From b78a42c24d119356e231052a526bf7e05d0d0c9f Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 20 Nov 2015 06:59:12 -0800 Subject: [PATCH 1/3] lib: Fixup a compiler warning on netbsd This code has a compiler warning on some oddball platforms Signed-off-by: Donald Sharp --- lib/log.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/log.c b/lib/log.c index 3fd62d59cf..13fbc00317 100644 --- a/lib/log.c +++ b/lib/log.c @@ -1021,7 +1021,7 @@ zlog_hexdump (void *mem, unsigned int len) { if (j >= len) /* end of block, not really printing */ s += sprintf(s, " "); - else if(isprint(((char*)mem)[j])) /* printable char */ + else if(isprint((int)((char*)mem)[j])) /* printable char */ s += sprintf(s, "%c", 0xFF & ((char*)mem)[j]); else /* other char */ From 8da4e9466a3a3cdbfbc36e92528a9c8f395b230c Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 20 Nov 2015 08:33:30 -0500 Subject: [PATCH 2/3] Quagga: Cleanup RTADV define The RTADV define was not being set correctly or consistently. Make the code consistent with our HAVE_IPV6 define. If the user wants to explicitly turn it off then they should run --disable-rtadv from the configure cli Signed-off-by: Donald Sharp --- zebra/interface.c | 20 ++++++++++---------- zebra/interface.h | 17 ++++------------- zebra/main.c | 6 +++--- zebra/rib.h | 17 ++++------------- zebra/rtadv.c | 4 ++-- zebra/rtadv.h | 4 ++-- 6 files changed, 25 insertions(+), 43 deletions(-) diff --git a/zebra/interface.c b/zebra/interface.c index a3d297d327..884dfedd9e 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -48,11 +48,11 @@ #define ZEBRA_PTM_SUPPORT -#ifdef RTADV +#if defined (HAVE_RTADV) /* Order is intentional. Matches RFC4191. This array is also used for command matching, so only modify with care. */ const char *rtadv_pref_strs[] = { "medium", "high", "INVALID", "low", 0 }; -#endif /* RTADV */ +#endif /* HAVE_RTADV */ /* Called when new interface is added. */ static int @@ -66,7 +66,7 @@ if_zebra_new_hook (struct interface *ifp) zebra_if->shutdown = IF_ZEBRA_SHUTDOWN_OFF; ifp->ptm_enable = zebra_ptm_get_enable_state(); -#ifdef RTADV +#if defined (HAVE_RTADV) { /* Set default router advertise values. */ struct rtadvconf *rtadv; @@ -92,7 +92,7 @@ if_zebra_new_hook (struct interface *ifp) rtadv->AdvPrefixList = list_new (); } -#endif /* RTADV */ +#endif /* HAVE_RTADV */ /* Initialize installed address chains tree. */ zebra_if->ipv4_subnets = route_table_init (); @@ -753,7 +753,7 @@ nbr_connected_dump_vty (struct vty *vty, struct nbr_connected *connected) vty_out (vty, "%s", VTY_NEWLINE); } -#ifdef RTADV +#if defined (HAVE_RTADV) /* Dump interface ND information to vty. */ static void nd_dump_vty (struct vty *vty, struct interface *ifp) @@ -814,7 +814,7 @@ nd_dump_vty (struct vty *vty, struct interface *ifp) VTY_NEWLINE); } } -#endif /* RTADV */ +#endif /* HAVE_RTADV */ /* Interface's information print out to vty interface. */ static void @@ -924,9 +924,9 @@ if_dump_vty (struct vty *vty, struct interface *ifp) connected_dump_vty (vty, connected); } -#ifdef RTADV +#if defined (HAVE_RTADV) nd_dump_vty (vty, ifp); -#endif /* RTADV */ +#endif /* HAVE_RTADV */ if (listhead(ifp->nbr_connected)) vty_out (vty, " Neighbor address(s):%s", VTY_NEWLINE); for (ALL_LIST_ELEMENTS_RO (ifp->nbr_connected, node, nbr_connected)) @@ -1912,9 +1912,9 @@ if_config_write (struct vty *vty) VTY_NEWLINE); } -#ifdef RTADV +#if defined (HAVE_RTADV) rtadv_config_write (vty, ifp); -#endif /* RTADV */ +#endif /* HAVE_RTADV */ #ifdef HAVE_IRDP irdp_config_write (vty, ifp); diff --git a/zebra/interface.h b/zebra/interface.h index ba76d3e845..650b62a458 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -37,16 +37,7 @@ #define IF_ZEBRA_SHUTDOWN_OFF 0 #define IF_ZEBRA_SHUTDOWN_ON 1 -/* Router advertisement feature. */ -#ifndef RTADV -#if (defined(LINUX_IPV6) && (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1)) || defined(KAME) - #ifdef HAVE_RTADV - #define RTADV - #endif -#endif -#endif - -#ifdef RTADV +#if defined (HAVE_RTADV) /* Router advertisement parameter. From RFC4861, RFC6275 and RFC4191. */ struct rtadvconf { @@ -180,7 +171,7 @@ struct rtadvconf #define RTADV_PREF_MEDIUM 0x0 /* Per RFC4191. */ }; -#endif /* RTADV */ +#endif /* HAVE_RTADV */ /* `zebra' daemon local interface structure. */ struct zebra_if @@ -197,9 +188,9 @@ struct zebra_if /* Installed addresses chains tree. */ struct route_table *ipv4_subnets; -#ifdef RTADV +#if defined(HAVE_RTADV) struct rtadvconf rtadv; -#endif /* RTADV */ +#endif /* HAVE_RTADV */ #ifdef HAVE_IRDP struct irdp_interface irdp; diff --git a/zebra/main.c b/zebra/main.c index 4b2a89856e..8048eba71e 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -238,7 +238,7 @@ zebra_vrf_enable (vrf_id_t vrf_id, void **info) assert (zvrf); -#ifdef RTADV +#if defined (HAVE_RTADV) rtadv_init (zvrf); #endif kernel_init (zvrf); @@ -269,7 +269,7 @@ zebra_vrf_disable (vrf_id_t vrf_id, void **info) if_down (ifp); } -#ifdef RTADV +#if defined (HAVE_RTADV) rtadv_terminate (zvrf); #endif kernel_terminate (zvrf); @@ -417,7 +417,7 @@ main (int argc, char **argv) zebra_vty_init (); access_list_init (); prefix_list_init (); -#ifdef RTADV +#if defined (HAVE_RTADV) rtadv_cmd_init (); #endif #ifdef HAVE_IRDP diff --git a/zebra/rib.h b/zebra/rib.h index 3656646c9b..1f045310a5 100644 --- a/zebra/rib.h +++ b/zebra/rib.h @@ -259,16 +259,7 @@ struct static_route : ((tnexthop) = (nexthop)->next)) \ : (((recursing) = 0),((tnexthop) = (tnexthop)->next))) -/* Router advertisement feature. */ -#ifndef RTADV -#if (defined(LINUX_IPV6) && (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1)) || defined(KAME) - #ifdef HAVE_RTADV - #define RTADV - #endif -#endif -#endif - -#if defined (RTADV) +#if defined (HAVE_RTADV) /* Structure which hold status of router advertisement. */ struct rtadv { @@ -280,7 +271,7 @@ struct rtadv struct thread *ra_read; struct thread *ra_timer; }; -#endif /* RTADV */ +#endif /* HAVE_RTADV */ #ifdef HAVE_NETLINK /* Socket interface to kernel */ @@ -338,9 +329,9 @@ struct zebra_vrf struct list *rid_lo_sorted_list; struct prefix rid_user_assigned; -#if defined (RTADV) +#if defined (HAVE_RTADV) struct rtadv rtadv; -#endif /* RTADV */ +#endif /* HAVE_RTADV */ }; /* diff --git a/zebra/rtadv.c b/zebra/rtadv.c index d48f804f77..29a29c4044 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -41,7 +41,7 @@ extern struct zebra_privs_t zserv_privs; -#if defined (HAVE_IPV6) && defined (RTADV) +#if defined (HAVE_IPV6) && defined (HAVE_RTADV) #ifdef OPEN_BSD #include @@ -1863,4 +1863,4 @@ rtadv_cmd_init (void) { /* Empty.*/; } -#endif /* RTADV && HAVE_IPV6 */ +#endif /* HAVE_RTADV && HAVE_IPV6 */ diff --git a/zebra/rtadv.h b/zebra/rtadv.h index 76f98cf2c8..160814b209 100644 --- a/zebra/rtadv.h +++ b/zebra/rtadv.h @@ -27,7 +27,7 @@ #include "zebra/interface.h" /* NB: RTADV is defined in zebra/interface.h above */ -#ifdef RTADV +#if defined (HAVE_RTADV) /* Router advertisement prefix. */ struct rtadv_prefix @@ -98,7 +98,7 @@ struct nd_opt_homeagent_info { /* Home Agent info */ extern const char *rtadv_pref_strs[]; -#endif /* RTADV */ +#endif /* HAVE_RTADV */ extern void rtadv_init (struct zebra_vrf *); extern void rtadv_terminate (struct zebra_vrf *); From 70d43d7cd31964f8b7c2908d93b186a4c3caf3db Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 20 Nov 2015 07:10:47 -0800 Subject: [PATCH 3/3] Quagga: Fixup decision about what an unnumbered interface is This Change modifies what zebra thinks is an unnumbered interface. If the interface is not a loopback and the prefixlength for the interface is 32 than consider this an unnumbered interface. Ticket: CM-8016 Reviewed by: CCR-3827 Testing: Full Regression Suites Signed-off-by: Donald Sharp --- lib/if.c | 30 ---------------------------- lib/if.h | 7 ------- zebra/connected.c | 50 ++--------------------------------------------- zebra/interface.c | 1 - 4 files changed, 2 insertions(+), 86 deletions(-) diff --git a/lib/if.c b/lib/if.c index b192d48e20..d4bd918e95 100644 --- a/lib/if.c +++ b/lib/if.c @@ -383,36 +383,6 @@ if_lookup_address (void *matchaddr, int family) return if_lookup_address_vrf (matchaddr, family, VRF_DEFAULT); } -/* Lookup anchor interface by IPv4 address. */ -struct connected * -if_anchor_lookup_by_address (struct in_addr src) -{ - struct listnode *node; - struct listnode *cnode; - struct interface *ifp; - struct prefix *p; - struct connected *c; - - for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp)) - { - for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c)) - { - if (CHECK_FLAG(c->flags, ZEBRA_IFA_UNNUMBERED) || - !CHECK_FLAG(c->conf, ZEBRA_IFC_REAL)) - continue; - - p = c->address; - - if (p && p->family == AF_INET) - { - if (IPV4_ADDR_SAME (&p->u.prefix4, &src)) - return c; - } - } - } - return NULL; -} - /* Lookup interface by prefix */ struct interface * if_lookup_prefix_vrf (struct prefix *prefix, vrf_id_t vrf_id) diff --git a/lib/if.h b/lib/if.h index 05803d01ad..f7a5a5ceef 100644 --- a/lib/if.h +++ b/lib/if.h @@ -190,12 +190,6 @@ struct connected Note: destination may be NULL if ZEBRA_IFA_PEER is not set. */ struct prefix *destination; - /* A list of unnumbered IFCs borrowing the address from me */ - struct list *unnumbered; - - /* Pointer to the anchor IFC if I'm unnumbered */ - struct connected *anchor; - /* Label for Linux 2.2.X and upper. */ char *label; }; @@ -271,7 +265,6 @@ extern struct interface *if_lookup_by_index (unsigned int); extern struct interface *if_lookup_exact_address (void *matchaddr, int family); extern struct interface *if_lookup_address (void *matchaddr, int family); extern struct interface *if_lookup_prefix (struct prefix *prefix); -extern struct connected *if_anchor_lookup_by_address (struct in_addr src); extern struct interface *if_create_vrf (const char *name, int namelen, vrf_id_t vrf_id); diff --git a/zebra/connected.c b/zebra/connected.c index b6dbad39bd..b9ab3e13b5 100644 --- a/zebra/connected.c +++ b/zebra/connected.c @@ -79,20 +79,12 @@ connected_announce (struct interface *ifp, struct connected *ifc) if (!ifc) return; - if (ifc->address->family == AF_INET) + if (!if_is_loopback(ifp) && ifc->address->family == AF_INET) { - if ((ifc->anchor = if_anchor_lookup_by_address(ifc->address->u.prefix4))) - { - /* found an anchor, so I'm unnumbered */ + if (ifc->address->prefixlen == 32) SET_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED); - listnode_add (ifc->anchor->unnumbered, ifc); - } else - { - /* I'm numbered */ UNSET_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED); - ifc->unnumbered = list_new(); - } } listnode_add (ifp->connected, ifc); @@ -339,42 +331,6 @@ connected_down_ipv4 (struct interface *ifp, struct connected *ifc) rib_update_static (ifp->vrf_id); } -void -connected_delete_ipv4_unnumbered (struct connected *ifc) -{ - struct connected *new_anchor, *iter; - struct listnode *node; - - if (CHECK_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED)) - { - listnode_delete (ifc->anchor->unnumbered, ifc); - ifc->anchor = NULL; - } - else /* I'm a numbered interface */ - { - if (!list_isempty (ifc->unnumbered)) - { - new_anchor = listgetdata (listhead (ifc->unnumbered)); - new_anchor->unnumbered = ifc->unnumbered; - listnode_delete (new_anchor->unnumbered, new_anchor); - new_anchor->anchor = NULL; - - /* new_anchor changed from unnumbered to numbered, notify clients */ - zebra_interface_address_delete_update (new_anchor->ifp, new_anchor); - UNSET_FLAG (new_anchor->flags, ZEBRA_IFA_UNNUMBERED); - zebra_interface_address_add_update (new_anchor->ifp, new_anchor); - - for (ALL_LIST_ELEMENTS_RO(new_anchor->unnumbered, node, iter)) - iter->anchor = new_anchor; - } - else - { - list_free (ifc->unnumbered); - ifc->unnumbered = NULL; - } - } -} - /* Delete connected IPv4 route to the interface. */ void connected_delete_ipv4 (struct interface *ifp, int flags, struct in_addr *addr, @@ -392,8 +348,6 @@ connected_delete_ipv4 (struct interface *ifp, int flags, struct in_addr *addr, if (! ifc) return; - connected_delete_ipv4_unnumbered (ifc); - connected_withdraw (ifc); if (IS_ZEBRA_DEBUG_RIB) diff --git a/zebra/interface.c b/zebra/interface.c index a3d297d327..a2d1c95b56 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -478,7 +478,6 @@ if_delete_update (struct interface *ifp) UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL); UNSET_FLAG (ifc->conf, ZEBRA_IFC_QUEUED); - connected_delete_ipv4_unnumbered(ifc); /* Remove from subnet chain. */ list_delete_node (addr_list, anode);