For userspace tunneling. Signed-off-by: YAMAMOTO Takashi <yamam...@valinux.co.jp> --- lib/route-table-bsd.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/lib/route-table-bsd.c b/lib/route-table-bsd.c index 09f9894..d40dd7e 100644 --- a/lib/route-table-bsd.c +++ b/lib/route-table-bsd.c @@ -47,6 +47,7 @@ route_table_fallback_lookup(ovs_be32 ip, char name[], ovs_be32 *gw) static int seq; int i, len, namelen, rtsock; const pid_t pid = getpid(); + bool got_ifp = false; rtsock = socket(PF_ROUTE, SOCK_RAW, 0); if (rtsock < 0) @@ -81,6 +82,7 @@ route_table_fallback_lookup(ovs_be32 ip, char name[], ovs_be32 *gw) return false; } + *gw = 0; sa = (struct sockaddr *)(rtm + 1); for (i = 1; i; i <<= 1) { if (rtm->rtm_addrs & i) { @@ -92,8 +94,12 @@ route_table_fallback_lookup(ovs_be32 ip, char name[], ovs_be32 *gw) namelen = IFNAMSIZ - 1; memcpy(name, ifp->sdl_data, namelen); name[namelen] = '\0'; - *gw = 0; - return true; + got_ifp = true; + } else if (i == RTA_GATEWAY && sa->sa_family == AF_INET) { + const struct sockaddr_in *sin_dst = + ALIGNED_CAST(struct sockaddr_in *, sa); + + *gw = sin_dst->sin_addr.s_addr; } #if defined(__FreeBSD__) sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa)); @@ -104,7 +110,7 @@ route_table_fallback_lookup(ovs_be32 ip, char name[], ovs_be32 *gw) #endif } } - return false; + return got_ifp; } uint64_t -- 1.9.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev