mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Populate link header from packet buffer fields
The arguments passed to LinkEndpoint.AddHeader are all available in the packet buffer so just get the values from the packet buffer. PiperOrigin-RevId: 424463821
This commit is contained in:
committed by
gVisor bot
parent
ad021f48c0
commit
ed2f45ace3
@@ -267,8 +267,7 @@ func (*Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (*Endpoint) AddHeader(tcpip.LinkAddress, tcpip.LinkAddress, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) {
|
||||
}
|
||||
func (*Endpoint) AddHeader(*stack.PacketBuffer) {}
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) WriteRawPacket(pkt *stack.PacketBuffer) tcpip.Error {
|
||||
|
||||
@@ -93,12 +93,12 @@ func (e *Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.
|
||||
func (*Endpoint) AddHeader(local, remote tcpip.LinkAddress, proto tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
func (*Endpoint) AddHeader(pkt *stack.PacketBuffer) {
|
||||
eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize))
|
||||
fields := header.EthernetFields{
|
||||
SrcAddr: local,
|
||||
DstAddr: remote,
|
||||
Type: proto,
|
||||
SrcAddr: pkt.EgressRoute.LocalLinkAddress,
|
||||
DstAddr: pkt.EgressRoute.RemoteLinkAddress,
|
||||
Type: pkt.NetworkProtocolNumber,
|
||||
}
|
||||
eth.Encode(&fields)
|
||||
}
|
||||
|
||||
@@ -486,22 +486,15 @@ const (
|
||||
)
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
func (e *endpoint) AddHeader(pkt *stack.PacketBuffer) {
|
||||
if e.hdrSize > 0 {
|
||||
// Add ethernet header if needed.
|
||||
eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize))
|
||||
ethHdr := &header.EthernetFields{
|
||||
DstAddr: remote,
|
||||
Type: protocol,
|
||||
}
|
||||
|
||||
// Preserve the src address if it's set in the route.
|
||||
if local != "" {
|
||||
ethHdr.SrcAddr = local
|
||||
} else {
|
||||
ethHdr.SrcAddr = e.addr
|
||||
}
|
||||
eth.Encode(ethHdr)
|
||||
eth.Encode(&header.EthernetFields{
|
||||
SrcAddr: pkt.EgressRoute.LocalLinkAddress,
|
||||
DstAddr: pkt.EgressRoute.RemoteLinkAddress,
|
||||
Type: pkt.NetworkProtocolNumber,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -220,7 +220,7 @@ func testWritePacket(t *testing.T, plen int, eth bool, gsoMaxSize uint32, hash u
|
||||
}
|
||||
}
|
||||
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
@@ -341,7 +341,7 @@ func TestPreserveSrcAddress(t *testing.T) {
|
||||
// Set LocalLinkAddress in route to the value of the bridged address.
|
||||
pkt.EgressRoute.LocalLinkAddress = baddr
|
||||
pkt.EgressRoute.RemoteLinkAddress = raddr
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
|
||||
@@ -91,8 +91,7 @@ func (*endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
return header.ARPHardwareLoopback
|
||||
}
|
||||
|
||||
func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
}
|
||||
func (*endpoint) AddHeader(*stack.PacketBuffer) {}
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.
|
||||
func (e *endpoint) WriteRawPacket(pkt *stack.PacketBuffer) tcpip.Error {
|
||||
|
||||
@@ -135,8 +135,7 @@ func (*InjectableEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (*InjectableEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
}
|
||||
func (*InjectableEndpoint) AddHeader(*stack.PacketBuffer) {}
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.
|
||||
func (*InjectableEndpoint) WriteRawPacket(*stack.PacketBuffer) tcpip.Error {
|
||||
|
||||
@@ -134,8 +134,8 @@ func (e *Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *Endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.child.AddHeader(local, remote, protocol, pkt)
|
||||
func (e *Endpoint) AddHeader(pkt *stack.PacketBuffer) {
|
||||
e.child.AddHeader(pkt)
|
||||
}
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.
|
||||
|
||||
@@ -108,8 +108,7 @@ func (*Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.
|
||||
func (*Endpoint) AddHeader(_, _ tcpip.LinkAddress, _ tcpip.NetworkProtocolNumber, _ *stack.PacketBuffer) {
|
||||
}
|
||||
func (*Endpoint) AddHeader(*stack.PacketBuffer) {}
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) WriteRawPacket(pkt *stack.PacketBuffer) tcpip.Error {
|
||||
|
||||
@@ -319,25 +319,18 @@ func (e *endpoint) LinkAddress() tcpip.LinkAddress {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
func (e *endpoint) AddHeader(pkt *stack.PacketBuffer) {
|
||||
// Add ethernet header if needed.
|
||||
if len(e.addr) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize))
|
||||
ethHdr := &header.EthernetFields{
|
||||
DstAddr: remote,
|
||||
Type: protocol,
|
||||
}
|
||||
|
||||
// Preserve the src address if it's set in the route.
|
||||
if local != "" {
|
||||
ethHdr.SrcAddr = local
|
||||
} else {
|
||||
ethHdr.SrcAddr = e.addr
|
||||
}
|
||||
eth.Encode(ethHdr)
|
||||
eth.Encode(&header.EthernetFields{
|
||||
SrcAddr: pkt.EgressRoute.LocalLinkAddress,
|
||||
DstAddr: pkt.EgressRoute.RemoteLinkAddress,
|
||||
Type: pkt.NetworkProtocolNumber,
|
||||
})
|
||||
}
|
||||
|
||||
func (e *endpoint) AddVirtioNetHeader(pkt *stack.PacketBuffer) {
|
||||
|
||||
@@ -205,25 +205,18 @@ func (e *serverEndpoint) LinkAddress() tcpip.LinkAddress {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *serverEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
func (e *serverEndpoint) AddHeader(pkt *stack.PacketBuffer) {
|
||||
// Add ethernet header if needed.
|
||||
if len(e.addr) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize))
|
||||
ethHdr := &header.EthernetFields{
|
||||
DstAddr: remote,
|
||||
Type: protocol,
|
||||
}
|
||||
|
||||
// Preserve the src address if it's set in the route.
|
||||
if local != "" {
|
||||
ethHdr.SrcAddr = local
|
||||
} else {
|
||||
ethHdr.SrcAddr = e.addr
|
||||
}
|
||||
eth.Encode(ethHdr)
|
||||
eth.Encode(&header.EthernetFields{
|
||||
SrcAddr: pkt.EgressRoute.LocalLinkAddress,
|
||||
DstAddr: pkt.EgressRoute.RemoteLinkAddress,
|
||||
Type: pkt.NetworkProtocolNumber,
|
||||
})
|
||||
}
|
||||
|
||||
func (e *serverEndpoint) AddVirtioNetHeader(pkt *stack.PacketBuffer) {
|
||||
|
||||
@@ -226,7 +226,7 @@ func TestSimpleSend(t *testing.T) {
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.EgressRoute.LocalLinkAddress = localLinkAddr
|
||||
pkt.NetworkProtocolNumber = proto
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
defer pkts.DecRef()
|
||||
@@ -300,7 +300,7 @@ func TestPreserveSrcAddressInSend(t *testing.T) {
|
||||
pkt.EgressRoute.LocalLinkAddress = newLocalLinkAddress
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = proto
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
defer pkts.DecRef()
|
||||
@@ -360,7 +360,7 @@ func TestFillTxQueue(t *testing.T) {
|
||||
})
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = header.IPv4ProtocolNumber
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
@@ -386,7 +386,7 @@ func TestFillTxQueue(t *testing.T) {
|
||||
})
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = header.IPv4ProtocolNumber
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
@@ -420,7 +420,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
pkts.PushBack(pkt)
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = header.IPv4ProtocolNumber
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
}
|
||||
if _, err := c.ep.WritePackets(pkts); err != nil {
|
||||
t.Fatalf("WritePackets failed unexpectedly: %s", err)
|
||||
@@ -448,7 +448,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
})
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = header.IPv4ProtocolNumber
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
@@ -473,7 +473,7 @@ func TestFillTxQueueAfterBadCompletion(t *testing.T) {
|
||||
})
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = header.IPv4ProtocolNumber
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
@@ -502,7 +502,7 @@ func TestFillTxMemory(t *testing.T) {
|
||||
})
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = header.IPv4ProtocolNumber
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
var pkts stack.PacketBufferList
|
||||
pkts.PushBack(pkt)
|
||||
@@ -577,7 +577,7 @@ func TestFillTxMemoryWithMultiBuffer(t *testing.T) {
|
||||
})
|
||||
pkt.EgressRoute.RemoteLinkAddress = remoteLinkAddr
|
||||
pkt.NetworkProtocolNumber = header.IPv4ProtocolNumber
|
||||
c.ep.AddHeader(pkt.EgressRoute.LocalLinkAddress, pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
c.ep.AddHeader(pkt)
|
||||
|
||||
pkts.PushBack(pkt)
|
||||
_, err := c.ep.WritePackets(pkts)
|
||||
|
||||
@@ -337,21 +337,16 @@ func (e *tunEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *tunEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
func (e *tunEndpoint) AddHeader(pkt *stack.PacketBuffer) {
|
||||
if !e.isTap {
|
||||
return
|
||||
}
|
||||
eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize))
|
||||
hdr := &header.EthernetFields{
|
||||
SrcAddr: local,
|
||||
DstAddr: remote,
|
||||
Type: protocol,
|
||||
}
|
||||
if hdr.SrcAddr == "" {
|
||||
hdr.SrcAddr = e.LinkAddress()
|
||||
}
|
||||
|
||||
eth.Encode(hdr)
|
||||
eth.Encode(&header.EthernetFields{
|
||||
SrcAddr: pkt.EgressRoute.LocalLinkAddress,
|
||||
DstAddr: pkt.EgressRoute.RemoteLinkAddress,
|
||||
Type: pkt.NetworkProtocolNumber,
|
||||
})
|
||||
}
|
||||
|
||||
// MaxHeaderLength returns the maximum size of the link layer header.
|
||||
|
||||
@@ -130,8 +130,8 @@ func (e *Endpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *Endpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
e.lower.AddHeader(local, remote, protocol, pkt)
|
||||
func (e *Endpoint) AddHeader(pkt *stack.PacketBuffer) {
|
||||
e.lower.AddHeader(pkt)
|
||||
}
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.
|
||||
|
||||
@@ -90,7 +90,7 @@ func (*countedEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
func (*countedEndpoint) Wait() {}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *countedEndpoint) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
func (*countedEndpoint) AddHeader(*stack.PacketBuffer) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
|
||||
@@ -88,8 +88,7 @@ func (*MockLinkEndpoint) Wait() {}
|
||||
func (*MockLinkEndpoint) ARPHardwareType() header.ARPHardwareType { return header.ARPHardwareNone }
|
||||
|
||||
// AddHeader implements LinkEndpoint.AddHeader.
|
||||
func (*MockLinkEndpoint) AddHeader(_, _ tcpip.LinkAddress, _ tcpip.NetworkProtocolNumber, _ *stack.PacketBuffer) {
|
||||
}
|
||||
func (*MockLinkEndpoint) AddHeader(*stack.PacketBuffer) {}
|
||||
|
||||
// WriteRawPacket implements stack.LinkEndpoint.
|
||||
func (*MockLinkEndpoint) WriteRawPacket(*stack.PacketBuffer) tcpip.Error {
|
||||
|
||||
@@ -218,7 +218,7 @@ func (*testObject) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (*testObject) AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
func (*testObject) AddHeader(*stack.PacketBuffer) {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
|
||||
@@ -83,8 +83,7 @@ func (*stubLinkEndpoint) WritePackets(pkts stack.PacketBufferList) (int, tcpip.E
|
||||
|
||||
func (*stubLinkEndpoint) Attach(stack.NetworkDispatcher) {}
|
||||
|
||||
func (*stubLinkEndpoint) AddHeader(_, _ tcpip.LinkAddress, _ tcpip.NetworkProtocolNumber, _ *stack.PacketBuffer) {
|
||||
}
|
||||
func (*stubLinkEndpoint) AddHeader(*stack.PacketBuffer) {}
|
||||
|
||||
type stubDispatcher struct {
|
||||
stack.TransportDispatcher
|
||||
|
||||
@@ -330,8 +330,7 @@ func (*fwdTestLinkEndpoint) ARPHardwareType() header.ARPHardwareType {
|
||||
}
|
||||
|
||||
// AddHeader implements stack.LinkEndpoint.AddHeader.
|
||||
func (e *fwdTestLinkEndpoint) AddHeader(tcpip.LinkAddress, tcpip.LinkAddress, tcpip.NetworkProtocolNumber, *PacketBuffer) {
|
||||
}
|
||||
func (*fwdTestLinkEndpoint) AddHeader(*PacketBuffer) {}
|
||||
|
||||
func fwdTestNetFactory(t *testing.T, proto *fwdTestNetworkProtocol) (*faketime.ManualClock, *fwdTestLinkEndpoint, *fwdTestLinkEndpoint) {
|
||||
clock := faketime.NewManualClock()
|
||||
|
||||
@@ -395,7 +395,7 @@ func (n *nic) writePacket(pkt *PacketBuffer) tcpip.Error {
|
||||
// WritePacket modifies pkt, calculate numBytes first.
|
||||
numBytes := pkt.Size()
|
||||
|
||||
n.NetworkLinkEndpoint.AddHeader(n.LinkAddress(), pkt.EgressRoute.RemoteLinkAddress, pkt.NetworkProtocolNumber, pkt)
|
||||
n.NetworkLinkEndpoint.AddHeader(pkt)
|
||||
|
||||
n.deliverLinkPacket(pkt.NetworkProtocolNumber, pkt, false /* incoming */)
|
||||
|
||||
|
||||
@@ -832,8 +832,8 @@ type NetworkLinkEndpoint interface {
|
||||
// https://github.com/torvalds/linux/blob/aa0c9086b40c17a7ad94425b3b70dd1fdd7497bf/include/uapi/linux/if_arp.h#L30
|
||||
ARPHardwareType() header.ARPHardwareType
|
||||
|
||||
// AddHeader adds a link layer header to pkt if required.
|
||||
AddHeader(local, remote tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *PacketBuffer)
|
||||
// AddHeader adds a link layer header to the packet if required.
|
||||
AddHeader(*PacketBuffer)
|
||||
}
|
||||
|
||||
// QueueingDiscipline provides a queueing strategy for outgoing packets (e.g
|
||||
|
||||
Reference in New Issue
Block a user