]> git.puffer.fish Git - matthieu/frr.git/commitdiff
babeld: Don't use an ifindex when installing IPv4 routes.
authorJuliusz Chroboczek <jch@pps.jussieu.fr>
Thu, 9 Feb 2012 11:29:10 +0000 (12:29 +0100)
committerPaul Jakma <paul@quagga.net>
Sun, 25 Mar 2012 16:06:53 +0000 (17:06 +0100)
Stand-alone babeld installs routes using both a next-hop gateway
and an interface index.  Unfortunately, this doesn't work for IPv4
under Quagga.

We now ignore the ifindex when installing IPv4 routes, which makes
Babel work for IPv4 in prefix-based networks.  Of course this breaks
IPv4 mesh networks, unless you play some tricks with your interfaces'
netmasks.

babeld/kernel_zebra.c

index f23403ecae5dde1ce49dd98cbf4a2d9af2a360e5..1df4217f0fa3de53cd98c41e1317bb7c9ffe5cb4 100644 (file)
@@ -157,7 +157,6 @@ static int
 kernel_route_add_v4(const unsigned char *pref, unsigned short plen,
                     const unsigned char *gate, int ifindex, unsigned int metric)
 {
-    unsigned int tmp_ifindex = ifindex; /* (for typing) */
     struct zapi_ipv4 api;               /* quagga's communication system */
     struct prefix_ipv4 quagga_prefix;   /* quagga's prefix */
     struct in_addr babel_prefix_addr;   /* babeld's prefix addr */
@@ -180,12 +179,17 @@ kernel_route_add_v4(const unsigned char *pref, unsigned short plen,
     api.flags = 0;
     api.message = 0;
     api.safi = SAFI_UNICAST;
+
+    /* Unlike the native Linux and BSD interfaces, Quagga doesn't like
+       there to be both and IPv4 nexthop and an ifindex.  Omit the
+       ifindex, and assume that the connected prefixes be set up
+       correctly. */
+
     SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
     api.nexthop_num = 1;
     api.nexthop = &nexthop_pointer;
-    SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
-    api.ifindex_num = 1;
-    api.ifindex = &tmp_ifindex;
+    api.ifindex_num = 0;
+
     SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
     api.metric = metric;
 
@@ -240,7 +244,6 @@ kernel_route_delete_v4(const unsigned char *pref, unsigned short plen,
                        const unsigned char *gate, int ifindex,
                        unsigned int metric)
 {
-    unsigned int tmp_ifindex = ifindex; /* (for typing) */
     struct zapi_ipv4 api;               /* quagga's communication system */
     struct prefix_ipv4 quagga_prefix;   /* quagga's prefix */
     struct in_addr babel_prefix_addr;   /* babeld's prefix addr */
@@ -266,9 +269,7 @@ kernel_route_delete_v4(const unsigned char *pref, unsigned short plen,
     SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
     api.nexthop_num = 1;
     api.nexthop = &nexthop_pointer;
-    SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
-    api.ifindex_num = 1;
-    api.ifindex = &tmp_ifindex;
+    api.ifindex_num = 0;
     SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
     api.metric = metric;