summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Jakma <paul.jakma@sun.com>2007-04-10 19:24:45 +0000
committerPaul Jakma <paul.jakma@sun.com>2007-04-10 19:24:45 +0000
commit6dc686a29ecdfa8f8011eee17e4e6276ab175a0d (patch)
treebd4a1f7b1c32318584bec6b4f420089aadc81b07
parent37a217a59bfd32381034a0ce0adbac1c34cbec37 (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/ChangeLog4
-rw-r--r--lib/prefix.h1
-rw-r--r--zebra/ChangeLog8
-rw-r--r--zebra/redistribute.c6
-rw-r--r--zebra/redistribute.h2
-rw-r--r--zebra/router-id.c14
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;
}