From 743a9e9ebf61ac0f2f164376c906946d8dd7e3ea Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Sat, 25 Nov 2023 16:38:19 +0200 Subject: [PATCH] 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) --- Kernel/Net/LoopbackAdapter.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Kernel/Net/LoopbackAdapter.cpp b/Kernel/Net/LoopbackAdapter.cpp index f1dbc0a27f..d88adb13f0 100644 --- a/Kernel/Net/LoopbackAdapter.cpp +++ b/Kernel/Net/LoopbackAdapter.cpp @@ -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 }); }