From: Hangbin Liu <liuhang...@gmail.com>
Date: Sun,  1 Jul 2018 16:21:21 +0800

> After we change the ipvlan mode from l3 to l2, or vice versa, we only
> reset IFF_NOARP flag, but don't flush the ARP table cache, which will
> cause eth->h_dest to be equal to eth->h_source in ipvlan_xmit_mode_l2().
> Then the message will not come out of host.
> 
> Here is the reproducer on local host:
> 
> ip link set eth1 up
> ip addr add 192.168.1.1/24 dev eth1
> ip link add link eth1 ipvlan1 type ipvlan mode l3
> 
> ip netns add net1
> ip link set ipvlan1 netns net1
> ip netns exec net1 ip link set ipvlan1 up
> ip netns exec net1 ip addr add 192.168.2.1/24 dev ipvlan1
> 
> ip route add 192.168.2.0/24 via 192.168.1.2
> ping 192.168.2.2 -c 2
> 
> ip netns exec net1 ip link set ipvlan1 type ipvlan mode l2
> ping 192.168.2.2 -c 2
> 
> Add the same configuration on remote host. After we set the mode to l2,
> we could find that the src/dst MAC addresses are the same on eth1:
> 
> 21:26:06.648565 00:b7:13:ad:d3:05 > 00:b7:13:ad:d3:05, ethertype IPv4 
> (0x0800), length 98: (tos 0x0, ttl 64, id 58356, offset 0, flags [DF], proto 
> ICMP (1), length 84)
>     192.168.2.1 > 192.168.2.2: ICMP echo request, id 22686, seq 1, length 64
> 
> Fix this by calling dev_change_flags(), which will call netdevice notifier
> with flag change info.
> 
> v2:
> a) As pointed out by Wang Cong, check return value for dev_change_flags() when
> change dev flags.
> b) As suggested by Stefano and Sabrina, move flags setting before l3mdev_ops.
> So we don't need to redo ipvlan_{, un}register_nf_hook() again in err path.
> 
> Reported-by: Jianlin Shi <ji...@redhat.com>
> Reviewed-by: Stefano Brivio <sbri...@redhat.com>
> Reviewed-by: Sabrina Dubroca <s...@queasysnail.net>
> Fixes: 2ad7bf3638411 ("ipvlan: Initial check-in of the IPVLAN driver.")
> Signed-off-by: Hangbin Liu <liuhang...@gmail.com>

Applied, thank you.

Reply via email to