mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Consider ethernet header size when returning MTU
...so that upper-layers do not send larger than expected packets. PiperOrigin-RevId: 416645503
This commit is contained in:
committed by
gVisor bot
parent
7b6078e252
commit
bb129b4bec
@@ -50,6 +50,14 @@ func (e *Endpoint) LinkAddress() tcpip.LinkAddress {
|
||||
return header.UnspecifiedEthernetAddress
|
||||
}
|
||||
|
||||
// MTU implements stack.LinkEndpoint.
|
||||
func (e *Endpoint) MTU() uint32 {
|
||||
if mtu := e.Endpoint.MTU(); mtu > header.EthernetMinimumSize {
|
||||
return mtu - header.EthernetMinimumSize
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// DeliverNetworkPacket implements stack.NetworkDispatcher.
|
||||
func (e *Endpoint) DeliverNetworkPacket(_, _ tcpip.LinkAddress, _ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
|
||||
hdr, ok := pkt.LinkHeader().Consume(header.EthernetMinimumSize)
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package ethernet_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/tcpip"
|
||||
@@ -69,3 +70,52 @@ func TestDeliverNetworkPacket(t *testing.T) {
|
||||
t.Fatalf("got networkDispatcher.networkPackets = %d, want = 1", networkDispatcher.networkPackets)
|
||||
}
|
||||
}
|
||||
|
||||
type testLinkEndpoint struct {
|
||||
stack.LinkEndpoint
|
||||
|
||||
mtu uint32
|
||||
}
|
||||
|
||||
func (t *testLinkEndpoint) MTU() uint32 {
|
||||
return t.mtu
|
||||
}
|
||||
|
||||
func TestMTU(t *testing.T) {
|
||||
const maxFrameSize = 1500
|
||||
|
||||
tests := []struct {
|
||||
maxFrameSize uint32
|
||||
expectedMTU uint32
|
||||
}{
|
||||
{
|
||||
maxFrameSize: 0,
|
||||
expectedMTU: 0,
|
||||
},
|
||||
{
|
||||
maxFrameSize: header.EthernetMinimumSize - 1,
|
||||
expectedMTU: 0,
|
||||
},
|
||||
{
|
||||
maxFrameSize: header.EthernetMinimumSize,
|
||||
expectedMTU: 0,
|
||||
},
|
||||
{
|
||||
maxFrameSize: header.EthernetMinimumSize + 1,
|
||||
expectedMTU: 1,
|
||||
},
|
||||
{
|
||||
maxFrameSize: maxFrameSize,
|
||||
expectedMTU: maxFrameSize - header.EthernetMinimumSize,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(fmt.Sprintf("MaxFrameSize=%d", test.maxFrameSize), func(t *testing.T) {
|
||||
e := ethernet.New(&testLinkEndpoint{mtu: test.maxFrameSize})
|
||||
if got := e.MTU(); got != test.expectedMTU {
|
||||
t.Errorf("got e.MTU() = %d, want = %d", got, test.expectedMTU)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user