From b38fe047a80f259c302171225ddcce7665b81be6 Mon Sep 17 00:00:00 2001
From: Ben Pfaff <blp@nicira.com>
Date: Fri, 6 Mar 2009 14:03:24 -0800
Subject: [PATCH] dpif: New function dpif_get_name().

This function is equivalent to querying the ODPP_LOCAL port, but its name
better reflects the caller's intent, and its interface is slightly more
convenient.
---
 lib/dpif.c          | 24 ++++++++++++++++++++----
 lib/dpif.h          |  2 ++
 secchan/discovery.c |  7 ++++---
 secchan/in-band.c   | 10 +++++-----
 secchan/ofproto.c   | 11 +++++------
 5 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/lib/dpif.c b/lib/dpif.c
index 84cef19b..9b89a9e2 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -185,6 +185,22 @@ dpif_create(const char *name, struct dpif *dpif)
     }
 }
 
+int
+dpif_get_name(struct dpif *dpif, char *name, size_t name_size)
+{
+    struct odp_port port;
+    int error;
+
+    assert(name_size > 0);
+    *name = '\0';
+
+    error = dpif_port_query_by_number(dpif, ODPP_LOCAL, &port);
+    if (!error) {
+        strlcpy(name, port.devname, name_size);
+    }
+    return error;
+}
+
 int
 dpif_delete(struct dpif *dpif)
 {
@@ -581,7 +597,7 @@ int
 dpifmon_create(const char *datapath_name, struct dpifmon **monp)
 {
     struct dpifmon *mon;
-    struct odp_port local;
+    char local_name[IFNAMSIZ];
     int error;
 
     mon = *monp = xmalloc(sizeof *mon);
@@ -590,16 +606,16 @@ dpifmon_create(const char *datapath_name, struct dpifmon **monp)
     if (error) {
         goto error;
     }
-    error = dpif_port_query_by_number(&mon->dpif, ODPP_LOCAL, &local);
+    error = dpif_get_name(&mon->dpif, local_name, sizeof local_name);
     if (error) {
         goto error_close_dpif;
     }
 
-    mon->local_ifindex = if_nametoindex(local.devname);
+    mon->local_ifindex = if_nametoindex(local_name);
     if (!mon->local_ifindex) {
         error = errno;
         VLOG_WARN("could not get ifindex of %s device: %s",
-                  local.devname, strerror(errno));
+                  local_name, strerror(errno));
         goto error_close_dpif;
     }
 
diff --git a/lib/dpif.h b/lib/dpif.h
index c8e7a437..6067188e 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -56,6 +56,8 @@ int dpif_open(const char *name, struct dpif *);
 int dpif_create(const char *name, struct dpif *);
 void dpif_close(struct dpif *);
 
+int dpif_get_name(struct dpif *, char *name, size_t name_size);
+
 int dpif_delete(struct dpif *);
 
 int dpif_get_dp_stats(const struct dpif *, struct odp_stats *);
diff --git a/secchan/discovery.c b/secchan/discovery.c
index 087fa2a1..2651a9b4 100644
--- a/secchan/discovery.c
+++ b/secchan/discovery.c
@@ -35,6 +35,7 @@
 #include "discovery.h"
 #include <errno.h>
 #include <inttypes.h>
+#include <net/if.h>
 #include <regex.h>
 #include <stdlib.h>
 #include <string.h>
@@ -115,7 +116,7 @@ discovery_create(const char *re, bool update_resolv_conf,
                  struct discovery **discoveryp)
 {
     struct discovery *d;
-    struct odp_port port;
+    char local_name[IF_NAMESIZE];
     int error;
 
     d = xcalloc(1, sizeof *d);
@@ -128,12 +129,12 @@ discovery_create(const char *re, bool update_resolv_conf,
     d->update_resolv_conf = update_resolv_conf;
 
     /* Initialize DHCP client. */
-    error = dpif_port_query_by_number(dpif, ODPP_LOCAL, &port);
+    error = dpif_get_name(dpif, local_name, sizeof local_name);
     if (error) {
         VLOG_ERR("failed to query datapath local port: %s", strerror(error));
         goto error_regfree;
     }
-    error = dhclient_create(port.devname, modify_dhcp_request,
+    error = dhclient_create(local_name, modify_dhcp_request,
                             validate_dhcp_offer, d, &d->dhcp);
     if (error) {
         VLOG_ERR("failed to initialize DHCP client: %s", strerror(error));
diff --git a/secchan/in-band.c b/secchan/in-band.c
index fe1301f0..c5793f08 100644
--- a/secchan/in-band.c
+++ b/secchan/in-band.c
@@ -36,6 +36,7 @@
 #include <arpa/inet.h>
 #include <errno.h>
 #include <inttypes.h>
+#include <net/if.h>
 #include <string.h>
 #include "dpif.h"
 #include "flow.h"
@@ -248,20 +249,19 @@ in_band_create(struct dpif *dpif, struct switch_status *ss,
 {
     struct in_band *in_band;
     struct netdev *netdev;
-    struct odp_port port;
+    char local_name[IF_NAMESIZE];
     int error;
 
     *in_bandp = NULL;
-    error = dpif_port_query_by_number(dpif, ODPP_LOCAL, &port);
+    error = dpif_get_name(dpif, local_name, sizeof local_name);
     if (error) {
-        VLOG_ERR("failed to query datapath local port: %s", strerror(error));
         return error;
     }
 
-    error = netdev_open(port.devname, NETDEV_ETH_TYPE_NONE, &netdev);
+    error = netdev_open(local_name, NETDEV_ETH_TYPE_NONE, &netdev);
     if (error) {
         VLOG_ERR("failed to open %s network device: %s",
-                 port.devname, strerror(error));
+                 local_name, strerror(error));
         return error;
     }
 
diff --git a/secchan/ofproto.c b/secchan/ofproto.c
index bc632767..9092723c 100644
--- a/secchan/ofproto.c
+++ b/secchan/ofproto.c
@@ -35,6 +35,7 @@
 #include "ofproto.h"
 #include <errno.h>
 #include <inttypes.h>
+#include <net/if.h>
 #include <netinet/in.h>
 #include <stdbool.h>
 #include <stdlib.h>
@@ -2797,20 +2798,18 @@ send_packet_in_miss(struct ofpbuf *packet, void *p_)
 static uint64_t
 pick_datapath_id(struct dpif *dpif, uint64_t fallback_dpid)
 {
-    struct odp_port port;
+    char local_name[IF_NAMESIZE];
     uint8_t ea[ETH_ADDR_LEN];
     int error;
 
-    error = dpif_port_query_by_number(dpif, ODPP_LOCAL, &port);
+    error = dpif_get_name(dpif, local_name, sizeof local_name);
     if (!error) {
-        error = netdev_nodev_get_etheraddr(port.devname, ea);
+        error = netdev_nodev_get_etheraddr(local_name, ea);
         if (!error) {
             return eth_addr_to_uint64(ea);
         }
         VLOG_WARN("could not get MAC address for %s (%s)",
-                  port.devname, strerror(error));
-    } else {
-        VLOG_WARN("datapath local port query failed (%s)", strerror(error));
+                  local_name, strerror(error));
     }
 
     return fallback_dpid;
-- 
2.30.2