[ovs-dev] [PATCH v2 7/7] sflow: use ovs route API to get source IP address.

Pravin B Shelar pshelar at ovn.org
Tue Mar 15 16:57:33 UTC 2016


Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
---
 lib/ovs-router.c             | 33 +++++++++++++++++++--------------
 lib/ovs-router.h             |  1 -
 lib/route-table-bsd.c        | 15 +++++++++++----
 lib/route-table-stub.c       |  8 ++++----
 lib/route-table.c            |  8 ++++----
 lib/route-table.h            |  6 ++++--
 ofproto/ofproto-dpif-sflow.c |  8 +++++---
 7 files changed, 47 insertions(+), 32 deletions(-)

diff --git a/lib/ovs-router.c b/lib/ovs-router.c
index 9eaa128..5146f27 100644
--- a/lib/ovs-router.c
+++ b/lib/ovs-router.c
@@ -69,6 +69,24 @@ ovs_router_entry_cast(const struct cls_rule *cr)
     }
 }
 
+static bool
+ovs_router_lookup_fallback(const struct in6_addr *ip6_dst, char output_bridge[],
+                           struct in6_addr *src6, struct in6_addr *gw6)
+{
+    ovs_be32 src;
+
+    if (!route_table_fallback_lookup(ip6_dst, output_bridge, gw6)) {
+        return false;
+    }
+    if (netdev_get_in4_by_name(output_bridge, (struct in_addr *)&src)) {
+        return false;
+    }
+    if (src6) {
+        in6_addr_set_mapped_ipv4(src6, src);
+    }
+    return true;
+}
+
 bool
 ovs_router_lookup(const struct in6_addr *ip6_dst, char output_bridge[],
                   struct in6_addr *src, struct in6_addr *gw)
@@ -87,20 +105,7 @@ ovs_router_lookup(const struct in6_addr *ip6_dst, char output_bridge[],
         }
         return true;
     }
-    return false;
-}
-
-bool
-ovs_router_lookup4(ovs_be32 ip_dst, char output_bridge[], ovs_be32 *gw)
-{
-    struct in6_addr ip6_dst = in6_addr_mapped_ipv4(ip_dst);
-    struct in6_addr gw6;
-
-    if (ovs_router_lookup(&ip6_dst, output_bridge, NULL, &gw6)) {
-        *gw = in6_addr_get_mapped_ipv4(&gw6);
-        return true;
-    }
-    return route_table_fallback_lookup(ip_dst, output_bridge, gw);
+    return ovs_router_lookup_fallback(ip6_dst, output_bridge, src, gw);
 }
 
 static void
diff --git a/lib/ovs-router.h b/lib/ovs-router.h
index 9ac61ce..9cb7509 100644
--- a/lib/ovs-router.h
+++ b/lib/ovs-router.h
@@ -27,7 +27,6 @@ extern "C" {
 
 bool ovs_router_lookup(const struct in6_addr *ip_dst, char out_dev[],
                        struct in6_addr *src, struct in6_addr *gw);
-bool ovs_router_lookup4(ovs_be32 ip_dst, char out_dev[], ovs_be32 *gw);
 void ovs_router_init(void);
 void ovs_router_insert(const struct in6_addr *ip_dst, uint8_t plen,
                        const char output_bridge[], const struct in6_addr *gw);
diff --git a/lib/route-table-bsd.c b/lib/route-table-bsd.c
index b5ff3cc..b16bc18 100644
--- a/lib/route-table-bsd.c
+++ b/lib/route-table-bsd.c
@@ -39,8 +39,10 @@
 VLOG_DEFINE_THIS_MODULE(route_table_bsd);
 
 bool
-route_table_fallback_lookup(ovs_be32 ip, char name[], ovs_be32 *gw)
+route_table_fallback_lookup(const struct in6_addr *ip6_dst, char name[],
+                            struct in6_addr *gw6)
 {
+    ovs_be32 ip;
     struct {
         struct rt_msghdr rtm;
         char space[512];
@@ -57,6 +59,11 @@ route_table_fallback_lookup(ovs_be32 ip, char name[], ovs_be32 *gw)
     bool got_ifp = false;
     unsigned int retry_count = 5;  /* arbitrary */
 
+    if (!IN6_IS_ADDR_V4MAPPED(ip6_dst)) {
+        return false;
+    }
+    ip = in6_addr_get_mapped_ipv4(ip6_dst);
+
     VLOG_DBG("looking route up for " IP_FMT " pid %" PRIuMAX,
         IP_ARGS(ip), (uintmax_t)pid);
 
@@ -137,7 +144,7 @@ retry:
         return false;
     }
 
-    *gw = 0;
+    *gw6 = in6addr_any;
     sa = (struct sockaddr *)(rtm + 1);
     for (i = 1; i; i <<= 1) {
         if (rtm->rtm_addrs & i) {
@@ -155,8 +162,8 @@ retry:
                 const struct sockaddr_in *sin_dst =
                     ALIGNED_CAST(struct sockaddr_in *, sa);
 
-                *gw = sin_dst->sin_addr.s_addr;
-                VLOG_DBG("got gateway " IP_FMT, IP_ARGS(*gw));
+                in6_addr_set_mapped_ipv4(gw6, sin_dst->sin_addr.s_addr);
+                VLOG_DBG("got gateway " IP_FMT, IP_ARGS(sin_dst->sin_addr.s_addr));
             }
 #if defined(__FreeBSD__)
             sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa));
diff --git a/lib/route-table-stub.c b/lib/route-table-stub.c
index 70b1a3d..dd0b096 100644
--- a/lib/route-table-stub.c
+++ b/lib/route-table-stub.c
@@ -19,11 +19,11 @@
 #include "route-table.h"
 
 bool
-route_table_fallback_lookup(ovs_be32 ip_dst OVS_UNUSED,
-                            char output_bridge[] OVS_UNUSED,
-                            ovs_be32 *gw)
+route_table_fallback_lookup(const struct in6_addr *ip6_dst OVS_UNUSED,
+                            char name[] OVS_UNUSED,
+                            struct in6_addr *gw6)
 {
-    *gw = 0;
+    *gw6 = in6addr_any;
     return false;
 }
 
diff --git a/lib/route-table.c b/lib/route-table.c
index 649b656..f45f9fd 100644
--- a/lib/route-table.c
+++ b/lib/route-table.c
@@ -308,11 +308,11 @@ route_map_clear(void)
 }
 
 bool
-route_table_fallback_lookup(ovs_be32 ip_dst OVS_UNUSED,
-                            char output_bridge[] OVS_UNUSED,
-                            ovs_be32 *gw)
+route_table_fallback_lookup(const struct in6_addr *ip6_dst OVS_UNUSED,
+                            char name[] OVS_UNUSED,
+                            struct in6_addr *gw6)
 {
-    *gw = 0;
+    *gw6 = in6addr_any;
     return false;
 }
 
diff --git a/lib/route-table.h b/lib/route-table.h
index 54d77f4..3a02d73 100644
--- a/lib/route-table.h
+++ b/lib/route-table.h
@@ -20,6 +20,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <net/if.h>
+#include <netinet/in.h>
 #include <stdbool.h>
 #include <stdint.h>
 
@@ -29,6 +30,7 @@ uint64_t route_table_get_change_seq(void);
 void route_table_init(void);
 void route_table_run(void);
 void route_table_wait(void);
-bool route_table_fallback_lookup(ovs_be32, char [], ovs_be32 *);
-
+bool route_table_fallback_lookup(const struct in6_addr *ip6_dst,
+                                 char name[],
+                                 struct in6_addr *gw6);
 #endif /* route-table.h */
diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
index f11699c..df915ff 100644
--- a/ofproto/ofproto-dpif-sflow.c
+++ b/ofproto/ofproto-dpif-sflow.c
@@ -453,10 +453,12 @@ sflow_choose_agent_address(const char *agent_device,
 
         if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, &sa.ss)
             && sa.ss.ss_family == AF_INET) {
-            ovs_be32 gw;
+            struct in6_addr addr6, src, gw;
 
-            if (ovs_router_lookup4(sa.sin.sin_addr.s_addr, name, &gw)
-                && !netdev_get_in4_by_name(name, &in4)) {
+            in6_addr_set_mapped_ipv4(&addr6, sa.sin.sin_addr.s_addr);
+            if (ovs_router_lookup(&addr6, name, &src, &gw)) {
+
+                in4.s_addr = in6_addr_get_mapped_ipv4(&src);
                 goto success;
             }
         }
-- 
2.5.0




More information about the dev mailing list