]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Changes to interface handling on traditional Unices:
authorMartin Mares <mj@ucw.cz>
Tue, 3 Aug 1999 19:30:20 +0000 (19:30 +0000)
committerMartin Mares <mj@ucw.cz>
Tue, 3 Aug 1999 19:30:20 +0000 (19:30 +0000)
  o  Aliases are interpreted as secondary addresses.
  o  When the system doesn't supply interface indices, generate
     our ones.

TODO
sysdep/unix/krt-iface.c

diff --git a/TODO b/TODO
index cfad917080dc66b1330ce678267158af8a007d59..9eaf272dd5201e6b92220ebe56f0ebca0887154f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -4,8 +4,6 @@ Core
 
 - io.c: refuse old-style multicasts for unnumbered interfaces?
 
-- prefer loopback addresses as router IDs (dummy interface?)
-
 - config: executable config files
 
 - do we really need preconfig?
@@ -13,7 +11,6 @@ Core
 - counters (according to SNMP MIB?)
 - better memory allocators
 - default preferences of protocols: prefer BGP over OSPF/RIP external routes?
-- secondary addresses -> subinterfaces or ignore
 
 - static: check validity of route destination?
 
@@ -23,8 +20,6 @@ Core
 
 - netlink: import Linux route attributes to our rta's, so that they can be filtered?
 
-- iface: when seen an invalid broadcast, fix it up or at least report
-- iface: we always need ifindex at least for PtP links (OSPF)
 - iface: interface filters should support filtering by IP address as well
 - iface: SIOCGIFINDEX exists on glibc systems, but it doesn't work on 2.0.x kernels!
 
index 57692ebc9f1e6f537730b22ed381de82fa1bfa13..0cc5662cd912b2ad1bbb657b179cff139e86fd58 100644 (file)
@@ -32,10 +32,11 @@ scan_ifs(struct ifreq *r, int cnt)
 {
   struct iface i, *pi;
   struct ifa a;
-  char *err;
+  char *err, *colon;
   unsigned fl;
   ip_addr netmask;
   int l;
+  int sec = 0;
 
   if_start_update();
   for (cnt /= sizeof(struct ifreq); cnt; cnt--, r++)
@@ -43,11 +44,11 @@ scan_ifs(struct ifreq *r, int cnt)
       bzero(&i, sizeof(i));
       bzero(&a, sizeof(a));
       DBG("%s\n", r->ifr_name);
-      if (strchr(r->ifr_name, ':'))
+      if (colon = strchr(r->ifr_name, ':'))
        {
-         /* FIXME: Honour aliases as secondary addresses? */
-         DBG("Alias, ignored.\n");
-         continue;
+         /* It's an alias -- let's interpret it as a secondary interface address */
+         sec = 1;
+         *colon = 0;
        }
       strncpy(i.name, r->ifr_name, sizeof(i.name) - 1);
       get_sockaddr((struct sockaddr_in *) &r->ifr_addr, &a.ip, NULL);
@@ -135,10 +136,27 @@ scan_ifs(struct ifreq *r, int cnt)
       else
        i.index = r->ifr_ifindex;
 #else
-      /* FIXME: What else? Guess ifindex (we need it at least for OSPF on unnumbered links)? */
+      /*
+       *  The kernel doesn't give us real ifindices, but we still need them
+       *  at least for OSPF unnumbered links. So let's make them up ourselves.
+       */
+      if (pi = if_find_by_name(i.name))
+       i.index = pi->index;
+      else
+       {
+         static int if_index_counter = 1;
+         i.index = if_index_counter++;
+       }
 #endif
 
-      pi = if_update(&i);
+      pi = NULL;
+      if (sec)
+       {
+         a.flags |= IA_SECONDARY;
+         pi = if_find_by_index(i.index);
+       }
+      if (!pi)
+       pi = if_update(&i);
       a.iface = pi;
       ifa_update(&a);
     }