Signed-off-by: Pravin B Shelar <pshe...@nicira.com> Acked-by: Ben Pfaff <b...@ovn.org> --- 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 82923ff..0d52bf9 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 76a8d3d..34d42cf 100644 --- a/lib/route-table-bsd.c +++ b/lib/route-table-bsd.c @@ -44,8 +44,10 @@ VLOG_DEFINE_THIS_MODULE(route_table_bsd); #endif 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]; @@ -62,6 +64,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); @@ -142,7 +149,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) { @@ -160,8 +167,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; } } -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev