Peer losing IP address after moving veth into namespace

From: Yan Zhai <hidden>
Date: 2020-01-03 06:42:58

Hi netdev folks,

  we have encountered a situation where moving veth into network
namespace can drop address on its peer.
 In the first case, I run following command:

yan@133m23:~$ sudo ip netns add foo
yan@133m23:~$ sudo ip link add dev foo type veth peer name Ifoo
yan@133m23:~$ sudo ip link set foo up
yan@133m23:~$ sudo ip addr add 10.1.128.2/31 dev foo
yan@133m23:~$ sudo ip addr show dev foo
437: foo@Ifoo: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
noqueue state UP group default qlen 1000
    link/ether f2:6a:39:d1:2b:75 brd ff:ff:ff:ff:ff:ff
    inet 10.1.128.2/31 scope global foo
       valid_lft forever preferred_lft forever
    inet6 fe80::f06a:39ff:fed1:2b75/64 scope link
       valid_lft forever preferred_lft forever
yan@133m23:~$ sudo ip link set Ifoo netns foo
yan@133m23:~$ sudo ip addr show dev foo
437: foo@if436: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether f2:6a:39:d1:2b:75 brd ff:ff:ff:ff:ff:ff link-netns foo
    inet6 fe80::f06a:39ff:fed1:2b75/64 scope link
       valid_lft forever preferred_lft forever

If I add address to a veth, it always gets lost after its peer is moved into ns.

Somehow interesting thing is, if I set its peer to "Down" state, then
things seem to be OK!

yan@133m23:~$ sudo ip netns add foo
yan@133m23:~$ sudo ip link add dev foo type veth peer name Ifoo
yan@133m23:~$ sudo ip link set Ifoo down
yan@133m23:~$ sudo ip addr add 10.1.128.2/31 dev foo
yan@133m23:~$ sudo ip addr show dev foo
439: foo@Ifoo: <NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500
qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 3a:94:12:d8:01:30 brd ff:ff:ff:ff:ff:ff
    inet 10.1.128.2/31 scope global foo
       valid_lft forever preferred_lft forever
    inet6 fe80::3894:12ff:fed8:130/64 scope link
       valid_lft forever preferred_lft forever
yan@133m23:~$ sudo ip link set Ifoo netns foo
yan@133m23:~$ sudo ip addr show dev foo
439: foo@if438: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 3a:94:12:d8:01:30 brd ff:ff:ff:ff:ff:ff link-netns foo
    inet 10.1.128.2/31 scope global foo
       valid_lft forever preferred_lft forever
    inet6 fe80::3894:12ff:fed8:130/64 scope link
       valid_lft forever preferred_lft forever

The address is still on the device after its peer moved. But if I put
these commands in a shell, then it is not working again:

yan@133m23:~$ cat up.sh
#!/bin/sh -x

ip netns add foo
ip link add dev foo type veth peer name Ifoo
ip link set Ifoo down
ip addr add 10.1.128.2/31 dev foo
ip link set Ifoo netns foo
sleep 1
ip addr show dev foo
yan@133m23:~$ sudo bash up.sh
451: foo@if450: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 86:24:e7:5b:d8:f0 brd ff:ff:ff:ff:ff:ff link-netns foo

If I add a "sleep 1" after dev creation, then it seems to be fine again.

Question: what is the expected behavior on a freshly created veth
pair? It seems to me that there is some race condition regarding the
2nd and 3rd case. Is this a known thing, or I accidentally triggered
some buggy path? Can someone help me sort out what is happening in
these cases? I am happy to provide more information if needed.

Thanks!

-- 
Yan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help