Kernel: Stop including the ethernet header in LoopbackAdapter's mtu

The networking subsystem currently assumes all adapters are Ethernet
adapters, including the LoopbackAdapter, so all packets are pre-pended
with an Ethernet Frame header. Since the MTU must not include any
overhead added by the data-link (Ethernet in this case) or physical
layers, we need to subtract it from the MTU.

This fixes a kernel panic which occurs when sending a packet that is at
least 65523 bytes long through the loopback adapter, which results in
the kernel "receiving" a packet which is larger than the support MTU
out the other end. (As the actual final size was increased by the
addition of the ethernet frame header)
This commit is contained in:
Idan Horowitz 2023-11-25 16:38:19 +02:00 committed by Andreas Kling
parent 16a53c811e
commit 743a9e9ebf
Notes: sideshowbarker 2024-07-17 06:24:08 +09:00

View File

@ -21,7 +21,10 @@ LoopbackAdapter::LoopbackAdapter(StringView interface_name)
{
VERIFY(!s_loopback_initialized);
s_loopback_initialized = true;
set_mtu(65536);
// The networking subsystem currently assumes all adapters are Ethernet adapters, including the LoopbackAdapter,
// so all packets are pre-pended with an Ethernet Frame header. Since the MTU must not include any overhead added
// by the data-link (Ethernet in this case) or physical layers, we need to subtract it from the MTU.
set_mtu(65536 - sizeof(EthernetFrameHeader));
set_mac_address({ 19, 85, 2, 9, 0x55, 0xaa });
}