Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Dec 2016 23:35:27 +0100
From:      =?UTF-8?B?Sm9zw6kgR2FyY8OtYSBKdWFuaW5v?= <jjuanino@gmail.com>
To:        freebsd-virtualization@freebsd.org
Subject:   bhyve: cannot send jumbo frames from linux or freebsd guest
Message-ID:  <CAAVO5%2BJnk1MepU7mBdQiWsRJf4FF0EuheaERGCHJJw3_pgG_dA@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hi everybody,

On my FreeBSD 11.0-RELEASE I am running three bhyve virtual machines:

1- Windows Server 2012
2- Centos 6
3- FreeBSD 11.0-RELEASE

An iSCSI target is configured in the host, and the three above guests runs a
iSCSI initiator. I use iSCSI to present zvols to guests, and so be
able to increase
the guests storage without rebooting. This setup works as expected: initiators
connect to target, and everything run smoothly.

In order to boost performance, I want to enable jumbo frames in the private,
non routing, iSCSI subnet. The subnet is 192.168.253/24, and is configured
as follows:


# ifconfig bridge6
bridge6: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 9000
        description: vm-iscsi0
        ether 02:10:ef:9e:c0:06
        inet 192.168.253.1 netmask 0xffffff00 broadcast 192.168.253.255
        nd6 options=1<PERFORMNUD>
        groups: bridge
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: tap9 flags=943<LEARNING,DISCOVER,PRIVATE,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 22 priority 128 path cost 2000000
        member: tap7 flags=943<LEARNING,DISCOVER,PRIVATE,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 20 priority 128 path cost 2000000
        member: tap6 flags=943<LEARNING,DISCOVER,PRIVATE,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 19 priority 128 path cost 2000000


192.168.253.1 is the ip address of the FreeBSD bhyve host (the iSCSI target) in
this private subnet.  Notice that I have set mtu=9000 in the bridge interface.
Automatically, the taps interfaces inherit that setting when the guests starts
up.

Inside each guest, I have configured the mtu setting to 9000. In the FreeBSD and
Linux, I get, respectively:

# ifconfig vtnet1
vtnet1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
metric 0 mtu 9000
        options=80028<VLAN_MTU,JUMBO_MTU,LINKSTATE>
        ether 58:9c:fc:05:55:66
        inet 192.168.253.4 netmask 0xffffff00 broadcast 192.168.253.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet 10Gbase-T <full-duplex>
        status: active

# ifconfig eth2
eth2      Link encap:Ethernet  HWaddr 58:9C:FC:0E:9D:01
          inet addr:192.168.253.3  Bcast:192.168.253.255  Mask:255.255.255.0
          inet6 addr: fe80::5a9c:fcff:fe0e:9d01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9000  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:65470 (63.9 KiB)  TX bytes:108972 (106.4 KiB)


In order to test if jumbo frames are set properly, I run the following from the
Windows guest:

C:\Users\Administrator>ping -n 1 -f -l 8972 192.168.253.1

Pinging 192.168.253.1 with 8972 bytes of data:
Reply from 192.168.253.1: bytes=8972 time<1ms TTL=64

Ping statistics for 192.168.253.1:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

As you can see, jumbo frames seems to work properly from Windows guest, as
I can trasmit a 8972 bytes frame with no fragmentation. A tcpdump in the host
side shows the following:

23:22:42.111043 IP (tos 0x0, ttl 128, id 20704, offset 0, flags [DF],
proto ICMP (1), length 9000)
    192.168.253.2 > 192.168.253.1: ICMP echo request, id 1, seq 301, length 8980
23:22:42.111106 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto
ICMP (1), length 9000)
    192.168.253.1 > 192.168.253.2: ICMP echo reply, id 1, seq 301, length 8980



But, If I repeat the analogous test from FreeBSD or Linux guest, I get wrong
results, as I will explain.

>From  Linux guest I run:

# ping -c 4 -s 8972 -M do 192.168.253.1
PING 192.168.253.1 (192.168.253.1) 8972(9000) bytes of data.

--- 192.168.253.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 13000ms

If I decrease the packet size to 4042, I get a succesful answer from the iSCSI
target:

# ping -c 4 -s 4042 -M do 192.168.253.1
PING 192.168.253.1 (192.168.253.1) 4042(4070) bytes of data.
4050 bytes from 192.168.253.1: icmp_seq=1 ttl=64 time=0.191 ms
4050 bytes from 192.168.253.1: icmp_seq=2 ttl=64 time=0.203 ms
4050 bytes from 192.168.253.1: icmp_seq=3 ttl=64 time=0.159 ms
4050 bytes from 192.168.253.1: icmp_seq=4 ttl=64 time=0.191 ms

--- 192.168.253.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.159/0.186/0.203/0.016 ms


With a 4043 packet size, the ping fails again.

>From FreeBSD guest, the test would be:

# ping -c 4 -D -s 8972 192.168.253.1
PING 192.168.253.1 (192.168.253.1): 8972 data bytes

--- 192.168.253.1 ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss

After some trial and error, I get 1994 as the upper bound:

# ping -c 4 -D -s 1994 192.168.253.1
PING 192.168.253.1 (192.168.253.1): 1994 data bytes
2002 bytes from 192.168.253.1: icmp_seq=0 ttl=64 time=0.203 ms
2002 bytes from 192.168.253.1: icmp_seq=1 ttl=64 time=0.239 ms
2002 bytes from 192.168.253.1: icmp_seq=2 ttl=64 time=0.224 ms
2002 bytes from 192.168.253.1: icmp_seq=3 ttl=64 time=0.214 ms

--- 192.168.253.1 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.203/0.220/0.239/0.013 ms


I have run tcpdump on both FreeBSD guest and host to debug the issue and I get
the following:

* From FreeBSD guest:
# tcpdump -vvn -i vtnet1 &
tcpdump: listening on vtnet1, link-type EN10MB (Ethernet), capture
size 262144 bytes
# ping -c 1 -D -s 1995 192.168.253.1
PING 192.168.253.1 (192.168.253.1): 1995 data bytes
23:08:46.808187 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto
ICMP (1), length 2023)
    192.168.253.4 > 192.168.253.1: ICMP echo request, id 58116, seq 0,
length 2003
23:08:46.808430 IP truncated-ip - 1 bytes missing! (tos 0x0, ttl 64,
id 0, offset 0, flags [DF], proto ICMP (1), length 2023)
    192.168.253.1 > 192.168.253.4: ICMP echo reply, id 58116, seq 0, length 2003

--- 192.168.253.1 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss


* From FreeBSD host:
# tcpdump -vvn -i bridge6
tcpdump: listening on bridge6, link-type EN10MB (Ethernet), capture
size 262144 bytes
23:09:58.315600 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto
ICMP (1), length 2023)
    192.168.253.4 > 192.168.253.1: ICMP echo request, id 59140, seq 0,
length 2003
23:09:58.315663 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto
ICMP (1), length 2023)
    192.168.253.1 > 192.168.253.4: ICMP echo reply, id 59140, seq 0, length 2003


Notice the "truncated-ip - 1 bytes missing!" from the guest. Indeed, is clear
that the issue is related to the Linux or FreeBSD guest, as from Windows guest
I cant transmit jumbo frames.

Could anyone explain why I cannot send jumbo frames from Linux and FreeBSD
guests, but I *can* send them from Windows guest? Am I missing o
missunderstanding something? Thanks in advanced, any comment o suggestion will
be wellcome. Best regards.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAAVO5%2BJnk1MepU7mBdQiWsRJf4FF0EuheaERGCHJJw3_pgG_dA>