[ovs-dev] [PATCH ovs V3 20/25] netdev-vport: Implement netdev vport get_ifindex on Linux

Roi Dayan roid at mellanox.com
Wed Feb 8 15:29:33 UTC 2017


From: Paul Blakey <paulb at mellanox.com>

We want to use this later in the HW offloading implementation
which we currently also support Linux only.

Signed-off-by: Paul Blakey <paulb at mellanox.com>
Reviewed-by: Roi Dayan <roid at mellanox.com>
---
 lib/netdev-linux.c |  7 +++----
 lib/netdev-linux.h |  2 ++
 lib/netdev-vport.c | 27 +++++++++++++++++----------
 3 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index 124d2c3..a48c6d9 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -531,7 +531,6 @@ static int set_flags(const char *, unsigned int flags);
 static int update_flags(struct netdev_linux *netdev, enum netdev_flags off,
                         enum netdev_flags on, enum netdev_flags *old_flagsp)
     OVS_REQUIRES(netdev->mutex);
-static int do_get_ifindex(const char *netdev_name);
 static int get_ifindex(const struct netdev *, int *ifindexp);
 static int do_set_addr(struct netdev *netdev,
                        int ioctl_nr, const char *ioctl_name,
@@ -5374,8 +5373,8 @@ set_flags(const char *name, unsigned int flags)
     return af_inet_ifreq_ioctl(name, &ifr, SIOCSIFFLAGS, "SIOCSIFFLAGS");
 }
 
-static int
-do_get_ifindex(const char *netdev_name)
+int
+linux_get_ifindex(const char *netdev_name)
 {
     struct ifreq ifr;
     int error;
@@ -5398,7 +5397,7 @@ get_ifindex(const struct netdev *netdev_, int *ifindexp)
     struct netdev_linux *netdev = netdev_linux_cast(netdev_);
 
     if (!(netdev->cache_valid & VALID_IFINDEX)) {
-        int ifindex = do_get_ifindex(netdev_get_name(netdev_));
+        int ifindex = linux_get_ifindex(netdev_get_name(netdev_));
 
         if (ifindex < 0) {
             netdev->get_ifindex_error = -ifindex;
diff --git a/lib/netdev-linux.h b/lib/netdev-linux.h
index d944691..880f864 100644
--- a/lib/netdev-linux.h
+++ b/lib/netdev-linux.h
@@ -27,6 +27,7 @@ struct netdev;
 
 int netdev_linux_ethtool_set_flag(struct netdev *netdev, uint32_t flag,
                                   const char *flag_name, bool enable);
+int linux_get_ifindex(const char *netdev_name);
 
 #define LINUX_FLOW_OFFLOAD_API                                  \
             netdev_tc_flow_flush,                               \
@@ -37,4 +38,5 @@ int netdev_linux_ethtool_set_flag(struct netdev *netdev, uint32_t flag,
             netdev_tc_flow_get,                                 \
             netdev_tc_flow_del,                                 \
             netdev_tc_init_flow_api
+
 #endif /* netdev-linux.h */
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index 8cb03e6..befa4e4 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -45,6 +45,7 @@
 #include "unaligned.h"
 #include "unixctl.h"
 #include "openvswitch/vlog.h"
+#include "netdev-linux.h"
 
 VLOG_DEFINE_THIS_MODULE(netdev_vport);
 
@@ -783,7 +784,8 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats)
 #define VPORT_FUNCTIONS(GET_CONFIG, SET_CONFIG,             \
                         GET_TUNNEL_CONFIG, GET_STATUS,      \
                         BUILD_HEADER,                       \
-                        PUSH_HEADER, POP_HEADER)            \
+                        PUSH_HEADER, POP_HEADER,            \
+                        GET_IFINDEX)                        \
     NULL,                                                   \
     netdev_vport_run,                                       \
     netdev_vport_wait,                                      \
@@ -808,7 +810,7 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats)
     netdev_vport_get_etheraddr,                             \
     NULL,                       /* get_mtu */               \
     NULL,                       /* set_mtu */               \
-    NULL,                       /* get_ifindex */           \
+    GET_IFINDEX,                                            \
     NULL,                       /* get_carrier */           \
     NULL,                       /* get_carrier_resets */    \
     NULL,                       /* get_miimon */            \
@@ -859,14 +861,16 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats)
     NULL,                   /* init_flow_api */
 
 
-#define TUNNEL_CLASS(NAME, DPIF_PORT, BUILD_HEADER, PUSH_HEADER, POP_HEADER)   \
+#define TUNNEL_CLASS(NAME, DPIF_PORT, BUILD_HEADER, PUSH_HEADER, POP_HEADER,   \
+                     GET_IFINDEX)                                              \
     { DPIF_PORT,                                                               \
         { NAME, false,                                                         \
           VPORT_FUNCTIONS(get_tunnel_config,                                   \
                           set_tunnel_config,                                   \
                           get_netdev_tunnel_config,                            \
                           tunnel_get_status,                                   \
-                          BUILD_HEADER, PUSH_HEADER, POP_HEADER) }}
+                          BUILD_HEADER, PUSH_HEADER, POP_HEADER,               \
+                          GET_IFINDEX) }}
 
 void
 netdev_vport_tunnel_register(void)
@@ -876,15 +880,18 @@ netdev_vport_tunnel_register(void)
     static const struct vport_class vport_classes[] = {
         TUNNEL_CLASS("geneve", "genev_sys", netdev_geneve_build_header,
                                             netdev_tnl_push_udp_header,
-                                            netdev_geneve_pop_header),
+                                            netdev_geneve_pop_header,
+                                            NULL),
         TUNNEL_CLASS("gre", "gre_sys", netdev_gre_build_header,
                                        netdev_gre_push_header,
-                                       netdev_gre_pop_header),
+                                       netdev_gre_pop_header,
+                                       NULL),
         TUNNEL_CLASS("vxlan", "vxlan_sys", netdev_vxlan_build_header,
                                            netdev_tnl_push_udp_header,
-                                           netdev_vxlan_pop_header),
-        TUNNEL_CLASS("lisp", "lisp_sys", NULL, NULL, NULL),
-        TUNNEL_CLASS("stt", "stt_sys", NULL, NULL, NULL),
+                                           netdev_vxlan_pop_header,
+                                           NETDEV_VPORT_GET_IFINDEX),
+        TUNNEL_CLASS("lisp", "lisp_sys", NULL, NULL, NULL, NULL),
+        TUNNEL_CLASS("stt", "stt_sys", NULL, NULL, NULL, NULL),
     };
     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
 
@@ -911,6 +918,6 @@ netdev_vport_patch_register(void)
               VPORT_FUNCTIONS(get_patch_config,
                               set_patch_config,
                               NULL,
-                              NULL, NULL, NULL, NULL) }};
+                              NULL, NULL, NULL, NULL, NULL) }};
     netdev_register_provider(&patch_class.netdev_class);
 }
-- 
2.7.4



More information about the dev mailing list