> I don't see a problem with this except for a layering violation: the
> generic "netdev" layer now has a function and a function pointer in it
> that is specific to the dpif code.  I can see two ways to deal with
> this: either move it out of the generic "netdev" layer into some other
> place, or to add conspicuous comments on ->get_dpif_port() and
> netdev_get_dpif_port() that explain the context and why this
> particular function might not make any sense (and you should just
> leave it NULL) if you're implementing something that isn't a
> dpif-based switch.

That's fair, I had went back and forth several times on which way was better,
but in the end I think you're right and it's better to pull it into the vport
layer.  Below is a new version of the patch.

Also note that netdev_vport_get_dpif_port()'s implementation changes to the
following in the "lib: Switch to flow based tunneling." patch.  I can resend
that if you'd like.

const char *
netdev_vport_get_dpif_port(const struct netdev *netdev)
{
    const struct netdev_dev *dev = netdev_get_dev(netdev);
    const struct netdev_class *class = netdev_dev_get_class(dev);
    const char *dpif_port;

    dpif_port = (is_vport_class(class)
                 ? vport_class_cast(class)->dpif_port
                 : NULL);
    return dpif_port ? dpif_port : netdev_get_name(netdev);
}

---
 lib/dpif-linux.c   |    4 ++--
 lib/dpif-netdev.c  |   18 ++++++++++--------
 lib/netdev-vport.c |    6 ++++++
 lib/netdev-vport.h |    2 ++
 4 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 6863e08..3dc94c2 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -426,7 +426,7 @@ dpif_linux_port_add(struct dpif *dpif_, struct netdev 
*netdev,
                     uint32_t *port_nop)
 {
     struct dpif_linux *dpif = dpif_linux_cast(dpif_);
-    const char *name = netdev_get_name(netdev);
+    const char *name = netdev_vport_get_dpif_port(netdev);
     const char *type = netdev_get_type(netdev);
     struct dpif_linux_vport request, reply;
     const struct ofpbuf *options;
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 2cf2265..038dfdc 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -40,6 +40,7 @@
 #include "hmap.h"
 #include "list.h"
 #include "netdev.h"
+#include "netdev-vport.h"
 #include "netlink.h"
 #include "odp-util.h"
 #include "ofp-print.h"
@@ -437,11 +438,11 @@ dpif_netdev_port_add(struct dpif *dpif, struct netdev 
*netdev,
         }
         port_no = *port_nop;
     } else {
-        port_no = choose_port(dp, netdev_get_name(netdev));
+        port_no = choose_port(dp, netdev_vport_get_dpif_port(netdev));
     }
     if (port_no >= 0) {
         *port_nop = port_no;
-        return do_add_port(dp, netdev_get_name(netdev),
+        return do_add_port(dp, netdev_vport_get_dpif_port(netdev),
                            netdev_get_type(netdev), port_no);
     }
     return EFBIG;
@@ -480,7 +481,7 @@ get_port_by_name(struct dp_netdev *dp,
     struct dp_netdev_port *port;
 
     LIST_FOR_EACH (port, node, &dp->port_list) {
-        if (!strcmp(netdev_get_name(port->netdev), devname)) {
+        if (!strcmp(netdev_vport_get_dpif_port(port->netdev), devname)) {
             *portp = port;
             return 0;
         }
@@ -504,7 +505,7 @@ do_del_port(struct dp_netdev *dp, uint32_t port_no)
     dp->ports[port->port_no] = NULL;
     dp->serial++;
 
-    name = xstrdup(netdev_get_name(port->netdev));
+    name = xstrdup(netdev_vport_get_dpif_port(port->netdev));
     netdev_close(port->netdev);
     free(port->type);
 
@@ -518,7 +519,7 @@ static void
 answer_port_query(const struct dp_netdev_port *port,
                   struct dpif_port *dpif_port)
 {
-    dpif_port->name = xstrdup(netdev_get_name(port->netdev));
+    dpif_port->name = xstrdup(netdev_vport_get_dpif_port(port->netdev));
     dpif_port->type = xstrdup(port->type);
     dpif_port->port_no = port->port_no;
 }
@@ -609,7 +610,7 @@ dpif_netdev_port_dump_next(const struct dpif *dpif, void 
*state_,
         struct dp_netdev_port *port = dp->ports[port_no];
         if (port) {
             free(state->name);
-            state->name = xstrdup(netdev_get_name(port->netdev));
+            state->name = xstrdup(netdev_vport_get_dpif_port(port->netdev));
             dpif_port->name = state->name;
             dpif_port->type = port->type;
             dpif_port->port_no = port->port_no;
@@ -1068,7 +1069,8 @@ dpif_netdev_run(struct dpif *dpif)
         } else if (error != EAGAIN && error != EOPNOTSUPP) {
             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
             VLOG_ERR_RL(&rl, "error receiving data from %s: %s",
-                        netdev_get_name(port->netdev), strerror(error));
+                        netdev_vport_get_dpif_port(port->netdev),
+                        strerror(error));
         }
     }
     ofpbuf_uninit(&packet);
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index 94f1110..95cffd2 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -151,6 +151,12 @@ netdev_vport_is_patch(const struct netdev *netdev)
     return class->get_config == get_patch_config; 
 }
 
+const char *
+netdev_vport_get_dpif_port(const struct netdev *netdev)
+{
+    return netdev_get_name(netdev);
+}
+
 static uint32_t
 get_u32_or_zero(const struct nlattr *a)
 {
diff --git a/lib/netdev-vport.h b/lib/netdev-vport.h
index b372a74..8c81d7a 100644
--- a/lib/netdev-vport.h
+++ b/lib/netdev-vport.h
@@ -41,4 +41,6 @@ void netdev_vport_patch_inc_rx(const struct netdev *,
 void netdev_vport_patch_inc_tx(const struct netdev *,
                                const struct dpif_flow_stats *);
 
+const char *netdev_vport_get_dpif_port(const struct netdev *);
+
 #endif /* netdev-vport.h */
-- 
1.7.9.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to