For userspace tunneling.
Signed-off-by: YAMAMOTO Takashi <[email protected]>
---
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 3608389..c3119e3 100644
--- a/lib/route-table-bsd.c
+++ b/lib/route-table-bsd.c
@@ -51,6 +51,7 @@ route_table_fallback_lookup(ovs_be32 ip, char name[],
ovs_be32 *gw)
struct sockaddr *sa;
static int seq;
int i, len, namelen, rtsock;
+ bool got_ifp = false;
rtsock = socket(PF_ROUTE, SOCK_RAW, 0);
if (rtsock < 0)
@@ -85,6 +86,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) {
@@ -96,8 +98,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));
@@ -108,7 +114,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
[email protected]
http://openvswitch.org/mailman/listinfo/dev