Ok, I spent most of the day looking at how thing works on openvswitch under the hood.
It seems that the kernel datapath assigns a ofport number for the kernel datapath, and then the user level assigns another port number, and maps it to the first one [1]
In the middle of that, it happens to try to fetch netdev details, I suspect again of a netns related, because if the device is moved into the netns then that mechanism fails (can't find the device and finish the mapping [1]) although we had code to avoid that by fetching the ofport number (with retries), may be the ovsdb switch broke it.
Btw, the second competing port (qvo, is a veth, and not namespaces, so still the whole picture isn't clear to me)
Ok, I spent most of the day looking at how thing works on openvswitch under the hood.
It seems that the kernel datapath assigns a ofport number for the kernel datapath, and then the user level assigns another port number, and maps it to the first one [1]
In the middle of that, it happens to try to fetch netdev details, I suspect again of a netns related, because if the device is moved into the netns then that mechanism fails (can't find the device and finish the mapping [1]) although we had code to avoid that by fetching the ofport number (with retries), may be the ovsdb switch broke it.
Btw, the second competing port (qvo, is a veth, and not namespaces, so still the whole picture isn't clear to me)
[1] https:/ /github. com/openvswitch /ovs/blob/ branch- 2.0/ofproto/ ofproto. c#L1714
[2] https:/ /github. com/openstack/ neutron/ blob/master/ neutron/ agent/common/ ovs_lib. py#L230