summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-08-03 19:30:20 +0000
committerMartin Mares <mj@ucw.cz>1999-08-03 19:30:20 +0000
commit9273035403ace754e5b405b2c5efba7d55c28e78 (patch)
tree03676b9f2022e1fb7715616cb8ac3871f731730b
parent5e13ffe6f4e229974238bb2ea96ea2ce8282b7ed (diff)
Changes to interface handling on traditional Unices:
o Aliases are interpreted as secondary addresses. o When the system doesn't supply interface indices, generate our ones.
-rw-r--r--TODO5
-rw-r--r--sysdep/unix/krt-iface.c32
2 files changed, 25 insertions, 12 deletions
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);
}