summaryrefslogtreecommitdiff
path: root/lib/ovs-router.c
diff options
context:
space:
mode:
authorPravin B Shelar <pshelar@ovn.org>2016-03-24 09:30:57 -0700
committerPravin B Shelar <pshelar@ovn.org>2016-03-24 09:30:57 -0700
commitec6c537986b4c7dc852575107e32184b33d974e8 (patch)
tree462ea495258de0f76666414d0c96108f1cc71fb9 /lib/ovs-router.c
parent6b6e13293e825dc69937615f42fc99eb023c9086 (diff)
downloadopenvswitch-ec6c537986b4c7dc852575107e32184b33d974e8.tar.gz
sflow: use ovs route API to get source IP address.
Signed-off-by: Pravin B Shelar <pshelar@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'lib/ovs-router.c')
-rw-r--r--lib/ovs-router.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/lib/ovs-router.c b/lib/ovs-router.c
index 82923ff26..0d52bf935 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