summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEelco Chaudron <echaudro@redhat.com>2018-11-12 04:26:22 -0500
committerIan Stokes <ian.stokes@intel.com>2018-11-12 15:45:12 +0000
commit2d37de73c11f5df6c933be5b734b812b61c24702 (patch)
treed433c80e24f5c8f8fa15c7d28a9acd0c2c38aaca /lib
parent87c7a35deb15f29ef6aad3e7b83bffd593d2d576 (diff)
downloadopenvswitch-2d37de73c11f5df6c933be5b734b812b61c24702.tar.gz
netdev-dpdk: Bring link down when NETDEV_UP is not set
When the netdev link flags are changed, !NETDEV_UP, the DPDK ports are not actually going down. This is causing problems for people trying to bring down a bond member. The bond link is no longer being used to receive or transmit traffic, however, the other end keeps sending data as the link remains up. With OVS 2.6 the link was brought down, and this was changed with commit 3b1fb0779. In this commit, it's explicitly mentioned that the link down/up DPDK APIs are not called as not all PMD devices support it. However, this patch does call the appropriate DPDK APIs and ignoring errors due to the PMD not supporting it. PMDs not supporting this should be fixed in DPDK upstream. I verified this patch is working correctly using the ovs-appctl netdev-dpdk/set-admin-state <port> {up|down} and ovs-ofctl mod-port <bridge> <port> {up|down} commands on a XL710 and 82599ES. Fixes: 3b1fb0779b87 ("netdev-dpdk: Don't call rte_dev_stop() in update_flags().") Signed-off-by: Eelco Chaudron <echaudro@redhat.com> Acked-by: Flavio Leitner <fbl@sysclose.org> Acked-by: Ilya Maximets <i.maximets@samsung.com> Signed-off-by: Ian Stokes <ian.stokes@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/netdev-dpdk.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 7e0a593d0..e8618a6d2 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -2942,6 +2942,26 @@ netdev_dpdk_update_flags__(struct netdev_dpdk *dev,
}
if (dev->type == DPDK_DEV_ETH) {
+
+ if ((dev->flags ^ *old_flagsp) & NETDEV_UP) {
+ int err;
+
+ if (dev->flags & NETDEV_UP) {
+ err = rte_eth_dev_set_link_up(dev->port_id);
+ } else {
+ err = rte_eth_dev_set_link_down(dev->port_id);
+ }
+ if (err == -ENOTSUP) {
+ VLOG_INFO("Interface %s does not support link state "
+ "configuration", netdev_get_name(&dev->up));
+ } else if (err < 0) {
+ VLOG_ERR("Interface %s link change error: %s",
+ netdev_get_name(&dev->up), rte_strerror(-err));
+ dev->flags = *old_flagsp;
+ return -err;
+ }
+ }
+
if (dev->flags & NETDEV_PROMISC) {
rte_eth_promiscuous_enable(dev->port_id);
}