I have two PCs directly connected like this:
PC1[eth1] <-> [eth0]PC2
MTU on eth1 interface in PC1 is 9000 bytes. MTU on eth0 interface in PC2 is 2000 bytes:
root@PC2:~# ip -s link show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 80:97:41:ae:f7:c9 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
170432 696 0 0 0 0
TX: bytes packets errors dropped carrier collsns
118126 274 0 0 0 0
root@PC2:~# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UP group default qlen 1000
link/ether 80:97:41:ae:f7:c9 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.30/24 scope global eth0
valid_lft forever preferred_lft forever
inet 10.11.12.2/24 scope global eth0:temporary
valid_lft forever preferred_lft forever
root@PC2:~#
Weird thing is that if I execute ping -M do -s 4182 -c 1 10.11.12.2 in PC1, then this package is received by PC2 and fragmented replies are sent:
root@PC1:~# ping -M do -s 4182 -c 1 10.11.12.2
PING 10.11.12.2 (10.11.12.2) 4182(4210) bytes of data.
4190 bytes from 10.11.12.2: icmp_seq=1 ttl=64 time=0.397 ms
--- 10.11.12.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.397/0.397/0.397/0.000 ms
root@PC1:~#
I would expect PC2 to silently drop this frame as it exceeds its MTU. However, ping -M do -s 4183 -c 1 10.11.12.2 does not receive a reply.
This looks like PC2 has an interface MTU of 4210(4182 + 8 ICMP header + 20 IPv4 header) bytes and not 2000 bytes. Kernel driver for eth0 in PC2 is e1000e.
How to explain this behavior?
giantscounter. So the behavior described seems to be specific to Linux. – Martin Feb 04 '17 at 15:34