• Marc Angel's avatar
    macvtap: add namespace support to the sysfs device class · 17af2bce
    Marc Angel authored
    When creating macvtaps that are expected to have the same ifindex
    in different network namespaces, only the first one will succeed.
    The others will fail with a sysfs_warn_dup warning due to them trying
    to create the following sysfs link (with 'NN' the ifindex of macvtapX):
    
    /sys/class/macvtap/tapNN -> /sys/devices/virtual/net/macvtapX/tapNN
    
    This is reproducible by running the following commands:
    
    ip netns add ns1
    ip netns add ns2
    ip link add veth0 type veth peer name veth1
    ip link set veth0 netns ns1
    ip link set veth1 netns ns2
    ip netns exec ns1 ip l add link veth0 macvtap0 type macvtap
    ip netns exec ns2 ip l add link veth1 macvtap1 type macvtap
    
    The last command will fail with "RTNETLINK answers: File exists" (along
    with the kernel warning) but retrying it will work because the ifindex
    was incremented.
    
    The 'net' device class is isolated between network namespaces so each
    one has its own hierarchy of net devices.
    This isn't the case for the 'macvtap' device class.
    The problem occurs half-way through the netdev registration, when
    `macvtap_device_event` is called-back to create the 'tapNN' macvtap
    class device under the 'macvtapX' net class device.
    
    This patch adds namespace support to the 'macvtap' device class so
    that /sys/class/macvtap is no longer shared between net namespaces.
    
    However, making the macvtap sysfs class namespace-aware has the side
    effect of changing /sys/devices/virtual/net/macvtapX/tapNN  into
    /sys/devices/virtual/net/macvtapX/macvtap/tapNN.
    
    This is due to Commit 24b1442d ("Driver-core: Always create class
    directories for classses that support namespaces") and the fact that
    class devices supporting namespaces are really not supposed to be placed
    directly under other class devices.
    
    To avoid breaking userland, a tapNN symlink pointing to macvtap/tapNN is
    created inside the macvtapX directory.
    Signed-off-by: default avatarMarc Angel <marc@arista.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    17af2bce
macvtap.c 32.9 KB