Problem
setupBridge (node/bridge_linux.go:19) creates cni0 at the default 1500 without reading the primary NIC's MTU, and buildReply (dhcp/reply.go:11) sends no DHCP option 26. Nothing in cocoon-net mentions MTU.
On a GCE VPC at the default 1460, ens4 is 1460 while cni0, the VM veths and the TAPs are 1500; cocoon copies the bridge MTU onto the TAP and advertises it to the guest (network/bridge/bridge_linux.go, network/cni/lifecycle_linux.go, Firecracker NIC mtu). Guests therefore emit full-size frames that the host must fragment on the way out, and any path that swallows ICMP frag-needed becomes a PMTUD black hole: small flows work, bulk transfers stall.
Verified on Linux with NET_ADMIN against a dummy ens4 at 1460: cni0 stays 1500 after a veth is enslaved, because the primary NIC is routed and never enslaved.
Proposal
Set the bridge MTU from the resolved primary NIC in setupBridge, and optionally add option 26 to buildReply from a new Config.MTU. The bridge route also covers VM-to-VM traffic on the same node; the DHCP option alone does not.
Acceptance
With the primary NIC at 1460, cni0 and every enslaved veth report 1460, and a guest booted through DHCP configures 1460.
Found in the 2026-09-21 whole-repo review round (branch review/whole-repo-2026-09-21). Filed as a behaviour question for the owner; no code change is included in the round PR.
Problem
setupBridge(node/bridge_linux.go:19) createscni0at the default 1500 without reading the primary NIC's MTU, andbuildReply(dhcp/reply.go:11) sends no DHCP option 26. Nothing in cocoon-net mentions MTU.On a GCE VPC at the default 1460,
ens4is 1460 whilecni0, the VM veths and the TAPs are 1500; cocoon copies the bridge MTU onto the TAP and advertises it to the guest (network/bridge/bridge_linux.go,network/cni/lifecycle_linux.go, Firecracker NICmtu). Guests therefore emit full-size frames that the host must fragment on the way out, and any path that swallows ICMP frag-needed becomes a PMTUD black hole: small flows work, bulk transfers stall.Verified on Linux with
NET_ADMINagainst a dummyens4at 1460:cni0stays 1500 after a veth is enslaved, because the primary NIC is routed and never enslaved.Proposal
Set the bridge MTU from the resolved primary NIC in
setupBridge, and optionally add option 26 tobuildReplyfrom a newConfig.MTU. The bridge route also covers VM-to-VM traffic on the same node; the DHCP option alone does not.Acceptance
With the primary NIC at 1460,
cni0and every enslaved veth report 1460, and a guest booted through DHCP configures 1460.Found in the 2026-09-21 whole-repo review round (branch
review/whole-repo-2026-09-21). Filed as a behaviour question for the owner; no code change is included in the round PR.