diff --git a/TODO b/TODO index cfad9170..9eaf272d 100644 --- 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! diff --git a/sysdep/unix/krt-iface.c b/sysdep/unix/krt-iface.c index 57692ebc..0cc5662c 100644 --- a/sysdep/unix/krt-iface.c +++ b/sysdep/unix/krt-iface.c @@ -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); }