diff options
author | Paul Jakma <paul.jakma@sun.com> | 2007-04-10 19:24:45 +0000 |
---|---|---|
committer | Paul Jakma <paul.jakma@sun.com> | 2007-04-10 19:24:45 +0000 |
commit | 6dc686a29ecdfa8f8011eee17e4e6276ab175a0d (patch) | |
tree | bd4a1f7b1c32318584bec6b4f420089aadc81b07 | |
parent | 37a217a59bfd32381034a0ce0adbac1c34cbec37 (diff) |
[zebra] Bug #351: Don't redistribute routes to ipv4 link-local prefixes
2007-04-07 Paul Jakma <paul.jakma@sun.com>
* lib/prefix.h: Add define to match IPv4 Link-Local addresses
* zebra/redistribute.c: (zebra_check_addr) Don't redistribute routes
to IPv4 link-local prefixes, fixes bug #351.
* zebra/redistribute.h: Export zebra_check_addr.
* zebra/router-id.c: (router_id_bad_address) re-use zebra_check_addr
rather than implementing similar logic.
-rw-r--r-- | lib/ChangeLog | 4 | ||||
-rw-r--r-- | lib/prefix.h | 1 | ||||
-rw-r--r-- | zebra/ChangeLog | 8 | ||||
-rw-r--r-- | zebra/redistribute.c | 6 | ||||
-rw-r--r-- | zebra/redistribute.h | 2 | ||||
-rw-r--r-- | zebra/router-id.c | 14 |
6 files changed, 24 insertions, 11 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index 99b82b1f..c58fef29 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,7 @@ +2007-04-07 Paul Jakma <paul.jakma@sun.com> + + * prefix.h: Add define to match IPv4 Link-Local addresses + 2007-03-20 Andrew J. Schorr <ajschorr@alumni.princeton.edu> * log.c: (mes_lookup) Make the function more robust: check for diff --git a/lib/prefix.h b/lib/prefix.h index f2a2adfa..9cfc1556 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -111,6 +111,7 @@ struct prefix_rd #define IPV4_NET0(a) ((((u_int32_t) (a)) & 0xff000000) == 0x00000000) #define IPV4_NET127(a) ((((u_int32_t) (a)) & 0xff000000) == 0x7f000000) +#define IPV4_LINKLOCAL(a) ((((u_int32_t) (a)) & 0xffff0000) == 0xa9fe0000) /* Max bit/byte length of IPv6 address. */ #define IPV6_MAX_BYTELEN 16 diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 97dcd5f5..602de50d 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,11 @@ +2007-04-07 Paul Jakma <paul.jakma@sun.com> + + * redistribute.c: (zebra_check_addr) Don't redistribute routes + to IPv4 link-local prefixes, fixes bug #351. + * redistribute.h: Export zebra_check_addr. + * router-id.c: (router_id_bad_address) re-use zebra_check_addr + rather than implementing similar logic. + 2007-03-06 Paul Jakma <paul.jakma@sun.com> * kernel_socket.c: (ifam_read) Do not update interface metric on diff --git a/zebra/redistribute.c b/zebra/redistribute.c index 677e6f90..b7bd5674 100644 --- a/zebra/redistribute.c +++ b/zebra/redistribute.c @@ -40,7 +40,7 @@ /* master zebra server structure */ extern struct zebra_t zebrad; -static int +int zebra_check_addr (struct prefix *p) { if (p->family == AF_INET) @@ -50,7 +50,9 @@ zebra_check_addr (struct prefix *p) addr = p->u.prefix4.s_addr; addr = ntohl (addr); - if (IPV4_NET127 (addr) || IN_CLASSD (addr)) + if (IPV4_NET127 (addr) + || IN_CLASSD (addr) + || IPV4_LINKLOCAL(addr)) return 0; } #ifdef HAVE_IPV6 diff --git a/zebra/redistribute.h b/zebra/redistribute.h index 9e78dfde..9ed99bc5 100644 --- a/zebra/redistribute.h +++ b/zebra/redistribute.h @@ -46,5 +46,7 @@ extern void zebra_interface_address_add_update (struct interface *, extern void zebra_interface_address_delete_update (struct interface *, struct connected *c); +extern int zebra_check_addr (struct prefix *); + #endif /* _ZEBRA_REDISTRIBUTE_H */ diff --git a/zebra/router-id.c b/zebra/router-id.c index c73b65b5..41bab545 100644 --- a/zebra/router-id.c +++ b/zebra/router-id.c @@ -39,6 +39,7 @@ #include "zebra/zserv.h" #include "zebra/router-id.h" +#include "zebra/redistribute.h" static struct list rid_all_sorted_list; static struct list rid_lo_sorted_list; @@ -63,18 +64,13 @@ router_id_find_node (struct list *l, struct connected *ifc) static int router_id_bad_address (struct connected *ifc) { - struct prefix n; - if (ifc->address->family != AF_INET) return 1; - - n.u.prefix4.s_addr = htonl (INADDR_LOOPBACK); - n.prefixlen = 8; - n.family = AF_INET; - - if (prefix_match (&n, ifc->address)) + + /* non-redistributable addresses shouldn't be used for RIDs either */ + if (!zebra_check_addr (ifc->address)) return 1; - + return 0; } |