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:
Ghanan Gowripalan
2022-01-26 16:10:03 -08:00
committed by gVisor bot
parent ad021f48c0
commit ed2f45ace3
20 changed files with 55 additions and 88 deletions
+1 -2
View File
@@ -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 {
+4 -4
View File
@@ -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)
}
+6 -13
View File
@@ -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,
})
}
}
+2 -2
View File
@@ -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)
+1 -2
View File
@@ -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 {
+1 -2
View File
@@ -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 {
+2 -2
View File
@@ -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.
+1 -2
View File
@@ -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 {
+6 -13
View File
@@ -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) {
+6 -13
View File
@@ -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) {
+9 -9
View File
@@ -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)
+6 -11
View File
@@ -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.
+2 -2
View File
@@ -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.
+1 -1
View File
@@ -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 {
+1 -1
View File
@@ -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")
}
+1 -2
View File
@@ -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
+1 -2
View File
@@ -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()
+1 -1
View File
@@ -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 */)
+2 -2
View File
@@ -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