]> git.proxmox.com Git - ovs.git/commitdiff
route-table-bsd: Provide gateway info
authorYAMAMOTO Takashi <yamamoto@valinux.co.jp>
Mon, 17 Nov 2014 05:29:39 +0000 (14:29 +0900)
committerYAMAMOTO Takashi <yamamoto@valinux.co.jp>
Wed, 10 Dec 2014 04:38:03 +0000 (13:38 +0900)
For userspace tunneling.

Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Acked-by: Ben Pfaff <blp@nicira.com>
lib/route-table-bsd.c

index 09f9894a73d45d1fc1e1fbf16a98b9bb190819ae..d40dd7e3d5cdc2ef331f2abaab5be4021dd7f500 100644 (file)
@@ -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