aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYAMAMOTO Takashi <yamamoto@valinux.co.jp>2014-11-17 14:29:39 +0900
committerYAMAMOTO Takashi <yamamoto@valinux.co.jp>2014-12-10 13:38:03 +0900
commita7701e29b215106c0fb73adddd079dbc0f23ce2d (patch)
tree4275a071f9ded45be8af3740a8b2fd09b6a39ed7
parent88ffdc93c8d287effd6eeeb8db149ff1da9ff4bd (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.c12
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