diff options
author | YAMAMOTO Takashi <yamamoto@valinux.co.jp> | 2014-11-17 14:29:39 +0900 |
---|---|---|
committer | YAMAMOTO Takashi <yamamoto@valinux.co.jp> | 2014-12-10 13:38:03 +0900 |
commit | a7701e29b215106c0fb73adddd079dbc0f23ce2d (patch) | |
tree | 4275a071f9ded45be8af3740a8b2fd09b6a39ed7 | |
parent | 88ffdc93c8d287effd6eeeb8db149ff1da9ff4bd (diff) |
route-table-bsd: Provide gateway info
For userspace tunneling.
Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Acked-by: Ben Pfaff <blp@nicira.com>
-rw-r--r-- | lib/route-table-bsd.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/route-table-bsd.c b/lib/route-table-bsd.c index 09f9894a7..d40dd7e3d 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 |