numam-dpdk/lib/librte_vhost
Yuanhan Liu bb66588304 vhost: broadcast RARP by injecting in receiving mbuf array
Broadcast RARP packet by injecting it to receiving mbuf array at
rte_vhost_dequeue_burst().

Commit 33226236a3 ("vhost: handle request to send RARP") iterates
all host interfaces and then broadcast it by all of them.  It did
notify the switches about the new location of the migrated VM, however,
the mac learning table in the target host is wrong (at least in my
test with OVS):

    $ ovs-appctl fdb/show ovsbr0
     port  VLAN  MAC                Age
        1     0  b6:3c:72:71:cd:4d   10
    LOCAL     0  b6:3c:72:71:cd:4e   10
    LOCAL     0  52:54:00:12:34:68    9
        1     0  56:f6:64:2c:bc:c0    1

Where 52:54:00:12:34:68 is the mac of the VM. As you can see from the
above, the port learned is "LOCAL", which is the "ovsbr0" port. That
is reasonable, since we indeed send the pkt by the "ovsbr0" interface.

The wrong mac table lead all the packets to the VM go to the "ovsbr0"
in the end, which ends up with all packets being lost, until the guest
send a ARP quest (or reply) to refresh the mac learning table.

Jianfeng then came up with a solution I have thought of firstly but NAKed
by myself, concerning it has potential issues [0]. The solution is as title
stated: broadcast the RARP packet by injecting it to the receiving mbuf
arrays at rte_vhost_dequeue_burst(). The re-bring of that idea made me
think it twice; it looked like a false concern to me then. And I had done
a rough verification: it worked as expected.

[0]: http://dpdk.org/ml/archives/dev/2016-February/033527.html

Another note is that while preparing this version, I found that DPDK has
some ARP related structures and macros defined. So, use them instead of
the one from standard header files here.

Cc: Thibaut Collet <thibaut.collet@6wind.com>
Suggested-by: Jianfeng Tan <jianfeng.tan@intel.com>
Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-02-29 16:55:30 +01:00
..
eventfd_link vhost: fix kernel module insertion 2015-11-24 21:34:11 +01:00
libvirt vhost: fix qemu shutdown 2015-09-24 14:57:36 +02:00
vhost_cuse vhost: remove device operations pointers 2016-02-19 19:33:31 +01:00
vhost_user vhost: broadcast RARP by injecting in receiving mbuf array 2016-02-29 16:55:30 +01:00
Makefile vhost: fix build dependency 2016-02-18 20:25:15 +01:00
rte_vhost_version.map vhost: cleanup unix socket 2015-06-30 17:49:08 +02:00
rte_virtio_net.h vhost: broadcast RARP by injecting in receiving mbuf array 2016-02-29 16:55:30 +01:00
vhost_rxtx.c vhost: broadcast RARP by injecting in receiving mbuf array 2016-02-29 16:55:30 +01:00
vhost-net.h vhost: remove device operations pointers 2016-02-19 19:33:31 +01:00
virtio-net.c vhost: check memory map before address translation 2016-02-21 11:17:48 +01:00
virtio-net.h vhost: implement cuse memory table 2015-02-24 01:38:14 +01:00