dpif-netdev: Don't run port names through netdev_vport_get_dpif_port().
[sliver-openvswitch.git] / lib / netdev-vport.c
index 699ed71..3558f43 100644 (file)
@@ -114,6 +114,12 @@ netdev_vport_needs_dst_port(const struct netdev *dev)
             (!strcmp("vxlan", type) || !strcmp("lisp", type)));
 }
 
+const char *
+netdev_vport_class_get_dpif_port(const struct netdev_class *class)
+{
+    return is_vport_class(class) ? vport_class_cast(class)->dpif_port : NULL;
+}
+
 const char *
 netdev_vport_get_dpif_port(const struct netdev *netdev)
 {
@@ -136,9 +142,7 @@ netdev_vport_get_dpif_port(const struct netdev *netdev)
         return dpif_port_combined;
     } else {
         const struct netdev_class *class = netdev_get_class(netdev);
-        dpif_port = (is_vport_class(class)
-                     ? vport_class_cast(class)->dpif_port
-                     : NULL);
+        dpif_port = netdev_vport_class_get_dpif_port(class);
     }
 
     return dpif_port ? dpif_port : netdev_get_name(netdev);
@@ -192,7 +196,7 @@ netdev_vport_get_etheraddr(const struct netdev *netdev,
 static int
 tunnel_get_status(const struct netdev *netdev, struct smap *smap)
 {
-    static char iface[IFNAMSIZ];
+    char iface[IFNAMSIZ];
     ovs_be32 route;
 
     route = netdev_vport_cast(netdev)->tnl_cfg.ip_dst;
@@ -681,11 +685,15 @@ netdev_vport_tunnel_register(void)
         TUNNEL_CLASS("vxlan", "vxlan_system"),
         TUNNEL_CLASS("lisp", "lisp_system")
     };
+    static bool inited;
 
     int i;
 
-    for (i = 0; i < ARRAY_SIZE(vport_classes); i++) {
-        netdev_register_provider(&vport_classes[i].netdev_class);
+    if (!inited) {
+        inited = true;
+        for (i = 0; i < ARRAY_SIZE(vport_classes); i++) {
+            netdev_register_provider(&vport_classes[i].netdev_class);
+        }
     }
 }