• Hangbin Liu's avatar
    ipvlan: call dev_change_flags when ipvlan mode is reset · 5dc2d399
    Hangbin Liu authored
    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: default avatarJianlin Shi <jishi@redhat.com>
    Reviewed-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Reviewed-by: default avatarSabrina Dubroca <sd@queasysnail.net>
    Fixes: 2ad7bf36 ("ipvlan: Initial check-in of the IPVLAN driver.")
    Signed-off-by: default avatarHangbin Liu <liuhangbin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5dc2d399
ipvlan_main.c 28.7 KB