[ovs-dev] [PATCH ovs RFC 6/9] dpif-hw-netlink: using port maps on init and changes

Paul Blakey paulb at mellanox.com
Tue Sep 27 12:46:01 UTC 2016


updating the port maps on dpif open (without create)
and in port_add/port_del.

Signed-off-by: Paul Blakey <paulb at mellanox.com>
Signed-off-by: Shahar Klein <shahark at mellanox.com>
---
 lib/dpif-hw-netlink.c | 68 +++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 60 insertions(+), 8 deletions(-)

diff --git a/lib/dpif-hw-netlink.c b/lib/dpif-hw-netlink.c
index 92ac6cb..885827a 100644
--- a/lib/dpif-hw-netlink.c
+++ b/lib/dpif-hw-netlink.c
@@ -574,11 +574,22 @@ dpif_hw_netlink_open(const struct dpif_class *class OVS_UNUSED,
 {
     struct dpif_hw_netlink *dpif;
     struct dpif *lp_dpif_netlink;
-
-    if (dpif_create_and_open(name, "system", &lp_dpif_netlink)) {
-        VLOG_WARN("ERROR! %d\n", __LINE__);
+    struct netdev *netdev;
+    struct dpif_port dpif_port;
+    struct dpif_port_dump dump;
+    int error = 0;
+
+    VLOG_DBG("%s %d %s: parameters name %s, create: %s\n", __FILE__, __LINE__,
+             __func__, name, (create ? "yes" : "no"));
+    if (create) {
+        if ((error = dpif_create(name, "system", &lp_dpif_netlink))) {
+            return error;
+        }
+    } else {
+        if ((error = dpif_open(name, "system", &lp_dpif_netlink))) {
+            return error;
+        }
     }
-
     dpif = xzalloc(sizeof *dpif);
 
     initmaps(dpif);
@@ -593,6 +604,31 @@ dpif_hw_netlink_open(const struct dpif_class *class OVS_UNUSED,
 
     *dpifp = &dpif->dpif;
 
+    if (!create) {
+        VLOG_DBG
+            ("%s %d %s(%p) requesting existing port dump, from dpif-netlink only.\n",
+             __FILE__, __LINE__, __func__, dpif);
+        DPIF_PORT_FOR_EACH(&dpif_port, &dump, dpif->lp_dpif_netlink) {
+            VLOG_DBG("%s %d %s(%p) port: %s, type: %s\n", __FILE__, __LINE__,
+                     __func__, dpif, dpif_port.name, dpif_port.type);
+            if (dpif_port.type && !strcmp(dpif_port.type, "internal")) {
+                if (!strcmp(dpif_port.name, "skip_hw")) {
+                    tc_set_skip_hw(true);
+                }
+                continue;
+            }
+            if (!netdev_open(dpif_port.name, dpif_port.type, &netdev)) {
+                VLOG_DBG
+                    ("%s %d %s(%p) opened a new netdev: %s, type: %s, ifindex: %d\n",
+                     __FILE__, __LINE__, __func__, dpif, netdev->name,
+                     netdev->netdev_class->type, netdev_get_ifindex(netdev));
+                port_add(dpif, dpif_port.port_no, netdev);
+            }
+        }
+    }
+    VLOG_DBG("%s %d %s(%p) port dump end.\n", __FILE__, __LINE__, __func__,
+             dpif);
+
     return 0;
 }
 
@@ -634,19 +670,35 @@ static int
 dpif_hw_netlink_port_add(struct dpif *dpif_, struct netdev *netdev,
                          odp_port_t * port_nop)
 {
+    int error;
     struct dpif_hw_netlink *dpif = dpif_hw_netlink_cast(dpif_);
 
-    return dpif->lp_dpif_netlink->dpif_class->port_add(dpif->lp_dpif_netlink,
-                                                       netdev, port_nop);
+    VLOG_DBG("%s %d %s (%p): request to add  netdev: %s\n", __FILE__, __LINE__,
+             __func__, dpif, netdev->name);
+    error =
+        dpif->lp_dpif_netlink->dpif_class->port_add(dpif->lp_dpif_netlink,
+                                                    netdev, port_nop);
+    if (!error)
+        port_add(dpif, *port_nop, netdev);
+    else
+        VLOG_ERR("%s %d %s (%p): failed to add port\n", __FILE__, __LINE__,
+                 __func__, dpif);
+
+    return error;
 }
 
 static int
 dpif_hw_netlink_port_del(struct dpif *dpif_, odp_port_t port_no)
 {
+    int error;
     struct dpif_hw_netlink *dpif = dpif_hw_netlink_cast(dpif_);
 
-    return dpif->lp_dpif_netlink->dpif_class->port_del(dpif->lp_dpif_netlink,
-                                                       port_no);
+    error =
+        dpif->lp_dpif_netlink->dpif_class->port_del(dpif->lp_dpif_netlink,
+                                                    port_no);
+    if (!error)
+        port_del(dpif, port_no);
+    return error;
 }
 
 static int
-- 
1.8.3.1




More information about the dev mailing list