Hello,
I have a colleague who is creating an openvswitch configuration consisting
of an
eth0, a vlan eth0.300 and two OVS bridges: br-ex and br-fixed. The system
uses
openvswitch-2.1.2 and linux kernel version 3.12.X
Initially, eth0 and eth0.300 are configured with the following addresses:
eth0 192.168.124.81
eth0.300 192.168.126.2
Ultimately, eth0 and eth0.300 will become ports of br-ex and br-fixed,
however,
it is not known in advance, which interface will be added to which bridge.
Further, it's not known which interface/bridge combo will be configured
first.
All that is certain, is that the interfaces will be added to different
bridges.
What we see when the eth0.300/br-X is configured first, is a subsequent
failure during
configuration of eth0/br-Y.
We perform the following steps:
# ovs-vsctl add-br br-ex
# ip addr flush dev eth0.300
# ip addr add 192.168.126.2/24 dev br-ex
# ovs-vsctl add-port br-ex eth0.300
Up to this point, we are able to access 192.168.126.0/24 and
192.168.124.0/24
Continuing:
# ovs-vsctl add-br br-fixed
# ip addr flush dev eth0
# ip addr add 192.168.124.81/24 dev br-fixed
# ovs-vsctl add-port br-fixed eth0
And here we see the problem. Specifically:
/var/log/openvswitch/ovs-vswitchd.log:
2015-09-15T23:14:24.638Z|00023|dpif|WARN|system@ovs-system: failed to add
eth0 as port: File exists
Digging into the openvswitch datapath module, we find:
datapath/vport-netdev.c:netdev_create()
...
err = netdev_master_upper_dev_link(netdev_vport->dev,
get_dpdev(vport->dp));
...
netdev_master_upper_dev_link() is a kernel API which returns -EEXISTS from:
net/core/dev.c:__netdev_upper_dev_link()
...
if (__netdev_find_adj(dev, upper_dev, &dev->all_adj_list.upper))
return -EEXIST;
...
Thus, since ovs bridge ports get enslaved under ovs-system, regardless to
which
actual bridge they are added, a case of eth0 and eth0.300 vlan trip the
adjacency
checks in newer kernel version. Older kernel versions did not show this
error
as the datapath contains:
openvswitch-2.1.2/datapath/linux/compat/include/linux/netdevice.h:
...
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)
/* XEN dom0 networking assumes dev->master is bond device
* and it tries to access bond private structure from dev->master
* ptr on receive path. This causes panic. Therefore it is better
* not to backport this API.
**/
static inline int netdev_master_upper_dev_link(struct net_device *dev,
struct net_device *upper_dev)
{
return 0;
}
static inline void netdev_upper_dev_unlink(struct net_device *dev,
struct net_device *upper_dev)
{
}
#endif
...
There is a 'workaround' we've employed, and that is when hitting this error,
to re-enslave eth0.300. This causes both eth0 and eth0.300 to be correctly
added to their respective bridges _and_ to be enslaved under ovs-system.
Clearly
this is exploiting a bit of a flaw, but it allows my colleague to proceed
on.
Aside from providing these data points to interested parties, I was hoping
I might get some feedback as to:
1. Whether this use case is at all valid - please note that another such
question
was posted to the mailer:
http://openvswitch.org/pipermail/discuss/2014-June/014219.html
2. What a suitable, ovs accepted, workaround/approach would be to solving
this problem.
Thanks in advance,
Karol
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev