diff --git a/.gitignore b/.gitignore index af345e5603..507b193b4b 100644 --- a/.gitignore +++ b/.gitignore @@ -26,9 +26,8 @@ conftest conftest.err aclocal.m4 Makefile.in -zebra-[0-9.][0-9.][0-9.]*.tar.gz -quagga-[0-9.][0-9.][0-9.]*.tar.gz -quagga-[0-9.][0-9.][0-9.]*.tar.gz.asc +*.tar.gz +*.tar.gz.asc .nfs* libtool .arch-inventory @@ -42,6 +41,7 @@ build m4/*.m4 !m4/ax_sys_weak_alias.m4 !m4/ax_compare_version.m4 +!m4/ax_prog_perl_modules.m4 debian/autoreconf.after debian/autoreconf.before debian/files diff --git a/COMMUNITY.md b/COMMUNITY.md index 7d08ed58dc..52777da968 100644 --- a/COMMUNITY.md +++ b/COMMUNITY.md @@ -300,4 +300,11 @@ at scale and in ways that can be unexpected for the original implementor. As such debugs MUST be guarded in such a way that they can be turned off. This PROJECT has the ability to turn on/off debugs from the CLI and it is expected that the developer will use this convention to allow control -of their debugs. \ No newline at end of file +of their debugs. + +### CLI-Changes + +CLI's are a complicated ugly beast. Additions or changes to the CLI +should use a DEFUN to encapsulate one setting as much as is possible. +Additionally as new DEFUN's are added to the system, documentation +should be provided for the new commands. \ No newline at end of file diff --git a/INSTALL.quagga.txt b/INSTALL.quagga.txt deleted file mode 100644 index b414d94861..0000000000 --- a/INSTALL.quagga.txt +++ /dev/null @@ -1,111 +0,0 @@ --------------------------------------------------------------------------- -Building and Installing Quagga from releases or snapshots: - -The 'INSTALL' file contains generic instructions on how to use 'configure' -scripts. - -Quagga requires a C compiler (and associated header files and -libraries) supporting the C99 standard. - -Quagga requires a reasonable make. It is considered a bug if quagga -does not compile with the system make on recent FreeBSD, NetBSD or -OpenBSD, and a very serious bug if it does not compile with GNU make. - -Quagga expects a POSIX.2 compliant system, more or less. Clean -workarounds for POSIX non-compliance are welcome. - -It is considered a bug if Quagga fails to build and run on any of the -following systems (where .x indicates the most recent release), or -such systems "-current" versions. Or, it might be that this list is -out of date and will be updated. (Note that considering it a bug is -not a guarantee of support, merely "we agree that it is broken".) - - Dragonfly ? - FreeBSD (stable branches currently supported, plus perhaps one) - FreeBSD-current - Linux [kernel/distribution information needed] - NetBSD 4.x - NetBSD 5.x - NetBSD 6.x - NetBSD-current - OpenBSD ? [info needed on what should work] - Solaris (modern/supported versions, including OpenSolaris forks) - -On BSD systems, installing libexecinfo is strongly recommended in order -to get backtrace support. - -For further Quagga specific information on 'configure' and build-time -configuration of the software, please read the Quagga info -documentation, (doc/quagga.info). To read the info page included with -the Quagga sources without first installing Quagga: - - cd doc - # one of the following, depending on your info viewer preferences - info quagga.info - pinfo -r quagga.info - emacs -eval '(info "quagga.info")' - -The Quagga website (http://www.quagga.net) currently has the info -files available in various formats. - --------------------------------------------------------------------------- -Building Quagga from git checkouts: - -In order to build from git, you will need recent versions of several GNU -tools, particularly autoconf, automake, libtool, GNU awk and texinfo. Note -that the CVS snapshots on the Quagga website should not require these tools; -everything is already setup ready to run 'configure'. If you have trouble -building from CVS checkout it is recommended that you try a CVS snapshot -instead. - -We declare that the following versions should work for building from -CVS checkouts. Earlier versions may work, but failure to do so is not -a bug. Required versions can be moved earlier if no problems, or -later after a judgement that a system without a higher version is -deficient is made. - - [TODO: this list is out of date as of 2013-07] - automake: 1.9.6 (released 2005-07-10) - autoconf: 2.59 (2.60 on 2006-06-26 is too recent to require) - libtool: 1.5.22 (released 2005-12-18) - texinfo: 4.7 (released 2004-04-10; 4.8 is not yet common) - -For running tests, one also needs: - - DejaGnu: - -[TODO: texinfo 4.6 is now ancient and this should be revisited/fixed] -Because some systems provide texinfo 4.6 (4.7 is new), quagga.info is -checked in so that texinfo will generally not be invoked. When -texinfo 4.7 is widespread, quagga.info will be removed from CVS and -texinfo will become required again. (4.7 has figure support, needed -for the route server docs, which is why 4.6 doesn't work.) - -In order to create PostScript or PDF versions of the Texinfo documentation, -you will need the convert utility, from the ImageMagick toolset installed, -and epstopdf from the TeTeX suite. - -To create the required autotools files (Makefile.in, configure, etc.), -run "./bootstrap.sh". After this you may run configure as for a -snapshot or release. - -Please refer to "Building and Installing Quagga" above for further -instructions. - --------------------------------------------------------------------------- -Notes on required versions: - -The general goal is to use a modern baseline of tools, while not -imposing pain on those tracking supported (or almost supported) stable -distributions. The notes below explain what versions are present in -various environments. - -NetBSD 4 provides texinfo 4.7. -NetBSD 5 and 6 provides texinfo 4.8 - -Fedora Core ? provides autoconf 2.59. - -OpenBSD 3.6 provides texinfo 4.2. -OpenBSD [3.6] ports provides automake 1.4-p6 autoconf 2.5.9 libtool 1.5.8 - --------------------------------------------------------------------------- diff --git a/Makefile.am b/Makefile.am index 7a2cc29bd5..d9b57a5eae 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,14 +2,14 @@ SUBDIRS = lib qpb fpm @ZEBRA@ @LIBRFP@ @RFPTEST@ \ @BGPD@ @RIPD@ @RIPNGD@ @OSPFD@ @OSPF6D@ @LDPD@ \ - @ISISD@ @PIMD@ @WATCHQUAGGA@ @VTYSH@ @OSPFCLIENT@ @DOC@ m4 @pkgsrcdir@ \ + @ISISD@ @PIMD@ @WATCHFRR@ @VTYSH@ @OSPFCLIENT@ @DOC@ m4 @pkgsrcdir@ \ redhat @SOLARIS@ tests tools cumulus DIST_SUBDIRS = lib qpb fpm zebra bgpd ripd ripngd ospfd ospf6d ldpd \ - isisd watchquagga vtysh ospfclient doc m4 pkgsrc redhat tests \ + isisd watchfrr vtysh ospfclient doc m4 pkgsrc redhat tests \ solaris pimd @LIBRFP@ @RFPTEST@ tools cumulus -EXTRA_DIST = aclocal.m4 SERVICES REPORTING-BUGS INSTALL.quagga.txt \ +EXTRA_DIST = aclocal.m4 SERVICES REPORTING-BUGS \ update-autotools \ vtysh/Makefile.in vtysh/Makefile.am \ tools/rrcheck.pl tools/rrlookup.pl tools/zc.pl \ diff --git a/README b/README index 91a1d8d0fb..95aa5eb248 100644 --- a/README +++ b/README @@ -1,11 +1,9 @@ -Quagga is free software that manages various IPv4 and IPv6 routing +Free Range Routing is free software that manages various IPv4 and IPv6 routing protocols. -Currently Quagga supports BGP4, BGP4+, OSPFv2, OSPFv3, RIPv1, +Currently Free Range Routing supports BGP4, BGP4+, OSPFv2, OSPFv3, RIPv1, RIPv2, RIPng, PIM-SSM and LDP as well as very early support for IS-IS. - -See the file INSTALL.quagga.txt for building and installation instructions. - + See the file REPORTING-BUGS to report bugs. - -Quagga is free software. See the file COPYING for copying conditions. + +Free Range Routing is free software. See the file COPYING for copying conditions. diff --git a/README.NetBSD b/README.NetBSD index 6bbc680b95..6e454533e5 100755 --- a/README.NetBSD +++ b/README.NetBSD @@ -1,7 +1,5 @@ #!/bin/sh -# $QuaggaId: Format:%an, %ai, %h$ $ - # This file is helpful for building quagga from cvs on NetBSD, and # probably on any system using pkgsrc. # One should have readline installed already (pkgsrc/devel/readline). diff --git a/SERVICES b/SERVICES index c69d0c1a77..ee242ca6a2 100644 --- a/SERVICES +++ b/SERVICES @@ -18,3 +18,4 @@ ospf6d 2606/tcp ospfapi 2607/tcp isisd 2608/tcp pimd 2611/tcp +ldpd 2612/tcp diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 0cdaa545d6..5c26ecc6ad 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -221,6 +221,11 @@ cluster_finish (void) cluster_hash = NULL; } +static struct hash *encap_hash = NULL; +#if ENABLE_BGP_VNC +static struct hash *vnc_hash = NULL; +#endif + struct bgp_attr_encap_subtlv * encap_tlv_dup(struct bgp_attr_encap_subtlv *orig) { @@ -288,14 +293,10 @@ encap_same(struct bgp_attr_encap_subtlv *h1, struct bgp_attr_encap_subtlv *h2) struct bgp_attr_encap_subtlv *p; struct bgp_attr_encap_subtlv *q; - if (!h1 && !h2) - return 1; - if (h1 && !h2) - return 0; - if (!h1 && h2) - return 0; if (h1 == h2) return 1; + if (h1 == NULL || h2 == NULL) + return 0; for (p = h1; p; p = p->next) { for (q = h2; q; q = q->next) { @@ -326,6 +327,96 @@ encap_same(struct bgp_attr_encap_subtlv *h1, struct bgp_attr_encap_subtlv *h2) return 1; } +static void * +encap_hash_alloc (void *p) +{ + /* Encap structure is already allocated. */ + return p; +} + +typedef enum +{ + ENCAP_SUBTLV_TYPE, +#if ENABLE_BGP_VNC + VNC_SUBTLV_TYPE +#endif +} encap_subtlv_type; + +static struct bgp_attr_encap_subtlv * +encap_intern (struct bgp_attr_encap_subtlv *encap, encap_subtlv_type type) +{ + struct bgp_attr_encap_subtlv *find; + struct hash *hash = encap_hash; +#if ENABLE_BGP_VNC + if (type == VNC_SUBTLV_TYPE) + hash = vnc_hash; +#endif + + find = hash_get (hash, encap, encap_hash_alloc); + if (find != encap) + encap_free (encap); + find->refcnt++; + + return find; +} + +static void +encap_unintern (struct bgp_attr_encap_subtlv **encapp, encap_subtlv_type type) +{ + struct bgp_attr_encap_subtlv *encap = *encapp; + if (encap->refcnt) + encap->refcnt--; + + if (encap->refcnt == 0) + { + struct hash *hash = encap_hash; +#if ENABLE_BGP_VNC + if (type == VNC_SUBTLV_TYPE) + hash = vnc_hash; +#endif + hash_release (hash, encap); + encap_free (encap); + *encapp = NULL; + } +} + +static unsigned int +encap_hash_key_make (void *p) +{ + const struct bgp_attr_encap_subtlv * encap = p; + + return jhash(encap->value, encap->length, 0); +} + +static int +encap_hash_cmp (const void *p1, const void *p2) +{ + return encap_same((struct bgp_attr_encap_subtlv *)p1, + (struct bgp_attr_encap_subtlv *)p2); +} + +static void +encap_init (void) +{ + encap_hash = hash_create (encap_hash_key_make, encap_hash_cmp); +#if ENABLE_BGP_VNC + vnc_hash = hash_create (encap_hash_key_make, encap_hash_cmp); +#endif +} + +static void +encap_finish (void) +{ + hash_clean (encap_hash, (void (*)(void *))encap_free); + hash_free (encap_hash); + encap_hash = NULL; +#if ENABLE_BGP_VNC + hash_clean (vnc_hash, (void (*)(void *))encap_free); + hash_free (vnc_hash); + vnc_hash = NULL; +#endif +} + /* Unknown transit attribute. */ static struct hash *transit_hash; @@ -434,16 +525,6 @@ bgp_attr_extra_free (struct attr *attr) { if (attr->extra) { - if (attr->extra->encap_subtlvs) { - encap_free(attr->extra->encap_subtlvs); - attr->extra->encap_subtlvs = NULL; - } -#if ENABLE_BGP_VNC - if (attr->extra->vnc_subtlvs) { - encap_free(attr->extra->vnc_subtlvs); - attr->extra->vnc_subtlvs = NULL; - } -#endif XFREE (MTYPE_ATTR_EXTRA, attr->extra); attr->extra = NULL; } @@ -481,28 +562,12 @@ bgp_attr_dup (struct attr *new, struct attr *orig) memset(new->extra, 0, sizeof(struct attr_extra)); if (orig->extra) { *new->extra = *orig->extra; - if (orig->extra->encap_subtlvs) { - new->extra->encap_subtlvs = encap_tlv_dup(orig->extra->encap_subtlvs); - } -#if ENABLE_BGP_VNC - if (orig->extra->vnc_subtlvs) { - new->extra->vnc_subtlvs = encap_tlv_dup(orig->extra->vnc_subtlvs); - } -#endif } } else if (orig->extra) { new->extra = bgp_attr_extra_new(); *new->extra = *orig->extra; - if (orig->extra->encap_subtlvs) { - new->extra->encap_subtlvs = encap_tlv_dup(orig->extra->encap_subtlvs); - } -#if ENABLE_BGP_VNC - if (orig->extra->vnc_subtlvs) { - new->extra->vnc_subtlvs = encap_tlv_dup(orig->extra->vnc_subtlvs); - } -#endif } } @@ -523,6 +588,12 @@ bgp_attr_deep_dup (struct attr *new, struct attr *orig) new->extra->cluster = cluster_dup(orig->extra->cluster); if (orig->extra->transit) new->extra->transit = transit_dup(orig->extra->transit); + if (orig->extra->encap_subtlvs) + new->extra->encap_subtlvs = encap_tlv_dup(orig->extra->encap_subtlvs); +#if ENABLE_BGP_VNC + if (orig->extra->vnc_subtlvs) + new->extra->vnc_subtlvs = encap_tlv_dup(orig->extra->vnc_subtlvs); +#endif } } @@ -543,6 +614,12 @@ bgp_attr_deep_free (struct attr *attr) cluster_free(attr->extra->cluster); if (attr->extra->transit) transit_free(attr->extra->transit); + if (attr->extra->encap_subtlvs) + encap_free(attr->extra->encap_subtlvs); +#if ENABLE_BGP_VNC + if (attr->extra->vnc_subtlvs) + encap_free(attr->extra->vnc_subtlvs); +#endif } } @@ -599,12 +676,15 @@ attrhash_key_make (void *p) MIX(cluster_hash_key_make (extra->cluster)); if (extra->transit) MIX(transit_hash_key_make (extra->transit)); - -#ifdef HAVE_IPV6 + if (extra->encap_subtlvs) + MIX(encap_hash_key_make (extra->encap_subtlvs)); +#if ENABLE_BGP_VNC + if (extra->vnc_subtlvs) + MIX(encap_hash_key_make (extra->vnc_subtlvs)); +#endif MIX(extra->mp_nexthop_len); key = jhash(extra->mp_nexthop_global.s6_addr, IPV6_MAX_BYTELEN, key); key = jhash(extra->mp_nexthop_local.s6_addr, IPV6_MAX_BYTELEN, key); -#endif /* HAVE_IPV6 */ } return key; @@ -633,11 +713,9 @@ attrhash_cmp (const void *p1, const void *p2) && ae1->aggregator_addr.s_addr == ae2->aggregator_addr.s_addr && ae1->weight == ae2->weight && ae1->tag == ae2->tag -#ifdef HAVE_IPV6 && ae1->mp_nexthop_len == ae2->mp_nexthop_len && IPV6_ADDR_SAME (&ae1->mp_nexthop_global, &ae2->mp_nexthop_global) && IPV6_ADDR_SAME (&ae1->mp_nexthop_local, &ae2->mp_nexthop_local) -#endif /* HAVE_IPV6 */ && IPV4_ADDR_SAME (&ae1->mp_nexthop_global_in, &ae2->mp_nexthop_global_in) && ae1->ecommunity == ae2->ecommunity && ae1->cluster == ae2->cluster @@ -712,13 +790,12 @@ bgp_attr_hash_alloc (void *p) { attr->extra = bgp_attr_extra_new (); *attr->extra = *val->extra; - - if (attr->extra->encap_subtlvs) { - attr->extra->encap_subtlvs = encap_tlv_dup(attr->extra->encap_subtlvs); + if (val->extra->encap_subtlvs) { + val->extra->encap_subtlvs = NULL; } #if ENABLE_BGP_VNC - if (attr->extra->vnc_subtlvs) { - attr->extra->vnc_subtlvs = encap_tlv_dup(attr->extra->vnc_subtlvs); + if (val->extra->vnc_subtlvs) { + val->extra->vnc_subtlvs = NULL; } #endif } @@ -773,11 +850,27 @@ bgp_attr_intern (struct attr *attr) else attre->transit->refcnt++; } + if (attre->encap_subtlvs) + { + if (! attre->encap_subtlvs->refcnt) + attre->encap_subtlvs = encap_intern (attre->encap_subtlvs, ENCAP_SUBTLV_TYPE); + else + attre->encap_subtlvs->refcnt++; + } +#if ENABLE_BGP_VNC + if (attre->vnc_subtlvs) + { + if (! attre->vnc_subtlvs->refcnt) + attre->vnc_subtlvs = encap_intern (attre->vnc_subtlvs, VNC_SUBTLV_TYPE); + else + attre->vnc_subtlvs->refcnt++; + } +#endif } find = (struct attr *) hash_get (attrhash, attr, bgp_attr_hash_alloc); find->refcnt++; - + return find; } @@ -811,6 +904,14 @@ bgp_attr_refcount (struct attr *attr) if (attre->transit) attre->transit->refcnt++; + + if (attre->encap_subtlvs) + attre->encap_subtlvs->refcnt++; + +#if ENABLE_BGP_VNC + if (attre->vnc_subtlvs) + attre->vnc_subtlvs->refcnt++; +#endif } attr->refcnt++; return attr; @@ -830,9 +931,7 @@ bgp_attr_default_set (struct attr *attr, u_char origin) attr->extra->weight = BGP_ATTR_DEFAULT_WEIGHT; attr->extra->tag = 0; attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP); -#ifdef HAVE_IPV6 attr->extra->mp_nexthop_len = IPV6_MAX_BYTELEN; -#endif return attr; } @@ -893,9 +992,7 @@ bgp_attr_aggregate_intern (struct bgp *bgp, u_char origin, } attre.weight = BGP_ATTR_DEFAULT_WEIGHT; -#ifdef HAVE_IPV6 attre.mp_nexthop_len = IPV6_MAX_BYTELEN; -#endif if (! as_set || atomic_aggregate) attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE); attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR); @@ -936,6 +1033,14 @@ bgp_attr_unintern_sub (struct attr *attr) if (attr->extra->transit) transit_unintern (attr->extra->transit); + + if (attr->extra->encap_subtlvs) + encap_unintern (&attr->extra->encap_subtlvs, ENCAP_SUBTLV_TYPE); + +#if ENABLE_BGP_VNC + if (attr->extra->vnc_subtlvs) + encap_unintern (&attr->extra->vnc_subtlvs, VNC_SUBTLV_TYPE); +#endif } } @@ -1001,11 +1106,17 @@ bgp_attr_flush (struct attr *attr) transit_free (attre->transit); attre->transit = NULL; } - encap_free(attre->encap_subtlvs); - attre->encap_subtlvs = NULL; + if (attre->encap_subtlvs && ! attre->encap_subtlvs->refcnt) + { + encap_free(attre->encap_subtlvs); + attre->encap_subtlvs = NULL; + } #if ENABLE_BGP_VNC - encap_free(attre->vnc_subtlvs); - attre->vnc_subtlvs = NULL; + if (attre->vnc_subtlvs && ! attre->vnc_subtlvs->refcnt) + { + encap_free(attre->vnc_subtlvs); + attre->vnc_subtlvs = NULL; + } #endif } } @@ -1738,8 +1849,9 @@ int bgp_mp_reach_parse (struct bgp_attr_parser_args *args, struct bgp_nlri *mp_update) { - afi_t afi; - safi_t safi; + iana_afi_t pkt_afi; + afi_t afi; + safi_t pkt_safi, safi; bgp_size_t nlri_len; size_t start; struct stream *s; @@ -1763,8 +1875,20 @@ bgp_mp_reach_parse (struct bgp_attr_parser_args *args, } /* Load AFI, SAFI. */ - afi = stream_getw (s); - safi = stream_getc (s); + pkt_afi = stream_getw (s); + pkt_safi = stream_getc (s); + + /* Convert AFI, SAFI to internal values, check. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) + { + /* Log if AFI or SAFI is unrecognized. This is not an error unless + * the attribute is otherwise malformed. + */ + if (bgp_debug_update(peer, NULL, NULL, 0)) + zlog_debug ("%s: MP_REACH received AFI %u or SAFI %u is unrecognized", + peer->host, pkt_afi, pkt_safi); + return BGP_ATTR_PARSE_ERROR; + } /* Get nexthop length. */ attre->mp_nexthop_len = stream_getc (s); @@ -1790,7 +1914,6 @@ bgp_mp_reach_parse (struct bgp_attr_parser_args *args, stream_getl (s); /* RD low */ stream_get (&attre->mp_nexthop_global_in, s, IPV4_MAX_BYTELEN); break; -#ifdef HAVE_IPV6 case BGP_ATTR_NHLEN_IPV6_GLOBAL: case BGP_ATTR_NHLEN_VPNV6_GLOBAL: if (attre->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL) @@ -1830,7 +1953,6 @@ bgp_mp_reach_parse (struct bgp_attr_parser_args *args, attre->mp_nexthop_len = IPV6_MAX_BYTELEN; } break; -#endif /* HAVE_IPV6 */ default: zlog_info ("%s: (%s) Wrong multiprotocol next hop length: %d", __func__, peer->host, attre->mp_nexthop_len); @@ -1879,8 +2001,9 @@ bgp_mp_unreach_parse (struct bgp_attr_parser_args *args, struct bgp_nlri *mp_withdraw) { struct stream *s; + iana_afi_t pkt_afi; afi_t afi; - safi_t safi; + safi_t pkt_safi, safi; u_int16_t withdraw_len; struct peer *const peer = args->peer; struct attr *const attr = args->attr; @@ -1892,9 +2015,21 @@ bgp_mp_unreach_parse (struct bgp_attr_parser_args *args, if ((length > STREAM_READABLE(s)) || (length < BGP_MP_UNREACH_MIN_SIZE)) return BGP_ATTR_PARSE_ERROR_NOTIFYPLS; - afi = stream_getw (s); - safi = stream_getc (s); - + pkt_afi = stream_getw (s); + pkt_safi = stream_getc (s); + + /* Convert AFI, SAFI to internal values, check. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) + { + /* Log if AFI or SAFI is unrecognized. This is not an error unless + * the attribute is otherwise malformed. + */ + if (bgp_debug_update(peer, NULL, NULL, 0)) + zlog_debug ("%s: MP_UNREACH received AFI %u or SAFI %u is unrecognized", + peer->host, pkt_afi, pkt_safi); + return BGP_ATTR_PARSE_ERROR; + } + withdraw_len = length - BGP_MP_UNREACH_MIN_SIZE; mp_withdraw->afi = afi; @@ -2493,10 +2628,18 @@ bgp_attr_parse (struct peer *peer, struct attr *attr, bgp_size_t size, if (ret != BGP_ATTR_PARSE_PROCEED) return ret; } - - /* Finally intern unknown attribute. */ - if (attr->extra && attr->extra->transit) - attr->extra->transit = transit_intern (attr->extra->transit); + if (attr->extra) + { + /* Finally intern unknown attribute. */ + if (attr->extra->transit) + attr->extra->transit = transit_intern (attr->extra->transit); + if (attr->extra->encap_subtlvs) + attr->extra->encap_subtlvs = encap_intern (attr->extra->encap_subtlvs, ENCAP_SUBTLV_TYPE); +#if ENABLE_BGP_VNC + if (attr->extra->vnc_subtlvs) + attr->extra->vnc_subtlvs = encap_intern (attr->extra->vnc_subtlvs, VNC_SUBTLV_TYPE); +#endif + } return BGP_ATTR_PARSE_PROCEED; } @@ -2507,6 +2650,8 @@ bgp_packet_mpattr_start (struct stream *s, afi_t afi, safi_t safi, afi_t nh_afi, struct attr *attr) { size_t sizep; + iana_afi_t pkt_afi; + safi_t pkt_safi; /* Set extended bit always to encode the attribute length as 2 bytes */ stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_EXTLEN); @@ -2514,8 +2659,12 @@ bgp_packet_mpattr_start (struct stream *s, afi_t afi, safi_t safi, afi_t nh_afi, sizep = stream_get_endp (s); stream_putw (s, 0); /* Marker: Attribute length. */ - stream_putw (s, afi); - stream_putc (s, (safi == SAFI_MPLS_VPN) ? SAFI_MPLS_LABELED_VPN : safi); + + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); + + stream_putw (s, pkt_afi); /* AFI */ + stream_putc (s, pkt_safi); /* SAFI */ /* Nexthop */ switch (nh_afi) @@ -2544,7 +2693,6 @@ bgp_packet_mpattr_start (struct stream *s, afi_t afi, safi_t safi, afi_t nh_afi, break; } break; -#ifdef HAVE_IPV6 case AFI_IP6: switch (safi) { @@ -2591,7 +2739,6 @@ bgp_packet_mpattr_start (struct stream *s, afi_t afi, safi_t safi, afi_t nh_afi, break; } break; -#endif /*HAVE_IPV6*/ default: break; } @@ -3134,6 +3281,8 @@ size_t bgp_packet_mpunreach_start (struct stream *s, afi_t afi, safi_t safi) { unsigned long attrlen_pnt; + iana_afi_t pkt_afi; + safi_t pkt_safi; /* Set extended bit always to encode the attribute length as 2 bytes */ stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_EXTLEN); @@ -3142,8 +3291,12 @@ bgp_packet_mpunreach_start (struct stream *s, afi_t afi, safi_t safi) attrlen_pnt = stream_get_endp (s); stream_putw (s, 0); /* Length of this attribute. */ - stream_putw (s, afi); - stream_putc (s, (safi == SAFI_MPLS_VPN) ? SAFI_MPLS_LABELED_VPN : safi); + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); + + stream_putw (s, pkt_afi); + stream_putc (s, pkt_safi); + return attrlen_pnt; } @@ -3184,6 +3337,7 @@ bgp_attr_init (void) ecommunity_init (); cluster_init (); transit_init (); + encap_init (); } void @@ -3195,6 +3349,7 @@ bgp_attr_finish (void) ecommunity_finish (); cluster_finish (); transit_finish (); + encap_finish (); } /* Make attribute packet. */ @@ -3232,11 +3387,7 @@ bgp_dump_routes_attr (struct stream *s, struct attr *attr, /* Nexthop attribute. */ /* If it's an IPv6 prefix, don't dump the IPv4 nexthop to save space */ - if(prefix != NULL -#ifdef HAVE_IPV6 - && prefix->family != AF_INET6 -#endif /* HAVE_IPV6 */ - ) + if(prefix != NULL && prefix->family != AF_INET6) { stream_putc (s, BGP_ATTR_FLAG_TRANS); stream_putc (s, BGP_ATTR_NEXT_HOP); @@ -3299,7 +3450,6 @@ bgp_dump_routes_attr (struct stream *s, struct attr *attr, stream_put (s, attr->community->val, attr->community->size * 4); } -#ifdef HAVE_IPV6 /* Add a MP_NLRI attribute to dump the IPv6 next hop */ if (prefix != NULL && prefix->family == AF_INET6 && attr->extra && (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL || @@ -3332,7 +3482,6 @@ bgp_dump_routes_attr (struct stream *s, struct attr *attr, /* Set MP attribute length. */ stream_putc_at (s, sizep, (stream_get_endp (s) - sizep) - 1); } -#endif /* HAVE_IPV6 */ /* Return total size of attribute. */ len = stream_get_endp (s) - cp - 2; diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index d4f45ba60a..6e639078d6 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -58,6 +58,8 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA struct bgp_attr_encap_subtlv { struct bgp_attr_encap_subtlv *next; /* for chaining */ + /* Reference count of this attribute. */ + unsigned long refcnt; uint16_t type; uint16_t length; uint8_t value[1]; /* will be extended */ diff --git a/bgpd/bgp_bfd.c b/bgpd/bgp_bfd.c index f2393dedd9..7892005f08 100644 --- a/bgpd/bgp_bfd.c +++ b/bgpd/bgp_bfd.c @@ -339,7 +339,6 @@ bgp_bfd_dest_update (int command, struct zclient *zclient, if (dp.u.prefix4.s_addr != peer->su.sin.sin_addr.s_addr) continue; } -#ifdef HAVE_IPV6 else if ((dp.family == AF_INET6) && (peer->su.sa.sa_family == AF_INET6)) { @@ -347,7 +346,6 @@ bgp_bfd_dest_update (int command, struct zclient *zclient, sizeof (struct in6_addr))) continue; } -#endif else continue; @@ -366,7 +364,6 @@ bgp_bfd_dest_update (int command, struct zclient *zclient, if (sp.u.prefix4.s_addr != peer->su_local->sin.sin_addr.s_addr) continue; } -#ifdef HAVE_IPV6 else if ((sp.family == AF_INET6) && (peer->su_local->sa.sa_family == AF_INET6)) { @@ -374,7 +371,6 @@ bgp_bfd_dest_update (int command, struct zclient *zclient, sizeof (struct in6_addr))) continue; } -#endif else continue; diff --git a/bgpd/bgp_btoa.c b/bgpd/bgp_btoa.c index cd52c94b1f..37bef9b85d 100644 --- a/bgpd/bgp_btoa.c +++ b/bgpd/bgp_btoa.c @@ -44,9 +44,9 @@ static zebra_capabilities_t _caps_p [] = struct zebra_privs_t bgpd_privs = { -#if defined(QUAGGA_USER) && defined(QUAGGA_GROUP) - .user = QUAGGA_USER, - .group = QUAGGA_GROUP, +#if defined(FRR_USER) && defined(FRR_GROUP) + .user = FRR_USER, + .group = FRR_GROUP, #endif #ifdef VTY_GROUP .vty_group = VTY_GROUP, diff --git a/bgpd/bgp_debug.c b/bgpd/bgp_debug.c index de175de5a0..ab05878210 100644 --- a/bgpd/bgp_debug.c +++ b/bgpd/bgp_debug.c @@ -392,7 +392,6 @@ bgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size) snprintf (buf + strlen (buf), size - strlen (buf), ", origin %s", bgp_origin_str[attr->origin]); -#ifdef HAVE_IPV6 if (attr->extra) { char addrbuf[BUFSIZ]; @@ -409,7 +408,6 @@ bgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size) inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local, addrbuf, BUFSIZ)); } -#endif /* HAVE_IPV6 */ if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))) snprintf (buf + strlen (buf), size - strlen (buf), ", localpref %u", diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c index add653193c..8dd753d272 100644 --- a/bgpd/bgp_dump.c +++ b/bgpd/bgp_dump.c @@ -364,11 +364,7 @@ bgp_dump_route_node_record (int afi, struct bgp_node *rn, stream_putw (obuf, info->peer->table_dump_index); /* Originated */ -#ifdef HAVE_CLOCK_MONOTONIC stream_putl (obuf, time(NULL) - (bgp_clock() - info->uptime)); -#else - stream_putl (obuf, info->uptime); -#endif /* HAVE_CLOCK_MONOTONIC */ /* Dump attribute. */ /* Skip prefix & AFI/SAFI for MP_NLRI */ diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c index 9138c72802..b65af9e1fa 100644 --- a/bgpd/bgp_ecommunity.c +++ b/bgpd/bgp_ecommunity.c @@ -54,6 +54,13 @@ ecommunity_free (struct ecommunity **ecom) ecom = NULL; } +static void +ecommunity_hash_free (struct ecommunity *ecom) +{ + ecommunity_free(&ecom); +} + + /* Add a new Extended Communities value to Extended Communities Attribute structure. When the value is already exists in the structure, we don't add the value. Newly added value is sorted by @@ -282,6 +289,7 @@ ecommunity_init (void) void ecommunity_finish (void) { + hash_clean (ecomhash, (void (*)(void *))ecommunity_hash_free); hash_free (ecomhash); ecomhash = NULL; } diff --git a/bgpd/bgp_encap.c b/bgpd/bgp_encap.c index 4ea2f9cde7..75a348e3fe 100644 --- a/bgpd/bgp_encap.c +++ b/bgpd/bgp_encap.c @@ -467,7 +467,7 @@ bgp_show_encap ( vty_out (vty, "No prefixes displayed, %ld exist%s", total_count, VTY_NEWLINE); } else - vty_out (vty, "%sDisplayed %ld out of %ld total prefixes%s", + vty_out (vty, "%sDisplayed %ld routes and %ld total paths%s", VTY_NEWLINE, output_count, total_count, VTY_NEWLINE); return CMD_SUCCESS; @@ -484,7 +484,7 @@ DEFUN (show_bgp_ipv4_encap, { return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 0); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap, show_bgp_ipv6_encap_cmd, "show [ip] bgp ipv6 encap", @@ -496,7 +496,6 @@ DEFUN (show_bgp_ipv6_encap, { return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 0); } -#endif DEFUN (show_bgp_ipv4_encap_rd, show_bgp_ipv4_encap_rd_cmd, @@ -521,7 +520,7 @@ DEFUN (show_bgp_ipv4_encap_rd, } return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 0); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap_rd, show_bgp_ipv6_encap_rd_cmd, "show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn", @@ -546,7 +545,6 @@ DEFUN (show_bgp_ipv6_encap_rd, } return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 0); } -#endif DEFUN (show_bgp_ipv4_encap_tags, show_bgp_ipv4_encap_tags_cmd, @@ -560,7 +558,7 @@ DEFUN (show_bgp_ipv4_encap_tags, { return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 1); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap_tags, show_bgp_ipv6_encap_tags_cmd, "show [ip] bgp ipv6 encap tags", @@ -573,7 +571,6 @@ DEFUN (show_bgp_ipv6_encap_tags, { return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 1); } -#endif DEFUN (show_bgp_ipv4_encap_rd_tags, show_bgp_ipv4_encap_rd_tags_cmd, @@ -599,7 +596,7 @@ DEFUN (show_bgp_ipv4_encap_rd_tags, } return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 1); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap_rd_tags, show_bgp_ipv6_encap_rd_tags_cmd, "show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn tags", @@ -624,7 +621,6 @@ DEFUN (show_bgp_ipv6_encap_rd_tags, } return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 1); } -#endif DEFUN (show_bgp_ipv4_encap_neighbor_routes, show_bgp_ipv4_encap_neighbor_routes_cmd, @@ -657,7 +653,7 @@ DEFUN (show_bgp_ipv4_encap_neighbor_routes, return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_neighbor, &su, 0); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap_neighbor_routes, show_bgp_ipv6_encap_neighbor_routes_cmd, "show [ip] bgp ipv6 encap neighbors A.B.C.D routes", @@ -689,7 +685,6 @@ DEFUN (show_bgp_ipv6_encap_neighbor_routes, return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_neighbor, &su, 0); } -#endif DEFUN (show_bgp_ipv4_encap_rd_neighbor_routes, show_bgp_ipv4_encap_rd_neighbor_routes_cmd, @@ -735,7 +730,7 @@ DEFUN (show_bgp_ipv4_encap_rd_neighbor_routes, return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_neighbor, &su, 0); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap_rd_neighbor_routes, show_bgp_ipv6_encap_rd_neighbor_routes_cmd, "show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn neighbors routes", @@ -780,7 +775,6 @@ DEFUN (show_bgp_ipv6_encap_rd_neighbor_routes, return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_neighbor, &su, 0); } -#endif DEFUN (show_bgp_ipv4_encap_neighbor_advertised_routes, show_bgp_ipv4_encap_neighbor_advertised_routes_cmd, @@ -814,7 +808,7 @@ DEFUN (show_bgp_ipv4_encap_neighbor_advertised_routes, return show_adj_route_encap (vty, peer, NULL); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap_neighbor_advertised_routes, show_bgp_ipv6_encap_neighbor_advertised_routes_cmd, "show [ip] bgp ipv6 encap neighbors A.B.C.D advertised-routes", @@ -847,7 +841,6 @@ DEFUN (show_bgp_ipv6_encap_neighbor_advertised_routes, return show_adj_route_encap (vty, peer, NULL); } -#endif DEFUN (show_bgp_ipv4_encap_rd_neighbor_advertised_routes, show_bgp_ipv4_encap_rd_neighbor_advertised_routes_cmd, @@ -893,7 +886,7 @@ DEFUN (show_bgp_ipv4_encap_rd_neighbor_advertised_routes, return show_adj_route_encap (vty, peer, &prd); } -#ifdef HAVE_IPV6 + DEFUN (show_bgp_ipv6_encap_rd_neighbor_advertised_routes, show_bgp_ipv6_encap_rd_neighbor_advertised_routes_cmd, "show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn neighbors advertised-routes", @@ -938,7 +931,6 @@ DEFUN (show_bgp_ipv6_encap_rd_neighbor_advertised_routes, return show_adj_route_encap (vty, peer, &prd); } -#endif void bgp_encap_init (void) @@ -955,7 +947,6 @@ bgp_encap_init (void) install_element (VIEW_NODE, &show_bgp_ipv4_encap_neighbor_advertised_routes_cmd); install_element (VIEW_NODE, &show_bgp_ipv4_encap_rd_neighbor_advertised_routes_cmd); -#ifdef HAVE_IPV6 install_element (VIEW_NODE, &show_bgp_ipv6_encap_cmd); install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_cmd); install_element (VIEW_NODE, &show_bgp_ipv6_encap_tags_cmd); @@ -964,5 +955,4 @@ bgp_encap_init (void) install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_neighbor_routes_cmd); install_element (VIEW_NODE, &show_bgp_ipv6_encap_neighbor_advertised_routes_cmd); install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_neighbor_advertised_routes_cmd); -#endif } diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 60a6475330..a71364381e 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -509,7 +509,7 @@ bgp_graceful_restart_timer_expire (struct thread *thread) /* NSF delete stale route */ for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) if (peer->nsf[afi][safi]) bgp_clear_stale_route (peer, afi, safi); @@ -542,7 +542,7 @@ bgp_graceful_stale_timer_expire (struct thread *thread) /* NSF delete stale route */ for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) if (peer->nsf[afi][safi]) bgp_clear_stale_route (peer, afi, safi); @@ -1051,7 +1051,7 @@ bgp_stop (struct peer *peer) UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) peer->nsf[afi][safi] = 0; } @@ -1468,7 +1468,7 @@ bgp_establish (struct peer *peer) /* graceful restart */ UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) { if (peer->afc_nego[afi][safi] && CHECK_FLAG (peer->cap, PEER_CAP_RESTART_ADV) diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c index 91eacc9320..33191f0a98 100644 --- a/bgpd/bgp_main.c +++ b/bgpd/bgp_main.c @@ -134,9 +134,9 @@ static zebra_capabilities_t _caps_p [] = struct zebra_privs_t bgpd_privs = { -#if defined(QUAGGA_USER) && defined(QUAGGA_GROUP) - .user = QUAGGA_USER, - .group = QUAGGA_GROUP, +#if defined(FRR_USER) && defined(FRR_GROUP) + .user = FRR_USER, + .group = FRR_GROUP, #endif #ifdef VTY_GROUP .vty_group = VTY_GROUP, @@ -174,7 +174,7 @@ redistribution between different routing protocols.\n\n\ -C, --dryrun Check configuration for validity and exit\n\ -h, --help Display this help and exit\n\ \n\ -Report bugs to %s\n", progname, ZEBRA_BUG_ADDRESS); +Report bugs to %s\n", progname, FRR_BUG_ADDRESS); } exit (status); @@ -547,7 +547,7 @@ main (int argc, char **argv) vty_serv_sock (vty_addr, vty_port, BGP_VTYSH_PATH); /* Print banner. */ - zlog_notice ("BGPd %s starting: vty@%d, bgp@%s:%d", QUAGGA_VERSION, + zlog_notice ("BGPd %s starting: vty@%d, bgp@%s:%d", FRR_COPYRIGHT, vty_port, (bm->address ? bm->address : ""), bm->port); diff --git a/bgpd/bgp_mpath.c b/bgpd/bgp_mpath.c index e7272cc0aa..1701c70441 100644 --- a/bgpd/bgp_mpath.c +++ b/bgpd/bgp_mpath.c @@ -1,5 +1,4 @@ -/* $QuaggaId: Format:%an, %ai, %h$ $ - * +/* * BGP Multipath * Copyright (C) 2010 Google Inc. * @@ -114,7 +113,6 @@ bgp_info_nexthop_cmp (struct bgp_info *bi1, struct bgp_info *bi2) ae2 = bi2->attr->extra; compare = IPV4_ADDR_CMP (&bi1->attr->nexthop, &bi2->attr->nexthop); - if (!compare && ae1 && ae2) { if (ae1->mp_nexthop_len == ae2->mp_nexthop_len) @@ -126,8 +124,8 @@ bgp_info_nexthop_cmp (struct bgp_info *bi1, struct bgp_info *bi2) compare = IPV4_ADDR_CMP (&ae1->mp_nexthop_global_in, &ae2->mp_nexthop_global_in); break; -#ifdef HAVE_IPV6 case BGP_ATTR_NHLEN_IPV6_GLOBAL: + case BGP_ATTR_NHLEN_VPNV6_GLOBAL: compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global, &ae2->mp_nexthop_global); break; @@ -138,11 +136,9 @@ bgp_info_nexthop_cmp (struct bgp_info *bi1, struct bgp_info *bi2) compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_local, &ae2->mp_nexthop_local); break; -#endif /* HAVE_IPV6 */ } } -#ifdef HAVE_IPV6 /* This can happen if one IPv6 peer sends you global and link-local * nexthops but another IPv6 peer only sends you global */ @@ -159,7 +155,6 @@ bgp_info_nexthop_cmp (struct bgp_info *bi1, struct bgp_info *bi2) compare = 1; } } -#endif /* HAVE_IPV6 */ } return compare; @@ -756,10 +751,8 @@ bgp_info_mpath_aggregate_update (struct bgp_info *new_best, /* Zap multipath attr nexthop so we set nexthop to self */ attr.nexthop.s_addr = 0; -#ifdef HAVE_IPV6 if (attr.extra) memset (&attr.extra->mp_nexthop_global, 0, sizeof (struct in6_addr)); -#endif /* HAVE_IPV6 */ /* TODO: should we set ATOMIC_AGGREGATE and AGGREGATOR? */ } diff --git a/bgpd/bgp_mpath.h b/bgpd/bgp_mpath.h index 0a51c98d06..9a38b5943d 100644 --- a/bgpd/bgp_mpath.h +++ b/bgpd/bgp_mpath.h @@ -1,5 +1,4 @@ -/* $QuaggaId: Format:%an, %ai, %h$ $ - * +/* * BGP Multipath * Copyright (C) 2010 Google Inc. * diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index c64c69dfca..29c8383e88 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -35,11 +35,35 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #include "bgpd/bgp_attr.h" #include "bgpd/bgp_mplsvpn.h" #include "bgpd/bgp_packet.h" +#include "bgpd/bgp_vty.h" #if ENABLE_BGP_VNC #include "bgpd/rfapi/rfapi_backend.h" #endif +#define BGP_VPNVX_HELP_STR \ + "Address Family \n" \ + "Address Family \n" + +static int +argv_find_and_parse_vpnvx(struct cmd_token **argv, int argc, int *index, afi_t *afi) +{ + int ret = 0; + if (argv_find (argv, argc, "vpnv4", index)) + { + ret = 1; + if (afi) + *afi = AFI_IP; + } + else if (argv_find (argv, argc, "vpnv6", index)) + { + ret = 1; + if (afi) + *afi = AFI_IP6; + } + return ret; +} + u_int16_t decode_rd_type (u_char *pnt) { @@ -336,12 +360,24 @@ str2prefix_rd (const char *str, struct prefix_rd *prd) if (! p2) { + unsigned long as_val; + if (! all_digit (half)) goto out; - stream_putw (s, RD_TYPE_AS); - stream_putw (s, atoi (half)); - stream_putl (s, atol (p + 1)); + as_val = atol(half); + if (as_val > 0xffff) + { + stream_putw (s, RD_TYPE_AS4); + stream_putl (s, as_val); + stream_putw (s, atol (p + 1)); + } + else + { + stream_putw (s, RD_TYPE_AS); + stream_putw (s, as_val); + stream_putl (s, atol (p + 1)); + } } else { @@ -494,8 +530,46 @@ DEFUN (no_vpnv4_network, return bgp_static_unset_safi (SAFI_MPLS_VPN, vty, argv[idx_ipv4_prefixlen]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg); } +DEFUN (vpnv6_network, + vpnv6_network_cmd, + "network X:X::X:X/M rd ASN:nn_or_IP-address:nn tag WORD [route-map WORD]", + "Specify a network to announce via BGP\n" + "IPv6 prefix /, e.g., 3ffe::/16\n" + "Specify Route Distinguisher\n" + "VPN Route Distinguisher\n" + "BGP tag\n" + "tag value\n") +{ + int idx_ipv6_prefix = 1; + int idx_ext_community = 3; + int idx_word = 5; + int idx_word_2 = 7; + if (argv[idx_word_2]) + return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg, argv[idx_word_2]->arg); + else + return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg, NULL); +} + +/* For testing purpose, static route of MPLS-VPN. */ +DEFUN (no_vpnv6_network, + no_vpnv6_network_cmd, + "no network X:X::X:X/M rd ASN:nn_or_IP-address:nn tag WORD", + NO_STR + "Specify a network to announce via BGP\n" + "IPv6 prefix /, e.g., 3ffe::/16\n" + "Specify Route Distinguisher\n" + "VPN Route Distinguisher\n" + "BGP tag\n" + "tag value\n") +{ + int idx_ipv6_prefix = 2; + int idx_ext_community = 4; + int idx_word = 6; + return bgp_static_unset_safi (SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg); +} + static int -show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd, u_char use_json) +show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd, u_char use_json, afi_t afi) { struct bgp *bgp; struct bgp_table *table; @@ -538,7 +612,7 @@ show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd, u json_object_string_add(json_ocode, "incomplete", "?"); } - for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; + for (rn = bgp_table_top (bgp->rib[afi][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn)) { if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0) @@ -888,46 +962,20 @@ bgp_show_mpls_vpn (struct vty *vty, afi_t afi, struct prefix_rd *prd, if (output_count == 0) vty_out (vty, "No prefixes displayed, %ld exist%s", total_count, VTY_NEWLINE); else - vty_out (vty, "%sDisplayed %ld out of %ld total prefixes%s", + vty_out (vty, "%sDisplayed %ld routes and %ld total paths%s", VTY_NEWLINE, output_count, total_count, VTY_NEWLINE); } return CMD_SUCCESS; } -DEFUN (show_bgp_ivp4_vpn, - show_bgp_ipv4_vpn_cmd, - "show [ip] bgp ipv4 vpn [json]", +DEFUN (show_bgp_ip_vpn_rd, + show_bgp_ip_vpn_rd_cmd, + "show [ip] bgp "BGP_AFI_CMD_STR" vpn [rd ASN:nn_or_IP-address:nn] [json]", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Display VPN NLRI specific information\n" - JSON_STR) -{ - return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 0, use_json (argc, argv)); -} - -DEFUN (show_bgp_ipv6_vpn, - show_bgp_ipv6_vpn_cmd, - "show [ip] bgp ipv6 vpn [json]", - SHOW_STR - IP_STR - BGP_STR - "Address Family\n" - "Display VPN NLRI specific information\n" - JSON_STR) -{ - return bgp_show_mpls_vpn (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 0, use_json (argc, argv)); -} - -DEFUN (show_bgp_ipv4_vpn_rd, - show_bgp_ipv4_vpn_rd_cmd, - "show [ip] bgp ipv4 vpn rd ASN:nn_or_IP-address:nn [json]", - SHOW_STR - IP_STR - BGP_STR - "Address Family\n" + BGP_VPNVX_HELP_STR "Display VPN NLRI specific information\n" "Display information for a route distinguisher\n" "VPN Route Distinguisher\n" @@ -936,97 +984,99 @@ DEFUN (show_bgp_ipv4_vpn_rd, int idx_ext_community = 5; int ret; struct prefix_rd prd; + afi_t afi; + int idx = 0; - ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); - if (! ret) + if (argv_find_and_parse_afi (argv, argc, &idx, &afi)) { - vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); - return CMD_WARNING; + if (argv[idx_ext_community]->arg) + { + ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); + if (! ret) + { + vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); + return CMD_WARNING; + } + return bgp_show_mpls_vpn (vty, afi, &prd, bgp_show_type_normal, NULL, 0, use_json (argc, argv)); + } + else + { + return bgp_show_mpls_vpn (vty, afi, NULL, bgp_show_type_normal, NULL, 0, use_json (argc, argv)); + } } - return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 0, use_json (argc, argv)); + return CMD_SUCCESS; } -DEFUN (show_bgp_ipv6_vpn_rd, - show_bgp_ipv6_vpn_rd_cmd, - "show [ip] bgp ipv6 vpn rd ASN:nn_or_IP-address:nn [json]", +DEFUN (show_ip_bgp_vpn_all, + show_ip_bgp_vpn_all_cmd, + "show [ip] bgp ", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Display VPN NLRI specific information\n" - "Display information for a route distinguisher\n" - "VPN Route Distinguisher\n" - JSON_STR) + BGP_VPNVX_HELP_STR) { - int idx_ext_community = 5; - int ret; - struct prefix_rd prd; + afi_t afi; + int idx = 0; - ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); - if (!ret) - { - vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); - return CMD_WARNING; - } - - return bgp_show_mpls_vpn (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 0, use_json (argc, argv)); + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) + return bgp_show_mpls_vpn (vty, afi, NULL, bgp_show_type_normal, NULL, 0, 0); + return CMD_SUCCESS; } -DEFUN (show_ip_bgp_vpnv4_all, - show_ip_bgp_vpnv4_all_cmd, - "show [ip] bgp vpnv4 all", +DEFUN (show_ip_bgp_vpn_rd, + show_ip_bgp_vpn_rd_cmd, + "show [ip] bgp rd ASN:nn_or_IP-address:nn", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Display information about all VPNv4 NLRIs\n") -{ - return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 0, 0); -} - -DEFUN (show_ip_bgp_vpnv4_rd, - show_ip_bgp_vpnv4_rd_cmd, - "show [ip] bgp vpnv4 rd ASN:nn_or_IP-address:nn", - SHOW_STR - IP_STR - BGP_STR - "Address Family\n" + BGP_VPNVX_HELP_STR "Display information for a route distinguisher\n" "VPN Route Distinguisher\n") { int idx_ext_community = 5; int ret; struct prefix_rd prd; + afi_t afi; + int idx = 0; - ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); - if (! ret) + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) { - vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); - return CMD_WARNING; + ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); + if (! ret) + { + vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); + return CMD_WARNING; + } + return bgp_show_mpls_vpn (vty, afi, &prd, bgp_show_type_normal, NULL, 0, 0); } - return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 0, 0); -} + return CMD_SUCCESS; + } -DEFUN (show_ip_bgp_vpnv4_all_tags, - show_ip_bgp_vpnv4_all_tags_cmd, - "show [ip] bgp vpnv4 all tags", +DEFUN (show_ip_bgp_vpn_all_tags, + show_ip_bgp_vpn_all_tags_cmd, + "show [ip] bgp all tags", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Display information about all VPNv4 NLRIs\n" + BGP_VPNVX_HELP_STR + "Display information about all VPNv4/VPNV6 NLRIs\n" "Display BGP tags for prefixes\n") { - return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 1, 0); + afi_t afi; + int idx = 0; + + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) + return bgp_show_mpls_vpn (vty, afi, NULL, bgp_show_type_normal, NULL, 1, 0); + return CMD_SUCCESS; } -DEFUN (show_ip_bgp_vpnv4_rd_tags, - show_ip_bgp_vpnv4_rd_tags_cmd, - "show [ip] bgp vpnv4 rd ASN:nn_or_IP-address:nn tags", +DEFUN (show_ip_bgp_vpn_rd_tags, + show_ip_bgp_vpn_rd_tags_cmd, + "show [ip] bgp rd ASN:nn_or_IP-address:nn tags", SHOW_STR IP_STR BGP_STR - "Address Family\n" + BGP_VPNVX_HELP_STR "Display information for a route distinguisher\n" "VPN Route Distinguisher\n" "Display BGP tags for prefixes\n") @@ -1034,24 +1084,30 @@ DEFUN (show_ip_bgp_vpnv4_rd_tags, int idx_ext_community = 5; int ret; struct prefix_rd prd; + afi_t afi; + int idx = 0; - ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); - if (! ret) + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) { - vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); - return CMD_WARNING; + ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); + if (! ret) + { + vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); + return CMD_WARNING; + } + return bgp_show_mpls_vpn (vty, afi, &prd, bgp_show_type_normal, NULL, 1, 0); } - return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 1, 0); + return CMD_SUCCESS; } -DEFUN (show_ip_bgp_vpnv4_all_neighbor_routes, - show_ip_bgp_vpnv4_all_neighbor_routes_cmd, - "show [ip] bgp vpnv4 all neighbors A.B.C.D routes [json]", +DEFUN (show_ip_bgp_vpn_all_neighbor_routes, + show_ip_bgp_vpn_all_neighbor_routes_cmd, + "show [ip] bgp all neighbors A.B.C.D routes [json]", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Display information about all VPNv4 NLRIs\n" + BGP_VPNVX_HELP_STR + "Display information about all VPNv4/VPNv6 NLRIs\n" "Detailed information on TCP and BGP neighbor connections\n" "Neighbor to display information about\n" "Display routes learned from neighbor\n" @@ -1062,49 +1118,55 @@ DEFUN (show_ip_bgp_vpnv4_all_neighbor_routes, struct peer *peer; int ret; u_char uj = use_json(argc, argv); + afi_t afi; + int idx = 0; - ret = str2sockunion (argv[idx_ipv4]->arg, &su); - if (ret < 0) + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) { - if (uj) + ret = str2sockunion (argv[idx_ipv4]->arg, &su); + if (ret < 0) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "Malformed address"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "Malformed address"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "Malformed address: %s%s", argv[idx_ipv4]->arg, VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "Malformed address: %s%s", argv[idx_ipv4]->arg, VTY_NEWLINE); - return CMD_WARNING; - } - peer = peer_lookup (NULL, &su); - if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN]) - { - if (uj) + peer = peer_lookup (NULL, &su); + if (! peer || ! peer->afc[afi][SAFI_MPLS_VPN]) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "No such neighbor or address family"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "No such neighbor or address family"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); - return CMD_WARNING; - } - return bgp_show_mpls_vpn (vty, AFI_IP, NULL, bgp_show_type_neighbor, &su, 0, uj); + return bgp_show_mpls_vpn (vty, afi, NULL, bgp_show_type_neighbor, &su, 0, uj); + } + return CMD_SUCCESS; } -DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes, - show_ip_bgp_vpnv4_rd_neighbor_routes_cmd, - "show [ip] bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D routes [json]", +DEFUN (show_ip_bgp_vpn_rd_neighbor_routes, + show_ip_bgp_vpn_rd_neighbor_routes_cmd, + "show [ip] bgp rd ASN:nn_or_IP-address:nn neighbors A.B.C.D routes [json]", SHOW_STR IP_STR BGP_STR - "Address Family\n" + BGP_VPNVX_HELP_STR "Display information for a route distinguisher\n" "VPN Route Distinguisher\n" "Detailed information on TCP and BGP neighbor connections\n" @@ -1119,66 +1181,72 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes, struct peer *peer; struct prefix_rd prd; u_char uj = use_json(argc, argv); + afi_t afi; + int idx = 0; - ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); - if (! ret) + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) { - if (uj) + ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); + if (! ret) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "Malformed Route Distinguisher"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "Malformed Route Distinguisher"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); - return CMD_WARNING; - } - ret = str2sockunion (argv[idx_ipv4]->arg, &su); - if (ret < 0) - { - if (uj) + ret = str2sockunion (argv[idx_ipv4]->arg, &su); + if (ret < 0) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "Malformed address"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "Malformed address"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "Malformed address: %s%s", argv[idx_ext_community]->arg, VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "Malformed address: %s%s", argv[idx_ext_community]->arg, VTY_NEWLINE); - return CMD_WARNING; - } - peer = peer_lookup (NULL, &su); - if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN]) - { - if (uj) + peer = peer_lookup (NULL, &su); + if (! peer || ! peer->afc[afi][SAFI_MPLS_VPN]) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "No such neighbor or address family"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "No such neighbor or address family"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); - return CMD_WARNING; - } - return bgp_show_mpls_vpn (vty, AFI_IP, &prd, bgp_show_type_neighbor, &su, 0, uj); + return bgp_show_mpls_vpn (vty, afi, &prd, bgp_show_type_neighbor, &su, 0, uj); + } + return CMD_SUCCESS; } -DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes, - show_ip_bgp_vpnv4_all_neighbor_advertised_routes_cmd, - "show [ip] bgp vpnv4 all neighbors A.B.C.D advertised-routes [json]", +DEFUN (show_ip_bgp_vpn_all_neighbor_advertised_routes, + show_ip_bgp_vpn_all_neighbor_advertised_routes_cmd, + "show [ip] bgp all neighbors A.B.C.D advertised-routes [json]", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Display information about all VPNv4 NLRIs\n" + BGP_VPNVX_HELP_STR + "Display information about all VPNv4/VPNv6 NLRIs\n" "Detailed information on TCP and BGP neighbor connections\n" "Neighbor to display information about\n" "Display the routes advertised to a BGP neighbor\n" @@ -1189,48 +1257,54 @@ DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes, struct peer *peer; union sockunion su; u_char uj = use_json(argc, argv); + afi_t afi; + int idx = 0; - ret = str2sockunion (argv[idx_ipv4]->arg, &su); - if (ret < 0) + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) { - if (uj) + ret = str2sockunion (argv[idx_ipv4]->arg, &su); + if (ret < 0) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "Malformed address"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "Malformed address"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "Malformed address: %s%s", argv[idx_ipv4]->arg, VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "Malformed address: %s%s", argv[idx_ipv4]->arg, VTY_NEWLINE); - return CMD_WARNING; - } - peer = peer_lookup (NULL, &su); - if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN]) - { - if (uj) + peer = peer_lookup (NULL, &su); + if (! peer || ! peer->afc[afi][SAFI_MPLS_VPN]) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "No such neighbor or address family"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "No such neighbor or address family"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); - return CMD_WARNING; - } - return show_adj_route_vpn (vty, peer, NULL, uj); + return show_adj_route_vpn (vty, peer, NULL, uj, afi); + } + return CMD_SUCCESS; } -DEFUN (show_ip_bgp_vpnv4_rd_neighbor_advertised_routes, - show_ip_bgp_vpnv4_rd_neighbor_advertised_routes_cmd, - "show [ip] bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D advertised-routes [json]", +DEFUN (show_ip_bgp_vpn_rd_neighbor_advertised_routes, + show_ip_bgp_vpn_rd_neighbor_advertised_routes_cmd, + "show [ip] bgp rd ASN:nn_or_IP-address:nn neighbors A.B.C.D advertised-routes [json]", SHOW_STR IP_STR BGP_STR - "Address Family\n" + BGP_VPNVX_HELP_STR "Display information for a route distinguisher\n" "VPN Route Distinguisher\n" "Detailed information on TCP and BGP neighbor connections\n" @@ -1245,55 +1319,61 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_advertised_routes, struct prefix_rd prd; union sockunion su; u_char uj = use_json(argc, argv); + afi_t afi; + int idx = 0; - ret = str2sockunion (argv[idx_ipv4]->arg, &su); - if (ret < 0) + if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) { - if (uj) + ret = str2sockunion (argv[idx_ipv4]->arg, &su); + if (ret < 0) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "Malformed address"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "Malformed address"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "Malformed address: %s%s", argv[idx_ext_community]->arg, VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "Malformed address: %s%s", argv[idx_ext_community]->arg, VTY_NEWLINE); - return CMD_WARNING; - } - peer = peer_lookup (NULL, &su); - if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN]) - { - if (uj) + peer = peer_lookup (NULL, &su); + if (! peer || ! peer->afc[afi][SAFI_MPLS_VPN]) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "No such neighbor or address family"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "No such neighbor or address family"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); - return CMD_WARNING; - } - ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); - if (! ret) - { - if (uj) + ret = str2prefix_rd (argv[idx_ext_community]->arg, &prd); + if (! ret) { - json_object *json_no = NULL; - json_no = json_object_new_object(); - json_object_string_add(json_no, "warning", "Malformed Route Distinguisher"); - vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); - json_object_free(json_no); + if (uj) + { + json_object *json_no = NULL; + json_no = json_object_new_object(); + json_object_string_add(json_no, "warning", "Malformed Route Distinguisher"); + vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE); + json_object_free(json_no); + } + else + vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); + return CMD_WARNING; } - else - vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); - return CMD_WARNING; - } - return show_adj_route_vpn (vty, peer, &prd, uj); + return show_adj_route_vpn (vty, peer, &prd, uj, afi); + } + return CMD_SUCCESS; } void @@ -1303,16 +1383,16 @@ bgp_mplsvpn_init (void) install_element (BGP_VPNV4_NODE, &vpnv4_network_route_map_cmd); install_element (BGP_VPNV4_NODE, &no_vpnv4_network_cmd); - install_element (VIEW_NODE, &show_bgp_ipv4_vpn_cmd); - install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_cmd); - install_element (VIEW_NODE, &show_bgp_ipv6_vpn_cmd); - install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_tags_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_tags_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_neighbor_routes_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_neighbor_routes_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_neighbor_advertised_routes_cmd); - install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_neighbor_advertised_routes_cmd); + install_element (BGP_VPNV6_NODE, &vpnv6_network_cmd); + install_element (BGP_VPNV6_NODE, &no_vpnv6_network_cmd); + + install_element (VIEW_NODE, &show_bgp_ip_vpn_rd_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_all_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_rd_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_all_tags_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_rd_tags_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_all_neighbor_routes_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_rd_neighbor_routes_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_all_neighbor_advertised_routes_cmd); + install_element (VIEW_NODE, &show_ip_bgp_vpn_rd_neighbor_advertised_routes_cmd); } diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c index 9a49051a96..1358ebc5ef 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c @@ -598,10 +598,8 @@ bgp_connect (struct peer *peer) zlog_err ("%s: could not raise privs", __func__); if (sockunion_family (&peer->su) == AF_INET) setsockopt_ipv4_tos (peer->fd, IPTOS_PREC_INTERNETCONTROL); -# ifdef HAVE_IPV6 else if (sockunion_family (&peer->su) == AF_INET6) setsockopt_ipv6_tclass (peer->fd, IPTOS_PREC_INTERNETCONTROL); -# endif if (bgpd_privs.change (ZPRIVS_LOWER)) zlog_err ("%s: could not lower privs", __func__); #endif @@ -618,10 +616,8 @@ bgp_connect (struct peer *peer) return connect_error; } -#ifdef HAVE_IPV6 if (peer->conf_if || peer->ifname) ifindex = ifname2ifindex (peer->conf_if ? peer->conf_if : peer->ifname); -#endif /* HAVE_IPV6 */ if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s [Event] Connect start to %s fd %d", @@ -681,10 +677,8 @@ bgp_listener (int sock, struct sockaddr *sa, socklen_t salen) #ifdef IPTOS_PREC_INTERNETCONTROL if (sa->sa_family == AF_INET) setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL); -# ifdef HAVE_IPV6 else if (sa->sa_family == AF_INET6) setsockopt_ipv6_tclass (sock, IPTOS_PREC_INTERNETCONTROL); -# endif #endif sockopt_v6only (sa->sa_family, sock); @@ -717,7 +711,6 @@ bgp_listener (int sock, struct sockaddr *sa, socklen_t salen) } /* IPv6 supported version of BGP server socket setup. */ -#ifdef HAVE_IPV6 int bgp_socket (unsigned short port, const char *address) { @@ -774,50 +767,6 @@ bgp_socket (unsigned short port, const char *address) return 0; } -#else -/* Traditional IPv4 only version. */ -int -bgp_socket (unsigned short port, const char *address) -{ - int sock; - int socklen; - struct sockaddr_in sin; - int ret; - - sock = socket (AF_INET, SOCK_STREAM, 0); - if (sock < 0) - { - zlog_err ("socket: %s", safe_strerror (errno)); - return sock; - } - - /* if we intend to implement ttl-security, this socket needs ttl=255 */ - sockopt_ttl (AF_INET, sock, MAXTTL); - - memset (&sin, 0, sizeof (struct sockaddr_in)); - sin.sin_family = AF_INET; - sin.sin_port = htons (port); - socklen = sizeof (struct sockaddr_in); - - if (address && ((ret = inet_aton(address, &sin.sin_addr)) < 1)) - { - zlog_err("bgp_socket: could not parse ip address %s: %s", - address, safe_strerror (errno)); - return ret; - } -#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN - sin.sin_len = socklen; -#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ - - ret = bgp_listener (sock, (struct sockaddr *) &sin, socklen); - if (ret < 0) - { - close (sock); - return ret; - } - return sock; -} -#endif /* HAVE_IPV6 */ void bgp_close (void) diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c index 0a72d09228..0a9747b526 100644 --- a/bgpd/bgp_nexthop.c +++ b/bgpd/bgp_nexthop.c @@ -243,7 +243,6 @@ bgp_connected_add (struct bgp *bgp, struct connected *ifc) } } } -#ifdef HAVE_IPV6 else if (addr->family == AF_INET6) { apply_mask_ipv6 ((struct prefix_ipv6 *) &p); @@ -267,7 +266,6 @@ bgp_connected_add (struct bgp *bgp, struct connected *ifc) rn->info = bc; } } -#endif /* HAVE_IPV6 */ } void @@ -304,7 +302,6 @@ bgp_connected_delete (struct bgp *bgp, struct connected *ifc) bgp_unlock_node (rn); bgp_unlock_node (rn); } -#ifdef HAVE_IPV6 else if (addr->family == AF_INET6) { apply_mask_ipv6 ((struct prefix_ipv6 *) &p); @@ -329,7 +326,6 @@ bgp_connected_delete (struct bgp *bgp, struct connected *ifc) bgp_unlock_node (rn); bgp_unlock_node (rn); } -#endif /* HAVE_IPV6 */ } int @@ -450,12 +446,8 @@ bgp_show_nexthops (struct vty *vty, struct bgp *bgp, int detail) if (CHECK_FLAG(bnc->flags, BGP_NEXTHOP_CONNECTED)) vty_out (vty, " Must be Connected%s", VTY_NEWLINE); } -#ifdef HAVE_CLOCK_MONOTONIC tbuf = time(NULL) - (bgp_clock() - bnc->last_update); vty_out (vty, " Last update: %s", ctime(&tbuf)); -#else - vty_out (vty, " Last update: %s", ctime(&bnc->uptime)); -#endif /* HAVE_CLOCK_MONOTONIC */ vty_out(vty, "%s", VTY_NEWLINE); } } diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 1ca0483678..057e2ace76 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -509,7 +509,6 @@ make_prefix (int afi, struct bgp_info *ri, struct prefix *p) p->prefixlen = IPV4_MAX_BITLEN; } break; -#ifdef HAVE_IPV6 case AFI_IP6: /* We don't register link local NH */ if (ri->attr->extra->mp_nexthop_len != BGP_ATTR_NHLEN_IPV6_GLOBAL @@ -529,7 +528,6 @@ make_prefix (int afi, struct bgp_info *ri, struct prefix *p) p->prefixlen = IPV6_MAX_BITLEN; } break; -#endif default: if (BGP_DEBUG(nht, NHT)) { @@ -582,11 +580,9 @@ sendmsg_zebra_rnh (struct bgp_nexthop_cache *bnc, int command) case AF_INET: stream_put_in_addr (s, &p->u.prefix4); break; -#ifdef HAVE_IPV6 case AF_INET6: stream_put(s, &(p->u.prefix6), 16); break; -#endif default: break; } diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c index 02026a004a..7dbb439be1 100644 --- a/bgpd/bgp_open.c +++ b/bgpd/bgp_open.c @@ -79,9 +79,13 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, jso if (hdr->code == CAPABILITY_CODE_MP) { + afi_t afi; + safi_t safi; + + bgp_map_afi_safi_iana2int (ntohs(mpc.afi), mpc.safi, &afi, &safi); if (use_json) { - switch (ntohs (mpc.afi)) + switch (afi) { case AFI_IP: json_object_string_add(json_cap, "capabilityErrorMultiProtocolAfi", "IPv4"); @@ -93,7 +97,7 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, jso json_object_int_add(json_cap, "capabilityErrorMultiProtocolAfiUnknown", ntohs (mpc.afi)); break; } - switch (mpc.safi) + switch (safi) { case SAFI_UNICAST: json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "unicast"); @@ -101,7 +105,7 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, jso case SAFI_MULTICAST: json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "multicast"); break; - case SAFI_MPLS_LABELED_VPN: + case SAFI_MPLS_VPN: json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "MPLS-labeled VPN"); break; case SAFI_ENCAP: @@ -115,7 +119,7 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, jso else { vty_out (vty, " Capability error for: Multi protocol "); - switch (ntohs (mpc.afi)) + switch (afi) { case AFI_IP: vty_out (vty, "AFI IPv4, "); @@ -127,7 +131,7 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, jso vty_out (vty, "AFI Unknown %d, ", ntohs (mpc.afi)); break; } - switch (mpc.safi) + switch (safi) { case SAFI_UNICAST: vty_out (vty, "SAFI Unicast"); @@ -135,7 +139,7 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, jso case SAFI_MULTICAST: vty_out (vty, "SAFI Multicast"); break; - case SAFI_MPLS_LABELED_VPN: + case SAFI_MPLS_VPN: vty_out (vty, "SAFI MPLS-labeled VPN"); break; case SAFI_ENCAP: @@ -178,42 +182,15 @@ bgp_capability_mp_data (struct stream *s, struct capability_mp_data *mpc) mpc->safi = stream_getc (s); } -int -bgp_afi_safi_valid_indices (afi_t afi, safi_t *safi) -{ - switch (afi) - { - case AFI_IP: - case AFI_IP6: - switch (*safi) - { - /* BGP MPLS-labeled VPN SAFI isn't contigious with others, remap */ - case SAFI_MPLS_LABELED_VPN: - *safi = SAFI_MPLS_VPN; - case SAFI_UNICAST: - case SAFI_MULTICAST: - case SAFI_MPLS_VPN: - case SAFI_ENCAP: - return 1; - } - break; - case AFI_ETHER: - default: - break; - } - - zlog_debug ("unknown afi/safi (%u/%u)", afi, *safi); - - return 0; -} - /* Set negotiated capability value. */ static int bgp_capability_mp (struct peer *peer, struct capability_header *hdr) { struct capability_mp_data mpc; struct stream *s = BGP_INPUT (peer); - + afi_t afi; + safi_t safi; + /* Verify length is 4 */ if (hdr->length != 4) { @@ -228,14 +205,15 @@ bgp_capability_mp (struct peer *peer, struct capability_header *hdr) zlog_debug ("%s OPEN has MP_EXT CAP for afi/safi: %u/%u", peer->host, mpc.afi, mpc.safi); - if (!bgp_afi_safi_valid_indices (mpc.afi, &mpc.safi)) + /* Convert AFI, SAFI to internal values, check. */ + if (bgp_map_afi_safi_iana2int (mpc.afi, mpc.safi, &afi, &safi)) return -1; /* Now safi remapped, and afi/safi are valid array indices */ - peer->afc_recv[mpc.afi][mpc.safi] = 1; + peer->afc_recv[afi][safi] = 1; - if (peer->afc[mpc.afi][mpc.safi]) - peer->afc_nego[mpc.afi][mpc.safi] = 1; + if (peer->afc[afi][safi]) + peer->afc_nego[afi][safi] = 1; else return -1; @@ -243,7 +221,7 @@ bgp_capability_mp (struct peer *peer, struct capability_header *hdr) } static void -bgp_capability_orf_not_support (struct peer *peer, afi_t afi, safi_t safi, +bgp_capability_orf_not_support (struct peer *peer, iana_afi_t afi, safi_t safi, u_char type, u_char mode) { if (bgp_debug_neighbor_events(peer)) @@ -271,8 +249,9 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) { struct stream *s = BGP_INPUT (peer); struct capability_orf_entry entry; + iana_afi_t pkt_afi; afi_t afi; - safi_t safi; + safi_t pkt_safi, safi; u_char type; u_char mode; u_int16_t sm_cap = 0; /* capability send-mode receive */ @@ -282,22 +261,25 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) /* ORF Entry header */ bgp_capability_mp_data (s, &entry.mpc); entry.num = stream_getc (s); - afi = entry.mpc.afi; - safi = entry.mpc.safi; + pkt_afi = entry.mpc.afi; + pkt_safi = entry.mpc.safi; if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s ORF Cap entry for afi/safi: %u/%u", peer->host, entry.mpc.afi, entry.mpc.safi); - /* Check AFI and SAFI. */ - if (!bgp_afi_safi_valid_indices (entry.mpc.afi, &safi)) + /* Convert AFI, SAFI to internal values, check. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) { zlog_info ("%s Addr-family %d/%d not supported." " Ignoring the ORF capability", - peer->host, entry.mpc.afi, entry.mpc.safi); + peer->host, pkt_afi, pkt_safi); return 0; } + entry.mpc.afi = pkt_afi; + entry.mpc.safi = safi; + /* validate number field */ if (CAPABILITY_CODE_ORF_LEN + (entry.num * 2) > hdr->length) { @@ -321,7 +303,7 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) case ORF_MODE_RECEIVE: break; default: - bgp_capability_orf_not_support (peer, afi, safi, type, mode); + bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode); continue; } /* ORF Type and afi/safi error checks */ @@ -334,7 +316,7 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) case ORF_TYPE_PREFIX: break; default: - bgp_capability_orf_not_support (peer, afi, safi, type, mode); + bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode); continue; } break; @@ -344,12 +326,12 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) case ORF_TYPE_PREFIX_OLD: break; default: - bgp_capability_orf_not_support (peer, afi, safi, type, mode); + bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode); continue; } break; default: - bgp_capability_orf_not_support (peer, afi, safi, type, mode); + bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode); continue; } @@ -358,7 +340,7 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) || (afi == AFI_IP && safi == SAFI_MULTICAST) || (afi == AFI_IP6 && safi == SAFI_UNICAST))) { - bgp_capability_orf_not_support (peer, afi, safi, type, mode); + bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode); continue; } @@ -367,7 +349,7 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) " as %s for afi/safi: %d/%d", peer->host, LOOKUP (orf_type_str, type), LOOKUP (orf_mode_str, mode), - entry.mpc.afi, safi); + pkt_afi, pkt_safi); if (hdr->code == CAPABILITY_CODE_ORF) { @@ -381,7 +363,7 @@ bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr) } else { - bgp_capability_orf_not_support (peer, afi, safi, type, mode); + bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode); continue; } @@ -437,23 +419,26 @@ bgp_capability_restart (struct peer *peer, struct capability_header *caphdr) while (stream_get_getp (s) + 4 <= end) { - afi_t afi = stream_getw (s); - safi_t safi = stream_getc (s); + afi_t afi; + safi_t safi; + iana_afi_t pkt_afi = stream_getw (s); + safi_t pkt_safi = stream_getc (s); u_char flag = stream_getc (s); - if (!bgp_afi_safi_valid_indices (afi, &safi)) + /* Convert AFI, SAFI to internal values, check. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) { if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported." " Ignore the Graceful Restart capability for this AFI/SAFI", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); } else if (!peer->afc[afi][safi]) { if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled." " Ignore the Graceful Restart capability", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); } else { @@ -512,22 +497,25 @@ bgp_capability_addpath (struct peer *peer, struct capability_header *hdr) while (stream_get_getp (s) + 4 <= end) { - afi_t afi = stream_getw (s); - safi_t safi = stream_getc (s); + afi_t afi; + safi_t safi; + iana_afi_t pkt_afi = stream_getw (s); + safi_t pkt_safi = stream_getc (s); u_char send_receive = stream_getc (s); if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s OPEN has AddPath CAP for afi/safi: %u/%u%s%s", - peer->host, afi, safi, + peer->host, pkt_afi, pkt_safi, (send_receive & BGP_ADDPATH_RX) ? ", receive" : "", (send_receive & BGP_ADDPATH_TX) ? ", transmit" : ""); - if (!bgp_afi_safi_valid_indices (afi, &safi)) + /* Convert AFI, SAFI to internal values, check. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) { if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported." " Ignore the Addpath Attribute for this AFI/SAFI", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); continue; } else if (!peer->afc[afi][safi]) @@ -535,7 +523,7 @@ bgp_capability_addpath (struct peer *peer, struct capability_header *hdr) if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled." " Ignore the AddPath capability for this AFI/SAFI", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); continue; } @@ -565,20 +553,23 @@ bgp_capability_enhe (struct peer *peer, struct capability_header *hdr) while (stream_get_getp (s) + 6 <= end) { - afi_t afi = stream_getw (s); - safi_t safi = stream_getw (s); - afi_t nh_afi = stream_getw (s); + iana_afi_t pkt_afi = stream_getw (s); + afi_t afi; + safi_t safi, pkt_safi = stream_getw (s); + iana_afi_t pkt_nh_afi = stream_getw (s); + afi_t nh_afi; if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s Received with afi/safi/next-hop afi: %u/%u/%u", - peer->host, afi, safi, nh_afi); + peer->host, pkt_afi, pkt_safi, pkt_nh_afi); - if (!bgp_afi_safi_valid_indices (afi, &safi)) + /* Convert AFI, SAFI to internal values, check. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) { if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported." " Ignore the ENHE Attribute for this AFI/SAFI", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); continue; } @@ -587,11 +578,13 @@ bgp_capability_enhe (struct peer *peer, struct capability_header *hdr) * possibilities, so we ignore other values with a log. Also, only * Unicast SAFI is currently supported (and expected). */ + nh_afi = afi_iana2int (pkt_nh_afi); + if (afi != AFI_IP || safi != SAFI_UNICAST || nh_afi != AFI_IP6) { zlog_warn ("%s Unexpected afi/safi/next-hop afi: %u/%u/%u " "in Extended Next-hop capability, ignoring", - peer->host, afi, safi, nh_afi); + peer->host, pkt_afi, pkt_safi, pkt_nh_afi); continue; } @@ -1174,9 +1167,11 @@ bgp_open_capability_orf (struct stream *s, struct peer *peer, unsigned long orfp; unsigned long numberp; int number_of_orfs = 0; + iana_afi_t pkt_afi; + safi_t pkt_safi; - if (safi == SAFI_MPLS_VPN) - safi = SAFI_MPLS_LABELED_VPN; + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); stream_putc (s, BGP_OPEN_OPT_CAP); capp = stream_get_endp (s); /* Set Capability Len Pointer */ @@ -1184,9 +1179,9 @@ bgp_open_capability_orf (struct stream *s, struct peer *peer, stream_putc (s, code); /* Capability Code */ orfp = stream_get_endp (s); /* Set ORF Len Pointer */ stream_putc (s, 0); /* ORF Length */ - stream_putw (s, afi); + stream_putw (s, pkt_afi); stream_putc (s, 0); - stream_putc (s, safi); + stream_putc (s, pkt_safi); numberp = stream_get_endp (s); /* Set Number Pointer */ stream_putc (s, 0); /* Number of ORFs */ @@ -1235,8 +1230,9 @@ bgp_open_capability (struct stream *s, struct peer *peer) { u_char len; unsigned long cp, capp, rcapp; + iana_afi_t pkt_afi; afi_t afi; - safi_t safi; + safi_t safi, pkt_safi; as_t local_as; u_int32_t restart_time; u_char afi_safi_count = 0; @@ -1254,56 +1250,29 @@ bgp_open_capability (struct stream *s, struct peer *peer) || CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY)) return; - /* IPv4 unicast. */ - if (peer->afc[AFI_IP][SAFI_UNICAST]) - { - peer->afc_adv[AFI_IP][SAFI_UNICAST] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP); - stream_putc (s, 0); - stream_putc (s, SAFI_UNICAST); - } - /* IPv4 multicast. */ - if (peer->afc[AFI_IP][SAFI_MULTICAST]) - { - peer->afc_adv[AFI_IP][SAFI_MULTICAST] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP); - stream_putc (s, 0); - stream_putc (s, SAFI_MULTICAST); - } - /* IPv4 VPN */ - if (peer->afc[AFI_IP][SAFI_MPLS_VPN]) - { - peer->afc_adv[AFI_IP][SAFI_MPLS_VPN] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP); - stream_putc (s, 0); - stream_putc (s, SAFI_MPLS_LABELED_VPN); - } - /* ENCAP */ - if (peer->afc[AFI_IP][SAFI_ENCAP]) - { - peer->afc_adv[AFI_IP][SAFI_ENCAP] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP); - stream_putc (s, 0); - stream_putc (s, SAFI_ENCAP); - } -#ifdef HAVE_IPV6 - /* Currently supporting RFC-5549 for Link-Local peering only */ + /* MP capability for configured AFI, SAFI */ + for (afi = AFI_IP ; afi < AFI_MAX ; afi++) + for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++) + { + if (peer->afc[afi][safi]) + { + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); + + peer->afc_adv[afi][safi] = 1; + stream_putc (s, BGP_OPEN_OPT_CAP); + stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); + stream_putc (s, CAPABILITY_CODE_MP); + stream_putc (s, CAPABILITY_CODE_MP_LEN); + stream_putw (s, pkt_afi); + stream_putc (s, 0); + stream_putc (s, pkt_safi); + } + } + + /* Extended nexthop capability - currently supporting RFC-5549 for + * Link-Local peering only + */ if (CHECK_FLAG (peer->flags, PEER_FLAG_CAPABILITY_ENHE) && peer->su.sa.sa_family == AF_INET6 && IN6_IS_ADDR_LINKLOCAL(&peer->su.sin6.sin6_addr)) @@ -1323,55 +1292,6 @@ bgp_open_capability (struct stream *s, struct peer *peer) if (CHECK_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_RCV)) SET_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_NEGO); } - /* IPv6 unicast. */ - if (peer->afc[AFI_IP6][SAFI_UNICAST]) - { - peer->afc_adv[AFI_IP6][SAFI_UNICAST] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP6); - stream_putc (s, 0); - stream_putc (s, SAFI_UNICAST); - } - /* IPv6 multicast. */ - if (peer->afc[AFI_IP6][SAFI_MULTICAST]) - { - peer->afc_adv[AFI_IP6][SAFI_MULTICAST] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP6); - stream_putc (s, 0); - stream_putc (s, SAFI_MULTICAST); - } - /* IPv6 VPN. */ - if (peer->afc[AFI_IP6][SAFI_MPLS_VPN]) - { - peer->afc_adv[AFI_IP6][SAFI_MPLS_VPN] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP6); - stream_putc (s, 0); - stream_putc (s, SAFI_MPLS_LABELED_VPN); - } - /* IPv6 ENCAP. */ - if (peer->afc[AFI_IP6][SAFI_ENCAP]) - { - peer->afc_adv[AFI_IP6][SAFI_ENCAP] = 1; - stream_putc (s, BGP_OPEN_OPT_CAP); - stream_putc (s, CAPABILITY_CODE_MP_LEN + 2); - stream_putc (s, CAPABILITY_CODE_MP); - stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, AFI_IP6); - stream_putc (s, 0); - stream_putc (s, SAFI_ENCAP); - } -#endif /* HAVE_IPV6 */ /* Route refresh. */ SET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV); @@ -1420,8 +1340,11 @@ bgp_open_capability (struct stream *s, struct peer *peer) for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++) if (peer->afc[afi][safi]) { - stream_putw (s, afi); - stream_putc (s, safi); + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); + + stream_putw (s, pkt_afi); + stream_putc (s, pkt_safi); if (adv_addpath_tx) { @@ -1535,9 +1458,14 @@ bgp_open_capability (struct stream *s, struct peer *peer) for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++) if (peer->afc[afi][safi]) { - stream_putw (s, afi); - stream_putc (s, safi); - stream_putc (s, 0); //Forwarding is not retained as of now. + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); + stream_putw (s, pkt_afi); + stream_putc (s, pkt_safi); + if (bgp_flag_check(peer->bgp, BGP_FLAG_GR_PRESERVE_FWD)) + stream_putc (s, RESTART_F_BIT); + else + stream_putc (s, 0); } } diff --git a/bgpd/bgp_open.h b/bgpd/bgp_open.h index 8ec0a5416b..9275b3a101 100644 --- a/bgpd/bgp_open.h +++ b/bgpd/bgp_open.h @@ -31,7 +31,7 @@ struct capability_header /* Generic MP capability data */ struct capability_mp_data { - afi_t afi; + iana_afi_t afi; u_char reserved; safi_t safi; }; @@ -115,6 +115,5 @@ extern int bgp_open_option_parse (struct peer *, u_char, int *); extern void bgp_open_capability (struct stream *, struct peer *); extern void bgp_capability_vty_out (struct vty *, struct peer *, u_char, json_object *); extern as_t peek_for_as4_capability (struct peer *, u_char); -extern int bgp_afi_safi_valid_indices (afi_t, safi_t *); #endif /* _QUAGGA_BGP_OPEN_H */ diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 796a57f054..529a3e46ca 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -147,6 +147,8 @@ static struct stream * bgp_update_packet_eor (struct peer *peer, afi_t afi, safi_t safi) { struct stream *s; + iana_afi_t pkt_afi; + safi_t pkt_safi; if (DISABLE_BGP_ANNOUNCE) return NULL; @@ -169,13 +171,16 @@ bgp_update_packet_eor (struct peer *peer, afi_t afi, safi_t safi) } else { + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); + /* Total Path Attribute Length */ stream_putw (s, 6); stream_putc (s, BGP_ATTR_FLAG_OPTIONAL); stream_putc (s, BGP_ATTR_MP_UNREACH_NLRI); stream_putc (s, 3); - stream_putw (s, afi); - stream_putc (s, safi); + stream_putw (s, pkt_afi); + stream_putc (s, pkt_safi); } bgp_packet_set_size (s); @@ -240,8 +245,7 @@ bgp_write_packet (struct peer *peer) if (!(PAF_SUBGRP(paf))->t_coalesce && peer->afc_nego[afi][safi] && peer->synctime && ! CHECK_FLAG (peer->af_sflags[afi][safi], - PEER_STATUS_EOR_SEND) - && safi != SAFI_MPLS_VPN) + PEER_STATUS_EOR_SEND)) { SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_EOR_SEND); @@ -691,15 +695,16 @@ bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi, struct stream *s; struct bgp_filter *filter; int orf_refresh = 0; + iana_afi_t pkt_afi; + safi_t pkt_safi; if (DISABLE_BGP_ANNOUNCE) return; filter = &peer->filter[afi][safi]; - /* Adjust safi code. */ - if (safi == SAFI_MPLS_VPN) - safi = SAFI_MPLS_LABELED_VPN; + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); s = stream_new (BGP_MAX_PACKET_SIZE); @@ -710,9 +715,9 @@ bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi, bgp_packet_set_marker (s, BGP_MSG_ROUTE_REFRESH_OLD); /* Encode Route Refresh message. */ - stream_putw (s, afi); + stream_putw (s, pkt_afi); stream_putc (s, 0); - stream_putc (s, safi); + stream_putc (s, pkt_safi); if (orf_type == ORF_TYPE_PREFIX || orf_type == ORF_TYPE_PREFIX_OLD) @@ -735,7 +740,7 @@ bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi, zlog_debug ("%s sending REFRESH_REQ to remove ORF(%d) (%s) for afi/safi: %d/%d", peer->host, orf_type, (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"), - afi, safi); + pkt_afi, pkt_safi); } else { @@ -747,7 +752,7 @@ bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi, zlog_debug ("%s sending REFRESH_REQ with pfxlist ORF(%d) (%s) for afi/safi: %d/%d", peer->host, orf_type, (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"), - afi, safi); + pkt_afi, pkt_safi); } /* Total ORF Entry Len. */ @@ -762,7 +767,7 @@ bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi, { if (! orf_refresh) zlog_debug ("%s sending REFRESH_REQ for afi/safi: %d/%d", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); } /* Add packet to the peer. */ @@ -777,10 +782,11 @@ bgp_capability_send (struct peer *peer, afi_t afi, safi_t safi, int capability_code, int action) { struct stream *s; + iana_afi_t pkt_afi; + safi_t pkt_safi; - /* Adjust safi code. */ - if (safi == SAFI_MPLS_VPN) - safi = SAFI_MPLS_LABELED_VPN; + /* Convert AFI, SAFI to values for packet. */ + bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi); s = stream_new (BGP_MAX_PACKET_SIZE); @@ -793,14 +799,14 @@ bgp_capability_send (struct peer *peer, afi_t afi, safi_t safi, stream_putc (s, action); stream_putc (s, CAPABILITY_CODE_MP); stream_putc (s, CAPABILITY_CODE_MP_LEN); - stream_putw (s, afi); + stream_putw (s, pkt_afi); stream_putc (s, 0); - stream_putc (s, safi); + stream_putc (s, pkt_safi); if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s sending CAPABILITY has %s MP_EXT CAP for afi/safi: %d/%d", peer->host, action == CAPABILITY_ACTION_SET ? - "Advertising" : "Removing", afi, safi); + "Advertising" : "Removing", pkt_afi, pkt_safi); } /* Set packet size. */ @@ -1330,7 +1336,6 @@ bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet) case SAFI_MULTICAST: return bgp_nlri_parse_ip (peer, attr, packet); case SAFI_MPLS_VPN: - case SAFI_MPLS_LABELED_VPN: return bgp_nlri_parse_vpn (peer, attr, packet); case SAFI_ENCAP: return bgp_nlri_parse_encap (peer, attr, packet); @@ -1509,26 +1514,6 @@ bgp_update_receive (struct peer *peer, bgp_size_t size) if (!nlris[i].nlri) continue; - /* We use afi and safi as indices into tables and what not. It would - * be impossible, at this time, to support unknown afi/safis. And - * anyway, the peer needs to be configured to enable the afi/safi - * explicitly which requires UI support. - * - * Ignore unknown afi/safi NLRIs. - * - * Note: This means nlri[x].afi/safi still can not be trusted for - * indexing later in this function! - * - * Note2: This will also remap the wire code-point for VPN safi to the - * internal safi_t point, as needs be. - */ - if(!bgp_afi_safi_valid_indices (nlris[i].afi, &nlris[i].safi)) - { - zlog_info ("%s [Info] UPDATE with unsupported AFI/SAFI %u/%u", - peer->host, nlris[i].afi, nlris[i].safi); - continue; - } - /* NLRI is processed iff the peer if configured for the specific afi/safi */ if (!peer->afc[nlris[i].afi][nlris[i].safi]) { @@ -1587,9 +1572,7 @@ bgp_update_receive (struct peer *peer, bgp_size_t size) safi = SAFI_UNICAST; } else if (attr.flag & ATTR_FLAG_BIT (BGP_ATTR_MP_UNREACH_NLRI) - && nlris[NLRI_MP_WITHDRAW].length == 0 - && bgp_afi_safi_valid_indices (nlris[NLRI_MP_WITHDRAW].afi, - &nlris[NLRI_MP_WITHDRAW].safi)) + && nlris[NLRI_MP_WITHDRAW].length == 0) { afi = nlris[NLRI_MP_WITHDRAW].afi; safi = nlris[NLRI_MP_WITHDRAW].safi; @@ -1728,8 +1711,9 @@ bgp_keepalive_receive (struct peer *peer, bgp_size_t size) static void bgp_route_refresh_receive (struct peer *peer, bgp_size_t size) { + iana_afi_t pkt_afi; afi_t afi; - safi_t safi; + safi_t pkt_safi, safi; struct stream *s; struct peer_af *paf; struct update_group *updgrp; @@ -1758,28 +1742,22 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size) s = peer->ibuf; /* Parse packet. */ - afi = stream_getw (s); + pkt_afi = stream_getw (s); (void)stream_getc (s); - safi = stream_getc (s); + pkt_safi = stream_getc (s); if (bgp_debug_update(peer, NULL, NULL, 0)) zlog_debug ("%s rcvd REFRESH_REQ for afi/safi: %d/%d", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); - /* Check AFI and SAFI. */ - if ((afi != AFI_IP && afi != AFI_IP6) - || (safi != SAFI_UNICAST && safi != SAFI_MULTICAST - && safi != SAFI_MPLS_LABELED_VPN)) + /* Convert AFI, SAFI to internal values and check. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) { zlog_info ("%s REFRESH_REQ for unrecognized afi/safi: %d/%d - ignored", - peer->host, afi, safi); + peer->host, pkt_afi, pkt_safi); return; } - /* Adjust safi code. */ - if (safi == SAFI_MPLS_LABELED_VPN) - safi = SAFI_MPLS_VPN; - if (size != BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE) { u_char *end; @@ -1955,8 +1933,9 @@ bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length) struct capability_mp_data mpc; struct capability_header *hdr; u_char action; + iana_afi_t pkt_afi; afi_t afi; - safi_t safi; + safi_t pkt_safi, safi; end = pnt + length; @@ -2000,18 +1979,19 @@ bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length) /* We know MP Capability Code. */ if (hdr->code == CAPABILITY_CODE_MP) { - afi = ntohs (mpc.afi); - safi = mpc.safi; + pkt_afi = ntohs (mpc.afi); + pkt_safi = mpc.safi; /* Ignore capability when override-capability is set. */ if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY)) continue; - if (!bgp_afi_safi_valid_indices (afi, &safi)) + /* Convert AFI, SAFI to internal values. */ + if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi)) { if (bgp_debug_neighbor_events(peer)) zlog_debug ("%s Dynamic Capability MP_EXT afi/safi invalid " - "(%u/%u)", peer->host, afi, safi); + "(%u/%u)", peer->host, pkt_afi, pkt_safi); continue; } @@ -2021,7 +2001,7 @@ bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length) peer->host, action == CAPABILITY_ACTION_SET ? "Advertising" : "Removing", - ntohs(mpc.afi) , mpc.safi); + pkt_afi, pkt_safi); if (action == CAPABILITY_ACTION_SET) { diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index cfc4ec3407..75036b5496 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -630,8 +630,9 @@ bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist, { if (peer_sort (new->peer) == BGP_PEER_IBGP && peer_sort (exist->peer) == BGP_PEER_IBGP - && CHECK_FLAG (mpath_cfg->ibgp_flags, - BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN)) + && (mpath_cfg == NULL || + CHECK_FLAG (mpath_cfg->ibgp_flags, + BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN))) { newm = BGP_CLUSTER_LIST_LENGTH(new->attr); existm = BGP_CLUSTER_LIST_LENGTH(exist->attr); @@ -867,9 +868,8 @@ bgp_info_cmp_compatible (struct bgp *bgp, struct bgp_info *new, struct bgp_info afi_t afi, safi_t safi) { int paths_eq; - struct bgp_maxpaths_cfg mpath_cfg; int ret; - ret = bgp_info_cmp (bgp, new, exist, &paths_eq, &mpath_cfg, 0, __func__); + ret = bgp_info_cmp (bgp, new, exist, &paths_eq, NULL, 0, __func__); if (paths_eq) ret = 0; @@ -1172,10 +1172,8 @@ subgroup_announce_reset_nhop (u_char family, struct attr *attr) { if (family == AF_INET) attr->nexthop.s_addr = 0; -#ifdef HAVE_IPV6 if (family == AF_INET6) memset (&attr->extra->mp_nexthop_global, 0, IPV6_MAX_BYTELEN); -#endif } int @@ -1266,10 +1264,8 @@ subgroup_announce_check (struct bgp_info *ri, struct update_subgroup *subgrp, { if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY) return 0; -#ifdef HAVE_IPV6 else if (p->family == AF_INET6 && p->prefixlen == 0) return 0; -#endif /* HAVE_IPV6 */ } /* Transparency check. */ @@ -1432,7 +1428,6 @@ subgroup_announce_check (struct bgp_info *ri, struct update_subgroup *subgrp, if (reflect) SET_FLAG(attr->rmap_change_flags, BATTR_REFLECTED); -#ifdef HAVE_IPV6 #define NEXTHOP_IS_V6 (\ (safi != SAFI_ENCAP && \ (p->family == AF_INET6 || peer_cap_enhe(peer))) || \ @@ -1463,7 +1458,6 @@ subgroup_announce_check (struct bgp_info *ri, struct update_subgroup *subgrp, PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED))) memset (&attr->extra->mp_nexthop_local, 0, IPV6_MAX_BYTELEN); } -#endif /* HAVE_IPV6 */ bgp_peer_remove_private_as(bgp, afi, safi, peer, attr); bgp_peer_as_override(bgp, afi, safi, peer, attr); @@ -1799,6 +1793,7 @@ subgroup_process_announce_selected (struct update_subgroup *subgrp, PEER_STATUS_ORF_WAIT_REFRESH)) return 0; + memset(&extra, 0, sizeof(struct attr_extra)); /* It's initialized in bgp_announce_check() */ attr.extra = &extra; @@ -2115,9 +2110,12 @@ bgp_maximum_prefix_restart_timer (struct thread *thread) } int -bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi, +bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi, safi_t safi, int always) { + iana_afi_t pkt_afi; + safi_t pkt_safi; + if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) return 0; @@ -2135,15 +2133,15 @@ bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi, if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)) return 0; + /* Convert AFI, SAFI to values for packet. */ + pkt_afi = afi_int2iana (afi); + pkt_safi = safi_int2iana (safi); { u_int8_t ndata[7]; - if (safi == SAFI_MPLS_VPN) - safi = SAFI_MPLS_LABELED_VPN; - - ndata[0] = (afi >> 8); - ndata[1] = afi; - ndata[2] = safi; + ndata[0] = (pkt_afi >> 8); + ndata[1] = pkt_afi; + ndata[2] = pkt_safi; ndata[3] = (peer->pmax[afi][safi] >> 24); ndata[4] = (peer->pmax[afi][safi] >> 16); ndata[5] = (peer->pmax[afi][safi] >> 8); @@ -2316,14 +2314,13 @@ bgp_update_martian_nexthop (struct bgp *bgp, afi_t afi, safi_t safi, struct attr IPV4_CLASS_DE (ntohl (attre->mp_nexthop_global_in.s_addr))); break; -#ifdef HAVE_IPV6 case BGP_ATTR_NHLEN_IPV6_GLOBAL: case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL: + case BGP_ATTR_NHLEN_VPNV6_GLOBAL: ret = (IN6_IS_ADDR_UNSPECIFIED(&attre->mp_nexthop_global) || IN6_IS_ADDR_LOOPBACK(&attre->mp_nexthop_global) || IN6_IS_ADDR_MULTICAST(&attre->mp_nexthop_global)); break; -#endif /* HAVE_IPV6 */ default: ret = 1; @@ -3307,17 +3304,37 @@ bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi) struct bgp_info *ri; struct bgp_table *table; - table = peer->bgp->rib[afi][safi]; - - for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) + if ( safi == SAFI_MPLS_VPN) { - for (ri = rn->info; ri; ri = ri->next) - if (ri->peer == peer) - { - if (CHECK_FLAG (ri->flags, BGP_INFO_STALE)) - bgp_rib_remove (rn, ri, peer, afi, safi); - break; - } + for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn)) + { + struct bgp_node *rm; + struct bgp_info *ri; + + /* look for neighbor in tables */ + if ((table = rn->info) != NULL) + { + for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm)) + for (ri = rm->info; ri; ri = ri->next) + if (ri->peer == peer) + { + if (CHECK_FLAG (ri->flags, BGP_INFO_STALE)) + bgp_rib_remove (rm, ri, peer, afi, safi); + break; + } + } + } + } + else + { + for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn)) + for (ri = rn->info; ri; ri = ri->next) + if (ri->peer == peer) + { + if (CHECK_FLAG (ri->flags, BGP_INFO_STALE)) + bgp_rib_remove (rn, ri, peer, afi, safi); + break; + } } } @@ -3502,7 +3519,6 @@ bgp_nlri_parse_ip (struct peer *peer, struct attr *attr, } } -#ifdef HAVE_IPV6 /* Check address. */ if (afi == AFI_IP6 && safi == SAFI_UNICAST) { @@ -3525,7 +3541,6 @@ bgp_nlri_parse_ip (struct peer *peer, struct attr *attr, continue; } } -#endif /* HAVE_IPV6 */ /* Normal process. */ if (attr) @@ -4008,14 +4023,12 @@ bgp_static_set (struct vty *vty, const char *ip_str, vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE); return CMD_WARNING; } -#ifdef HAVE_IPV6 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6)) { vty_out (vty, "%% Malformed prefix (link-local address)%s", VTY_NEWLINE); return CMD_WARNING; } -#endif /* HAVE_IPV6 */ apply_mask (&p); @@ -4097,14 +4110,12 @@ bgp_static_unset (struct vty *vty, const char *ip_str, vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE); return CMD_WARNING; } -#ifdef HAVE_IPV6 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6)) { vty_out (vty, "%% Malformed prefix (link-local address)%s", VTY_NEWLINE); return CMD_WARNING; } -#endif /* HAVE_IPV6 */ apply_mask (&p); @@ -4289,6 +4300,7 @@ bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str, struct bgp_table *table; struct bgp_static *bgp_static; u_char tag[3]; + afi_t afi; ret = str2prefix (ip_str, &p); if (! ret) @@ -4311,11 +4323,19 @@ bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str, vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE); return CMD_WARNING; } - - prn = bgp_node_get (bgp->route[AFI_IP][safi], + if (p.family == AF_INET) + afi = AFI_IP; + else if (p.family == AF_INET6) + afi = AFI_IP6; + else + { + vty_out (vty, "%% Non Supported prefix%s", VTY_NEWLINE); + return CMD_WARNING; + } + prn = bgp_node_get (bgp->route[afi][safi], (struct prefix *)&prd); if (prn->info == NULL) - prn->info = bgp_table_init (AFI_IP, safi); + prn->info = bgp_table_init (afi, safi); else bgp_unlock_node (prn); table = prn->info; @@ -4348,7 +4368,7 @@ bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str, rn->info = bgp_static; bgp_static->valid = 1; - bgp_static_update_safi (bgp, &p, bgp_static, AFI_IP, safi); + bgp_static_update_safi (bgp, &p, bgp_static, afi, safi); } return CMD_SUCCESS; @@ -4478,7 +4498,6 @@ bgp_config_write_table_map (struct vty *vty, struct bgp *bgp, afi_t afi, return 0; } - DEFUN (bgp_table_map, bgp_table_map_cmd, "table-map WORD", @@ -5531,14 +5550,12 @@ bgp_redistribute_add (struct bgp *bgp, struct prefix *p, const struct in_addr *n attr.nexthop = *nexthop; attr.nh_ifindex = ifindex; -#ifdef HAVE_IPV6 if (nexthop6) { struct attr_extra *extra = bgp_attr_extra_get(&attr); extra->mp_nexthop_global = *nexthop6; extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL; } -#endif attr.med = metric; attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC); @@ -5867,12 +5884,10 @@ route_vty_out (struct vty *vty, struct prefix *p, vty_out (vty, "%s", inet_ntop(af, &attr->extra->mp_nexthop_global_in, buf, BUFSIZ)); break; -#if HAVE_IPV6 case AF_INET6: vty_out (vty, "%s", inet_ntop(af, &attr->extra->mp_nexthop_global, buf, BUFSIZ)); break; -#endif default: vty_out(vty, "?"); break; @@ -6119,7 +6134,6 @@ route_vty_out_tmp (struct vty *vty, struct prefix *p, struct attr *attr, safi_t else json_object_string_add(json_net, "nextHop", inet_ntoa (attr->nexthop)); } -#ifdef HAVE_IPV6 else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr)) { char buf[BUFSIZ]; @@ -6127,7 +6141,6 @@ route_vty_out_tmp (struct vty *vty, struct prefix *p, struct attr *attr, safi_t json_object_string_add(json_net, "netHopGloabal", inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global, buf, BUFSIZ)); } -#endif /* HAVE_IPV6 */ if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC)) json_object_int_add(json_net, "metric", attr->med); @@ -6160,7 +6173,6 @@ route_vty_out_tmp (struct vty *vty, struct prefix *p, struct attr *attr, safi_t else vty_out (vty, "%-16s", inet_ntoa (attr->nexthop)); } -#ifdef HAVE_IPV6 else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr)) { int len; @@ -6177,7 +6189,6 @@ route_vty_out_tmp (struct vty *vty, struct prefix *p, struct attr *attr, safi_t else vty_out (vty, "%*s", len, " "); } -#endif /* HAVE_IPV6 */ if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC)) vty_out (vty, "%10u", attr->med); else @@ -6258,7 +6269,6 @@ route_vty_out_tag (struct vty *vty, struct prefix *p, vty_out (vty, "%-16s", inet_ntoa (attr->nexthop)); } } -#ifdef HAVE_IPV6 else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr)) { assert (attr->extra); @@ -6295,7 +6305,6 @@ route_vty_out_tag (struct vty *vty, struct prefix *p, } } -#endif /* HAVE_IPV6 */ } label = decode_label (binfo->extra->tag); @@ -6537,9 +6546,7 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p, char buf1[BUFSIZ]; struct attr *attr; int sockunion_vty_out (struct vty *, union sockunion *); -#ifdef HAVE_CLOCK_MONOTONIC time_t tbuf; -#endif json_object *json_bestpath = NULL; json_object *json_cluster_list = NULL; json_object *json_cluster_list_list = NULL; @@ -7164,7 +7171,6 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p, } /* Line 8 display Uptime */ -#ifdef HAVE_CLOCK_MONOTONIC tbuf = time(NULL) - (bgp_clock() - binfo->uptime); if (json_paths) { @@ -7175,17 +7181,6 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p, } else vty_out (vty, " Last update: %s", ctime(&tbuf)); -#else - if (json_paths) - { - json_last_update = json_object_new_object(); - json_object_int_add(json_last_update, "epoch", tbuf); - json_object_string_add(json_last_update, "string", ctime(&binfo->uptime)); - json_object_object_add(json_path, "lastUpdate", json_last_update); - } - else - vty_out (vty, " Last update: %s", ctime(&binfo->uptime)); -#endif /* HAVE_CLOCK_MONOTONIC */ } /* We've constructed the json object for this path, add it to the json @@ -7486,7 +7481,7 @@ bgp_show_table (struct vty *vty, struct bgp *bgp, struct bgp_table *table, vty_out (vty, "No BGP prefixes displayed, %ld exist%s", total_count, VTY_NEWLINE); } else - vty_out (vty, "%sDisplayed %ld out of %ld total prefixes%s", + vty_out (vty, "%sDisplayed %ld routes and %ld total paths%s", VTY_NEWLINE, output_count, total_count, VTY_NEWLINE); } @@ -7840,7 +7835,7 @@ bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str, /* BGP route print out function. */ DEFUN (show_ip_bgp_ipv4, show_ip_bgp_ipv4_cmd, - "show [ip] bgp [ WORD] []|ipv6 []|encap [unicast]|vpnv4 [unicast]>]\ + "show [ip] bgp [ WORD] []|ipv6 []]\ [<\ cidr-only\ |dampening \ @@ -7860,12 +7855,12 @@ DEFUN (show_ip_bgp_ipv4, "Address Family\n" "Address Family modifier\n" "Address Family modifier\n" - "Address Family\n" "Address Family modifier\n" "Address Family modifier\n" "Address Family\n" "Address Family modifier\n" - "Address Family\n" + "Address Family modifier\n" + "Address Family modifier\n" "Address Family modifier\n" "Display only routes with non-natural netmasks\n" "Display detailed information about dampening\n" @@ -7910,7 +7905,7 @@ DEFUN (show_ip_bgp_ipv4, { afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP; if (argv_find (argv, argc, "unicast", &idx) || argv_find (argv, argc, "multicast", &idx)) - safi = strmatch (argv[idx]->text, "unicast") ? SAFI_UNICAST : SAFI_MULTICAST; + safi = bgp_vty_safi_from_arg (argv[idx]->text); } else if (argv_find (argv, argc, "encap", &idx) || argv_find (argv, argc, "vpnv4", &idx)) { @@ -7987,7 +7982,7 @@ DEFUN (show_ip_bgp_ipv4, DEFUN (show_ip_bgp_route, show_ip_bgp_route_cmd, - "show [ip] bgp [ WORD] []|ipv6 []|encap [unicast]|vpnv4 [unicast]>]" + "show [ip] bgp [ WORD] []|ipv6 []]" " [] [json]", SHOW_STR IP_STR @@ -7996,12 +7991,12 @@ DEFUN (show_ip_bgp_route, "Address Family\n" "Address Family modifier\n" "Address Family modifier\n" - "Address Family\n" "Address Family modifier\n" "Address Family modifier\n" "Address Family\n" "Address Family modifier\n" - "Address Family\n" + "Address Family modifier\n" + "Address Family modifier\n" "Address Family modifier\n" "Network in the BGP routing table to display\n" "IPv4 prefix\n" @@ -8076,16 +8071,20 @@ DEFUN (show_ip_bgp_route, DEFUN (show_ip_bgp_regexp, show_ip_bgp_regexp_cmd, - "show [ip] bgp []|ipv6 []|encap [unicast]|vpnv4 [unicast]>] regexp REGEX...", + "show [ip] bgp []|ipv6 []|encap [unicast]|vpnv4 [unicast]>] regexp REGEX...", SHOW_STR IP_STR BGP_STR "Address Family\n" "Address Family modifier\n" "Address Family modifier\n" + "Address Family modifier\n" + "Address Family modifier\n" "Address Family\n" "Address Family modifier\n" "Address Family modifier\n" + "Address Family modifier\n" + "Address Family modifier\n" "Address Family\n" "Address Family modifier\n" "Address Family\n" @@ -8780,39 +8779,20 @@ bgp_table_stats_vty (struct vty *vty, const char *name, vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE); return CMD_WARNING; } - if (strncmp (afi_str, "ipv", 3) == 0) - { - if (strncmp (afi_str, "ipv4", 4) == 0) - afi = AFI_IP; - else if (strncmp (afi_str, "ipv6", 4) == 0) - afi = AFI_IP6; - else - { - vty_out (vty, "%% Invalid address family %s%s", - afi_str, VTY_NEWLINE); - return CMD_WARNING; - } - if (strncmp (safi_str, "m", 1) == 0) - safi = SAFI_MULTICAST; - else if (strncmp (safi_str, "u", 1) == 0) - safi = SAFI_UNICAST; - else if (strncmp (safi_str, "e", 1) == 0) - safi = SAFI_ENCAP; - else if (strncmp (safi_str, "vpnv4", 5) == 0 || strncmp (safi_str, "vpnv6", 5) == 0) - safi = SAFI_MPLS_VPN; - else - { - vty_out (vty, "%% Invalid subsequent address family %s%s", - safi_str, VTY_NEWLINE); - return CMD_WARNING; - } - } - else + afi = bgp_vty_afi_from_arg(afi_str); + if (afi == AFI_MAX) { vty_out (vty, "%% Invalid address family \"%s\"%s", afi_str, VTY_NEWLINE); return CMD_WARNING; } + safi = bgp_vty_safi_from_arg(safi_str); + if (safi == SAFI_MAX) + { + vty_out (vty, "%% Invalid subsequent address family %s%s", + safi_str, VTY_NEWLINE); + return CMD_WARNING; + } return bgp_table_stats (vty, bgp, afi, safi); } @@ -9497,7 +9477,7 @@ DEFUN (show_ip_bgp_instance_neighbor_advertised_route, char *vrf = NULL; char *rmap_name = NULL; char *peerstr = NULL; - int rcvd; + int rcvd = 0; struct peer *peer; @@ -10309,7 +10289,7 @@ DEFUN (clear_ip_bgp_dampening_address_mask, /* also used for encap safi */ static int -bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp, +bgp_config_write_network_vpn (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi, int *write) { struct bgp_node *prn; @@ -10359,8 +10339,8 @@ bgp_config_write_network (struct vty *vty, struct bgp *bgp, struct bgp_aggregate *bgp_aggregate; char buf[SU_ADDRSTRLEN]; - if (afi == AFI_IP && ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP))) - return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write); + if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP)) + return bgp_config_write_network_vpn (vty, bgp, afi, safi, write); /* Network configuration. */ for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn)) @@ -10556,17 +10536,6 @@ bgp_route_init (void) install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd); install_element (VIEW_NODE, &show_ip_bgp_route_cmd); install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd); - - install_element (VIEW_NODE, &show_ip_bgp_instance_neighbor_advertised_route_cmd); - install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd); - install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd); - install_element (VIEW_NODE, &show_ip_bgp_dampening_params_cmd); - install_element (VIEW_NODE, &show_ip_bgp_ipv4_dampening_parameters_cmd); - - /* Restricted node: VIEW_NODE - (set of dangerous commands) */ - install_element (VIEW_NODE, &show_ip_bgp_instance_all_cmd); - install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd); - install_element (VIEW_NODE, &show_ip_bgp_route_cmd); install_element (VIEW_NODE, &show_ip_bgp_instance_neighbor_advertised_route_cmd); install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd); install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd); @@ -10585,7 +10554,6 @@ bgp_route_init (void) install_element (ENABLE_NODE, &show_ip_bgp_instance_neighbor_prefix_counts_cmd); install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd); install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd); -#ifdef HAVE_IPV6 install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd); install_element (ENABLE_NODE, &show_bgp_instance_ipv6_neighbor_prefix_counts_cmd); @@ -10605,7 +10573,6 @@ bgp_route_init (void) /* Statistics */ install_element (ENABLE_NODE, &show_bgp_statistics_cmd); install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd); -#endif /* HAVE_IPV6 */ install_element (BGP_NODE, &bgp_distance_cmd); install_element (BGP_NODE, &no_bgp_distance_cmd); diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index e3e018c07f..4f7f51fbbb 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -1916,7 +1916,6 @@ static struct route_map_rule_cmd route_set_tag_cmd = }; -#ifdef HAVE_IPV6 /* `match ipv6 address IP_ACCESS_LIST' */ static route_map_result_t @@ -2341,8 +2340,6 @@ struct route_map_rule_cmd route_set_ipv6_nexthop_peer_cmd = route_set_ipv6_nexthop_peer_free }; -#endif /* HAVE_IPV6 */ - /* `set vpnv4 nexthop A.B.C.D' */ static route_map_result_t @@ -3755,7 +3752,6 @@ DEFUN (no_set_aggregator_as, return ret; } -#ifdef HAVE_IPV6 DEFUN (match_ipv6_next_hop, match_ipv6_next_hop_cmd, "match ipv6 next-hop X:X::X:X", @@ -3884,7 +3880,6 @@ DEFUN (no_set_ipv6_nexthop_global, return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), "ipv6 next-hop global", argv[idx_ipv6]->arg); } -#endif /* HAVE_IPV6 */ DEFUN (set_vpnv4_nexthop, set_vpnv4_nexthop_cmd, @@ -4085,7 +4080,6 @@ bgp_route_map_init (void) install_element (RMAP_NODE, &set_originator_id_cmd); install_element (RMAP_NODE, &no_set_originator_id_cmd); -#ifdef HAVE_IPV6 route_map_install_match (&route_match_ipv6_address_cmd); route_map_install_match (&route_match_ipv6_next_hop_cmd); route_map_install_match (&route_match_ipv6_address_prefix_list_cmd); @@ -4102,7 +4096,6 @@ bgp_route_map_init (void) install_element (RMAP_NODE, &no_set_ipv6_nexthop_prefer_global_cmd); install_element (RMAP_NODE, &set_ipv6_nexthop_peer_cmd); install_element (RMAP_NODE, &no_set_ipv6_nexthop_peer_cmd); -#endif /* HAVE_IPV6 */ } void diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index 2f839c4af7..3c96dac617 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -222,8 +222,6 @@ bgp_node_match_ipv4 (const struct bgp_table *table, struct in_addr *addr) addr)); } -#ifdef HAVE_IPV6 - /* * bgp_node_match_ipv6 */ @@ -234,8 +232,6 @@ bgp_node_match_ipv6 (const struct bgp_table *table, struct in6_addr *addr) addr)); } -#endif /* HAVE_IPV6 */ - static inline unsigned long bgp_table_count (const struct bgp_table *const table) { diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c index 9a103de915..48f56a29b2 100644 --- a/bgpd/bgp_updgrp_adv.c +++ b/bgpd/bgp_updgrp_adv.c @@ -573,8 +573,9 @@ subgroup_clear_table (struct update_subgroup *subgrp) SUBGRP_FOREACH_ADJ_SAFE (subgrp, aout, taout) { - bgp_adj_out_remove_subgroup (aout->rn, aout, subgrp); - bgp_unlock_node (aout->rn); + struct bgp_node *rn = aout->rn; + bgp_adj_out_remove_subgroup (rn, aout, subgrp); + bgp_unlock_node (rn); } } @@ -710,7 +711,6 @@ subgroup_default_originate (struct update_subgroup *subgrp, int withdraw) if (afi == AFI_IP) str2prefix ("0.0.0.0/0", &p); -#ifdef HAVE_IPV6 else if (afi == AFI_IP6) { struct attr_extra *ae = attr.extra; @@ -726,7 +726,6 @@ subgroup_default_originate (struct update_subgroup *subgrp, int withdraw) && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local)) ae->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL; } -#endif /* HAVE_IPV6 */ if (peer->default_rmap[afi][safi].name) { @@ -784,10 +783,8 @@ subgroup_default_originate (struct update_subgroup *subgrp, int withdraw) */ if (afi == AFI_IP) str2prefix ("0.0.0.0/0", &p); -#ifdef HAVE_IPV6 else str2prefix ("::/0", &p); -#endif /* HAVE_IPV6 */ rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, &p, NULL); bgp_adj_out_unset_subgroup (rn, subgrp, 0, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE); diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index e18ba235c7..cb05cf0a80 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -988,10 +988,8 @@ subgroup_default_update_packet (struct update_subgroup *subgrp, if (afi == AFI_IP) str2prefix ("0.0.0.0/0", &p); -#ifdef HAVE_IPV6 else str2prefix ("::/0", &p); -#endif /* HAVE_IPV6 */ /* Logging the attribute. */ if (bgp_debug_update(NULL, &p, subgrp->update_group, 0)) @@ -1066,10 +1064,8 @@ subgroup_default_withdraw_packet (struct update_subgroup *subgrp) if (afi == AFI_IP) str2prefix ("0.0.0.0/0", &p); -#ifdef HAVE_IPV6 else str2prefix ("::/0", &p); -#endif /* HAVE_IPV6 */ if (bgp_debug_update(NULL, &p, subgrp->update_group, 0)) { diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 1c2cc037f9..6d23af03e4 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -107,44 +107,106 @@ bgp_node_safi (struct vty *vty) return safi; } +/* supports */ +afi_t +bgp_vty_afi_from_arg(const char *afi_str) +{ + afi_t afi = AFI_MAX; /* unknown */ + if (!strcmp(afi_str, "ipv4")) { + afi = AFI_IP; + } + else if (!strcmp(afi_str, "ipv6")) { + afi = AFI_IP6; + } + return afi; +} + int bgp_parse_afi(const char *str, afi_t *afi) { - if (!strcmp(str, "ipv4")) { - *afi = AFI_IP; - return 0; - } -#ifdef HAVE_IPV6 - if (!strcmp(str, "ipv6")) { - *afi = AFI_IP6; - return 0; - } -#endif /* HAVE_IPV6 */ + *afi = bgp_vty_afi_from_arg(str); + if (*afi != AFI_MAX) + return 0; + else return -1; } +int +argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index, afi_t *afi) +{ + int ret = 0; + if (argv_find (argv, argc, "ipv4", index)) + { + ret = 1; + if (afi) + *afi = AFI_IP; + } + else if (argv_find (argv, argc, "ipv6", index)) + { + ret = 1; + if (afi) + *afi = AFI_IP6; + } + return ret; +} + +/* supports */ +safi_t +bgp_vty_safi_from_arg(const char *safi_str) +{ + safi_t safi = SAFI_MAX; /* unknown */ + if (strncmp (safi_str, "m", 1) == 0) + safi = SAFI_MULTICAST; + else if (strncmp (safi_str, "u", 1) == 0) + safi = SAFI_UNICAST; + else if (strncmp (safi_str, "e", 1) == 0) + safi = SAFI_ENCAP; + else if (strncmp (safi_str, "v", 1) == 0) + safi = SAFI_MPLS_VPN; + return safi; +} + int bgp_parse_safi(const char *str, safi_t *safi) { - if (!strcmp(str, "encap")) { - *safi = SAFI_ENCAP; - return 0; - } - if (!strcmp(str, "multicast")) { - *safi = SAFI_MULTICAST; - return 0; - } - if (!strcmp(str, "unicast")) { - *safi = SAFI_UNICAST; - return 0; - } - if (!strcmp(str, "vpn")) { - *safi = SAFI_MPLS_VPN; - return 0; - } + *safi = bgp_vty_safi_from_arg(str); + if (*safi != SAFI_MAX) + return 0; + else return -1; } +int +argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index, safi_t *safi) +{ + int ret = 0; + if (argv_find (argv, argc, "unicast", index)) + { + ret = 1; + if (safi) + *safi = SAFI_UNICAST; + } + else if (argv_find (argv, argc, "multicast", index)) + { + ret = 1; + if (safi) + *safi = SAFI_MULTICAST; + } + else if (argv_find (argv, argc, "vpn", index)) + { + ret = 1; + if (safi) + *safi = SAFI_MPLS_VPN; + } + else if (argv_find (argv, argc, "encap", index)) + { + ret = 1; + if (safi) + *safi = SAFI_ENCAP; + } + return ret; +} + static int peer_address_self_check (struct bgp *bgp, union sockunion *su) { @@ -152,11 +214,9 @@ peer_address_self_check (struct bgp *bgp, union sockunion *su) if (su->sa.sa_family == AF_INET) ifp = if_lookup_by_ipv4_exact (&su->sin.sin_addr, bgp->vrf_id); -#ifdef HAVE_IPV6 else if (su->sa.sa_family == AF_INET6) ifp = if_lookup_by_ipv6_exact (&su->sin6.sin6_addr, su->sin6.sin6_scope_id, bgp->vrf_id); -#endif /* HAVE IPV6 */ if (ifp) return 1; @@ -359,10 +419,8 @@ bgp_clear_vty_error (struct vty *vty, struct peer *peer, afi_t afi, { case BGP_ERR_AF_UNCONFIGURED: vty_out (vty, - "%%BGP: Enable %s %s address family for the neighbor %s%s", - afi == AFI_IP6 ? "IPv6" : safi == SAFI_MPLS_VPN ? "VPNv4" : "IPv4", - safi == SAFI_MULTICAST ? "Multicast" : "Unicast", - peer->host, VTY_NEWLINE); + "%%BGP: Enable %s address family for the neighbor %s%s", + afi_safi_print(afi, safi), peer->host, VTY_NEWLINE); break; case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED: vty_out (vty, "%%BGP: Inbound soft reconfig for %s not possible as it%s has neither refresh capability, nor inbound soft reconfig%s", peer->host, VTY_NEWLINE, VTY_NEWLINE); @@ -1673,6 +1731,31 @@ DEFUN (no_bgp_graceful_restart_restart_time, return CMD_SUCCESS; } +DEFUN (bgp_graceful_restart_preserve_fw, + bgp_graceful_restart_preserve_fw_cmd, + "bgp graceful-restart preserve-fw-state", + "BGP specific commands\n" + "Graceful restart capability parameters\n" + "Sets F-bit indication that fib is preserved while doing Graceful Restart\n") +{ + VTY_DECLVAR_CONTEXT(bgp, bgp); + bgp_flag_set(bgp, BGP_FLAG_GR_PRESERVE_FWD); + return CMD_SUCCESS; +} + +DEFUN (no_bgp_graceful_restart_preserve_fw, + no_bgp_graceful_restart_preserve_fw_cmd, + "no bgp graceful-restart preserve-fw-state", + NO_STR + "BGP specific commands\n" + "Graceful restart capability parameters\n" + "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n") +{ + VTY_DECLVAR_CONTEXT(bgp, bgp); + bgp_flag_unset(bgp, BGP_FLAG_GR_PRESERVE_FWD); + return CMD_SUCCESS; +} + /* "bgp fast-external-failover" configuration. */ DEFUN (bgp_fast_external_failover, bgp_fast_external_failover_cmd, @@ -2861,12 +2944,14 @@ DEFUN (neighbor_local_as, int idx_number = 3; struct peer *peer; int ret; + as_t as; peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg); if (! peer) return CMD_WARNING; - ret = peer_local_as_set (peer, atoi (argv[idx_number]->arg), 0, 0); + VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX); + ret = peer_local_as_set (peer, as, 0, 0); return bgp_vty_return (vty, ret); } @@ -2883,12 +2968,14 @@ DEFUN (neighbor_local_as_no_prepend, int idx_number = 3; struct peer *peer; int ret; + as_t as; peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg); if (! peer) return CMD_WARNING; - ret = peer_local_as_set (peer, atoi (argv[idx_number]->arg), 1, 0); + VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX); + ret = peer_local_as_set (peer, as, 1, 0); return bgp_vty_return (vty, ret); } @@ -2906,12 +2993,14 @@ DEFUN (neighbor_local_as_no_prepend_replace_as, int idx_number = 3; struct peer *peer; int ret; + as_t as; peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg); if (! peer) return CMD_WARNING; - ret = peer_local_as_set (peer, atoi (argv[idx_number]->arg), 1, 1); + VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX); + ret = peer_local_as_set (peer, as, 1, 1); return bgp_vty_return (vty, ret); } @@ -5411,17 +5500,28 @@ DEFUN (address_family_ipv4, DEFUN (address_family_ipv4_safi, address_family_ipv4_safi_cmd, - "address-family ipv4 ", + "address-family ipv4 "BGP_SAFI_CMD_STR, "Enter Address Family command mode\n" "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n") + BGP_SAFI_HELP_STR) { int idx_safi = 2; - if (strncmp (argv[idx_safi]->arg, "m", 1) == 0) - vty->node = BGP_IPV4M_NODE; - else - vty->node = BGP_IPV4_NODE; + switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg)) + { + case SAFI_MULTICAST: + vty->node = BGP_IPV4M_NODE; + break; + case SAFI_ENCAP: + vty->node = BGP_ENCAP_NODE; + break; + case SAFI_MPLS_VPN: + vty->node = BGP_VPNV4_NODE; + break; + case SAFI_UNICAST: + default: + vty->node = BGP_IPV4_NODE; + break; + } return CMD_SUCCESS; } @@ -5438,17 +5538,28 @@ DEFUN (address_family_ipv6, DEFUN (address_family_ipv6_safi, address_family_ipv6_safi_cmd, - "address-family ipv6 ", + "address-family ipv6 "BGP_SAFI_CMD_STR, "Enter Address Family command mode\n" "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n") + BGP_SAFI_HELP_STR) { int idx_safi = 2; - if (strncmp (argv[idx_safi]->arg, "m", 1) == 0) - vty->node = BGP_IPV6M_NODE; - else - vty->node = BGP_IPV6_NODE; + switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg)) + { + case SAFI_MULTICAST: + vty->node = BGP_IPV6M_NODE; + break; + case SAFI_ENCAP: + vty->node = BGP_ENCAPV6_NODE; + break; + case SAFI_MPLS_VPN: + vty->node = BGP_VPNV6_NODE; + break; + case SAFI_UNICAST: + default: + vty->node = BGP_IPV6_NODE; + break; + } return CMD_SUCCESS; } @@ -5598,7 +5709,7 @@ bgp_clear_prefix (struct vty *vty, const char *view_name, const char *ip_str, /* one clear bgp command to rule them all */ DEFUN (clear_ip_bgp_all, clear_ip_bgp_all_cmd, - "clear [ip] bgp [ WORD] []|ipv6 []|encap [unicast]|vpnv4 [unicast]>] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> []|in [prefix-filter]|out>]", + "clear [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> []|in [prefix-filter]|out>]", CLEAR_STR IP_STR BGP_STR @@ -5611,16 +5722,8 @@ DEFUN (clear_ip_bgp_all, "Clear all external peers\n" "Clear all members of peer-group\n" "BGP peer-group name\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" + BGP_AFI_HELP_STR + BGP_SAFI_HELP_STR BGP_SOFT_STR BGP_SOFT_IN_STR BGP_SOFT_OUT_STR @@ -5697,19 +5800,10 @@ DEFUN (clear_ip_bgp_all, { clr_sort = clear_external; } - /* []|ipv6 []|encap [unicast]||vpnv4 [unicast]>] */ - if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx)) + /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */ + if (argv_find_and_parse_afi (argv, argc, &idx, &afi)) { - afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP; - if (argv_find (argv, argc, "unicast", &idx) || argv_find (argv, argc, "multicast", &idx)) - safi = strmatch (argv[idx]->text, "unicast") ? SAFI_UNICAST : SAFI_MULTICAST; - } - else if (argv_find (argv, argc, "encap", &idx) || argv_find (argv, argc, "vpnv4", &idx)) - { - afi = AFI_IP; - safi = strmatch (argv[idx]->text, "encap") ? SAFI_ENCAP : SAFI_MPLS_VPN; - // advance idx if necessary - argv_find (argv, argc, "unicast", &idx); + argv_find_and_parse_safi (argv, argc, &idx, &safi); } /* []|in [prefix-filter]|out>] */ if (argv_find (argv, argc, "soft", &idx)) @@ -5759,44 +5853,38 @@ DEFUN (clear_ip_bgp_prefix, DEFUN (clear_bgp_ipv6_safi_prefix, clear_bgp_ipv6_safi_prefix_cmd, - "clear [ip] bgp ipv6 prefix X:X::X:X/M", + "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M", CLEAR_STR IP_STR BGP_STR "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" + BGP_SAFI_HELP_STR "Clear bestpath and re-advertise\n" "IPv6 prefix\n") { int idx_safi = 3; int idx_ipv6_prefixlen = 5; - if (strncmp (argv[idx_safi]->arg, "m", 1) == 0) - return bgp_clear_prefix (vty, NULL, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, SAFI_MULTICAST, NULL); - else - return bgp_clear_prefix (vty, NULL, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, SAFI_UNICAST, NULL); + return bgp_clear_prefix (vty, NULL, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, + bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL); } DEFUN (clear_bgp_instance_ipv6_safi_prefix, clear_bgp_instance_ipv6_safi_prefix_cmd, - "clear [ip] bgp WORD ipv6 prefix X:X::X:X/M", + "clear [ip] bgp WORD ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M", CLEAR_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" + BGP_SAFI_HELP_STR "Clear bestpath and re-advertise\n" "IPv6 prefix\n") { int idx_word = 3; int idx_safi = 5; int idx_ipv6_prefixlen = 7; - if (strncmp (argv[idx_safi]->arg, "m", 1) == 0) - return bgp_clear_prefix (vty, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, SAFI_MULTICAST, NULL); - else - return bgp_clear_prefix (vty, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, SAFI_UNICAST, NULL); + return bgp_clear_prefix (vty, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, + bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL); } DEFUN (show_bgp_views, @@ -6118,6 +6206,10 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi, if (peer->afc[afi][safi]) { + memset(dn_flag, '\0', sizeof(dn_flag)); + if (peer_dynamic_neighbor(peer)) + dn_flag[0] = '*'; + if (peer->hostname && bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME)) sprintf(neighbor_buf, "%s%s(%s) ", dn_flag, peer->hostname, peer->host); else @@ -6412,10 +6504,10 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi, { if (use_json) vty_out(vty, "{\"error\": {\"message\": \"No %s neighbor configured\"}}%s", - afi == AFI_IP ? "IPv4" : "IPv6", VTY_NEWLINE); + afi_safi_print(afi, safi), VTY_NEWLINE); else vty_out (vty, "No %s neighbor is configured%s", - afi == AFI_IP ? "IPv4" : "IPv6", VTY_NEWLINE); + afi_safi_print(afi, safi), VTY_NEWLINE); } if (dn_count && ! use_json) @@ -6430,6 +6522,62 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi, return CMD_SUCCESS; } +static void +bgp_show_summary_afi_safi (struct vty *vty, struct bgp *bgp, int afi, int safi, + u_char use_json, json_object *json) +{ + int is_first = 1; + int afi_wildcard = (afi == AFI_MAX); + int safi_wildcard = (safi == SAFI_MAX); + int is_wildcard = (afi_wildcard || safi_wildcard); + if (use_json && is_wildcard) + vty_out (vty, "{%s", VTY_NEWLINE); + if (afi_wildcard) + afi = 1; /* AFI_IP */ + while (afi < AFI_MAX) + { + if (safi_wildcard) + safi = 1; /* SAFI_UNICAST */ + while (safi < SAFI_MAX) + { + if (is_wildcard) + { + if (use_json) + { + json = json_object_new_object(); + + if (! is_first) + vty_out (vty, ",%s", VTY_NEWLINE); + else + is_first = 0; + + vty_out(vty, "\"%s\":", afi_safi_json(afi, safi)); + } + else + { + vty_out (vty, "%s%s Summary:%s", + VTY_NEWLINE, afi_safi_print(afi, safi), VTY_NEWLINE); + } + } + bgp_show_summary (vty, bgp, afi, safi, use_json, json); + if (safi == SAFI_MPLS_VPN) /* handle special cases to match zebra.h */ + safi = SAFI_ENCAP; + else + safi++; + if (! safi_wildcard) + safi = SAFI_MAX; + } + afi++; + if (! afi_wildcard || + afi == AFI_ETHER) /* special case, not handled yet */ + afi = AFI_MAX; + } + + if (use_json && is_wildcard) + vty_out (vty, "}%s", VTY_NEWLINE); + +} + static void bgp_show_all_instances_summary_vty (struct vty *vty, afi_t afi, safi_t safi, u_char use_json) @@ -6463,7 +6611,7 @@ bgp_show_all_instances_summary_vty (struct vty *vty, afi_t afi, safi_t safi, (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) ? "Default" : bgp->name, VTY_NEWLINE); } - bgp_show_summary (vty, bgp, afi, safi, use_json, json); + bgp_show_summary_afi_safi (vty, bgp, afi, safi, use_json, json); } if (use_json) @@ -6497,7 +6645,7 @@ bgp_show_summary_vty (struct vty *vty, const char *name, return CMD_WARNING; } - bgp_show_summary (vty, bgp, afi, safi, use_json, NULL); + bgp_show_summary_afi_safi (vty, bgp, afi, safi, use_json, NULL); return CMD_SUCCESS; } } @@ -6505,7 +6653,7 @@ bgp_show_summary_vty (struct vty *vty, const char *name, bgp = bgp_get_default (); if (bgp) - bgp_show_summary (vty, bgp, afi, safi, use_json, NULL); + bgp_show_summary_afi_safi (vty, bgp, afi, safi, use_json, NULL); return CMD_SUCCESS; } @@ -6513,29 +6661,19 @@ bgp_show_summary_vty (struct vty *vty, const char *name, /* `show [ip] bgp summary' commands. */ DEFUN (show_ip_bgp_summary, show_ip_bgp_summary_cmd, - "show [ip] bgp [ WORD] []|ipv6 []|encap [unicast]|vpnv4 >] summary [json]", + "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] summary [json]", SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family\n" - "Display information about all VPNv4 NLRIs\n" - "Display information for a route distinguisher\n" - "VPN Route Distinguisher\n" + BGP_AFI_HELP_STR + BGP_SAFI_HELP_STR "Summary of BGP neighbor status\n" JSON_STR) { char *vrf = NULL; - afi_t afi = AFI_IP6; - safi_t safi = SAFI_UNICAST; + afi_t afi = AFI_MAX; + safi_t safi = SAFI_MAX; int idx = 0; @@ -6545,23 +6683,10 @@ DEFUN (show_ip_bgp_summary, /* [ WORD] */ if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) vrf = argv[++idx]->arg; - /* []|ipv6 []|encap [unicast]|vpnv4 [unicast]>] */ - if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx)) + /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */ + if (argv_find_and_parse_afi (argv, argc, &idx, &afi)) { - afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP; - if (argv_find (argv, argc, "unicast", &idx) || argv_find (argv, argc, "multicast", &idx)) - safi = strmatch (argv[idx]->text, "unicast") ? SAFI_UNICAST : SAFI_MULTICAST; - } - else if (argv_find (argv, argc, "encap", &idx)) - { - afi = AFI_IP; - safi = SAFI_ENCAP; - } - else if (argv_find (argv, argc, "vpnv4", &idx)) - { - // we show the same thing regardless of rd and all - afi = AFI_IP; - safi = SAFI_MPLS_VPN; + argv_find_and_parse_safi (argv, argc, &idx, &safi); } int uj = use_json (argc, argv); @@ -6577,17 +6702,40 @@ afi_safi_print (afi_t afi, safi_t safi) else if (afi == AFI_IP && safi == SAFI_MULTICAST) return "IPv4 Multicast"; else if (afi == AFI_IP && safi == SAFI_MPLS_VPN) - return "VPN-IPv4 Unicast"; + return "IPv4 VPN"; else if (afi == AFI_IP && safi == SAFI_ENCAP) - return "ENCAP-IPv4 Unicast"; + return "IPv4 Encap"; else if (afi == AFI_IP6 && safi == SAFI_UNICAST) return "IPv6 Unicast"; else if (afi == AFI_IP6 && safi == SAFI_MULTICAST) return "IPv6 Multicast"; else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN) - return "VPN-IPv6 Unicast"; + return "IPv6 VPN"; else if (afi == AFI_IP6 && safi == SAFI_ENCAP) - return "ENCAP-IPv6 Unicast"; + return "IPv6 Encap"; + else + return "Unknown"; +} + +const char * +afi_safi_json (afi_t afi, safi_t safi) +{ + if (afi == AFI_IP && safi == SAFI_UNICAST) + return "IPv4Unicast"; + else if (afi == AFI_IP && safi == SAFI_MULTICAST) + return "IPv4Multicast"; + else if (afi == AFI_IP && safi == SAFI_MPLS_VPN) + return "IPv4VPN"; + else if (afi == AFI_IP && safi == SAFI_ENCAP) + return "IPv4Encap"; + else if (afi == AFI_IP6 && safi == SAFI_UNICAST) + return "IPv6Unicast"; + else if (afi == AFI_IP6 && safi == SAFI_MULTICAST) + return "IPv6Multicast"; + else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN) + return "IPv6VPN"; + else if (afi == AFI_IP6 && safi == SAFI_ENCAP) + return "IPv6Encap"; else return "Unknown"; } @@ -7372,7 +7520,6 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js || p->afc_recv[AFI_IP][SAFI_UNICAST] || p->afc_adv[AFI_IP][SAFI_MULTICAST] || p->afc_recv[AFI_IP][SAFI_MULTICAST] -#ifdef HAVE_IPV6 || p->afc_adv[AFI_IP6][SAFI_UNICAST] || p->afc_recv[AFI_IP6][SAFI_UNICAST] || p->afc_adv[AFI_IP6][SAFI_MULTICAST] @@ -7381,7 +7528,6 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js || p->afc_recv[AFI_IP6][SAFI_MPLS_VPN] || p->afc_adv[AFI_IP6][SAFI_ENCAP] || p->afc_recv[AFI_IP6][SAFI_ENCAP] -#endif /* HAVE_IPV6 */ || p->afc_adv[AFI_IP][SAFI_ENCAP] || p->afc_recv[AFI_IP][SAFI_ENCAP] || p->afc_adv[AFI_IP][SAFI_MPLS_VPN] @@ -8131,21 +8277,18 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js if (use_json) { json_object_string_add(json_neigh, "nexthop", inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ)); -#ifdef HAVE_IPV6 json_object_string_add(json_neigh, "nexthopGlobal", inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ)); json_object_string_add(json_neigh, "nexthopLocal", inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, BUFSIZ)); if (p->shared_network) json_object_string_add(json_neigh, "bgpConnection", "sharedNetwork"); else json_object_string_add(json_neigh, "bgpConnection", "nonSharedNetwork"); -#endif /* HAVE_IPV6 */ } else { vty_out (vty, "Nexthop: %s%s", inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ), VTY_NEWLINE); -#ifdef HAVE_IPV6 vty_out (vty, "Nexthop global: %s%s", inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ), VTY_NEWLINE); @@ -8155,7 +8298,6 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js vty_out (vty, "BGP connection: %s%s", p->shared_network ? "shared network" : "non shared network", VTY_NEWLINE); -#endif /* HAVE_IPV6 */ } } @@ -8452,12 +8594,11 @@ DEFUN (show_ip_bgp_neighbors, same.*/ DEFUN (show_ip_bgp_paths, show_ip_bgp_paths_cmd, - "show [ip] bgp [] paths", + "show [ip] bgp ["BGP_SAFI_CMD_STR"] paths", SHOW_STR IP_STR BGP_STR - "Address Family modifier\n" - "Address Family modifier\n" + BGP_SAFI_HELP_STR "Path information\n") { vty_out (vty, "Address Refcnt Path%s", VTY_NEWLINE); @@ -8555,21 +8696,13 @@ bgp_show_update_groups(struct vty *vty, const char *name, DEFUN (show_ip_bgp_updgrps, show_ip_bgp_updgrps_cmd, - "show [ip] bgp [ WORD] []|ipv6 []|encap [unicast]|vpnv4 [unicast]>] update-groups [SUBGROUP-ID]", + "show [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] update-groups [SUBGROUP-ID]", SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family\n" - "Address Family modifier\n" + BGP_AFI_HELP_STR + BGP_SAFI_HELP_STR "Detailed info about dynamic update groups\n" "Specific subgroup to display detailed info for\n") { @@ -8586,20 +8719,11 @@ DEFUN (show_ip_bgp_updgrps, /* [ WORD] */ if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) vrf = argv[++idx]->arg; - /* []|ipv6 []|encap [unicast]|vpnv4 [unicast]>] */ - if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx)) - { - afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP; - if (argv_find (argv, argc, "unicast", &idx) || argv_find (argv, argc, "multicast", &idx)) - safi = strmatch (argv[idx]->text, "unicast") ? SAFI_UNICAST : SAFI_MULTICAST; - } - else if (argv_find (argv, argc, "encap", &idx) || argv_find (argv, argc, "vpnv4", &idx)) - { - afi = AFI_IP; - safi = strmatch (argv[idx]->text, "encap") ? SAFI_ENCAP : SAFI_MPLS_VPN; - // advance idx if necessary - argv_find (argv, argc, "unicast", &idx); - } + /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */ + if (argv_find_and_parse_afi (argv, argc, &idx, &afi)) + { + argv_find_and_parse_safi (argv, argc, &idx, &safi); + } /* get subgroup id, if provided */ idx = argc - 1; @@ -8721,14 +8845,11 @@ DEFUN (show_ip_bgp_instance_updgrps_adj, DEFUN (show_bgp_updgrps_afi_adj, show_bgp_updgrps_afi_adj_cmd, - "show [ip] bgp update-groups ", + "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups ", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" + BGP_AFI_SAFI_HELP_STR "Detailed info about dynamic update groups\n" "Advertisement queue\n" "Announced routes\n" @@ -8738,12 +8859,10 @@ DEFUN (show_bgp_updgrps_afi_adj, int idx_afi = 2; int idx_safi = 3; int idx_type = 5; - afi_t afi; - safi_t safi; - - afi = (strcmp(argv[idx_afi]->arg, "ipv4") == 0) ? AFI_IP : AFI_IP6; - safi = (strncmp (argv[idx_safi]->arg, "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST; - show_bgp_updgrps_adj_info_aux(vty, NULL, afi, safi, argv[idx_type]->arg, 0); + show_bgp_updgrps_adj_info_aux(vty, NULL, + bgp_vty_afi_from_arg(argv[idx_afi]->arg), + bgp_vty_safi_from_arg(argv[idx_safi]->arg), + argv[idx_type]->arg, 0); return CMD_SUCCESS; } @@ -8831,14 +8950,11 @@ DEFUN (show_ip_bgp_instance_updgrps_adj_s, DEFUN (show_bgp_updgrps_afi_adj_s, show_bgp_updgrps_afi_adj_s_cmd, - "show [ip] bgp update-groups SUBGROUP-ID ", + "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups SUBGROUP-ID ", SHOW_STR IP_STR BGP_STR - "Address Family\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" + BGP_AFI_SAFI_HELP_STR "Detailed info about dynamic update groups\n" "Specific subgroup to display info for\n" "Advertisement queue\n" @@ -8850,15 +8966,14 @@ DEFUN (show_bgp_updgrps_afi_adj_s, int idx_safi = 3; int idx_subgroup_id = 5; int idx_type = 6; - afi_t afi; - safi_t safi; uint64_t subgrp_id; - afi = (strmatch(argv[idx_afi]->text, "ipv4")) ? AFI_IP : AFI_IP6; - safi = (strmatch(argv[idx_safi]->text, "unicast")) ? SAFI_UNICAST : SAFI_MULTICAST; VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg); - show_bgp_updgrps_adj_info_aux(vty, NULL, afi, safi, argv[idx_type]->arg, subgrp_id); + show_bgp_updgrps_adj_info_aux(vty, NULL, + bgp_vty_afi_from_arg(argv[idx_afi]->arg), + bgp_vty_safi_from_arg(argv[idx_safi]->arg), + argv[idx_type]->arg, subgrp_id); return CMD_SUCCESS; } @@ -9098,14 +9213,14 @@ DEFUN (bgp_redistribute_ipv4, bgp_redistribute_ipv4_cmd, "redistribute ", "Redistribute information from another routing protocol\n" - QUAGGA_IP_REDIST_HELP_STR_BGPD) + FRR_IP_REDIST_HELP_STR_BGPD) { VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int type; - type = proto_redistnum (AFI_IP, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9118,7 +9233,7 @@ DEFUN (bgp_redistribute_ipv4_rmap, bgp_redistribute_ipv4_rmap_cmd, "redistribute route-map WORD", "Redistribute information from another routing protocol\n" - QUAGGA_IP_REDIST_HELP_STR_BGPD + FRR_IP_REDIST_HELP_STR_BGPD "Route map reference\n" "Pointer to route-map entries\n") { @@ -9128,8 +9243,8 @@ DEFUN (bgp_redistribute_ipv4_rmap, int type; struct bgp_redist *red; - type = proto_redistnum (AFI_IP, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9144,7 +9259,7 @@ DEFUN (bgp_redistribute_ipv4_metric, bgp_redistribute_ipv4_metric_cmd, "redistribute metric (0-4294967295)", "Redistribute information from another routing protocol\n" - QUAGGA_IP_REDIST_HELP_STR_BGPD + FRR_IP_REDIST_HELP_STR_BGPD "Metric for redistributed routes\n" "Default metric\n") { @@ -9155,8 +9270,8 @@ DEFUN (bgp_redistribute_ipv4_metric, u_int32_t metric; struct bgp_redist *red; - type = proto_redistnum (AFI_IP, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9172,7 +9287,7 @@ DEFUN (bgp_redistribute_ipv4_rmap_metric, bgp_redistribute_ipv4_rmap_metric_cmd, "redistribute route-map WORD metric (0-4294967295)", "Redistribute information from another routing protocol\n" - QUAGGA_IP_REDIST_HELP_STR_BGPD + FRR_IP_REDIST_HELP_STR_BGPD "Route map reference\n" "Pointer to route-map entries\n" "Metric for redistributed routes\n" @@ -9186,8 +9301,8 @@ DEFUN (bgp_redistribute_ipv4_rmap_metric, u_int32_t metric; struct bgp_redist *red; - type = proto_redistnum (AFI_IP, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9204,7 +9319,7 @@ DEFUN (bgp_redistribute_ipv4_metric_rmap, bgp_redistribute_ipv4_metric_rmap_cmd, "redistribute metric (0-4294967295) route-map WORD", "Redistribute information from another routing protocol\n" - QUAGGA_IP_REDIST_HELP_STR_BGPD + FRR_IP_REDIST_HELP_STR_BGPD "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -9218,8 +9333,8 @@ DEFUN (bgp_redistribute_ipv4_metric_rmap, u_int32_t metric; struct bgp_redist *red; - type = proto_redistnum (AFI_IP, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9423,7 +9538,7 @@ DEFUN (no_bgp_redistribute_ipv4, "no redistribute [metric (0-4294967295)] [route-map WORD]", NO_STR "Redistribute information from another routing protocol\n" - QUAGGA_IP_REDIST_HELP_STR_BGPD + FRR_IP_REDIST_HELP_STR_BGPD "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -9433,8 +9548,8 @@ DEFUN (no_bgp_redistribute_ipv4, int idx_protocol = 2; int type; - type = proto_redistnum (AFI_IP, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9442,19 +9557,18 @@ DEFUN (no_bgp_redistribute_ipv4, return bgp_redistribute_unset (bgp, AFI_IP, type, 0); } -#ifdef HAVE_IPV6 DEFUN (bgp_redistribute_ipv6, bgp_redistribute_ipv6_cmd, "redistribute ", "Redistribute information from another routing protocol\n" - QUAGGA_IP6_REDIST_HELP_STR_BGPD) + FRR_IP6_REDIST_HELP_STR_BGPD) { VTY_DECLVAR_CONTEXT(bgp, bgp); int idx_protocol = 1; int type; - type = proto_redistnum (AFI_IP6, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9468,7 +9582,7 @@ DEFUN (bgp_redistribute_ipv6_rmap, bgp_redistribute_ipv6_rmap_cmd, "redistribute route-map WORD", "Redistribute information from another routing protocol\n" - QUAGGA_IP6_REDIST_HELP_STR_BGPD + FRR_IP6_REDIST_HELP_STR_BGPD "Route map reference\n" "Pointer to route-map entries\n") { @@ -9478,8 +9592,8 @@ DEFUN (bgp_redistribute_ipv6_rmap, int type; struct bgp_redist *red; - type = proto_redistnum (AFI_IP6, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9494,7 +9608,7 @@ DEFUN (bgp_redistribute_ipv6_metric, bgp_redistribute_ipv6_metric_cmd, "redistribute metric (0-4294967295)", "Redistribute information from another routing protocol\n" - QUAGGA_IP6_REDIST_HELP_STR_BGPD + FRR_IP6_REDIST_HELP_STR_BGPD "Metric for redistributed routes\n" "Default metric\n") { @@ -9505,8 +9619,8 @@ DEFUN (bgp_redistribute_ipv6_metric, u_int32_t metric; struct bgp_redist *red; - type = proto_redistnum (AFI_IP6, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9522,7 +9636,7 @@ DEFUN (bgp_redistribute_ipv6_rmap_metric, bgp_redistribute_ipv6_rmap_metric_cmd, "redistribute route-map WORD metric (0-4294967295)", "Redistribute information from another routing protocol\n" - QUAGGA_IP6_REDIST_HELP_STR_BGPD + FRR_IP6_REDIST_HELP_STR_BGPD "Route map reference\n" "Pointer to route-map entries\n" "Metric for redistributed routes\n" @@ -9536,8 +9650,8 @@ DEFUN (bgp_redistribute_ipv6_rmap_metric, u_int32_t metric; struct bgp_redist *red; - type = proto_redistnum (AFI_IP6, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9554,7 +9668,7 @@ DEFUN (bgp_redistribute_ipv6_metric_rmap, bgp_redistribute_ipv6_metric_rmap_cmd, "redistribute metric (0-4294967295) route-map WORD", "Redistribute information from another routing protocol\n" - QUAGGA_IP6_REDIST_HELP_STR_BGPD + FRR_IP6_REDIST_HELP_STR_BGPD "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -9568,8 +9682,8 @@ DEFUN (bgp_redistribute_ipv6_metric_rmap, u_int32_t metric; struct bgp_redist *red; - type = proto_redistnum (AFI_IP6, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9587,7 +9701,7 @@ DEFUN (no_bgp_redistribute_ipv6, "no redistribute [metric (0-4294967295)] [route-map WORD]", NO_STR "Redistribute information from another routing protocol\n" - QUAGGA_IP6_REDIST_HELP_STR_BGPD + FRR_IP6_REDIST_HELP_STR_BGPD "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -9597,8 +9711,8 @@ DEFUN (no_bgp_redistribute_ipv6, int idx_protocol = 2; int type; - type = proto_redistnum (AFI_IP6, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_BGP) + type = proto_redistnum (AFI_IP6, argv[idx_protocol]->text); + if (type < 0) { vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE); return CMD_WARNING; @@ -9607,11 +9721,6 @@ DEFUN (no_bgp_redistribute_ipv6, return bgp_redistribute_unset (bgp, AFI_IP6, type, 0); } - - - -#endif /* HAVE_IPV6 */ - int bgp_config_write_redistribute (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi, int *write) @@ -9852,6 +9961,9 @@ bgp_vty_init (void) install_element (BGP_NODE, &bgp_graceful_restart_restart_time_cmd); install_element (BGP_NODE, &no_bgp_graceful_restart_restart_time_cmd); + install_element (BGP_NODE, &bgp_graceful_restart_preserve_fw_cmd); + install_element (BGP_NODE, &no_bgp_graceful_restart_preserve_fw_cmd); + /* "bgp fast-external-failover" commands */ install_element (BGP_NODE, &bgp_fast_external_failover_cmd); install_element (BGP_NODE, &no_bgp_fast_external_failover_cmd); @@ -10570,18 +10682,14 @@ bgp_vty_init (void) /* address-family commands. */ install_element (BGP_NODE, &address_family_ipv4_cmd); install_element (BGP_NODE, &address_family_ipv4_safi_cmd); -#ifdef HAVE_IPV6 install_element (BGP_NODE, &address_family_ipv6_cmd); install_element (BGP_NODE, &address_family_ipv6_safi_cmd); -#endif /* HAVE_IPV6 */ install_element (BGP_NODE, &address_family_vpnv4_cmd); install_element (BGP_NODE, &address_family_vpnv6_cmd); install_element (BGP_NODE, &address_family_encap_cmd); -#ifdef HAVE_IPV6 install_element (BGP_NODE, &address_family_encapv6_cmd); -#endif /* "exit-address-family" command. */ install_element (BGP_IPV4_NODE, &exit_address_family_cmd); @@ -10602,33 +10710,21 @@ bgp_vty_init (void) install_element (ENABLE_NODE, &clear_bgp_instance_ipv6_safi_prefix_cmd); /* "show [ip] bgp summary" commands. */ - install_element (VIEW_NODE, &show_ip_bgp_summary_cmd); - install_element (VIEW_NODE, &show_ip_bgp_updgrps_cmd); install_element (VIEW_NODE, &show_bgp_instance_all_ipv6_updgrps_cmd); - install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_cmd); - install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_cmd); - install_element (VIEW_NODE, &show_bgp_updgrps_adj_cmd); install_element (VIEW_NODE, &show_bgp_instance_updgrps_adj_cmd); - install_element (VIEW_NODE, &show_bgp_updgrps_afi_adj_cmd); - install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_s_cmd); - install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_s_cmd); - install_element (VIEW_NODE, &show_bgp_updgrps_adj_s_cmd); install_element (VIEW_NODE, &show_bgp_instance_updgrps_adj_s_cmd); - install_element (VIEW_NODE, &show_bgp_updgrps_afi_adj_s_cmd); - install_element (VIEW_NODE, &show_ip_bgp_updgrps_cmd); - install_element (VIEW_NODE, &show_bgp_instance_all_ipv6_updgrps_cmd); - install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_cmd); - install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_cmd); + install_element (VIEW_NODE, &show_bgp_instance_updgrps_stats_cmd); install_element (VIEW_NODE, &show_bgp_updgrps_adj_cmd); - install_element (VIEW_NODE, &show_bgp_instance_updgrps_adj_cmd); - install_element (VIEW_NODE, &show_bgp_updgrps_afi_adj_cmd); - install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_s_cmd); - install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_s_cmd); install_element (VIEW_NODE, &show_bgp_updgrps_adj_s_cmd); - install_element (VIEW_NODE, &show_bgp_instance_updgrps_adj_s_cmd); + install_element (VIEW_NODE, &show_bgp_updgrps_afi_adj_cmd); install_element (VIEW_NODE, &show_bgp_updgrps_afi_adj_s_cmd); install_element (VIEW_NODE, &show_bgp_updgrps_stats_cmd); - install_element (VIEW_NODE, &show_bgp_instance_updgrps_stats_cmd); + install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_cmd); + install_element (VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_s_cmd); + install_element (VIEW_NODE, &show_ip_bgp_summary_cmd); + install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_cmd); + install_element (VIEW_NODE, &show_ip_bgp_updgrps_adj_s_cmd); + install_element (VIEW_NODE, &show_ip_bgp_updgrps_cmd); /* "show [ip] bgp neighbors" commands. */ install_element (VIEW_NODE, &show_ip_bgp_neighbors_cmd); @@ -10670,14 +10766,12 @@ bgp_vty_init (void) install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_cmd); install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_rmap_metric_cmd); install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_rmap_cmd); -#ifdef HAVE_IPV6 install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_cmd); install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_cmd); install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_cmd); install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_cmd); install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_metric_cmd); install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_rmap_cmd); -#endif /* HAVE_IPV6 */ /* ttl_security commands */ install_element (BGP_NODE, &neighbor_ttl_security_cmd); diff --git a/bgpd/bgp_vty.h b/bgpd/bgp_vty.h index 382af0984f..40c1723218 100644 --- a/bgpd/bgp_vty.h +++ b/bgpd/bgp_vty.h @@ -26,8 +26,20 @@ struct bgp; #define BGP_INSTANCE_HELP_STR "BGP view\nBGP VRF\nView/VRF name\n" #define BGP_INSTANCE_ALL_HELP_STR "BGP view\nBGP VRF\nAll Views/VRFs\n" +#define BGP_AFI_CMD_STR "" +#define BGP_AFI_HELP_STR "Address Family\nAddress Family\n" +#define BGP_SAFI_CMD_STR "" +#define BGP_SAFI_HELP_STR \ + "Address Family modifier\n" \ + "Address Family modifier\n" \ + "Address Family modifier\n" \ + "Address Family modifier\n" +#define BGP_AFI_SAFI_CMD_STR BGP_AFI_CMD_STR" "BGP_SAFI_CMD_STR +#define BGP_AFI_SAFI_HELP_STR BGP_AFI_HELP_STR BGP_SAFI_HELP_STR + extern void bgp_vty_init (void); extern const char *afi_safi_print (afi_t, safi_t); +extern const char *afi_safi_json (afi_t, safi_t); extern int bgp_config_write_update_delay (struct vty *, struct bgp *); extern int bgp_config_write_wpkt_quanta(struct vty *vty, struct bgp *bgp); extern int bgp_config_write_listen(struct vty *vty, struct bgp *bgp); @@ -42,4 +54,16 @@ bgp_parse_afi(const char *str, afi_t *afi); extern int bgp_parse_safi(const char *str, safi_t *safi); +extern afi_t +bgp_vty_afi_from_arg(const char *afi_str); + +extern safi_t +bgp_vty_safi_from_arg(const char *safi_str); + +extern int +argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index, afi_t *afi); + +extern int +argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index, safi_t *safi); + #endif /* _QUAGGA_BGP_VTY_H */ diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 3d3bd90f5b..8bc7bd3025 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -698,7 +698,6 @@ zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length, return 0; } -#ifdef HAVE_IPV6 /* Zebra route add and delete treatment. */ static int zebra_read_ipv6 (int command, struct zclient *zclient, zebra_size_t length, @@ -817,7 +816,6 @@ zebra_read_ipv6 (int command, struct zclient *zclient, zebra_size_t length, return 0; } -#endif /* HAVE_IPV6 */ struct interface * if_lookup_by_ipv4 (struct in_addr *addr, vrf_id_t vrf_id) @@ -870,7 +868,6 @@ if_lookup_by_ipv4_exact (struct in_addr *addr, vrf_id_t vrf_id) return NULL; } -#ifdef HAVE_IPV6 struct interface * if_lookup_by_ipv6 (struct in6_addr *addr, ifindex_t ifindex, vrf_id_t vrf_id) { @@ -979,7 +976,6 @@ if_get_ipv6_local (struct interface *ifp, struct in6_addr *addr) } return 0; } -#endif /* HAVE_IPV6 */ static int if_get_ipv4_address (struct interface *ifp, struct in_addr *addr) @@ -1022,7 +1018,6 @@ bgp_nexthop_set (union sockunion *local, union sockunion *remote, else ifp = if_lookup_by_ipv4_exact (&local->sin.sin_addr, peer->bgp->vrf_id); } -#ifdef HAVE_IPV6 if (local->sa.sa_family == AF_INET6) { if (IN6_IS_ADDR_LINKLOCAL (&local->sin6.sin6_addr)) @@ -1037,7 +1032,6 @@ bgp_nexthop_set (union sockunion *local, union sockunion *remote, local->sin6.sin6_scope_id, peer->bgp->vrf_id); } -#endif /* HAVE_IPV6 */ if (!ifp) return -1; @@ -1047,7 +1041,6 @@ bgp_nexthop_set (union sockunion *local, union sockunion *remote, /* IPv4 connection, fetch and store IPv6 local address(es) if any. */ if (local->sa.sa_family == AF_INET) { -#ifdef HAVE_IPV6 /* IPv6 nexthop*/ ret = if_get_ipv6_global (ifp, &nexthop->v6_global); @@ -1069,10 +1062,8 @@ bgp_nexthop_set (union sockunion *local, union sockunion *remote, peer->shared_network = 1; else peer->shared_network = 0; -#endif /* HAVE_IPV6 */ } -#ifdef HAVE_IPV6 /* IPv6 connection, fetch and store IPv4 local address if any. */ if (local->sa.sa_family == AF_INET6) { @@ -1135,7 +1126,6 @@ bgp_nexthop_set (union sockunion *local, union sockunion *remote, SET_IN6_LINKLOCAL_IFINDEX (nexthop->v6_local, 0); } #endif /* KAME */ -#endif /* HAVE_IPV6 */ /* If we have identified the local interface, there is no error for now. */ return 0; @@ -1390,7 +1380,6 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, zapi_ipv4_route (valid_nh_count ? ZEBRA_IPV4_ROUTE_ADD: ZEBRA_IPV4_ROUTE_DELETE, zclient, (struct prefix_ipv4 *) p, &api); } -#ifdef HAVE_IPV6 /* We have to think about a IPv6 link-local address curse. */ if (p->family == AF_INET6 || @@ -1601,7 +1590,6 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, zclient, (struct prefix_ipv6 *) p, &api); } } -#endif /* HAVE_IPV6 */ } /* Announce all routes of a table to zebra */ @@ -1700,7 +1688,6 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi) zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient, (struct prefix_ipv4 *) p, &api); } -#ifdef HAVE_IPV6 /* We have to think about a IPv6 link-local address curse. */ if (p->family == AF_INET6) { @@ -1740,8 +1727,8 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi) zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, (struct prefix_ipv6 *) p, &api); } -#endif /* HAVE_IPV6 */ } + struct bgp_redist * bgp_redist_lookup (struct bgp *bgp, afi_t afi, u_char type, u_short instance) { diff --git a/bgpd/bgp_zebra.h b/bgpd/bgp_zebra.h index 24b4634eb6..d22a00e8fb 100644 --- a/bgpd/bgp_zebra.h +++ b/bgpd/bgp_zebra.h @@ -57,10 +57,8 @@ extern int bgp_redistribute_unreg (struct bgp *, afi_t, int, u_short); extern struct interface *if_lookup_by_ipv4 (struct in_addr *, vrf_id_t); extern struct interface *if_lookup_by_ipv4_exact (struct in_addr *, vrf_id_t); -#ifdef HAVE_IPV6 extern struct interface *if_lookup_by_ipv6 (struct in6_addr *, ifindex_t, vrf_id_t); extern struct interface *if_lookup_by_ipv6_exact (struct in6_addr *, ifindex_t, vrf_id_t); -#endif /* HAVE_IPV6 */ extern int bgp_zebra_num_connects(void); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 30f6e0d859..c08107f0d9 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -651,6 +651,35 @@ bgp_listen_limit_unset (struct bgp *bgp) return 0; } +int +bgp_map_afi_safi_iana2int (iana_afi_t pkt_afi, safi_t pkt_safi, + afi_t *afi, safi_t *safi) +{ + /* Map from IANA values to internal values, return error if + * values are unrecognized. + */ + *afi = afi_iana2int (pkt_afi); + *safi = safi_iana2int (pkt_safi); + if (*afi == AFI_MAX || *safi == SAFI_MAX) + return -1; + + return 0; +} + +int +bgp_map_afi_safi_int2iana (afi_t afi, safi_t safi, + iana_afi_t *pkt_afi, safi_t *pkt_safi) +{ + /* Map from internal values to IANA values, return error if + * internal values are bad (unexpected). + */ + if (afi == AFI_MAX || safi == SAFI_MAX) + return -1; + *pkt_afi = afi_int2iana (afi); + *pkt_safi = safi_int2iana (safi); + return 0; +} + struct peer_af * peer_af_create (struct peer *peer, afi_t afi, safi_t safi) { @@ -1902,7 +1931,7 @@ peer_nsf_stop (struct peer *peer) UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) - for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) + for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++) peer->nsf[afi][safi] = 0; if (peer->t_gr_restart) @@ -7371,6 +7400,10 @@ bgp_config_write (struct vty *vty) if (bgp_flag_check (bgp, BGP_FLAG_GRACEFUL_RESTART)) vty_out (vty, " bgp graceful-restart%s", VTY_NEWLINE); + /* BGP graceful-restart Preserve State F bit. */ + if (bgp_flag_check (bgp, BGP_FLAG_GR_PRESERVE_FWD)) + vty_out (vty, " bgp graceful-restart preserve-fw-state%s", VTY_NEWLINE); + /* BGP bestpath method. */ if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE)) vty_out (vty, " bgp bestpath as-path ignore%s", VTY_NEWLINE); diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 86fa207b6b..3dd5523dce 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -289,6 +289,7 @@ struct bgp #define BGP_FLAG_MULTIPATH_RELAX_AS_SET (1 << 17) #define BGP_FLAG_FORCE_STATIC_PROCESS (1 << 18) #define BGP_FLAG_SHOW_HOSTNAME (1 << 19) +#define BGP_FLAG_GR_PRESERVE_FWD (1 << 20) /* BGP Per AF flags */ u_int16_t af_flags[AFI_MAX][SAFI_MAX]; @@ -404,10 +405,8 @@ struct bgp_nexthop { struct interface *ifp; struct in_addr v4; -#ifdef HAVE_IPV6 struct in6_addr v6_global; struct in6_addr v6_local; -#endif /* HAVE_IPV6 */ }; /* BGP addpath values */ @@ -1079,10 +1078,6 @@ struct bgp_nlri #define BGP_DEFAULT_RESTART_TIME 120 #define BGP_DEFAULT_STALEPATH_TIME 360 -/* RFC4364 */ -#define SAFI_MPLS_LABELED_VPN 128 -#define BGP_SAFI_VPN 128 - /* BGP uptime string length. */ #define BGP_UPTIME_LEN 25 @@ -1359,6 +1354,13 @@ extern void bgp_route_map_terminate(void); extern int peer_cmp (struct peer *p1, struct peer *p2); +extern int +bgp_map_afi_safi_iana2int (iana_afi_t pkt_afi, safi_t pkt_safi, + afi_t *afi, safi_t *safi); +extern int +bgp_map_afi_safi_int2iana (afi_t afi, safi_t safi, + iana_afi_t *pkt_afi, safi_t *pkt_safi); + extern struct peer_af * peer_af_create (struct peer *, afi_t, safi_t); extern struct peer_af * peer_af_find (struct peer *, afi_t, safi_t); extern int peer_af_delete (struct peer *, afi_t, safi_t); @@ -1458,13 +1460,9 @@ peer_group_af_configured (struct peer_group *group) static inline char * timestamp_string (time_t ts) { -#ifdef HAVE_CLOCK_MONOTONIC time_t tbuf; tbuf = time(NULL) - (bgp_clock() - ts); return ctime(&tbuf); -#else - return ctime(&ts); -#endif /* HAVE_CLOCK_MONOTONIC */ } static inline int diff --git a/bgpd/rfapi/bgp_rfapi_cfg.c b/bgpd/rfapi/bgp_rfapi_cfg.c index b6c162eb16..faa35503b3 100644 --- a/bgpd/rfapi/bgp_rfapi_cfg.c +++ b/bgpd/rfapi/bgp_rfapi_cfg.c @@ -3497,7 +3497,7 @@ static struct cmd_node bgp_vnc_l2_group_node = { 1 }; -static struct rfapi_l2_group_cfg * +struct rfapi_l2_group_cfg * bgp_rfapi_get_group_by_lni_label ( struct bgp *bgp, uint32_t logical_net_id, diff --git a/bgpd/rfapi/bgp_rfapi_cfg.h b/bgpd/rfapi/bgp_rfapi_cfg.h index 50ab3e27aa..897b4be764 100644 --- a/bgpd/rfapi/bgp_rfapi_cfg.h +++ b/bgpd/rfapi/bgp_rfapi_cfg.h @@ -300,6 +300,12 @@ bgp_rfapi_show_summary (struct bgp *bgp, struct vty *vty); extern struct rfapi_cfg * bgp_rfapi_get_config (struct bgp *bgp); +extern struct rfapi_l2_group_cfg * +bgp_rfapi_get_group_by_lni_label ( + struct bgp *bgp, + uint32_t logical_net_id, + uint32_t label); + extern struct ecommunity * bgp_rfapi_get_ecommunity_by_lni_label ( struct bgp *bgp, diff --git a/bgpd/rfapi/rfapi.c b/bgpd/rfapi/rfapi.c index e74b370f43..248ba7a63f 100644 --- a/bgpd/rfapi/rfapi.c +++ b/bgpd/rfapi/rfapi.c @@ -2842,13 +2842,39 @@ rfapi_register ( * If mac address is set, add an RT based on the registered LNI */ memset ((char *) &ecom_value, 0, sizeof (ecom_value)); - ecom_value.val[1] = 0x02; + ecom_value.val[1] = ECOMMUNITY_ROUTE_TARGET; ecom_value.val[5] = (l2o->logical_net_id >> 16) & 0xff; ecom_value.val[6] = (l2o->logical_net_id >> 8) & 0xff; ecom_value.val[7] = (l2o->logical_net_id >> 0) & 0xff; rtlist = ecommunity_new(); ecommunity_add_val (rtlist, &ecom_value); } + if (l2o->tag_id) + { + as_t as = bgp->as; + uint16_t val = l2o->tag_id; + memset ((char *) &ecom_value, 0, sizeof (ecom_value)); + ecom_value.val[1] = ECOMMUNITY_ROUTE_TARGET; + if (as > BGP_AS_MAX) + { + ecom_value.val[0] = ECOMMUNITY_ENCODE_AS4; + ecom_value.val[2] = (as >>24) & 0xff; + ecom_value.val[3] = (as >>16) & 0xff; + ecom_value.val[4] = (as >>8) & 0xff; + ecom_value.val[5] = as & 0xff; + } + else + { + ecom_value.val[0] = ECOMMUNITY_ENCODE_AS; + ecom_value.val[2] = (as >>8) & 0xff; + ecom_value.val[3] = as & 0xff; + } + ecom_value.val[6] = (val >> 8) & 0xff; + ecom_value.val[7] = val & 0xff; + if (rtlist == NULL) + rtlist = ecommunity_new(); + ecommunity_add_val (rtlist, &ecom_value); + } } /* diff --git a/bgpd/rfapi/rfapi.h b/bgpd/rfapi/rfapi.h index 7d108432ae..420c6e0d71 100644 --- a/bgpd/rfapi/rfapi.h +++ b/bgpd/rfapi/rfapi.h @@ -89,6 +89,7 @@ struct rfapi_l2address_option uint32_t logical_net_id; /* ~= EVPN Ethernet Segment Id, must not be zero for mac regis. */ uint8_t local_nve_id; + uint16_t tag_id; /* EVPN Ethernet Tag ID, 0 = none */ }; typedef enum diff --git a/bgpd/rfapi/rfapi_import.c b/bgpd/rfapi/rfapi_import.c index 0b46702bb0..716a1fb537 100644 --- a/bgpd/rfapi/rfapi_import.c +++ b/bgpd/rfapi/rfapi_import.c @@ -1130,6 +1130,49 @@ rfapiEcommunityGetLNI (struct ecommunity *ecom, uint32_t * lni) return ENOENT; } +int +rfapiEcommunityGetEthernetTag (struct ecommunity *ecom, uint16_t * tag_id) +{ + struct bgp *bgp = bgp_get_default (); + *tag_id = 0; /* default to untagged */ + if (ecom) + { + int i; + for (i = 0; i < ecom->size; ++i) + { + as_t as = 0; + int encode = 0; + uint8_t *p = ecom->val + (i * ECOMMUNITY_SIZE); + + /* High-order octet of type. */ + encode = *p++; + + if (*p++ == ECOMMUNITY_ROUTE_TARGET) { + if (encode == ECOMMUNITY_ENCODE_AS4) + { + as = (*p++ << 24); + as |= (*p++ << 16); + as |= (*p++ << 8); + as |= (*p++); + } + else if (encode == ECOMMUNITY_ENCODE_AS) + { + as = (*p++ << 8); + as |= (*p++); + p += 2; /* skip next two, tag/vid always in lowest bytes */ + } + if (as == bgp->as) + { + *tag_id = *p++ << 8; + *tag_id |= (*p++); + return 0; + } + } + } + } + return ENOENT; +} + static int rfapiVpnBiNhEqualsPt (struct bgp_info *bi, struct rfapi_ip_addr *hpt) { @@ -1377,6 +1420,8 @@ rfapiRouteInfo2NextHopEntry ( { (void) rfapiEcommunityGetLNI (bi->attr->extra->ecommunity, &vo->v.l2addr.logical_net_id); + (void) rfapiEcommunityGetEthernetTag (bi->attr->extra->ecommunity, + &vo->v.l2addr.tag_id); } /* local_nve_id comes from lower byte of RD type */ @@ -2106,6 +2151,7 @@ rfapiBgpInfoAttachSorted ( info_new->next = next; if (next) next->prev = info_new; + bgp_attr_intern (info_new->attr); } static void @@ -2114,6 +2160,7 @@ rfapiBgpInfoDetach (struct route_node *rn, struct bgp_info *bi) /* * Remove the route (doubly-linked) */ + // bgp_attr_unintern (&bi->attr); if (bi->next) bi->next->prev = bi->prev; if (bi->prev) @@ -2464,6 +2511,7 @@ rfapiMonitorEncapAdd ( __func__, import_table, vpn_bi, afi, rn, m); RFAPI_CHECK_REFCOUNT (rn, SAFI_ENCAP, 0); + bgp_attr_intern (vpn_bi->attr); } static void @@ -2966,6 +3014,7 @@ rfapiBiStartWithdrawTimer ( wcb->node = rn; wcb->info = bi; wcb->import_table = import_table; + bgp_attr_intern (bi->attr); if (VNC_DEBUG(VERBOSE)) { @@ -4037,7 +4086,6 @@ rfapiBgpInfoFilteredImportFunction (safi_t safi) switch (safi) { case SAFI_MPLS_VPN: - case BGP_SAFI_VPN: return rfapiBgpInfoFilteredImportVPN; case SAFI_ENCAP: @@ -4154,7 +4202,7 @@ rfapiProcessUpdate ( label); } - if (safi == SAFI_MPLS_VPN || safi == BGP_SAFI_VPN) + if (safi == SAFI_MPLS_VPN) { vnc_direct_bgp_rh_add_route (bgp, afi, p, peer, attr); } @@ -4283,7 +4331,7 @@ rfapiProcessWithdraw ( } /* TBD the deletion should happen after the lifetime expires */ - if (safi == SAFI_MPLS_VPN || safi == BGP_SAFI_VPN) + if (safi == SAFI_MPLS_VPN) vnc_direct_bgp_rh_del_route (bgp, afi, p, peer); if (safi == SAFI_MPLS_VPN) diff --git a/bgpd/rfapi/rfapi_import.h b/bgpd/rfapi/rfapi_import.h index 3a1ae3573e..3cf55462a1 100644 --- a/bgpd/rfapi/rfapi_import.h +++ b/bgpd/rfapi/rfapi_import.h @@ -203,6 +203,9 @@ extern int rfapiEcommunityGetLNI ( struct ecommunity *ecom, uint32_t *lni); +extern int rfapiEcommunityGetEthernetTag ( + struct ecommunity *ecom, + uint16_t * tag_id); /* enable for debugging; disable for performance */ #if 0 diff --git a/bgpd/rfapi/rfapi_rib.c b/bgpd/rfapi/rfapi_rib.c index daedbeedef..6aae35e635 100644 --- a/bgpd/rfapi/rfapi_rib.c +++ b/bgpd/rfapi/rfapi_rib.c @@ -707,6 +707,8 @@ rfapiRibBi2Ri( { (void) rfapiEcommunityGetLNI (bi->attr->extra->ecommunity, &vo->v.l2addr.logical_net_id); + (void) rfapiEcommunityGetEthernetTag (bi->attr->extra->ecommunity, + &vo->v.l2addr.tag_id); } /* local_nve_id comes from RD */ diff --git a/bgpd/rfapi/rfapi_vty.c b/bgpd/rfapi/rfapi_vty.c index add18ecbfd..0b729ba30c 100644 --- a/bgpd/rfapi/rfapi_vty.c +++ b/bgpd/rfapi/rfapi_vty.c @@ -2553,7 +2553,7 @@ DEFUN (add_vnc_prefix_cost_life_lnh, "add vnc prefix vn un cost (0-255) lifetime (1-4294967295) .LNH_OPTIONS", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2579,7 +2579,7 @@ DEFUN (add_vnc_prefix_life_cost_lnh, "add vnc prefix vn un lifetime (1-4294967295) cost (0-255) .LNH_OPTIONS", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2605,7 +2605,7 @@ DEFUN (add_vnc_prefix_cost_lnh, "add vnc prefix vn un cost (0-255) .LNH_OPTIONS", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2629,7 +2629,7 @@ DEFUN (add_vnc_prefix_life_lnh, "add vnc prefix vn un lifetime (1-4294967295) .LNH_OPTIONS", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2653,7 +2653,7 @@ DEFUN (add_vnc_prefix_lnh, "add vnc prefix vn un .LNH_OPTIONS", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2678,7 +2678,7 @@ DEFUN (add_vnc_prefix_cost_life, "add vnc prefix vn un cost (0-255) lifetime (1-4294967295)", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2704,7 +2704,7 @@ DEFUN (add_vnc_prefix_life_cost, "add vnc prefix vn un lifetime (1-4294967295) cost (0-255)", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2730,7 +2730,7 @@ DEFUN (add_vnc_prefix_cost, "add vnc prefix vn un cost (0-255)", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2754,7 +2754,7 @@ DEFUN (add_vnc_prefix_life, "add vnc prefix vn un lifetime (1-4294967295)", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2778,7 +2778,7 @@ DEFUN (add_vnc_prefix, "add vnc prefix vn un ", "Add registration\n" "VNC Information\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "VN address of NVE\n" @@ -2803,7 +2803,7 @@ DEFUN (add_vnc_mac_vni_prefix_cost_life, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un prefix cost (0-255) lifetime (1-4294967295)", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -2813,7 +2813,7 @@ DEFUN (add_vnc_mac_vni_prefix_cost_life, "UN address of NVE\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "Administrative cost [default: 255]\n" @@ -2833,7 +2833,7 @@ DEFUN (add_vnc_mac_vni_prefix_life, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un prefix lifetime (1-4294967295)", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -2843,7 +2843,7 @@ DEFUN (add_vnc_mac_vni_prefix_life, "UN address of NVE\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "Registration lifetime [default: infinite]\n" @@ -2860,7 +2860,7 @@ DEFUN (add_vnc_mac_vni_prefix_cost, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un prefix cost (0-255)", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -2870,7 +2870,7 @@ DEFUN (add_vnc_mac_vni_prefix_cost, "UN address of NVE\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n" "Administrative cost [default: 255]\n" "Administrative cost\n") @@ -2886,7 +2886,7 @@ DEFUN (add_vnc_mac_vni_prefix, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un prefix ", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -2896,7 +2896,7 @@ DEFUN (add_vnc_mac_vni_prefix, "UN address of NVE\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n" - "Add/modify prefix related infomation\n" + "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n") { /* pfx vn un cost life */ @@ -2910,7 +2910,7 @@ DEFUN (add_vnc_mac_vni_cost_life, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un cost (0-255) lifetime (1-4294967295)", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -2937,7 +2937,7 @@ DEFUN (add_vnc_mac_vni_cost, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un cost (0-255)", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -2961,7 +2961,7 @@ DEFUN (add_vnc_mac_vni_life, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un lifetime (1-4294967295)", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -2986,7 +2986,7 @@ DEFUN (add_vnc_mac_vni, "add vnc mac YY:YY:YY:YY:YY:YY virtual-network-identifier (1-4294967295) vn un ", "Add registration\n" "VNC Information\n" - "Add/modify mac address infomation\n" + "Add/modify mac address information\n" "MAC address\n" "Virtual Network Identifier follows\n" "Virtual Network Identifier\n" @@ -3735,7 +3735,7 @@ DEFUN (clear_vnc_nve_vn_un, "clear vnc nve vn <*|A.B.C.D|X:X::X:X> un <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "VN address of NVE\n" "VN IPv4 interface address\n" "VN IPv6 interface address\n" @@ -3765,7 +3765,7 @@ DEFUN (clear_vnc_nve_un_vn, "clear vnc nve un <*|A.B.C.D|X:X::X:X> vn <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "UN address of NVE\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n" @@ -3795,7 +3795,7 @@ DEFUN (clear_vnc_nve_vn, "clear vnc nve vn <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "VN address of NVE\n" "VN IPv4 interface address\n" "VN IPv6 interface address\n") { @@ -3820,7 +3820,7 @@ DEFUN (clear_vnc_nve_un, "clear vnc nve un <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "UN address of NVE\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n") { @@ -3853,7 +3853,7 @@ DEFUN (clear_vnc_prefix_vn_un, "clear vnc prefix <*|A.B.C.D/M|X:X::X:X/M> vn <*|A.B.C.D|X:X::X:X> un <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "All prefixes\n" "IPv4 prefix\n" "IPv6 prefix\n" @@ -3883,7 +3883,7 @@ DEFUN (clear_vnc_prefix_un_vn, "clear vnc prefix <*|A.B.C.D/M|X:X::X:X/M> un <*|A.B.C.D|X:X::X:X> vn <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "All prefixes\n" "IPv4 prefix\n" "IPv6 prefix\n" @@ -3913,7 +3913,7 @@ DEFUN (clear_vnc_prefix_un, "clear vnc prefix <*|A.B.C.D/M|X:X::X:X/M> un <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "All prefixes\n" "IPv4 prefix\n" "IPv6 prefix\n" @@ -3939,7 +3939,7 @@ DEFUN (clear_vnc_prefix_vn, "clear vnc prefix <*|A.B.C.D/M|X:X::X:X/M> vn <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "All prefixes\n" "IPv4 prefix\n" "IPv6 prefix\n" @@ -3965,7 +3965,7 @@ DEFUN (clear_vnc_prefix_all, "clear vnc prefix <*|A.B.C.D/M|X:X::X:X/M> *", "clear\n" "VNC Information\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "All prefixes\n" "IPv4 prefix\n" "IPv6 prefix\n" @@ -3995,7 +3995,7 @@ DEFUN (clear_vnc_mac_vn_un, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> vn <*|A.B.C.D|X:X::X:X> un <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4030,7 +4030,7 @@ DEFUN (clear_vnc_mac_un_vn, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> un <*|A.B.C.D|X:X::X:X> vn <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4064,7 +4064,7 @@ DEFUN (clear_vnc_mac_un, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> un <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4093,7 +4093,7 @@ DEFUN (clear_vnc_mac_vn, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> vn <*|A.B.C.D|X:X::X:X>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4122,7 +4122,7 @@ DEFUN (clear_vnc_mac_all, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> *", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4152,7 +4152,7 @@ DEFUN (clear_vnc_mac_vn_un_prefix, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> vn <*|A.B.C.D|X:X::X:X> un <*|A.B.C.D|X:X::X:X> prefix <*|A.B.C.D/M|X:X::X:X/M>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4167,7 +4167,7 @@ DEFUN (clear_vnc_mac_vn_un_prefix, "All UN addresses\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n" - "Clear prefix registration infomation\n" + "Clear prefix registration information\n" "All prefixes\n" "IPv4 prefix\n" "IPv6 prefix\n") @@ -4191,7 +4191,7 @@ DEFUN (clear_vnc_mac_un_vn_prefix, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> un <*|A.B.C.D|X:X::X:X> vn <*|A.B.C.D|X:X::X:X> prefix <*|A.B.C.D/M|X:X::X:X/M> prefix <*|A.B.C.D/M|X:X::X:X/M>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4225,7 +4225,7 @@ DEFUN (clear_vnc_mac_un_prefix, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> un <*|A.B.C.D|X:X::X:X> prefix <*|A.B.C.D/M|X:X::X:X/M>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4255,7 +4255,7 @@ DEFUN (clear_vnc_mac_vn_prefix, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> vn <*|A.B.C.D|X:X::X:X> prefix <*|A.B.C.D/M|X:X::X:X/M>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" @@ -4285,7 +4285,7 @@ DEFUN (clear_vnc_mac_all_prefix, "clear vnc mac <*|YY:YY:YY:YY:YY:YY> virtual-network-identifier <*|(1-4294967295)> prefix <*|A.B.C.D/M|X:X::X:X/M>", "clear\n" "VNC Information\n" - "Clear mac registration infomation\n" + "Clear mac registration information\n" "All macs\n" "MAC address\n" "VNI keyword\n" diff --git a/bgpd/rfapi/vnc_export_bgp.c b/bgpd/rfapi/vnc_export_bgp.c index bcfa145c67..f20e9ed674 100644 --- a/bgpd/rfapi/vnc_export_bgp.c +++ b/bgpd/rfapi/vnc_export_bgp.c @@ -76,7 +76,6 @@ encap_attr_export_ce ( memset (new, 0, sizeof (struct attr)); bgp_attr_dup (new, orig); bgp_attr_extra_get (new); - bgp_attr_flush_encap (new); /* * Set nexthop diff --git a/bgpd/rfp-example/rfptest/.gitignore b/bgpd/rfp-example/rfptest/.gitignore new file mode 100644 index 0000000000..d3d7c0a165 --- /dev/null +++ b/bgpd/rfp-example/rfptest/.gitignore @@ -0,0 +1 @@ +/rfptest diff --git a/configure.ac b/configure.ac index 40eab0a9a1..297e5cea55 100755 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ ## -## Configure template file for Quagga. +## Configure template file for FreeRangeRouting. ## autoconf will generate configure script. ## ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro @@ -7,9 +7,14 @@ ## AC_PREREQ(2.60) -AC_INIT(Quagga, 2.0.999, [https://bugzilla.quagga.net]) +AC_INIT(frr, 2.0-rc0, [https://bugzilla.quagga.net]) +PACKAGE_URL="https://freerangerouting.org/" +PACKAGE_FULLNAME="FreeRangeRouting" +AC_SUBST(PACKAGE_FULLNAME) + CONFIG_ARGS="$ac_configure_args" AC_SUBST(CONFIG_ARGS) + AC_CONFIG_SRCDIR(lib/zebra.h) AC_CONFIG_MACRO_DIR([m4]) @@ -208,8 +213,8 @@ AC_ARG_ENABLE(ospf6d, AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d])) AC_ARG_ENABLE(ldpd, AS_HELP_STRING([--enable-ldpd], [build ldpd])) -AC_ARG_ENABLE(watchquagga, - AS_HELP_STRING([--disable-watchquagga], [do not build watchquagga])) +AC_ARG_ENABLE(watchfrr, + AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr])) AC_ARG_ENABLE(isisd, AS_HELP_STRING([--disable-isisd], [do not build isisd])) AC_ARG_ENABLE(pimd, @@ -234,9 +239,9 @@ AC_ARG_ENABLE(ospfclient, AC_ARG_ENABLE(multipath, AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit])) AC_ARG_ENABLE(user, - AS_HELP_STRING([--enable-user=USER], [user to run Quagga suite as (default quagga)])) + AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)])) AC_ARG_ENABLE(group, - AS_HELP_STRING([--enable-group=GROUP], [group to run Quagga suite as (default quagga)])) + AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)])) AC_ARG_ENABLE(vty_group, AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner])) AC_ARG_ENABLE(configfile_mask, @@ -422,18 +427,18 @@ if test x"${enable_user}" = x"no"; then enable_user="" else if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then - enable_user="quagga" + enable_user="frr" fi - AC_DEFINE_UNQUOTED(QUAGGA_USER, "${enable_user}", Quagga User) + AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User) fi if test x"${enable_group}" = x"no"; then enable_group="" else if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then - enable_group="quagga" + enable_group="frr" fi - AC_DEFINE_UNQUOTED(QUAGGA_GROUP, "${enable_group}", Quagga Group) + AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group) fi if test x"${enable_vty_group}" = x"yes" ; then @@ -511,7 +516,7 @@ AC_CHECK_HEADERS([stropts.h sys/ksym.h \ sys/cdefs.h]) dnl Utility macro to avoid retyping includes all the time -m4_define([QUAGGA_INCLUDES], +m4_define([FRR_INCLUDES], [#ifdef SUNOS_5 #define _XPG4_2 #define __EXTENSIONS__ @@ -538,10 +543,10 @@ dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence dnl an additional round for it. -AC_CHECK_HEADERS([net/if_var.h], [], [], QUAGGA_INCLUDES) +AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES) -m4_define([QUAGGA_INCLUDES], -QUAGGA_INCLUDES +m4_define([FRR_INCLUDES], +FRR_INCLUDES [#if HAVE_NET_IF_VAR_H # include #endif @@ -551,13 +556,13 @@ AC_CHECK_HEADERS([netinet/in_var.h \ net/if_dl.h net/netopt.h \ inet/nd.h netinet/ip_icmp.h \ sys/sysctl.h sys/sockio.h kvm.h sys/conf.h], - [], [], QUAGGA_INCLUDES) + [], [], FRR_INCLUDES) AC_CHECK_HEADERS([ucontext.h], [], [], [#ifndef __USE_GNU #define __USE_GNU #endif /* __USE_GNU */ -QUAGGA_INCLUDES +FRR_INCLUDES ]) m4_define([UCONTEXT_INCLUDES], @@ -572,8 +577,8 @@ AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs], AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs], [], [], [UCONTEXT_INCLUDES]) -m4_define([QUAGGA_INCLUDES], -QUAGGA_INCLUDES +m4_define([FRR_INCLUDES], +FRR_INCLUDES [ #include #include @@ -701,13 +706,13 @@ if test "$with_libpam" = "yes"; then AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv) pam_conv_func="misc_conv" ], - [], QUAGGA_INCLUDES) + [], FRR_INCLUDES) AC_CHECK_HEADER([security/openpam.h], [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h) AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv) pam_conv_func="openpam_ttyconv" ], - [], QUAGGA_INCLUDES[#include ]) + [], FRR_INCLUDES[#include ]) if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then AC_MSG_WARN([*** pam support will not be built ***]) with_libpam="no" @@ -774,7 +779,6 @@ AC_CHECK_HEADER([math.h], [AC_CHECK_LIB([m], [pow], [LIBM="-lm" LIBS="$LIBS $LIBM" - AC_DEFINE(HAVE_LIBM,, Have libm) AC_CHECK_FUNCS(pow,[],[LIBM=""]) ]) ]) @@ -795,7 +799,7 @@ AC_CHECK_FUNCS([ \ AC_CHECK_HEADER([asm-generic/unistd.h], [AC_CHECK_DECL(__NR_setns, AC_DEFINE(HAVE_NETNS,, Have netns),, - QUAGGA_INCLUDES [#include + FRR_INCLUDES [#include ]) AC_CHECK_FUNCS(setns)] ) @@ -882,25 +886,25 @@ main() dnl ------------------------------ dnl check kernel route read method dnl ------------------------------ -AC_CACHE_CHECK([route read method], [quagga_cv_rtread_method], +AC_CACHE_CHECK([route read method], [frr_cv_rtread_method], [if test "x$netlink" = xyes; then - quagga_cv_rtread_method="netlink" + frr_cv_rtread_method="netlink" else -for quagga_cv_rtread_method in /dev/ip /dev/null; +for frr_cv_rtread_method in /dev/ip /dev/null; do - test x`ls $quagga_cv_rtread_method 2>/dev/null` = x"$quagga_cv_rtread_method" && break + test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break done -case $quagga_cv_rtread_method in +case $frr_cv_rtread_method in "/dev/ip") case "$host" in - *-freebsd*) quagga_cv_rtread_method="sysctl";; - *) quagga_cv_rtread_method="getmsg";; + *-freebsd*) frr_cv_rtread_method="sysctl";; + *) frr_cv_rtread_method="getmsg";; esac;; *) - quagga_cv_rtread_method="sysctl";; + frr_cv_rtread_method="sysctl";; esac fi]) -RTREAD_METHOD=rtread_${quagga_cv_rtread_method}.o +RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o AC_SUBST(RTREAD_METHOD) dnl ----------------------------- @@ -935,7 +939,7 @@ AC_SUBST(IOCTL_METHOD) dnl --------------------------------------------------------------- dnl figure out how to specify an interface in multicast sockets API dnl --------------------------------------------------------------- -AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], QUAGGA_INCLUDES) +AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES) AC_CHECK_HEADERS([linux/mroute.h], [], [],[ #include @@ -944,8 +948,8 @@ AC_CHECK_HEADERS([linux/mroute.h], [], [],[ #include ]) -m4_define([QUAGGA_INCLUDES], -QUAGGA_INCLUDES +m4_define([FRR_INCLUDES], +FRR_INCLUDES [#if HAVE_LINUX_MROUTE_H # include #endif @@ -958,8 +962,8 @@ AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[ #include ]) -m4_define([QUAGGA_INCLUDES], -QUAGGA_INCLUDES +m4_define([FRR_INCLUDES], +FRR_INCLUDES [#if HAVE_NETINET_IP_MROUTE_H # include #endif @@ -989,14 +993,14 @@ dnl figure out how to check link-state dnl --------------------------------------------------------------- AC_CHECK_HEADER( [net/if_media.h], [m4_define([LINK_DETECT_INCLUDES], - QUAGGA_INCLUDES + FRR_INCLUDES [#include ]) AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status], AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]), [], LINK_DETECT_INCLUDES)], [], - QUAGGA_INCLUDES) + FRR_INCLUDES) dnl --------------------------------------------------------------- dnl Additional, newer way to check link-state using ifi_link_state. @@ -1004,7 +1008,7 @@ dnl Not available in all BSD's when ifmediareq available dnl --------------------------------------------------------------- AC_CHECK_MEMBERS([struct if_data.ifi_link_state], AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]), - [], QUAGGA_INCLUDES) + [], FRR_INCLUDES) dnl ------------------------ dnl TCP_MD5SIG socket option @@ -1012,16 +1016,16 @@ dnl ------------------------ AC_CHECK_HEADER([netinet/tcp.h], [m4_define([MD5_INCLUDES], - QUAGGA_INCLUDES + FRR_INCLUDES [#include ]) AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)], [], - QUAGGA_INCLUDES) + FRR_INCLUDES) if test $ac_cv_have_decl_TCP_MD5SIG = no; then AC_CHECK_HEADER([linux/tcp.h], [m4_define([MD5_INCLUDES], - QUAGGA_INCLUDES + FRR_INCLUDES [#include ]) AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)]) @@ -1030,29 +1034,29 @@ fi dnl ----------------------------- dnl check ipforward detect method dnl ----------------------------- -AC_CACHE_CHECK([ipforward method], [quagga_cv_ipforward_method], +AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method], [if test x$cross_compiling = xyes; then if test x"$opsys" = x"gnu-linux"; then - quagga_cv_ipforward_method=/proc/net/snmp + frr_cv_ipforward_method=/proc/net/snmp else - quagga_cv_ipforward_method=/dev/ip + frr_cv_ipforward_method=/dev/ip fi else - for quagga_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null; + for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null; do - test x`ls $quagga_cv_ipforward_method 2>/dev/null` = x"$quagga_cv_ipforward_method" && break + test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break done fi -case $quagga_cv_ipforward_method in - "/proc/net/snmp") quagga_cv_ipforward_method="proc";; +case $frr_cv_ipforward_method in + "/proc/net/snmp") frr_cv_ipforward_method="proc";; "/dev/ip") case "$host" in - *-freebsd*) quagga_cv_ipforward_method="sysctl";; - *) quagga_cv_ipforward_method="solaris";; + *-freebsd*) frr_cv_ipforward_method="sysctl";; + *) frr_cv_ipforward_method="solaris";; esac;; - *) quagga_cv_ipforward_method="sysctl";; + *) frr_cv_ipforward_method="sysctl";; esac]) -IPFORWARD=ipforward_${quagga_cv_ipforward_method}.o +IPFORWARD=ipforward_${frr_cv_ipforward_method}.o AC_SUBST(IPFORWARD) dnl ---------------------------------------------------------------------------- @@ -1092,18 +1096,15 @@ dnl ---------- AC_MSG_ERROR([Failed to detect IPv6 stack]) fi -dnl this is unconditial, for compatibility -AC_DEFINE(HAVE_IPV6,1,IPv6) - dnl ------------------ dnl IPv6 header checks dnl ------------------ AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \ netinet6/in6_var.h netinet6/nd6.h], [], [], - QUAGGA_INCLUDES) + FRR_INCLUDES) -m4_define([QUAGGA_INCLUDES],dnl -QUAGGA_INCLUDES +m4_define([FRR_INCLUDES],dnl +FRR_INCLUDES [#if HAVE_NETINET6_IN6_H #include #endif @@ -1160,17 +1161,25 @@ AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd") if test "${enable_ldpd}" = "no";then LDPD="" else + AX_PROG_PERL_MODULES(XML::LibXML, , [ + if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then + AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c]) + else + AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing]) + fi + ]) + LDPD="ldpd" AC_DEFINE(HAVE_LDPD, 1, ldpd) fi AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd") -if test "${enable_watchquagga}" = "no";then - WATCHQUAGGA="" +if test "${enable_watchfrr}" = "no";then + WATCHFRR="" else - WATCHQUAGGA="watchquagga" + WATCHFRR="watchfrr" fi -AM_CONDITIONAL(WATCHQUAGGA, test "x$WATCHQUAGGA" = "xwatchquagga") +AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr") OSPFCLIENT="" if test "${enable_ospfapi}" != "no";then @@ -1245,7 +1254,7 @@ AC_SUBST(RIPNGD) AC_SUBST(OSPFD) AC_SUBST(OSPF6D) AC_SUBST(LDPD) -AC_SUBST(WATCHQUAGGA) +AC_SUBST(WATCHFRR) AC_SUBST(ISISD) AC_SUBST(PIMD) AC_SUBST(SOLARIS) @@ -1313,14 +1322,14 @@ AC_CHECK_TYPES([ struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq, struct nd_opt_adv_interval, struct rt_addrinfo, struct nd_opt_homeagent_info, struct nd_opt_adv_interval], - [], [], QUAGGA_INCLUDES) + [], [], FRR_INCLUDES) AC_CHECK_MEMBERS([struct sockaddr.sa_len, struct sockaddr_in.sin_len, struct sockaddr_un.sun_len, struct sockaddr_dl.sdl_len, struct if6_aliasreq.ifra_lifetime, struct nd_opt_adv_interval.nd_opt_ai_type], - [], [], QUAGGA_INCLUDES) + [], [], FRR_INCLUDES) dnl --------------------------- dnl IRDP/pktinfo/icmphdr checks @@ -1332,10 +1341,10 @@ AC_CHECK_TYPES([struct in_pktinfo], fi], [if test "${enable_irdp}" = "yes"; then AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!']) - fi], [QUAGGA_INCLUDES])], + fi], [FRR_INCLUDES])], [if test "${enable_irdp}" = "yes"; then AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!']) - fi], [QUAGGA_INCLUDES]) + fi], [FRR_INCLUDES]) dnl ----------------------- dnl checking for IP_PKTINFO @@ -1408,7 +1417,7 @@ dnl -------------------------------------- AC_CHECK_DECL(CLOCK_MONOTONIC, [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"]) AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock) -], [AC_MSG_RESULT(no)], [QUAGGA_INCLUDES]) +], [AC_MSG_RESULT(no)], [FRR_INCLUDES]) dnl -------------------------------------- dnl checking for flex and bison @@ -1478,17 +1487,17 @@ if test "${enable_capabilities}" != "no"; then AC_TRY_COMPILE([#include ],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl) - quagga_ac_keepcaps="yes"], + frr_ac_keepcaps="yes"], AC_MSG_RESULT(no) ) - if test x"${quagga_ac_keepcaps}" = x"yes"; then + if test x"${frr_ac_keepcaps}" = x"yes"; then AC_CHECK_HEADERS(sys/capability.h) fi if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then AC_CHECK_LIB(cap, cap_init, [AC_DEFINE(HAVE_LCAPS,1,Capabilities) LIBCAP="-lcap" - quagga_ac_lcaps="yes"] + frr_ac_lcaps="yes"] ) else AC_CHECK_HEADERS(priv.h, @@ -1496,14 +1505,14 @@ if test "${enable_capabilities}" != "no"; then AC_TRY_COMPILE([#include ],[getpflags(PRIV_AWARE);], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags) - quagga_ac_scaps="yes"], + frr_ac_scaps="yes"], AC_MSG_RESULT(no) ) ] ) fi - if test x"${quagga_ac_scaps}" = x"yes" \ - -o x"${quagga_ac_lcaps}" = x"yes"; then + if test x"${frr_ac_scaps}" = x"yes" \ + -o x"${frr_ac_lcaps}" = x"yes"; then AC_DEFINE(HAVE_CAPABILITIES,1,capabilities) fi fi @@ -1543,7 +1552,7 @@ AC_CHECK_HEADER([malloc.h], AC_DEFINE(HAVE_MALLINFO,,mallinfo)], AC_MSG_RESULT(no) ) - ], [], QUAGGA_INCLUDES) + ], [], FRR_INCLUDES) dnl ---------- dnl configure date @@ -1568,54 +1577,54 @@ dnl set paths for state directory dnl ------------------------------ AC_MSG_CHECKING(directory to use for state file) if test "${prefix}" = "NONE"; then - quagga_statedir_prefix=""; + frr_statedir_prefix=""; else - quagga_statedir_prefix=${prefix} + frr_statedir_prefix=${prefix} fi if test "${localstatedir}" = '${prefix}/var'; then - for QUAGGA_STATE_DIR in ${quagga_statedir_prefix}/var/run dnl - ${quagga_statedir_prefix}/var/adm dnl - ${quagga_statedir_prefix}/etc dnl + for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl + ${frr_statedir_prefix}/var/adm dnl + ${frr_statedir_prefix}/etc dnl /var/run dnl /var/adm dnl /etc dnl /dev/null; do - test -d $QUAGGA_STATE_DIR && break + test -d $FRR_STATE_DIR && break done - quagga_statedir=$QUAGGA_STATE_DIR + frr_statedir=$FRR_STATE_DIR else - quagga_statedir=${localstatedir} + frr_statedir=${localstatedir} fi -if test $quagga_statedir = "/dev/null"; then +if test $frr_statedir = "/dev/null"; then AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!') fi -AC_MSG_RESULT(${quagga_statedir}) -AC_SUBST(quagga_statedir) +AC_MSG_RESULT(${frr_statedir}) +AC_SUBST(frr_statedir) -AC_DEFINE_UNQUOTED(PATH_ZEBRA_PID, "$quagga_statedir/zebra.pid",zebra PID) -AC_DEFINE_UNQUOTED(PATH_RIPD_PID, "$quagga_statedir/ripd.pid",ripd PID) -AC_DEFINE_UNQUOTED(PATH_RIPNGD_PID, "$quagga_statedir/ripngd.pid",ripngd PID) -AC_DEFINE_UNQUOTED(PATH_BGPD_PID, "$quagga_statedir/bgpd.pid",bgpd PID) -AC_DEFINE_UNQUOTED(PATH_OSPFD_PID, "$quagga_statedir/ospfd.pid",ospfd PID) -AC_DEFINE_UNQUOTED(PATH_OSPF6D_PID, "$quagga_statedir/ospf6d.pid",ospf6d PID) -AC_DEFINE_UNQUOTED(PATH_LDPD_PID, "$quagga_statedir/ldpd.pid",ldpd PID) -AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$quagga_statedir/ldpd.sock",ldpd control socket) -AC_DEFINE_UNQUOTED(PATH_ISISD_PID, "$quagga_statedir/isisd.pid",isisd PID) -AC_DEFINE_UNQUOTED(PATH_PIMD_PID, "$quagga_statedir/pimd.pid",pimd PID) -AC_DEFINE_UNQUOTED(PATH_WATCHQUAGGA_PID, "$quagga_statedir/watchquagga.pid",watchquagga PID) -AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$quagga_statedir/zserv.api",zebra api socket) -AC_DEFINE_UNQUOTED(ZEBRA_VTYSH_PATH, "$quagga_statedir/zebra.vty",zebra vty socket) -AC_DEFINE_UNQUOTED(RIP_VTYSH_PATH, "$quagga_statedir/ripd.vty",rip vty socket) -AC_DEFINE_UNQUOTED(RIPNG_VTYSH_PATH, "$quagga_statedir/ripngd.vty",ripng vty socket) -AC_DEFINE_UNQUOTED(BGP_VTYSH_PATH, "$quagga_statedir/bgpd.vty",bgpd vty socket) -AC_DEFINE_UNQUOTED(OSPF_VTYSH_PATH, "$quagga_statedir/ospfd.vty",ospfd vty socket) -AC_DEFINE_UNQUOTED(OSPF6_VTYSH_PATH, "$quagga_statedir/ospf6d.vty",ospf6d vty socket) -AC_DEFINE_UNQUOTED(LDP_VTYSH_PATH, "$quagga_statedir/ldpd.vty",ldpd vty socket) -AC_DEFINE_UNQUOTED(ISIS_VTYSH_PATH, "$quagga_statedir/isisd.vty",isisd vty socket) -AC_DEFINE_UNQUOTED(PIM_VTYSH_PATH, "$quagga_statedir/pimd.vty",pimd vty socket) -AC_DEFINE_UNQUOTED(WATCHQUAGGA_VTYSH_PATH, "$quagga_statedir/watchquagga.vty",watchquagga vty socket) -AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$quagga_statedir",daemon vty directory) +AC_DEFINE_UNQUOTED(PATH_ZEBRA_PID, "$frr_statedir/zebra.pid",zebra PID) +AC_DEFINE_UNQUOTED(PATH_RIPD_PID, "$frr_statedir/ripd.pid",ripd PID) +AC_DEFINE_UNQUOTED(PATH_RIPNGD_PID, "$frr_statedir/ripngd.pid",ripngd PID) +AC_DEFINE_UNQUOTED(PATH_BGPD_PID, "$frr_statedir/bgpd.pid",bgpd PID) +AC_DEFINE_UNQUOTED(PATH_OSPFD_PID, "$frr_statedir/ospfd.pid",ospfd PID) +AC_DEFINE_UNQUOTED(PATH_OSPF6D_PID, "$frr_statedir/ospf6d.pid",ospf6d PID) +AC_DEFINE_UNQUOTED(PATH_LDPD_PID, "$frr_statedir/ldpd.pid",ldpd PID) +AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket) +AC_DEFINE_UNQUOTED(PATH_ISISD_PID, "$frr_statedir/isisd.pid",isisd PID) +AC_DEFINE_UNQUOTED(PATH_PIMD_PID, "$frr_statedir/pimd.pid",pimd PID) +AC_DEFINE_UNQUOTED(PATH_WATCHFRR_PID, "$frr_statedir/watchfrr.pid",watchfrr PID) +AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket) +AC_DEFINE_UNQUOTED(ZEBRA_VTYSH_PATH, "$frr_statedir/zebra.vty",zebra vty socket) +AC_DEFINE_UNQUOTED(RIP_VTYSH_PATH, "$frr_statedir/ripd.vty",rip vty socket) +AC_DEFINE_UNQUOTED(RIPNG_VTYSH_PATH, "$frr_statedir/ripngd.vty",ripng vty socket) +AC_DEFINE_UNQUOTED(BGP_VTYSH_PATH, "$frr_statedir/bgpd.vty",bgpd vty socket) +AC_DEFINE_UNQUOTED(OSPF_VTYSH_PATH, "$frr_statedir/ospfd.vty",ospfd vty socket) +AC_DEFINE_UNQUOTED(OSPF6_VTYSH_PATH, "$frr_statedir/ospf6d.vty",ospf6d vty socket) +AC_DEFINE_UNQUOTED(LDP_VTYSH_PATH, "$frr_statedir/ldpd.vty",ldpd vty socket) +AC_DEFINE_UNQUOTED(ISIS_VTYSH_PATH, "$frr_statedir/isisd.vty",isisd vty socket) +AC_DEFINE_UNQUOTED(PIM_VTYSH_PATH, "$frr_statedir/pimd.vty",pimd vty socket) +AC_DEFINE_UNQUOTED(WATCHFRR_VTYSH_PATH, "$frr_statedir/watchfrr.vty",watchfrr vty socket) +AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory) dnl autoconf does this, but it does it too late... test "x$prefix" = xNONE && prefix=$ac_default_prefix @@ -1628,6 +1637,18 @@ for I in 1 2 3 4 5 6 7 8 9 10; do done AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary) +CFG_SYSCONF="$sysconfdir" +CFG_SBIN="$sbindir" +CFG_STATE="$frr_statedir" +for I in 1 2 3 4 5 6 7 8 9 10; do + eval CFG_SYSCONF="\"$CFG_SYSCONF\"" + eval CFG_SBIN="\"$CFG_SBIN\"" + eval CFG_STATE="\"$CFG_STATE\"" +done +AC_SUBST(CFG_SYSCONF) +AC_SUBST(CFG_SBIN) +AC_SUBST(CFG_STATE) + dnl ------------------------------- dnl Quagga sources should always be dnl current wrt interfaces. Dont @@ -1641,14 +1662,14 @@ dnl Check htonl works correctly dnl --------------------------- AC_MSG_CHECKING(for working htonl) AC_CACHE_VAL(ac_cv_htonl_works, - [AC_LINK_IFELSE([AC_LANG_PROGRAM([QUAGGA_INCLUDES],[htonl (0);])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])], [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no]) ] ) AC_MSG_RESULT($ac_cv_htonl_works) AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile - ripngd/Makefile bgpd/Makefile ospfd/Makefile watchquagga/Makefile + ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile pimd/Makefile @@ -1659,9 +1680,22 @@ AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile cumulus/Makefile pkgsrc/Makefile fpm/Makefile - redhat/quagga.spec + redhat/frr.spec lib/version.h doc/defines.texi + doc/bgpd.8 + doc/isisd.8 + doc/ospf6d.8 + doc/ospfclient.8 + doc/ospfd.8 + doc/ldpd.8 + doc/ripd.8 + doc/ripngd.8 + doc/pimd.8 + doc/vtysh.1 + doc/watchfrr.8 + doc/zebra.8 + doc/frr.1 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh]) @@ -1682,21 +1716,21 @@ AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl]) AC_OUTPUT echo " -Quagga configuration --------------------- -quagga version : ${PACKAGE_VERSION} +FreeRangeRouting configuration +------------------------------ +FRR version : ${PACKAGE_VERSION} host operating system : ${host_os} source code location : ${srcdir} compiler : ${CC} compiler flags : ${CFLAGS} make : ${MAKE-make} linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM} -state file directory : ${quagga_statedir} +state file directory : ${frr_statedir} config file directory : `eval echo \`echo ${sysconfdir}\`` example directory : `eval echo \`echo ${exampledir}\`` -user to run as : ${enable_user} -group to run as : ${enable_group} -group for vty sockets : ${enable_vty_group} +user to run as : ${enable_user} +group to run as : ${enable_group} +group for vty sockets : ${enable_vty_group} config file mask : ${enable_configfile_mask} log file mask : ${enable_logfile_mask} zebra protobuf enabled : ${have_protobuf:-no} diff --git a/cumulus/Makefile.am b/cumulus/Makefile.am index 852af344af..027862314c 100644 --- a/cumulus/Makefile.am +++ b/cumulus/Makefile.am @@ -1,5 +1,5 @@ sbin_PROGRAMS = ssd -EXTRA_DIST = etc/quagga/debian.conf etc/quagga/daemons etc/default/quagga +EXTRA_DIST = etc/frr/debian.conf etc/frr/daemons etc/default/frr ssd_SOURCES = start-stop-daemon.c diff --git a/cumulus/etc/default/quagga b/cumulus/etc/default/frr similarity index 100% rename from cumulus/etc/default/quagga rename to cumulus/etc/default/frr diff --git a/cumulus/etc/frr/Frr.conf b/cumulus/etc/frr/Frr.conf new file mode 100644 index 0000000000..2cd05bf803 --- /dev/null +++ b/cumulus/etc/frr/Frr.conf @@ -0,0 +1,2 @@ +log file /var/log/frr/frr.log +log timestamp precision 6 diff --git a/cumulus/etc/quagga/daemons b/cumulus/etc/frr/daemons similarity index 53% rename from cumulus/etc/quagga/daemons rename to cumulus/etc/frr/daemons index dd0e23914b..cf03cd9de1 100644 --- a/cumulus/etc/quagga/daemons +++ b/cumulus/etc/frr/daemons @@ -1,25 +1,25 @@ -# This file tells the quagga package which daemons to start. +# This file tells the frr package which daemons to start. # # Entries are in the format: =(yes|no|priority) # 0, "no" = disabled # 1, "yes" = highest priority # 2 .. 10 = lower priorities -# Read /usr/share/doc/quagga/README.Debian for details. +# Read /usr/share/doc/frr/README.Debian for details. # # Sample configurations for these daemons can be found in -# /usr/share/doc/quagga/examples/. +# /usr/share/doc/frr/examples/. # # ATTENTION: # # When activation a daemon at the first time, a config file, even if it is -# empty, has to be present *and* be owned by the user and group "quagga", else -# the daemon will not be started by /etc/init.d/quagga. The permissions should +# empty, has to be present *and* be owned by the user and group "frr", else +# the daemon will not be started by /etc/init.d/frr. The permissions should # be u=rw,g=r,o=. # When using "vtysh" such a config file is also needed. It should be owned by -# group "quaggavty" and set to ug=rw,o= though. Check /etc/pam.d/quagga, too. +# group "frrvty" and set to ug=rw,o= though. Check /etc/pam.d/frr, too. # -# The watchquagga daemon is always started. Per default in monitoring-only but -# that can be changed via /etc/quagga/debian.conf. +# The watchfrr daemon is always started. Per default in monitoring-only but +# that can be changed via /etc/frr/debian.conf. # zebra=no bgpd=no diff --git a/cumulus/etc/quagga/debian.conf b/cumulus/etc/frr/debian.conf similarity index 60% rename from cumulus/etc/quagga/debian.conf rename to cumulus/etc/frr/debian.conf index 88df9424e2..8f3e1c1db6 100644 --- a/cumulus/etc/quagga/debian.conf +++ b/cumulus/etc/frr/debian.conf @@ -1,7 +1,7 @@ # -# If this option is set the /etc/init.d/quagga script automatically loads +# If this option is set the /etc/init.d/frr script automatically loads # the config via "vtysh -b" when the servers are started. -# Check /etc/pam.d/quagga if you intend to use "vtysh"! +# Check /etc/pam.d/frr if you intend to use "vtysh"! # vtysh_enable=yes zebra_options=" -s 90000000 --daemon -A 127.0.0.1" @@ -14,5 +14,5 @@ isisd_options=" --daemon -A 127.0.0.1" pimd_options=" --daemon -A 127.0.0.1" # The list of daemons to watch is automatically generated by the init script. -watchquagga_enable=yes -watchquagga_options=(-adz -r /usr/sbin/servicebBquaggabBrestartbB%s -s /usr/sbin/servicebBquaggabBstartbB%s -k /usr/sbin/servicebBquaggabBstopbB%s -b bB -t 30) +watchfrr_enable=yes +watchfrr_options=(-adz -r /usr/sbin/servicebBfrrbBrestartbB%s -s /usr/sbin/servicebBfrrbBstartbB%s -k /usr/sbin/servicebBfrrbBstopbB%s -b bB -t 30) diff --git a/cumulus/etc/quagga/vtysh.conf b/cumulus/etc/frr/vtysh.conf similarity index 100% rename from cumulus/etc/quagga/vtysh.conf rename to cumulus/etc/frr/vtysh.conf diff --git a/cumulus/etc/quagga/Quagga.conf b/cumulus/etc/quagga/Quagga.conf deleted file mode 100644 index e52f3f8aab..0000000000 --- a/cumulus/etc/quagga/Quagga.conf +++ /dev/null @@ -1,2 +0,0 @@ -log file /var/log/quagga/quagga.log -log timestamp precision 6 diff --git a/cumulus/etc/sudoers.d/quagga_sudoers b/cumulus/etc/sudoers.d/frr_sudoers similarity index 70% rename from cumulus/etc/sudoers.d/quagga_sudoers rename to cumulus/etc/sudoers.d/frr_sudoers index 4375d7e5fa..4a42fb24f4 100644 --- a/cumulus/etc/sudoers.d/quagga_sudoers +++ b/cumulus/etc/sudoers.d/frr_sudoers @@ -1,7 +1,7 @@ Defaults env_keep += VTYSH_PAGER -# Allow user in group quagga to run vtysh show commands -# without a password by uncommenting the "%quagga" line below. +# Allow user in group frr to run vtysh show commands +# without a password by uncommenting the "%frr" line below. # Subshell commands need to be disallowed, including # preventing the user passing command line args like 'start-shell' @@ -11,5 +11,5 @@ Defaults env_keep += VTYSH_PAGER # Instead, use NOEXEC, to prevent any exec'ed commands. Cmnd_Alias VTY_SHOW = /usr/bin/vtysh -c show * -# %quagga ALL = (root) NOPASSWD:NOEXEC: VTY_SHOW +# %frr ALL = (root) NOPASSWD:NOEXEC: VTY_SHOW diff --git a/debian/README.Debian b/debian/README.Debian index 7bec53230f..fb481eb456 100644 --- a/debian/README.Debian +++ b/debian/README.Debian @@ -2,34 +2,34 @@ ================== Please consider setting this package "on hold" by typing - echo "quagga hold" | dpkg --set-selections + echo "frr hold" | dpkg --set-selections and verifying this using dpkg --get-selections | grep 'hold$' Setting a package "on hold" means that it will not automatically be upgraded. Instead apt-get only displays a warning saying that a new version would be -available forcing you to explicitly type "apt-get install quagga" to upgrade it. +available forcing you to explicitly type "apt-get install frr" to upgrade it. -* What is quagga? +* What is frr? ================= -http://www.quagga.net/ -> Quagga is a routing software suite, providing implementations of OSPFv2, +http://www.freerangerouting.net/ +> Frr is a routing software suite, providing implementations of OSPFv2, > OSPFv3, RIP v1 and v2, RIPv3 and BGPv4 for Unix platforms, particularly -> FreeBSD and Linux and also NetBSD, to mention a few. Quagga is a fork of GNU +> FreeBSD and Linux and also NetBSD, to mention a few. Frr is a fork of GNU > Zebra which was developed by Kunihiro Ishiguro. Development of GNU Zebra > slowed dramatically to the point where eventually GNU Zebra was forked into -> Quagga. +> Frr. -> The Quagga tree is an attempt to provide a zebra tree with at least the +> The Frr tree is an attempt to provide a zebra tree with at least the > bug-fixes, which have accumulated, applied, while tracking any significant > changes made to the zebra.org tree. Ultimately, this tree hopes to revitalise > development of this code base. -I packaged zebra-pj which was then renamed to quagga to get people used to it +I packaged zebra-pj which was then renamed to frr to get people used to it and offer Debian users the choice which versions they like to use. I hope this -brings quagga some feedback and helps it evolving to a good successor of the +brings frr some feedback and helps it evolving to a good successor of the orphaned zebra. -- Christian Hammers , Jul/Aug 2003 @@ -37,16 +37,16 @@ orphaned zebra. * Why has SNMP support been disabled? ===================================== -Quagga used to link against the NetSNMP libraries to provide SNMP +Frr used to link against the NetSNMP libraries to provide SNMP support. Those libraries sadly link against the OpenSSL libraries to provide crypto support for SNMPv3 among others. OpenSSL now is not compatible with the GNU GENERAL PUBLIC LICENSE (GPL) -licence that Quagga is distributed under. For more explanation read: +licence that Frr is distributed under. For more explanation read: http://www.gnome.org/~markmc/openssl-and-the-gpl.html http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs Updating the licence to explecitly allow linking against OpenSSL would requite the affirmation of all people that ever contributed -a significant part to Zebra or Quagga and thus are the collective +a significant part to Zebra or Frr and thus are the collective "copyright holder". That's too much work. Using a shrinked down version of NetSNMP without OpenSSL or convincing the NetSNMP people to change to GnuTLS are maybe good solutions but not reachable @@ -55,17 +55,17 @@ during the last days before the Sarge release :-( *BUT* It is allowed by the used licence mix that you fetch the sources and -build Quagga yourself with SNMP with - +build Frr yourself with SNMP with + # export WANT_SNMP=1 - # apt-get -b source quagga + # apt-get -b source frr Just distributing it in binary form, linked against OpenSSL, is forbidden. * Daemon selection: =================== -The Debian package uses /etc/quagga/daemons to tell the +The Debian package uses /etc/frr/daemons to tell the initscript which daemons to start. It's in the format = with no spaces (it's simply source-d into the initscript). @@ -73,13 +73,13 @@ Default is not to start anything, since it can hose your system's routing table if not set up properly. Priorities were suggested by Dancer . -They're used to start the Quagga daemons in more than one step +They're used to start the Frr daemons in more than one step (for example start one or two at network initialization and the -rest later). The number of Quagga daemons being small, priorities +rest later). The number of Frr daemons being small, priorities must be between 1 and 9, inclusive (or the initscript has to be -changed). /etc/init.d/quagga then can be started as +changed). /etc/init.d/frr then can be started as -/etc/init.d/quagga > +/etc/init.d/frr > where priority 0 is the same as 'stop', priority 10 or 'start' means 'start all' @@ -96,15 +96,15 @@ into the kernel. ===================================================================== If this message occurs the receive buffer should be increased by adding the -following to /etc/sysctl.conf and "--nl-bufsize" to /etc/quagga/debian.conf. +following to /etc/sysctl.conf and "--nl-bufsize" to /etc/frr/debian.conf. > net.core.rmem_default = 262144 > net.core.rmem_max = 262144 -See message #4525 from 2005-05-09 in the quagga-users mailing list. +See message #4525 from 2005-05-09 in the frr-users mailing list. * vtysh immediately exists: =========================== -Check /etc/pam.d/quagga, it probably denies access to your user. The passwords -configured in /etc/quagga/Quagga.conf are only for telnet access. +Check /etc/pam.d/frr, it probably denies access to your user. The passwords +configured in /etc/frr/Frr.conf are only for telnet access. diff --git a/debian/README.Maintainer b/debian/README.Maintainer index b0b1e62b34..aa8ac0cf35 100644 --- a/debian/README.Maintainer +++ b/debian/README.Maintainer @@ -4,19 +4,19 @@ for i in debian/patches/*.diff; do echo -e "#\n# $i\n#"; patch --fuzz=3 --dry-run -p1 < $i; done # -# Filename transition from zebra to quagga +# Filename transition from zebra to frr # Files that keep their names /usr/bin/vtysh Files that got an -pj suffix - /etc/default/zebra -> /etc/quagga/debian.conf - /etc/init.d/zebra -> /etc/init.d/quagga - /etc/zebra/ -> /etc/quagga/ - /usr/share/doc/zebra/ -> /usr/share/doc/quagga/ - /var/log/zebra/ -> /var/log/quagga/ - /var/run/ -> /var/run/quagga/ + /etc/default/zebra -> /etc/frr/debian.conf + /etc/init.d/zebra -> /etc/init.d/frr + /etc/zebra/ -> /etc/frr/ + /usr/share/doc/zebra/ -> /usr/share/doc/frr/ + /var/log/zebra/ -> /var/log/frr/ + /var/run/ -> /var/run/frr/ Files that were moved - /usr/sbin/* -> /usr/lib/quagga/ + /usr/sbin/* -> /usr/lib/frr/ diff --git a/debian/changelog b/debian/changelog index f17f89eaff..ef019b4d23 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,7 @@ +frr (2.0) Released; urgency=medium + + * Switchover to FRR + quagga (0.99.24+cl3u5) RELEASED; urgency=medium * Closes: CM-12846 - Resolve Memory leaks in 'show ip bgp neighbor json' diff --git a/debian/control b/debian/control index 3bd4e21a9d..ac9298425f 100644 --- a/debian/control +++ b/debian/control @@ -1,14 +1,14 @@ -Source: quagga +Source: frr Section: net Priority: optional Maintainer: Christian Hammers Uploaders: Florian Weimer Build-Depends: debhelper (>= 7.0.50~), libncurses5-dev, libreadline-dev, texlive-latex-base, texlive-generic-recommended, libpam0g-dev | libpam-dev, libcap-dev, texinfo (>= 4.7), imagemagick, ghostscript, groff, po-debconf, autotools-dev, hardening-wrapper, libpcre3-dev, gawk, chrpath, libsnmp-dev, git, dh-autoreconf, libjson0, libjson0-dev, dh-systemd, libsystemd-dev, python-ipaddr, bison, flex Standards-Version: 3.9.6 -Homepage: http://www.quagga.net/ +Homepage: http://www.frr.net/ XS-Testsuite: autopkgtest -Package: quagga +Package: frr Architecture: any Depends: ${shlibs:Depends}, logrotate (>= 3.2-11), iproute, ${misc:Depends} Pre-Depends: adduser @@ -16,37 +16,33 @@ Conflicts: zebra, zebra-pj Replaces: zebra, zebra-pj Suggests: snmpd Description: BGP/OSPF/RIP routing daemon - GNU Quagga is free software which manages TCP/IP based routing protocols. + Frr is free software which manages TCP/IP based routing protocols. It supports BGP4, BGP4+, OSPFv2, OSPFv3, IS-IS, RIPv1, RIPv2, and RIPng as well as the IPv6 versions of these. . - As the precessor Zebra has been considered orphaned, the Quagga project - has been formed by members of the zebra mailing list and the former - zebra-pj project to continue developing. - . - Quagga uses threading if the kernel supports it, but can also run on + Frr uses threading if the kernel supports it, but can also run on kernels that do not support threading. Each protocol has its own daemon. . It is more than a routed replacement, it can be used as a Route Server and a Route Reflector. -Package: quagga-dbg +Package: frr-dbg Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, quagga (= ${binary:Version}) +Depends: ${shlibs:Depends}, ${misc:Depends}, frr (= ${binary:Version}) Priority: extra Section: debug Description: BGP/OSPF/RIP routing daemon (debug symbols) This package provides debugging symbols for all binary packages built from - quagga source package. It's highly recommended to have this package installed - before reporting any Quagga crashes to either Quagga developers or Debian + frr source package. It's highly recommended to have this package installed + before reporting any Frr crashes to either Frr developers or Debian package maintainers. -Package: quagga-doc +Package: frr-doc Section: net Architecture: all Depends: ${misc:Depends} -Suggests: quagga -Description: documentation files for quagga - This package includes info files for quagga, a free software which manages +Suggests: frr +Description: documentation files for frr + This package includes info files for frr, a free software which manages TCP/IP based routing protocols. It supports BGP4, BGP4+, OSPFv2, OSPFv3, IS-IS, RIPv1, RIPv2, and RIPng as well as the IPv6 versions of these. diff --git a/debian/copyright b/debian/copyright index 22434fb255..ab392027c8 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,7 +1,7 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: Quagga -Upstream-Contact: maintainers@quagga.net, security@quagga.net -Source: http://www.quagga.net/ +Upstream-Name: Frr +Upstream-Contact: maintainers@freerangerouting.net, security@freerangerouting.net +Source: http://www.freerangerouting.net/ Files: * Copyright: 1996-2003 by the original Zebra authors: diff --git a/debian/quagga-doc.docs b/debian/frr-doc.docs similarity index 100% rename from debian/quagga-doc.docs rename to debian/frr-doc.docs diff --git a/debian/frr-doc.info b/debian/frr-doc.info new file mode 100644 index 0000000000..c4f181cdb0 --- /dev/null +++ b/debian/frr-doc.info @@ -0,0 +1 @@ +doc/frr.info* diff --git a/debian/quagga-doc.install b/debian/frr-doc.install similarity index 100% rename from debian/quagga-doc.install rename to debian/frr-doc.install diff --git a/debian/frr-doc.lintian-overrides b/debian/frr-doc.lintian-overrides new file mode 100644 index 0000000000..1fe64ffd53 --- /dev/null +++ b/debian/frr-doc.lintian-overrides @@ -0,0 +1 @@ +frr-doc: wrong-section-according-to-package-name frr-doc => doc diff --git a/debian/frr.conf b/debian/frr.conf new file mode 100644 index 0000000000..dee3cd849a --- /dev/null +++ b/debian/frr.conf @@ -0,0 +1,2 @@ +# Create the /run/frr directory at boot or from systemd-tmpfiles on install +d /run/frr 0755 frr frr diff --git a/debian/quagga.config b/debian/frr.config similarity index 100% rename from debian/quagga.config rename to debian/frr.config diff --git a/debian/frr.dirs b/debian/frr.dirs new file mode 100644 index 0000000000..58290080d0 --- /dev/null +++ b/debian/frr.dirs @@ -0,0 +1,7 @@ +etc/logrotate.d/ +etc/frr/ +usr/share/doc/frr/ +usr/share/doc/frr/examples/ +usr/share/lintian/overrides/ +usr/share/snmp/mibs/ +var/log/frr/ diff --git a/debian/quagga.docs b/debian/frr.docs similarity index 100% rename from debian/quagga.docs rename to debian/frr.docs diff --git a/debian/quagga.install b/debian/frr.install similarity index 60% rename from debian/quagga.install rename to debian/frr.install index 6a70be9925..45b3b973be 100644 --- a/debian/quagga.install +++ b/debian/frr.install @@ -1,12 +1,12 @@ -etc/quagga/ +etc/frr/ usr/bin/vtysh -usr/include/quagga/ +usr/include/frr/ usr/lib/ -tools/quagga-reload.py usr/lib/quagga/ -tools/quagga usr/lib/quagga -usr/share/doc/quagga/ +tools/frr-reload.py usr/lib/frr/ +tools/frr usr/lib/frr +usr/share/doc/frr/ usr/share/man/man1/vtysh.1 -usr/share/man/man1/quagga.1 +usr/share/man/man1/frr.1 usr/share/man/man8 usr/share/man/man8/bgpd.8 usr/share/man/man8/ospf6d.8 @@ -15,8 +15,8 @@ usr/share/man/man8/ripd.8 usr/share/man/man8/ripngd.8 usr/share/man/man8/zebra.8 usr/share/man/man8/isisd.8 -usr/share/man/man8/watchquagga.8 +usr/share/man/man8/watchfrr.8 usr/share/snmp/mibs/ cumulus/etc/* etc/ tools/*.service lib/systemd/system -debian/quagga.conf usr/lib/tmpfiles.d +debian/frr.conf usr/lib/tmpfiles.d diff --git a/debian/frr.lintian-overrides b/debian/frr.lintian-overrides new file mode 100644 index 0000000000..42a51b5e69 --- /dev/null +++ b/debian/frr.lintian-overrides @@ -0,0 +1,4 @@ +frr: non-dev-pkg-with-shlib-symlink usr/lib/libospfapiclient.so.0.0.0 usr/lib/libospfapiclient.so +frr: non-dev-pkg-with-shlib-symlink usr/lib/libospf.so.0.0.0 usr/lib/libospf.so +frr: non-dev-pkg-with-shlib-symlink usr/lib/libzebra.so.0.0.0 usr/lib/libzebra.so +frr: package-name-doesnt-match-sonames libospf0 libospfapiclient0 libzebra0 diff --git a/debian/quagga.logrotate b/debian/frr.logrotate similarity index 59% rename from debian/quagga.logrotate rename to debian/frr.logrotate index 77e015d725..0dd68fb257 100644 --- a/debian/quagga.logrotate +++ b/debian/frr.logrotate @@ -1,15 +1,15 @@ -/var/log/quagga/*.log { +/var/log/frr/*.log { size 500k sharedscripts missingok compress rotate 14 - create 640 quagga quaggavty + create 640 frr frrvty postrotate for i in zebra bgpd ripd ospfd ripngd ospf6d isisd pimd; do - if [ -e /var/run/quagga/$i.pid ] ; then - kill -USR1 `cat /var/run/quagga/$i.pid` + if [ -e /var/run/frr/$i.pid ] ; then + kill -USR1 `cat /var/run/frr/$i.pid` fi done diff --git a/debian/quagga.manpages b/debian/frr.manpages similarity index 84% rename from debian/quagga.manpages rename to debian/frr.manpages index 194b13af66..17a128b7e3 100644 --- a/debian/quagga.manpages +++ b/debian/frr.manpages @@ -6,4 +6,4 @@ doc/ripngd.8 doc/vtysh.1 doc/zebra.8 doc/isisd.8 -doc/watchquagga.8 +doc/watchfrr.8 diff --git a/debian/quagga.pam b/debian/frr.pam similarity index 91% rename from debian/quagga.pam rename to debian/frr.pam index 093e172946..2b106d43bc 100644 --- a/debian/quagga.pam +++ b/debian/frr.pam @@ -1,3 +1,3 @@ -# Any user may call vtysh but only those belonging to the group quaggavty can +# Any user may call vtysh but only those belonging to the group frrvty can # actually connect to the socket and use the program. auth sufficient pam_permit.so diff --git a/debian/frr.postinst b/debian/frr.postinst new file mode 100644 index 0000000000..43d3ffa9e0 --- /dev/null +++ b/debian/frr.postinst @@ -0,0 +1,41 @@ +#!/bin/bash -e + +###################### +PASSWDFILE=/etc/passwd +GROUPFILE=/etc/group + +frruid=`egrep "^frr:" $PASSWDFILE | awk -F ":" '{ print $3 }'` +frrgid=`egrep "^frr:" $GROUPFILE | awk -F ":" '{ print $3 }'` +frrvtygid=`egrep "^frrvty:" $GROUPFILE | awk -F ":" '{ print $3 }'` + +[ -n ${frruid} ] || (echo "No uid for frr in ${PASSWDFILE}" && /bin/false) +[ -n ${frrgid} ] || (echo "No gid for frr in ${GROUPFILE}" && /bin/false) +[ -n ${frrVTYgid} ] || (echo "No gid for frrvty in ${GROUPFILE}" && /bin/false) + +chown -R ${frruid}:${frrgid} /etc/frr +touch /etc/frr/vtysh.conf +chgrp ${frrvtygid} /etc/frr/vtysh* +chmod 440 /etc/sudoers.d/frr_sudoers +chmod 644 /etc/frr/* + +ENVIRONMENTFILE=/etc/environment +if ! grep --quiet VTYSH_PAGER=/bin/cat ${ENVIRONMENTFILE}; then + echo "VTYSH_PAGER=/bin/cat" >> ${ENVIRONMENTFILE} +fi +################################################## + +if [ -n "$DEBIAN_SCRIPT_DEBUG" ]; then set -v -x; DEBIAN_SCRIPT_TRACE=1; fi +${DEBIAN_SCRIPT_TRACE:+ echo "#42#DEBUG# RUNNING $0 $*"} + +# This is most likely due to the answer "no" to the "really stop the server" +# question in the prerm script. +if [ "$1" = "abort-upgrade" ]; then + exit 0 +fi + +. /usr/share/debconf/confmodule + +db_stop + +#DEBHELPER# + diff --git a/debian/quagga.postrm b/debian/frr.postrm similarity index 70% rename from debian/quagga.postrm rename to debian/frr.postrm index 1c69e4899d..26576fd136 100644 --- a/debian/quagga.postrm +++ b/debian/frr.postrm @@ -5,8 +5,8 @@ ${DEBIAN_SCRIPT_TRACE:+ echo "#42#DEBUG# RUNNING $0 $*"} # set -u not because of debhelper if [ "$1" = "purge" ]; then - rm -rf /etc/quagga /var/run/quagga /var/log/quagga - userdel quagga >/dev/null 2>&1 || true + rm -rf /etc/frr /var/run/frr /var/log/frr + userdel frr >/dev/null 2>&1 || true fi #DEBHELPER# diff --git a/debian/quagga.preinst b/debian/frr.preinst similarity index 56% rename from debian/quagga.preinst rename to debian/frr.preinst index 1af0b5ba63..abdaa7277b 100644 --- a/debian/quagga.preinst +++ b/debian/frr.preinst @@ -5,73 +5,73 @@ ${DEBIAN_SCRIPT_TRACE:+ echo "#42#DEBUG# RUNNING $0 $*"} set -e set -u -# creating quaggavty group if it isn't already there -if ! getent group quaggavty >/dev/null; then - addgroup --system quaggavty >/dev/null +# creating frrvty group if it isn't already there +if ! getent group frrvty >/dev/null; then + addgroup --system frrvty >/dev/null fi -# creating quagga group if it isn't already there -if ! getent group quagga >/dev/null; then - addgroup --system quagga >/dev/null +# creating frr group if it isn't already there +if ! getent group frr >/dev/null; then + addgroup --system frr >/dev/null fi -# creating quagga user if he isn't already there -if ! getent passwd quagga >/dev/null; then +# creating frr user if he isn't already there +if ! getent passwd frr >/dev/null; then adduser \ --system \ - --ingroup quagga \ - --home /var/run/quagga/ \ - --gecos "Quagga routing suite" \ + --ingroup frr \ + --home /var/run/frr/ \ + --gecos "Frr routing suite" \ --shell /bin/false \ - quagga >/dev/null + frr >/dev/null fi # We may be installing over an older version of -# quagga and as such we need to intelligently -# check to see if the quagga user is in the quaggavty +# frr and as such we need to intelligently +# check to see if the frr user is in the frrvty # group. -if ! /usr/bin/id quagga | grep &>/dev/null 'quaggavty'; then - usermod -a -G quaggavty quagga >/dev/null +if ! /usr/bin/id frr | grep &>/dev/null 'frrvty'; then + usermod -a -G frrvty frr >/dev/null fi # Do not change permissions when upgrading as it would violate policy. if [ "$1" = "install" ]; then - # Logfiles are group readable in case users were put into the quagga group. - d=/var/log/quagga/ + # Logfiles are group readable in case users were put into the frr group. + d=/var/log/frr/ mkdir -p $d - chown -R quagga:quagga $d + chown -R frr:frr $d chmod u=rwx,go=rx $d find $d -type f -print0 | xargs -0 --no-run-if-empty chmod u=rw,g=r,o= # Strict permissions for the sockets. - d=/var/run/quagga/ + d=/var/run/frr/ mkdir -p $d - chown -R quagga:quagga $d + chown -R frr:frr $d chmod u=rwx,go=rx $d find $d -type f -print0 | xargs -0 --no-run-if-empty chmod u=rw,go= # Config files. Vtysh does not have access to the individual daemons config file - d=/etc/quagga/ + d=/etc/frr/ mkdir -p $d - chown quagga:quaggavty $d + chown frr:frrvty $d chmod ug=rwx,o=rx $d - find $d -type f -print0 | xargs -0 --no-run-if-empty chown quagga:quagga + find $d -type f -print0 | xargs -0 --no-run-if-empty chown frr:frr find $d -type f -print0 | xargs -0 --no-run-if-empty chmod u=rw,g=r,o= # Exceptions for vtysh. f=$d/vtysh.conf if [ -f $f ]; then - chown quagga:quaggavty $f + chown frr:frrvty $f chmod u=rw,g=r,o= $f fi # Exceptions for vtysh. - f=$d/Quagga.conf + f=$d/Frr.conf if [ -f $d/Zebra.conf ]; then mv $d/Zebra.conf $f fi if [ -f $f ]; then - chown quagga:quaggavty $f + chown frr:frrvty $f chmod u=rw,g=r,o= $f fi fi diff --git a/debian/quagga.prerm b/debian/frr.prerm similarity index 89% rename from debian/quagga.prerm rename to debian/frr.prerm index 9775412253..e0df24e10f 100644 --- a/debian/quagga.prerm +++ b/debian/frr.prerm @@ -15,7 +15,7 @@ case $1 in ;; failed-upgrade) - # If quagga/really_stop was negated then this script exits with return + # If frr/really_stop was negated then this script exits with return # code 1 and is called again with "failed-upgrade". Well, exit again. exit 1 ;; diff --git a/debian/quagga-doc.info b/debian/quagga-doc.info deleted file mode 100644 index c9ff0f55fc..0000000000 --- a/debian/quagga-doc.info +++ /dev/null @@ -1 +0,0 @@ -doc/quagga.info* diff --git a/debian/quagga-doc.lintian-overrides b/debian/quagga-doc.lintian-overrides deleted file mode 100644 index afa3c64ad3..0000000000 --- a/debian/quagga-doc.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -quagga-doc: wrong-section-according-to-package-name quagga-doc => doc diff --git a/debian/quagga.conf b/debian/quagga.conf deleted file mode 100644 index 04d8eea57f..0000000000 --- a/debian/quagga.conf +++ /dev/null @@ -1,2 +0,0 @@ -# Create the /run/quagga directory at boot or from systemd-tmpfiles on install -d /run/quagga 0755 quagga quagga diff --git a/debian/quagga.dirs b/debian/quagga.dirs deleted file mode 100644 index 581074f8fc..0000000000 --- a/debian/quagga.dirs +++ /dev/null @@ -1,7 +0,0 @@ -etc/logrotate.d/ -etc/quagga/ -usr/share/doc/quagga/ -usr/share/doc/quagga/examples/ -usr/share/lintian/overrides/ -usr/share/snmp/mibs/ -var/log/quagga/ diff --git a/debian/quagga.lintian-overrides b/debian/quagga.lintian-overrides deleted file mode 100644 index aee52a1eba..0000000000 --- a/debian/quagga.lintian-overrides +++ /dev/null @@ -1,4 +0,0 @@ -quagga: non-dev-pkg-with-shlib-symlink usr/lib/libospfapiclient.so.0.0.0 usr/lib/libospfapiclient.so -quagga: non-dev-pkg-with-shlib-symlink usr/lib/libospf.so.0.0.0 usr/lib/libospf.so -quagga: non-dev-pkg-with-shlib-symlink usr/lib/libzebra.so.0.0.0 usr/lib/libzebra.so -quagga: package-name-doesnt-match-sonames libospf0 libospfapiclient0 libzebra0 diff --git a/debian/quagga.postinst b/debian/quagga.postinst deleted file mode 100644 index 4611313c1d..0000000000 --- a/debian/quagga.postinst +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -e - -###################### -PASSWDFILE=/etc/passwd -GROUPFILE=/etc/group - -quaggauid=`egrep "^quagga:" $PASSWDFILE | awk -F ":" '{ print $3 }'` -quaggagid=`egrep "^quagga:" $GROUPFILE | awk -F ":" '{ print $3 }'` -quaggavtygid=`egrep "^quaggavty:" $GROUPFILE | awk -F ":" '{ print $3 }'` - -[ -n ${quaggauid} ] || (echo "No uid for quagga in ${PASSWDFILE}" && /bin/false) -[ -n ${quaggagid} ] || (echo "No gid for quagga in ${GROUPFILE}" && /bin/false) -[ -n ${quaggaVTYgid} ] || (echo "No gid for quaggavty in ${GROUPFILE}" && /bin/false) - -chown -R ${quaggauid}:${quaggagid} /etc/quagga -touch /etc/quagga/vtysh.conf -chgrp ${quaggavtygid} /etc/quagga/vtysh* -chmod 440 /etc/sudoers.d/quagga_sudoers -chmod 644 /etc/quagga/* - -ENVIRONMENTFILE=/etc/environment -if ! grep --quiet VTYSH_PAGER=/bin/cat ${ENVIRONMENTFILE}; then - echo "VTYSH_PAGER=/bin/cat" >> ${ENVIRONMENTFILE} -fi -################################################## - -if [ -n "$DEBIAN_SCRIPT_DEBUG" ]; then set -v -x; DEBIAN_SCRIPT_TRACE=1; fi -${DEBIAN_SCRIPT_TRACE:+ echo "#42#DEBUG# RUNNING $0 $*"} - -# This is most likely due to the answer "no" to the "really stop the server" -# question in the prerm script. -if [ "$1" = "abort-upgrade" ]; then - exit 0 -fi - -. /usr/share/debconf/confmodule - -db_stop - -#DEBHELPER# - diff --git a/debian/rules b/debian/rules index b100813182..42c0d5f63a 100755 --- a/debian/rules +++ b/debian/rules @@ -20,10 +20,10 @@ MAKEFLAGS += -j$(DEBIAN_JOBS) endif %: - dh $@ --with=systemd,autoreconf --parallel --dbg-package=quagga-dbg --list-missing + dh $@ --with=systemd,autoreconf --parallel --dbg-package=frr-dbg --list-missing override_dh_auto_configure: - # Quagga needs /proc to check some BSD vs Linux specific stuff. + # Frr needs /proc to check some BSD vs Linux specific stuff. # Else it fails with an obscure error message pointing out that # IPCTL_FORWARDING is an undefined symbol which is not very helpful. @if ! [ -d /proc/1 ]; then \ @@ -33,18 +33,18 @@ override_dh_auto_configure: if ! [ -e config.status ]; then \ dh_auto_configure -- \ - --enable-exampledir=/usr/share/doc/quagga/examples/ \ - --localstatedir=/var/run/quagga \ - --sbindir=/usr/lib/quagga \ - --sysconfdir=/etc/quagga \ + --enable-exampledir=/usr/share/doc/frr/examples/ \ + --localstatedir=/var/run/frr \ + --sbindir=/usr/lib/frr \ + --sysconfdir=/etc/frr \ $(USE_SNMP) \ --enable-ospfapi=yes \ --enable-vtysh=yes \ --enable-isisd=yes \ --enable-multipath=256 \ - --enable-user=quagga \ - --enable-group=quagga \ - --enable-vty-group=quaggavty \ + --enable-user=frr \ + --enable-group=frr \ + --enable-vty-group=frrvty \ --enable-configfile-mask=0640 \ --enable-logfile-mask=0640 \ --enable-werror \ @@ -53,7 +53,7 @@ override_dh_auto_configure: --enable-systemd=yes \ --enable-poll=yes \ --enable-cumulus=yes \ - --enable-pimd=no \ + --enable-pimd=yes \ --enable-dependency-tracking \ --enable-bgp-vnc=no; \ fi @@ -66,11 +66,11 @@ override_dh_auto_build: # doc/ is a bit crazy ifeq ($(GENERATE_PDF), 1) - dh_auto_build -- -C doc quagga.pdf || true # pdfetex fails with exit code 1 but still produces a good looking .pdf + dh_auto_build -- -C doc frr.pdf || true # pdfetex fails with exit code 1 but still produces a good looking .pdf endif - rm -vf doc/quagga.info - dh_auto_build -- -C doc quagga.info - rm -vf doc/quagga.info.html* + rm -vf doc/frr.info + dh_auto_build -- -C doc frr.info + rm -vf doc/frr.info.html* override_dh_auto_test: @@ -81,18 +81,18 @@ override_dh_auto_install: rm -f debian/tmp/usr/share/info/dir* # install config files - mkdir -p debian/tmp/etc/quagga/ - perl -pi -e 's#^!log file #!log file /var/log/quagga/#' debian/tmp/usr/share/doc/quagga/examples/*sample* + mkdir -p debian/tmp/etc/frr/ + perl -pi -e 's#^!log file #!log file /var/log/frr/#' debian/tmp/usr/share/doc/frr/examples/*sample* - # installing the Quagga specific SNMP MIB + # installing the Frr specific SNMP MIB install -D -m 644 ./zebra/GNOME-PRODUCT-ZEBRA-MIB debian/tmp/usr/share/snmp/mibs/GNOME-PRODUCT-ZEBRA-MIB # cleaning .la files sed -i "/dependency_libs/ s/'.*'/''/" debian/tmp/usr/lib/*.la override_dh_systemd_start: - dh_systemd_start quagga.service + dh_systemd_start frr.service override_dh_systemd_enable: - dh_systemd_enable quagga.service + dh_systemd_enable frr.service diff --git a/debian/tests/control b/debian/tests/control index 1993e371f0..53fd537e2e 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -1,3 +1,3 @@ Tests: daemons -Depends: quagga +Depends: frr Restrictions: needs-root diff --git a/debian/tests/daemons b/debian/tests/daemons index 52c156a1d6..ac35ecd950 100644 --- a/debian/tests/daemons +++ b/debian/tests/daemons @@ -1,21 +1,21 @@ #!/bin/bash #--------------- -# Testing quagga +# Testing frr #--------------- set -e # modify config file to enable all daemons and copy config files -CONFIG_FILE=/etc/quagga/daemons +CONFIG_FILE=/etc/frr/daemons DAEMONS=("zebra" "bgpd" "ospfd" "ospf6d" "ripd" "ripngd" "isisd" "pimd") for daemon in "${DAEMONS[@]}" do sed -i -e "s/${daemon}=no/${daemon}=yes/g" $CONFIG_FILE - cp /usr/share/doc/quagga/examples/${daemon}.conf.sample /etc/quagga/${daemon}.conf + cp /usr/share/doc/frr/examples/${daemon}.conf.sample /etc/frr/${daemon}.conf done -# reload quagga -/etc/init.d/quagga restart > /dev/null 2>&1 +# reload frr +/etc/init.d/frr restart > /dev/null 2>&1 # check daemons for daemon in "${DAEMONS[@]}" diff --git a/debian/watch b/debian/watch index bc6d91dab5..46ff1c7dab 100644 --- a/debian/watch +++ b/debian/watch @@ -4,5 +4,5 @@ # Site Directory Pattern Version Script version=3 opts=uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha|b|a)[\-\.]?\d*)$/$1~$2/ \ - http://download.savannah.gnu.org/releases/quagga/quagga-(\d.*)\.(?:tgz|tar\.(?:gz|bz2|xz)) + http://download.savannah.gnu.org/releases/frr/quagga-(\d.*)\.(?:tgz|tar\.(?:gz|bz2|xz)) # Bart Martens Fri, 25 Jan 2013 06:38:53 +0000 diff --git a/debian/watchfrr.rc b/debian/watchfrr.rc new file mode 100644 index 0000000000..4110b86399 --- /dev/null +++ b/debian/watchfrr.rc @@ -0,0 +1,4 @@ +check process watchfrr with pidfile /var/run/frr/watchfrr.pid + start program = "/etc/init.d/frr start watchfrr" with timeout 120 seconds + stop program = "/etc/init.d/frr stop watchfrr" + if 3 restarts within 10 cycles then timeout diff --git a/debian/watchquagga.rc b/debian/watchquagga.rc deleted file mode 100644 index e3b6340dce..0000000000 --- a/debian/watchquagga.rc +++ /dev/null @@ -1,4 +0,0 @@ -check process watchquagga with pidfile /var/run/quagga/watchquagga.pid - start program = "/etc/init.d/quagga start watchquagga" with timeout 120 seconds - stop program = "/etc/init.d/quagga stop watchquagga" - if 3 restarts within 10 cycles then timeout diff --git a/doc/.gitignore b/doc/.gitignore index 66c43c73e6..57c66cb4ac 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -2,17 +2,17 @@ Makefile Makefile.in mdate-sh draft-zebra-00.txt -quagga.info-* +frr.info-* zebra.html defines.texi version.texi texinfo.tex -quagga.html -quagga.info +frr.html +frr.info *.pdf *.eps -quagga.ps -quagga.dvi +frr.ps +frr.dvi stamp-vti .nfs* *.aux @@ -28,6 +28,8 @@ stamp-vti *.toc *.tp *.vr +*.8 +*.1 .arch-inventory .arch-ids *~ diff --git a/doc/Makefile.am b/doc/Makefile.am index d5db6cf497..04389c63ac 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -7,7 +7,7 @@ # # Here we use 'convert' from the well known 'ImageMagick' package # to do conversion from png to eps/pdf for figures. -# PDF form is required for quagga.pdf, using PDFTex at least. +# PDF form is required for frr.pdf, using PDFTex at least. # # TeX implementation, which we depend on already anyway. # @@ -20,7 +20,7 @@ PNGTOPDF = $(PNGTOEPS) EPSTOPDF = epstopdf VNCFIGURES_PNG = -VNCFIGURES_DIA = -vnc-mesh -vnc-quagga-route-reflector \ +VNCFIGURES_DIA = -vnc-mesh -vnc-frr-route-reflector \ -vnc-commercial-route-reflector -vnc-redundant-route-reflectors \ -vnc-gw -vnc-gw-rr @@ -40,7 +40,7 @@ figures_eps = $(figures_names_parts:%=fig%.eps) $(VNCFIGURES_PNG:%.png=%.eps) figures_txt = $(figures_names_parts:%=fig%.txt) # rather twisted logic because we have to build PDFs of the EPS figures for -# PDFTex and yet build one PDF, quagga.pdf, from texi source. Which means we +# PDFTex and yet build one PDF, frr.pdf, from texi source. Which means we # cant rely on a single automatic rule for *.pdf, eg the one automatically # provided by automake. If you are an automake wizard, please feel free to # compact it somehow. @@ -48,16 +48,16 @@ figures_txt = $(figures_names_parts:%=fig%.txt) # Built from defines.texi.in BUILT_SOURCES = defines.texi -info_TEXINFOS = quagga.texi +info_TEXINFOS = frr.texi -# Have to manually specify the quagga.pdf rule in order to allow +# Have to manually specify the frr.pdf rule in order to allow # us to have a generic automatic .pdf rule to build the figure sources # because it cant just work from the png's directly it seems - contrary # to the documentation... -quagga.pdf: $(info_TEXINFOS) $(figures_pdf) $(quagga_TEXINFOS) +frr.pdf: $(info_TEXINFOS) $(figures_pdf) $(frr_TEXINFOS) $(TEXI2PDF) -o "$@" $< || true -quagga_TEXINFOS = appendix.texi basic.texi bgpd.texi isisd.texi filter.texi \ +frr_TEXINFOS = appendix.texi basic.texi bgpd.texi isisd.texi filter.texi \ vnc.texi \ install.texi ipv6.texi kernel.texi main.texi ospf6d.texi ospfd.texi \ overview.texi protocol.texi ripd.texi ripngd.texi routemap.texi \ @@ -73,7 +73,7 @@ quagga_TEXINFOS = appendix.texi basic.texi bgpd.texi isisd.texi filter.texi \ .dia.png: $(DIATOPNG) "$@" $< -man_MANS = quagga.1 +man_MANS = frr.1 if PIMD man_MANS += pimd.8 @@ -115,8 +115,8 @@ if VTYSH man_MANS += vtysh.1 endif -if WATCHQUAGGA -man_MANS += watchquagga.8 +if WATCHFRR +man_MANS += watchfrr.8 endif if ZEBRA @@ -124,8 +124,21 @@ man_MANS += zebra.8 endif EXTRA_DIST = BGP-TypeCode draft-zebra-00.ms draft-zebra-00.txt \ - bgpd.8 isisd.8 ospf6d.8 ospfclient.8 ospfd.8 ldpd.8 ripd.8 \ - ripngd.8 pimd.8 vtysh.1 watchquagga.8 zebra.8 quagga.1 \ + \ + bgpd.8.in \ + isisd.8.in \ + ospf6d.8.in \ + ospfclient.8.in \ + ospfd.8.in \ + ldpd.8.in \ + ripd.8.in \ + ripngd.8.in \ + pimd.8.in \ + vtysh.1.in \ + watchfrr.8.in \ + zebra.8.in \ + frr.1.in \ + \ mpls/ChangeLog.opaque.txt mpls/cli_summary.txt \ mpls/opaque_lsa.txt mpls/ospfd.conf \ $(figures_sources) $(figures_png) $(figures_txt) diff --git a/doc/basic.texi b/doc/basic.texi index 4485665afa..cea33eaa81 100644 --- a/doc/basic.texi +++ b/doc/basic.texi @@ -110,7 +110,7 @@ with severity @code{errors}. If you want to log into a file, please specify @code{filename} as in this example: @example -log file /var/log/quagga/bgpd.log informational +log file /var/log/frr/bgpd.log informational @end example If the optional second argument specifying the logging level is not present, the default logging level (typically debugging, @@ -119,7 +119,7 @@ The @code{no} form of the command disables logging to a file. Note: if you do not configure any file logging, and a daemon crashes due to a signal or an assertion failure, it will attempt to save the crash -information in a file named /var/tmp/quagga..crashlog. +information in a file named /var/tmp/frr..crashlog. For security reasons, this will not happen if the file exists already, so it is important to delete the file after reporting the crash information. @end deffn diff --git a/doc/bgpd.8 b/doc/bgpd.8.in similarity index 79% rename from doc/bgpd.8 rename to doc/bgpd.8.in index 7e90eaec5b..7047744635 100644 --- a/doc/bgpd.8 +++ b/doc/bgpd.8.in @@ -1,7 +1,6 @@ -.TH BGPD 8 "25 November 2004" "Quagga BGPD daemon" "Version 0.97.3" +.TH BGPD 8 "25 November 2004" "@PACKAGE_FULLNAME@ BGPD daemon" "Version @PACKAGE_VERSION@" .SH NAME -bgpd \- a BGPv4, BGPv4\+, BGPv4\- routing engine for use with Quagga routing -software +bgpd \- a BGPv4, BGPv4\+, BGPv4\- routing engine for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B bgpd @@ -32,7 +31,7 @@ software .SH DESCRIPTION .B bgpd is a routing component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -44,10 +43,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/bgpd.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/bgpd.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -55,7 +54,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When bgpd starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart bgpd. The likely default is \fB\fI/var/run/bgpd.pid\fR. +restart bgpd. The default is \fB\fI@CFG_STATE@/bgpd.pid\fR. .TP \fB\-p\fR, \fB\-\-bgp_port \fR\fIbgp-port-number\fR Set the port that bgpd will listen to for bgp data. @@ -69,7 +68,7 @@ Specify the address that the bgpd VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-r\fR, \fB\-\-retain\fR When the program terminates, retain routes added by \fBbgpd\fR. @@ -81,12 +80,12 @@ Skip setting the process effective user and group. Print the version and exit. .SH FILES .TP -.BI /usr/lib/quagga/bgpd +.BI @CFG_SBIN@/bgpd The default location of the .B bgpd binary. .TP -.BI /etc/quagga/bgpd.conf +.BI @CFG_SYSCONF@/bgpd.conf The default location of the .B bgpd config file. @@ -98,7 +97,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBbgpd\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The bgpd process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBbgpd\fR supports many @@ -114,11 +113,11 @@ debugging options, see the Info file, or the source for details. .SH BUGS .B bgpd eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://www.zebra.org and -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/bgpd.texi b/doc/bgpd.texi index 54bed102f3..08cd4149a4 100644 --- a/doc/bgpd.texi +++ b/doc/bgpd.texi @@ -1,9 +1,9 @@ @c -*-texinfo-*- -@c This is part of the Quagga Manual. +@c This is part of the Frr Manual. @c @value{COPYRIGHT_STR} @c Portions: @c Copyright @copyright{} 2015 Hewlett Packard Enterprise Development LP -@c See file quagga.texi for copying conditions. +@c See file frr.texi for copying conditions. @node BGP @chapter BGP @@ -114,7 +114,7 @@ This command set distance value to @node BGP decision process @subsection BGP decision process -The decision process Quagga BGP uses to select routes is as follows: +The decision process Frr BGP uses to select routes is as follows: @table @asis @item 1. Weight check @@ -240,7 +240,7 @@ The BGP MED (Multi_Exit_Discriminator) attribute has properties which can cause subtle convergence problems in BGP. These properties and problems have proven to be hard to understand, at least historically, and may still not be widely understood. The following attempts to collect together and -present what is known about MED, to help operators and Quagga users in +present what is known about MED, to help operators and Frr users in designing and configuring their networks. The BGP @acronym{MED, Multi_Exit_Discriminator} attribute is intended to @@ -263,7 +263,7 @@ MED values to those of AS X. The MED values have been set by different administrators, with different frames of reference. The default behaviour of BGP therefore is to not compare MED values across -routes received from different neighbouring ASes. In Quagga this is done by +routes received from different neighbouring ASes. In Frr this is done by comparing the neighbouring, left-most AS in the received AS_PATHs of the routes and only comparing MED if those are the same. @@ -341,7 +341,7 @@ in response to the most common sequence of received updates. A deterministic order of evaluation tends to imply an additional overhead of sorting over any set of n routes to a destination. The implementation of -deterministic MED in Quagga scales significantly worse than most sorting +deterministic MED in Frr scales significantly worse than most sorting algorithms at present, with the number of paths to a given destination. That number is often low enough to not cause any issues, but where there are many paths, the deterministic comparison may quickly become increasingly @@ -408,7 +408,7 @@ preferences between the routes: This particular type of oscillation in full-mesh iBGP topologies can be avoided by speakers preferring already selected, external routes rather than choosing to update to new a route based on a post-MED metric (e.g. -router-ID), at the cost of a non-deterministic selection process. Quagga +router-ID), at the cost of a non-deterministic selection process. Frr implements this, as do many other implementations, so long as it is not overridden by setting @ref{bgp bestpath compare-routerid}, and see also @ref{BGP decision process}, . @@ -480,7 +480,7 @@ with MED may be determined largely by the order that routes were received in. Setting this option will have a performance cost that may be noticeable when -there are many routes for each destination. Currently in Quagga it is +there are many routes for each destination. Currently in Frr it is implemented in a way that scales poorly as the number of routes per destination increases. @@ -1478,11 +1478,11 @@ unicast neighbor, @command{bgpd} does not send these Capability Negotiation packets (at least not unless other optional BGP features require capability negotation). -By default, Quagga will bring up peering with minimal common capability +By default, Frr will bring up peering with minimal common capability for the both sides. For example, local router has unicast and multicast capabilitie and remote router has unicast capability. In this case, the local router will establish the connection with unicast -only capability. When there are no common capabilities, Quagga sends +only capability. When there are no common capabilities, Frr sends Unsupported Capability error and then resets the connection. If you want to completely match capabilities with remote peer. Please @@ -1588,10 +1588,10 @@ When bgp config-type cisco is specified, ``network'' and ``aggregate-address'' argument is displayed as ``A.B.C.D M.M.M.M'' -Quagga: network 10.0.0.0/8 +Frr: network 10.0.0.0/8 Cisco: network 10.0.0.0 -Quagga: aggregate-address 192.168.0.0/24 +Frr: aggregate-address 192.168.0.0/24 Cisco: aggregate-address 192.168.0.0 255.255.255.0 Community attribute handling is also different. If there is no @@ -1615,7 +1615,7 @@ router bgp 1 @end example @deffn {Command} {bgp config-type zebra} {} -Quagga style BGP configuration. This is default. +Frr style BGP configuration. This is default. @end deffn @node BGP instance and view diff --git a/doc/defines.texi.in b/doc/defines.texi.in index 5436f20c36..43d7442939 100644 --- a/doc/defines.texi.in +++ b/doc/defines.texi.in @@ -10,7 +10,9 @@ @set COPYRIGHT_STR Copyright @copyright{} @value{COPYRIGHT_YEAR} @value{AUTHORS} @c These may vary with installation environment. -@set INSTALL_PREFIX_ETC /etc/quagga -@set INSTALL_PREFIX_SBIN /usr/sbin -@set INSTALL_PREFIX_STATE /var/run/quagga +@set INSTALL_PREFIX_ETC @CFG_SYSCONF@ +@set INSTALL_PREFIX_SBIN @CFG_SBIN@ +@set INSTALL_PREFIX_STATE @CFG_STATE@ +@set INSTALL_USER @enable_user@ +@set INSTALL_GROUP @enable_group@ @set INSTALL_VTY_GROUP @enable_vty_group@ diff --git a/doc/fig-vnc-quagga-route-reflector.dia b/doc/fig-vnc-frr-route-reflector.dia similarity index 100% rename from doc/fig-vnc-quagga-route-reflector.dia rename to doc/fig-vnc-frr-route-reflector.dia diff --git a/doc/fig-vnc-quagga-route-reflector.png b/doc/fig-vnc-frr-route-reflector.png similarity index 100% rename from doc/fig-vnc-quagga-route-reflector.png rename to doc/fig-vnc-frr-route-reflector.png diff --git a/doc/fig-vnc-quagga-route-reflector.txt b/doc/fig-vnc-frr-route-reflector.txt similarity index 100% rename from doc/fig-vnc-quagga-route-reflector.txt rename to doc/fig-vnc-frr-route-reflector.txt diff --git a/doc/filter.texi b/doc/filter.texi index 5a9a15ee99..a494043659 100644 --- a/doc/filter.texi +++ b/doc/filter.texi @@ -2,7 +2,7 @@ @comment node-name, next, previous, up @chapter Filtering -Quagga provides many very flexible filtering features. Filtering is used +Frr provides many very flexible filtering features. Filtering is used for both input and output of the routing information. Once filtering is defined, it can be applied in any direction. diff --git a/doc/quagga.1 b/doc/frr.1.in similarity index 67% rename from doc/quagga.1 rename to doc/frr.1.in index 35e8b30bf5..528358a8d0 100644 --- a/doc/quagga.1 +++ b/doc/frr.1.in @@ -1,45 +1,45 @@ -.TH Quagga 1 "27 July 2006" "Quagga Systemd Script" "Version 0.99.23.1" +.TH Frr 1 "27 July 2006" "@PACKAGE_FULLNAME@ Systemd Script" "Version @PACKAGE_VERSION@" .SH NAME -quagga \- a systemd interaction script +frr \- a systemd interaction script .SH SYNOPSIS -.B quagga +.B frr [ .B start ] .br -.B quagga +.B frr [ .B stop ] .br -.B quagga +.B frr [ .B reload ] .br -.B quagga +.B frr [ .B restart ] .br -.B quagga +.B frr [ .B status ] .br .SH DESCRIPTION -.B Quagga +.B @PACKAGE_NAME@ is a systemd interaction script for the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the -.B quagga +.B frr command: .IP start -Start enabled Quagga daemons +Start enabled Frr daemons .IP stop -Stop enabled Quagga daemons +Stop enabled Frr daemons .IP reload Reload modified configuration files .IP restart @@ -55,11 +55,11 @@ Status of all the daemons .BR isisd (8), .BR zebra (8) .SH BUGS -.B quagga +.B frr eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/quagga.texi b/doc/frr.texi similarity index 78% rename from doc/quagga.texi rename to doc/frr.texi index 13b885b69c..360acebe16 100644 --- a/doc/quagga.texi +++ b/doc/frr.texi @@ -4,10 +4,10 @@ @include defines.texi @c %**start of header -@setfilename quagga.info +@setfilename frr.info @c Set variables - sourced from defines.texi @include defines.texi -@settitle @uref{http://www.quagga.net,,@value{PACKAGE_NAME}} +@settitle @uref{http://www.freerangerouting.net,,@value{PACKAGE_NAME}} @c %**end of header @c automake will automatically generate version.texi @@ -38,26 +38,26 @@ approved by Kunihiro Ishiguro. @c Info entry @dircategory Routing Software: @direntry -* @value{PACKAGE_NAME}: (quagga). The Quagga Software Routing Suite +* @value{PACKAGE_NAME}: (frr). The Frr Suite @end direntry @c @smallbook @ifinfo -This file documents the Quagga Software Routing Suite which manages common +This file documents the Frr Software Routing Suite which manages common TCP/IP routing protocols. This is Edition @value{EDITION}, last updated @value{UPDATED} of -@cite{The Quagga Manual}, for @uref{http://www.quagga.net/,,@value{PACKAGE_NAME}} +@cite{The Frr Manual}, for @uref{http://www.freerangerouting.net/,,@value{PACKAGE_NAME}} Version @value{VERSION}. @insertcopying @end ifinfo @titlepage -@title @uref{http://www.quagga.net,,Quagga} +@title @uref{http://www.freerangerouting.net,,Frr} @subtitle A routing software package for TCP/IP networks -@subtitle @uref{http://www.quagga.net,,@value{PACKAGE_NAME}} @value{VERSION} +@subtitle @uref{http://www.freerangerouting.net,,@value{PACKAGE_NAME}} @value{VERSION} @subtitle @value{UPDATED-MONTH} @author @value{AUTHORS} @@ -70,12 +70,12 @@ Version @value{VERSION}. @ifnottex @node Top -@top Quagga -- With Virtual Network Control +@top Frr -- With Virtual Network Control -@uref{http://www.quagga.net,,Quagga} is an advanced routing software package +@uref{http://www.freerangerouting.net,,Frr} is an advanced routing software package that provides a suite of TCP/IP based routing protocols. This is the Manual -for @value{PACKAGE_STRING}. @uref{http://www.quagga.net,,Quagga} is a fork of -@uref{http://www.zebra.org,,GNU Zebra}. +for @value{PACKAGE_STRING}. @uref{http://www.freerangerouting.net,,Frr} is a fork of +@uref{http://www.quagga.net,,Quagga}. @insertcopying @end ifnottex @@ -91,7 +91,7 @@ for @value{PACKAGE_STRING}. @uref{http://www.quagga.net,,Quagga} is a fork of * OSPFv3:: * ISIS:: * BGP:: -* Configuring Quagga as a Route Server:: +* Configuring Frr as a Route Server:: * VNC and VNC-GW:: * VTY shell:: * Filtering:: diff --git a/doc/install.texi b/doc/install.texi index 3ace7d6a0c..8c501ed45d 100644 --- a/doc/install.texi +++ b/doc/install.texi @@ -1,11 +1,11 @@ @node Installation @chapter Installation -@cindex How to install Quagga +@cindex How to install Frr @cindex Installation -@cindex Installing Quagga +@cindex Installing Frr @cindex Building the system -@cindex Making Quagga +@cindex Making Frr There are three steps for installing the software: configuration, compilation, and installation. @@ -16,7 +16,7 @@ compilation, and installation. * Install the Software:: @end menu -The easiest way to get Quagga running is to issue the following +The easiest way to get Frr running is to issue the following commands: @example @@ -43,7 +43,7 @@ commands: @cindex Distribution configuration @cindex Options to @code{./configure} -Quagga has an excellent configure script which automatically detects most +Frr has an excellent configure script which automatically detects most host configurations. There are several additional configure options to customize the build to include or exclude specific features and dependencies. @@ -122,13 +122,13 @@ This command will configure zebra and the routing daemons. @node Least-Privilege support @subsection Least-Privilege support -@cindex Quagga Least-Privileges -@cindex Quagga Privileges +@cindex Frr Least-Privileges +@cindex Frr Privileges Additionally, you may configure zebra to drop its elevated privileges shortly after startup and switch to another user. The configure script will automatically try to configure this support. There are three configure -options to control the behaviour of Quagga daemons. +options to control the behaviour of Frr daemons. @table @option @item --enable-user=@var{user} @@ -145,29 +145,29 @@ delegate this group to individual users, or to run vtysh setgid to this group. @end table -The default user and group which will be configured is 'quagga' if no user +The default user and group which will be configured is 'frr' if no user or group is specified. Note that this user or group requires write access to the local state directory (see --localstatedir) and requires at least read access, and write access if you wish to allow daemons to write out their configuration, to the configuration directory (see --sysconfdir). On systems which have the 'libcap' capabilities manipulation library -(currently only linux), the quagga system will retain only minimal +(currently only linux), the frr system will retain only minimal capabilities required, further it will only raise these capabilities for -brief periods. On systems without libcap, quagga will run as the user +brief periods. On systems without libcap, frr will run as the user specified and only raise its uid back to uid 0 for brief periods. @node Linux notes @subsection Linux Notes -@cindex Configuring Quagga +@cindex Configuring Frr @cindex Building on Linux boxes @cindex Linux configurations There are several options available only to @sc{gnu}/Linux systems: @footnote{@sc{gnu}/Linux has very flexible kernel configuration features}. If you use @sc{gnu}/Linux, make sure that the current kernel configuration is -what you want. Quagga will run with any kernel configuration but some +what you want. Frr will run with any kernel configuration but some recommendations do exist. @table @var @@ -190,7 +190,7 @@ This option should be specified when you use @command{ripd} (@pxref{RIP}) or @end table IPv6 support has been added in @sc{gnu}/Linux kernel version 2.2. If you -try to use the Quagga IPv6 feature on a @sc{gnu}/Linux kernel, please +try to use the Frr IPv6 feature on a @sc{gnu}/Linux kernel, please make sure the following libraries have been installed. Please note that these libraries will not be needed when you uses @sc{gnu} C library 2.1 or upper. @@ -244,7 +244,7 @@ programs and supporting files to a standard location. After the installation process has completed, these files have been copied from your work directory to @file{/usr/local/bin}, and @file{/usr/local/etc}. -To install the Quagga suite, issue the following command at your shell +To install the Frr suite, issue the following command at your shell prompt: @command{make install}. @example @@ -253,7 +253,7 @@ prompt: @command{make install}. % @end example -Quagga daemons have their own terminal interface or VTY. After +Frr daemons have their own terminal interface or VTY. After installation, you have to setup each beast's port number to connect to them. Please add the following entries to @file{/etc/services}. diff --git a/doc/ipv6.texi b/doc/ipv6.texi index e08759ab03..859f6a960e 100644 --- a/doc/ipv6.texi +++ b/doc/ipv6.texi @@ -1,14 +1,14 @@ @node IPv6 Support @chapter IPv6 Support -Quagga fully supports IPv6 routing. As described so far, Quagga supports +Frr fully supports IPv6 routing. As described so far, Frr supports RIPng, OSPFv3, and BGP-4+. You can give IPv6 addresses to an interface -and configure static IPv6 routing information. Quagga IPv6 also provides +and configure static IPv6 routing information. Frr IPv6 also provides automatic address configuration via a feature called @code{address auto configuration}. To do it, the router must send router advertisement messages to the all nodes that exist on the network. -Previous versions of Quagga could be built without IPv6 support. This is +Previous versions of Frr could be built without IPv6 support. This is no longer possible. @menu diff --git a/doc/isisd.8 b/doc/isisd.8.in similarity index 79% rename from doc/isisd.8 rename to doc/isisd.8.in index 83ac99d57a..9ffcbc618d 100644 --- a/doc/isisd.8 +++ b/doc/isisd.8.in @@ -1,6 +1,6 @@ -.TH IS-IS 8 "25 November 2004" "Quagga IS-IS daemon" "Version 0.97.3" +.TH IS-IS 8 "25 November 2004" "@PACKAGE_FULLNAME@ IS-IS daemon" "Version @PACKAGE_VERSION@" .SH NAME -isisd \- an IS-IS routing engine for use with Quagga routing software. +isisd \- an IS-IS routing engine for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B isisd [ @@ -27,7 +27,7 @@ isisd \- an IS-IS routing engine for use with Quagga routing software. .SH DESCRIPTION .B isisd is a routing component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -39,10 +39,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/isisd.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/isisd.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -50,7 +50,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When isisd starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart isisd. The likely default is \fB\fI/var/run/isisd.pid\fR. +restart isisd. The default is \fB\fI@CFG_STATE@/isisd.pid\fR. .TP \fB\-P\fR, \fB\-\-vty_port \fR\fIport-number\fR Specify the port that the isisd VTY will listen on. This defaults to @@ -61,18 +61,18 @@ Specify the address that the isisd VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-v\fR, \fB\-\-version\fR Print the version and exit. .SH FILES .TP -.BI /usr/lib/quagga/isisd +.BI @CFG_SBIN@/isisd The default location of the .B isisd binary. .TP -.BI /etc/quagga/isisd.conf +.BI @CFG_SYSCONF@/isisd.conf The default location of the .B isisd config file. @@ -84,7 +84,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBisisd\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The isisd process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBisisd\fR supports many @@ -103,7 +103,7 @@ production use. .B isisd eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://isisd.sourceforge.net diff --git a/doc/kernel.texi b/doc/kernel.texi index 67fbb5e360..e58ade5a85 100644 --- a/doc/kernel.texi +++ b/doc/kernel.texi @@ -31,7 +31,7 @@ information. @item netlink On recent Linux kernels (2.0.x and 2.2.x), there is a kernel/user communication support called @code{netlink}. It makes asynchronous -communication between kernel and Quagga possible, similar to a routing +communication between kernel and Frr possible, similar to a routing socket on BSD systems. Before you use this feature, be sure to select (in kernel configuration) @@ -41,7 +41,7 @@ the kernel/netlink support option 'Kernel/User network link driver' and Today, the /dev/route special device file is obsolete. Netlink communication is done by reading/writing over netlink socket. -After the kernel configuration, please reconfigure and rebuild Quagga. -You can use netlink as a dynamic routing update channel between Quagga +After the kernel configuration, please reconfigure and rebuild Frr. +You can use netlink as a dynamic routing update channel between Frr and the kernel. @end table diff --git a/doc/ldpd-basic-test-setup.md b/doc/ldpd-basic-test-setup.md index e5e987f9e3..b25a2b6d4b 100644 --- a/doc/ldpd-basic-test-setup.md +++ b/doc/ldpd-basic-test-setup.md @@ -103,7 +103,7 @@ just to show how the VPLS configuration should look like in the future. # ip -6 route add 3:3:3::3/128 via 2001:db8:4::3 ``` -6 - Edit /etc/quagga/ospfd.conf: +6 - Edit /etc/frr/ospfd.conf: ``` router ospf network 4.4.4.4/32 area 0.0.0.0 @@ -112,7 +112,7 @@ router ospf ! ``` -7 - Edit /etc/quagga/ldpd.conf: +7 - Edit /etc/frr/ldpd.conf: ``` debug mpls ldp messages recv debug mpls ldp messages sent @@ -207,7 +207,7 @@ LDPv6 but the IOS-XR implementation is not RFC compliant in this regard. # route -n add 2:2:2::2/128 2001:db8:2::2 ``` -6 - Edit /etc/quagga/ospfd.conf: +6 - Edit /etc/frr/ospfd.conf: ``` router ospf network 10.0.2.3/24 area 0 @@ -216,7 +216,7 @@ router ospf ! ``` -7 - Edit /etc/quagga/ldpd.conf: +7 - Edit /etc/frr/ldpd.conf: ``` debug mpls ldp messages recv debug mpls ldp messages sent diff --git a/doc/ldpd.8 b/doc/ldpd.8.in similarity index 78% rename from doc/ldpd.8 rename to doc/ldpd.8.in index 092ff39d49..1683de46ca 100644 --- a/doc/ldpd.8 +++ b/doc/ldpd.8.in @@ -1,6 +1,6 @@ -.TH LDPD 8 "29 March 2016" "Quagga LDP daemon" "Version 1.0.20160309" +.TH LDPD 8 "29 March 2016" "@PACKAGE_FULLNAME@ LDP daemon" "Version @PACKAGE_VERSION@" .SH NAME -ldpd \- an LDP engine for use with Quagga routing software. +ldpd \- an LDP engine for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B ldpd [ @@ -27,7 +27,7 @@ ldpd \- an LDP engine for use with Quagga routing software. .SH DESCRIPTION .B ldpd is a component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -39,10 +39,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/ldpd.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/ldpd.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -50,7 +50,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When ldpd starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart ldpd. The likely default is \fB\fI/var/run/ldpd.pid\fR. +restart ldpd. The default is \fB\fI@CFG_STATE@/ldpd.pid\fR. .TP \fB\-P\fR, \fB\-\-vty_port \fR\fIport-number\fR Specify the port that the ldpd VTY will listen on. This defaults to @@ -61,18 +61,18 @@ Specify the address that the ldpd VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-v\fR, \fB\-\-version\fR Print the version and exit. .SH FILES .TP -.BI /usr/local/sbin/ldpd +.BI @CFG_SBIN@/ldpd The default location of the .B ldpd binary. .TP -.BI /usr/local/etc/ldpd.conf +.BI @CFG_SYSCONF@/ldpd.conf The default location of the .B ldpd config file. @@ -84,7 +84,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBldpd\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The ldpd process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBldpd\fR supports many @@ -101,9 +101,9 @@ debugging options, see the Info file, or the source for details. .SH BUGS .B ldpd eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/main.texi b/doc/main.texi index 5302c9687d..2e50457628 100644 --- a/doc/main.texi +++ b/doc/main.texi @@ -258,7 +258,7 @@ addresses but unicast addresses. This table is fully separate from the default unicast table. However, RPF lookup can include the unicast table. -WARNING: RPF lookup results are non-responsive in this version of Quagga, +WARNING: RPF lookup results are non-responsive in this version of Frr, i.e. multicast routing does not actively react to changes in underlying unicast topology! @@ -330,7 +330,7 @@ Multicast RIB instead of the Unicast RIB. @node zebra Route Filtering @section zebra Route Filtering Zebra supports @command{prefix-list} and @command{route-map} to match -routes received from other quagga components. The +routes received from other frr components. The @command{permit}/@command{deny} facilities provided by these commands can be used to filter which routes zebra will install in the kernel. @@ -374,16 +374,16 @@ ip protocol rip route-map RM1 @section zebra FIB push interface Zebra supports a 'FIB push' interface that allows an external -component to learn the forwarding information computed by the Quagga +component to learn the forwarding information computed by the Frr routing suite. -In Quagga, the Routing Information Base (RIB) resides inside +In Frr, the Routing Information Base (RIB) resides inside zebra. Routing protocols communicate their best routes to zebra, and zebra computes the best route across protocols for each prefix. This latter information makes up the Forwarding Information Base (FIB). Zebra feeds the FIB to the kernel, which allows the IP stack in the kernel to forward packets according to the routes computed by -Quagga. The kernel FIB is updated in an OS-specific way. For example, +Frr. The kernel FIB is updated in an OS-specific way. For example, the @code{netlink} interface is used on Linux, and route sockets are used on FreeBSD. @@ -408,7 +408,7 @@ interaction of zebra with the kernel remains unchanged -- that is, the kernel continues to receive FIB updates as before. The encapsulation header for the messages exchanged with the FPM is -defined by the file @file{fpm/fpm.h} in the quagga tree. The routes +defined by the file @file{fpm/fpm.h} in the frr tree. The routes themselves are encoded in netlink or protobuf format, with netlink being the default. diff --git a/doc/next-hop-tracking.txt b/doc/next-hop-tracking.txt index d157866e8a..d64433e2fe 100644 --- a/doc/next-hop-tracking.txt +++ b/doc/next-hop-tracking.txt @@ -1,7 +1,7 @@ 0. Introduction This is the design specification for next hop tracking feature in -Quagga. +Frr. 1. Background @@ -259,7 +259,7 @@ rnh table: 5. User interface changes -quagga# show ip nht +frr# show ip nht 3.3.3.3 resolved via kernel via 11.0.0.6, swp1 @@ -277,7 +277,7 @@ quagga# show ip nht via 10.0.1.2, eth0 Client list: bgp(fd 12) -quagga# show ip bgp nexthop +frr# show ip bgp nexthop Current BGP nexthop cache: 3.3.3.3 valid [IGP metric 0], #paths 3 Last update: Wed Oct 16 04:43:49 2013 @@ -291,11 +291,11 @@ Current BGP nexthop cache: 11.11.11.11 valid [IGP metric 0], #paths 1 Last update: Wed Oct 16 04:43:47 2013 -quagga# show ipv6 nht -quagga# show ip bgp nexthop detail +frr# show ipv6 nht +frr# show ip bgp nexthop detail -quagga# debug bgp nht -quagga# debug zebra nht +frr# debug bgp nht +frr# debug zebra nht 6. Sample test cases diff --git a/doc/ospf6d.8 b/doc/ospf6d.8.in similarity index 77% rename from doc/ospf6d.8 rename to doc/ospf6d.8.in index 630b20afdd..7f94782bea 100644 --- a/doc/ospf6d.8 +++ b/doc/ospf6d.8.in @@ -1,6 +1,6 @@ -.TH OSPF6D 8 "25 November 2004" "Quagga OSPFv3 daemon" "Version 0.97.3" +.TH OSPF6D 8 "25 November 2004" "@PACKAGE_FULLNAME@ OSPFv3 daemon" "Version @PACKAGE_VERSION@" .SH NAME -ospf6d \- an OSPFv3 routing engine for use with Quagga routing software. +ospf6d \- an OSPFv3 routing engine for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B ospf6d [ @@ -27,7 +27,7 @@ ospf6d \- an OSPFv3 routing engine for use with Quagga routing software. .SH DESCRIPTION .B ospf6d is a routing component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -40,10 +40,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/ospf6d.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/ospf6d.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -51,7 +51,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When ospf6d starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart ospf6d. The likely default is \fB\fI/var/run/ospf6d.pid\fR. +restart ospf6d. The default is \fB\fI@CFG_STATE@/ospf6d.pid\fR. .TP \fB\-P\fR, \fB\-\-vty_port \fR\fIport-number\fR Specify the port that the ospf6d VTY will listen on. This defaults to @@ -62,18 +62,18 @@ Specify the address that the ospf6d VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-v\fR, \fB\-\-version\fR Print the version and exit. .SH FILES .TP -.BI /usr/lib/quagga/ospf6d +.BI @CFG_SBIN@/ospf6d The default location of the .B ospf6d binary. .TP -.BI /etc/quagga/ospf6d.conf +.BI @CFG_SYSCONF@/ospf6d.conf The default location of the .B ospf6d config file. @@ -85,7 +85,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBospf6d\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The ospf6d process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBospf6d\fR supports many @@ -101,11 +101,11 @@ debugging options, see the Info file, or the source for details. .SH BUGS .B ospf6d eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://www.zebra.org and -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/ospfclient.8 b/doc/ospfclient.8.in similarity index 94% rename from doc/ospfclient.8 rename to doc/ospfclient.8.in index ccfad1aad0..fb996a541f 100644 --- a/doc/ospfclient.8 +++ b/doc/ospfclient.8.in @@ -39,4 +39,4 @@ Area in the IP address format for type 10, otherwise it will be ignored. .SH "SEE ALSO" .BR ospfd (8). .SH AUTHORS -See the project homepage at . +See the project homepage at <@PACKAGE_URL@>. diff --git a/doc/ospfd.8 b/doc/ospfd.8.in similarity index 78% rename from doc/ospfd.8 rename to doc/ospfd.8.in index ba8848affa..1b86551ca5 100644 --- a/doc/ospfd.8 +++ b/doc/ospfd.8.in @@ -1,6 +1,6 @@ -.TH OSPFD 8 "25 November 2004" "Quagga OSPFv2 daemon" "Version 0.97.3" +.TH OSPFD 8 "25 November 2004" "@PACKAGE_FULLNAME@ OSPFv2 daemon" "Version @PACKAGE_VERSION@" .SH NAME -ospfd \- an OSPFv2 routing engine for use with Quagga routing software. +ospfd \- an OSPFv2 routing engine for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B ospfd [ @@ -27,7 +27,7 @@ ospfd \- an OSPFv2 routing engine for use with Quagga routing software. .SH DESCRIPTION .B ospfd is a routing component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -39,10 +39,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/ospfd.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/ospfd.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -50,7 +50,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When ospfd starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart ospfd. The likely default is \fB\fI/var/run/ospfd.pid\fR. +restart ospfd. The default is \fB\fI@CFG_STATE@/ospfd.pid\fR. .TP \fB\-P\fR, \fB\-\-vty_port \fR\fIport-number\fR Specify the port that the ospfd VTY will listen on. This defaults to @@ -61,7 +61,7 @@ Specify the address that the ospfd VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-a\fR, \fB\-\-apiserver \fR Enable OSPF apiserver. Default is disabled. @@ -70,12 +70,12 @@ Enable OSPF apiserver. Default is disabled. Print the version and exit. .SH FILES .TP -.BI /usr/lib/quagga/ospfd +.BI @CFG_SBIN@/ospfd The default location of the .B ospfd binary. .TP -.BI /etc/quagga/ospfd.conf +.BI @CFG_SYSCONF@/ospfd.conf The default location of the .B ospfd config file. @@ -87,7 +87,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBospfd\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The ospfd process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBospfd\fR supports many @@ -103,11 +103,11 @@ debugging options, see the Info file, or the source for details. .SH BUGS .B ospfd eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://www.zebra.org and -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/ospfd.texi b/doc/ospfd.texi index 7b9df8e78e..7ff78e67cf 100644 --- a/doc/ospfd.texi +++ b/doc/ospfd.texi @@ -77,7 +77,7 @@ which still can reach the backbone - this restriction exists primarily to ensure routing-loops are avoided. With the "Cisco" or "IBM" ABR type, the default in this release of -Quagga, this restriction is lifted, allowing an ABR to consider +Frr, this restriction is lifted, allowing an ABR to consider summaries learnt from other ABRs through non-backbone areas, and hence route via non-backbone areas as a last resort when, and only when, backbone links are down. @@ -169,7 +169,7 @@ calculations will always be seperated by between 400ms to 10s, the hold-time increasing by 400ms each time an SPF-triggering event occurs within the hold-time of the previous SPF calculation. -This command supercedes the @command{timers spf} command in previous Quagga +This command supercedes the @command{timers spf} command in previous Frr releases. @end deffn @@ -259,7 +259,7 @@ Summarize intra area paths from specified area into one Type-3 summary-LSA announced to other areas. This command can be used only in ABR and ONLY router-LSAs (Type-1) and network-LSAs (Type-2) (ie. LSAs with scope area) can be summarized. Type-5 AS-external-LSAs can't be summarized - their scope is AS. -Summarizing Type-7 AS-external-LSAs isn't supported yet by Quagga. +Summarizing Type-7 AS-external-LSAs isn't supported yet by Frr. @example @group @@ -784,7 +784,7 @@ of networks between the areas: @group ! password ABCDEF -log file /var/log/quagga/ospfd.log +log file /var/log/frr/ospfd.log service advanced-vty ! interface eth0 diff --git a/doc/overview.texi b/doc/overview.texi index 2301c4b7fe..d1e8ea48b2 100644 --- a/doc/overview.texi +++ b/doc/overview.texi @@ -2,73 +2,73 @@ @chapter Overview @cindex Overview - @uref{http://www.quagga.net,,Quagga} is a routing software package that + @uref{http://www.freerangerouting.net,,Frr} is a routing software package that provides TCP/IP based routing services with routing protocols support such as RIPv1, RIPv2, RIPng, OSPFv2, OSPFv3, IS-IS, BGP-4, and BGP-4+ (@pxref{Supported -RFCs}). Quagga also supports special BGP Route Reflector and Route Server -behavior. In addition to traditional IPv4 routing protocols, Quagga also +RFCs}). Frr also supports special BGP Route Reflector and Route Server +behavior. In addition to traditional IPv4 routing protocols, Frr also supports IPv6 routing protocols. With SNMP daemon which supports SMUX and AgentX -protocol, Quagga provides routing protocol MIBs (@pxref{SNMP Support}). +protocol, Frr provides routing protocol MIBs (@pxref{SNMP Support}). - Quagga uses an advanced software architecture to provide you with a high -quality, multi server routing engine. Quagga has an interactive user + Frr uses an advanced software architecture to provide you with a high +quality, multi server routing engine. Frr has an interactive user interface for each routing protocol and supports common client commands. -Due to this design, you can add new protocol daemons to Quagga easily. You -can use Quagga library as your program's client user interface. +Due to this design, you can add new protocol daemons to Frr easily. You +can use Frr library as your program's client user interface. - Quagga is distributed under the @sc{gnu} General Public License. + Frr is distributed under the @sc{gnu} General Public License. @menu -* About Quagga:: Basic information about Quagga -* System Architecture:: The Quagga system architecture +* About Frr:: Basic information about Frr +* System Architecture:: The Frr system architecture * Supported Platforms:: Supported platforms and future plans * Supported RFCs:: Supported RFCs -* How to get Quagga:: +* How to get Frr:: * Mailing List:: Mailing list information * Bug Reports:: Mail address for bug data @end menu -@node About Quagga +@node About Frr @comment node-name, next, previous, up -@section About Quagga -@cindex About Quagga +@section About Frr +@cindex About Frr Today, TCP/IP networks are covering all of the world. The Internet has been deployed in many countries, companies, and to the home. When you connect to the Internet your packet will pass many routers which have TCP/IP routing functionality. - A system with Quagga installed acts as a dedicated router. With Quagga, + A system with Frr installed acts as a dedicated router. With Frr, your machine exchanges routing information with other routers using routing -protocols. Quagga uses this information to update the kernel routing table +protocols. Frr uses this information to update the kernel routing table so that the right data goes to the right place. You can dynamically change -the configuration and you may view routing table information from the Quagga +the configuration and you may view routing table information from the Frr terminal interface. - Adding to routing protocol support, Quagga can setup interface's flags, + Adding to routing protocol support, Frr can setup interface's flags, interface's address, static routes and so on. If you have a small network, -or a stub network, or xDSL connection, configuring the Quagga routing +or a stub network, or xDSL connection, configuring the Frr routing software is very easy. The only thing you have to do is to set up the interfaces and put a few commands about static routes and/or default routes. If the network is rather large, or if the network structure changes -frequently, you will want to take advantage of Quagga's dynamic routing +frequently, you will want to take advantage of Frr's dynamic routing protocol support for protocols such as RIP, OSPF, IS-IS or BGP. Traditionally, UNIX based router configuration is done by @command{ifconfig} and @command{route} commands. Status of routing table is displayed by @command{netstat} utility. Almost of these commands -work only if the user has root privileges. Quagga has a different system -administration method. There are two user modes in Quagga. One is normal +work only if the user has root privileges. Frr has a different system +administration method. There are two user modes in Frr. One is normal mode, the other is enable mode. Normal mode user can only view system status, enable mode user can change system configuration. This UNIX account independent feature will be great help to the router administrator. - Currently, Quagga supports common unicast routing protocols, that is BGP, + Currently, Frr supports common unicast routing protocols, that is BGP, OSPF, RIP and IS-IS. Upcoming for MPLS support, an implementation of LDP is currently being prepared for merging. Implementations of BFD and PIM-SSM (IPv4) also exist, but are not actively being worked on. - The ultimate goal of the Quagga project is making a productive, quality, free + The ultimate goal of the Frr project is making a productive, quality, free TCP/IP routing software package. @node System Architecture @@ -79,7 +79,7 @@ TCP/IP routing software package. @cindex Software internals Traditional routing software is made as a one process program which -provides all of the routing protocol functionalities. Quagga takes a +provides all of the routing protocol functionalities. Frr takes a different approach. It is made from a collection of several daemons that work together to build the routing table. There may be several protocol-specific routing daemons and zebra the kernel routing manager. @@ -110,7 +110,7 @@ architecture creates new possibilities for the routing system. | | +------------------------------+ - Quagga System Architecture + Frr System Architecture @end group @end example @@ -120,11 +120,11 @@ and terminal interfaces. Each daemon has it's own configuration file and terminal interface. When you configure a static route, it must be done in @command{zebra} configuration file. When you configure BGP network it must be done in @command{bgpd} configuration file. This can be a very annoying -thing. To resolve the problem, Quagga provides integrated user interface +thing. To resolve the problem, Frr provides integrated user interface shell called @command{vtysh}. @command{vtysh} connects to each daemon with UNIX domain socket and then works as a proxy for user input. -Quagga was planned to use multi-threaded mechanism when it runs with a +Frr was planned to use multi-threaded mechanism when it runs with a kernel that supports multi-threads. But at the moment, the thread library which comes with @sc{gnu}/Linux or FreeBSD has some problems with running reliable services such as routing software, so we don't use threads at all. @@ -136,18 +136,18 @@ events. @section Supported Platforms @cindex Supported platforms -@cindex Quagga on other systems +@cindex Frr on other systems @cindex Compatibility with other systems -@cindex Operating systems that support Quagga +@cindex Operating systems that support Frr -Currently Quagga supports @sc{gnu}/Linux and BSD. Porting Quagga +Currently Frr supports @sc{gnu}/Linux and BSD. Porting Frr to other platforms is not too difficult as platform dependent code should most be limited to the @command{zebra} daemon. Protocol daemons are mostly -platform independent. Please let us know when you find out Quagga runs on a +platform independent. Please let us know when you find out Frr runs on a platform which is not listed below. The list of officially supported platforms are listed below. Note that -Quagga may run correctly on other platforms, and may run with partial +Frr may run correctly on other platforms, and may run with partial functionality on further platforms. @sp 1 @@ -176,7 +176,7 @@ Mac OSX @end itemize Also note that, in particular regarding proprietary platforms, compiler -and C library choice will affect Quagga. Only recent versions of the +and C library choice will affect Frr. Only recent versions of the following C compilers are well-tested: @sp 1 @@ -269,39 +269,39 @@ November 1995.} @end table -@node How to get Quagga +@node How to get Frr @comment node-name, next, previous, up -@section How to get Quagga +@section How to get Frr -The official Quagga web-site is located at: +The official Frr web-site is located at: -@uref{http://www.quagga.net/} +@uref{http://www.freerangerouting.net/} and contains further information, as well as links to additional resources. -@uref{http://www.quagga.net/,Quagga} is a fork of GNU Zebra, whose +@uref{http://www.freerangerouting.net/,Frr} is a fork of Quagga, whose web-site is located at: -@uref{http://www.zebra.org/}. +@uref{http://www.quagga.net/}. @node Mailing List @comment node-name, next, previous, up @section Mailing List -@cindex How to get in touch with Quagga -@cindex Mailing Quagga +@cindex How to get in touch with Frr +@cindex Mailing Frr @cindex Contact information @cindex Mailing lists -There is a mailing list for discussions about Quagga. If you have any -comments or suggestions to Quagga, please subscribe to: +There is a mailing list for discussions about Frr. If you have any +comments or suggestions to Frr, please subscribe to: -@uref{http://lists.quagga.net/mailman/listinfo/quagga-users}. +@uref{http://lists.nox.tf/listinfo/frr-users}. -The @uref{http://www.quagga.net/,,Quagga} site has further information on +The @uref{http://www.freerangerouting.net/,,Frr} site has further information on the available mailing lists, see: - @uref{http://www.quagga.net/lists.php} + @uref{http://lists.nox.tf/lists.php} @node Bug Reports @section Bug Reports @@ -315,7 +315,7 @@ the available mailing lists, see: If you think you have found a bug, please send a bug report to: -@uref{http://bugzilla.quagga.net} +@uref{http://github.com/freerangerouting/frr/issues} When you send a bug report, please be careful about the points below. @@ -332,6 +332,6 @@ Please send your configuration file with the report. If you specify arguments to the configure script please note that too. @end itemize - Bug reports are very important for us to improve the quality of Quagga. -Quagga is still in the development stage, but please don't hesitate to -send a bug report to @uref{http://bugzilla.quagga.net}. + Bug reports are very important for us to improve the quality of Frr. +Frr is still in the development stage, but please don't hesitate to +send a bug report to @uref{http://github.com/freerangerouting/frr/issues}. diff --git a/doc/pimd.8 b/doc/pimd.8.in similarity index 81% rename from doc/pimd.8 rename to doc/pimd.8.in index 0dd170a2cd..60b844b1e7 100644 --- a/doc/pimd.8 +++ b/doc/pimd.8.in @@ -1,6 +1,6 @@ -.TH PIM 8 "10 December 2008" "Quagga PIM daemon" "Version 0.99.11" +.TH PIM 8 "10 December 2008" "@PACKAGE_FULLNAME@ PIM daemon" "Version @PACKAGE_VERSION@" .SH NAME -pimd \- a PIM routing for use with Quagga Routing Suite. +pimd \- a PIM routing for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B pimd [ @@ -30,7 +30,7 @@ pimd \- a PIM routing for use with Quagga Routing Suite. .SH DESCRIPTION .B pimd is a protocol-independent multicast component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ Routing Suite. .SH OPTIONS Options available for the @@ -42,10 +42,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/pimd.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/pimd.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -53,11 +53,11 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When pimd starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart pimd. The likely default is \fB\fI/var/run/pimd.pid\fR. +restart pimd. The default is \fB\fI@CFG_STATE@/pimd.pid\fR. .TP \fB\-z\fR, \fB\-\-socket \fR\fIpath\fR Specify the socket path for contacting the zebra daemon. -The likely default is \fB\fI/var/run/zserv.api\fR. +The default is \fB\fI@CFG_STATE@/zserv.api\fR. .TP \fB\-P\fR, \fB\-\-vty_port \fR\fIport-number\fR Specify the port that the pimd VTY will listen on. This defaults to @@ -68,7 +68,7 @@ Specify the address that the pimd VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-v\fR, \fB\-\-version\fR Print the version and exit. @@ -77,22 +77,22 @@ Print the version and exit. Enable logging information for zclient debugging. .SH FILES .TP -.BI /usr/local/sbin/pimd +.BI @CFG_SBIN@/pimd The default location of the .B pimd binary. .TP -.BI /usr/local/etc/pimd.conf +.BI @CFG_SYSCONF@/pimd.conf The default location of the .B pimd config file. .TP -.BI /var/run/pimd.pid +.BI @CFG_STATE@/pimd.pid The default location of the .B pimd pid file. .TP -.BI /var/run/zserv.api +.BI @CFG_STATE@/zserv.api The default location of the .B zebra unix socket file. diff --git a/doc/protocol.texi b/doc/protocol.texi index 602768a786..7e8a96dc5d 100644 --- a/doc/protocol.texi +++ b/doc/protocol.texi @@ -25,8 +25,11 @@ enough to allow for future extensions to done compatibly through seperate commands. Version 0 is used by all versions of GNU Zebra as of this writing, and -versions of Quagga up to and including Quagga 0.98. Version 1 will be -used as of Quagga 1.0. +versions of Quagga up to and including Quagga 0.98. Version 2 was created +for 0.99.21 of Quagga. Version 3 designates VRF compatibility and was +released in 1.0. Version 4 will be used as of Frr 2.0 to indicate that +we are a different Routing Suite now and to hopefully prevent accidental +Quagga <-> FRR issues. @appendixsection Zebra Protocol Definition @appendixsubsec Zebra Protocol Header (version 0) diff --git a/doc/ripd.8 b/doc/ripd.8.in similarity index 79% rename from doc/ripd.8 rename to doc/ripd.8.in index f042af228b..6db5ac3649 100644 --- a/doc/ripd.8 +++ b/doc/ripd.8.in @@ -1,6 +1,6 @@ -.TH RIPD 8 "25 November 2004" "Quagga RIP daemon" "Version 0.97.3" +.TH RIPD 8 "25 November 2004" "@PACKAGE_FULLNAME@ RIP daemon" "Version @PACKAGE_VERSION@" .SH NAME -ripd \- a RIP routing engine for use with Quagga routing software. +ripd \- a RIP routing engine for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B ripd [ @@ -27,7 +27,7 @@ ripd \- a RIP routing engine for use with Quagga routing software. .SH DESCRIPTION .B ripd is a routing component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -40,10 +40,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/ripd.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/ripd.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -51,7 +51,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When ripd starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart ripd. The likely default is \fB\fI/var/run/ripd.pid\fR. +restart ripd. The default is \fB\fI@CFG_STATE@/ripd.pid\fR. .TP \fB\-P\fR, \fB\-\-vty_port \fR\fIport-number\fR Specify the port that the ripd VTY will listen on. This defaults to @@ -62,7 +62,7 @@ Specify the address that the ripd VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-r\fR, \fB\-\-retain\fR When the program terminates, retain routes added by \fBripd\fR. @@ -71,12 +71,12 @@ When the program terminates, retain routes added by \fBripd\fR. Print the version and exit. .SH FILES .TP -.BI /usr/lib/quagga/ripd +.BI @CFG_SBIN@/ripd The default location of the .B ripd binary. .TP -.BI /etc/quagga/ripd.conf +.BI @CFG_SYSCONF@/ripd.conf The default location of the .B ripd config file. @@ -88,7 +88,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBripd\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The ripd process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBripd\fR supports many @@ -104,10 +104,10 @@ debugging options, see the Info file, or the source for details. .SH BUGS .B ripd eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://www.zebra.org and -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/ripd.texi b/doc/ripd.texi index 78d63eed4c..da0f596afd 100644 --- a/doc/ripd.texi +++ b/doc/ripd.texi @@ -1,7 +1,7 @@ @c -*-texinfo-*- -@c This is part of the Quagga Manual. +@c This is part of the Frr Manual. @c @value{COPYRIGHT_STR} -@c See file quagga.texi for copying conditions. +@c See file frr.texi for copying conditions. @node RIP @chapter RIP @@ -97,7 +97,7 @@ to the packet on the basis of the interface that received the packet. Version 2 of RIP supports a variable length subnet mask (VLSM). By extending the subnet mask, the mask can be divided and reused. Each subnet can be used for different purposes such as large to middle size -LANs and WAN links. Quagga @command{ripd} does not support the non-sequential +LANs and WAN links. Frr @command{ripd} does not support the non-sequential netmasks that are included in RIP Version 2. In a case of similar information with the same prefix and metric, the @@ -294,10 +294,10 @@ If you want to specify RIP only static routes: @deffn {RIP command} {route @var{a.b.c.d/m}} {} @deffnx {RIP command} {no route @var{a.b.c.d/m}} {} -This command is specific to Quagga. The @code{route} command makes a static +This command is specific to Frr. The @code{route} command makes a static route only inside RIP. This command should be used only by advanced users who are particularly knowledgeable about the RIP protocol. In -most cases, we recommend creating a static route in Quagga and +most cases, we recommend creating a static route in Frr and redistributing it in RIP using @code{redistribute static}. @end deffn @@ -399,7 +399,7 @@ redistribute connected [route-map MAP_NAME] @end example Cisco applies route-map _before_ routes will exported to rip route table. -In current Quagga's test implementation, @command{ripd} applies route-map +In current Frr's test implementation, @command{ripd} applies route-map after routes are listed in the route table and before routes will be announced to an interface (something like output filter). I think it is not so clear, but it is draft and it may be changed at future. diff --git a/doc/ripngd.8 b/doc/ripngd.8.in similarity index 78% rename from doc/ripngd.8 rename to doc/ripngd.8.in index e4504fde46..4c5f2bb114 100644 --- a/doc/ripngd.8 +++ b/doc/ripngd.8.in @@ -1,6 +1,6 @@ -.TH RIPNGD 8 "25 November 2004" "Quagga RIPNG daemon" "Version 0.97.3" +.TH RIPNGD 8 "25 November 2004" "@PACKAGE_FULLNAME@ RIPNG daemon" "Version @PACKAGE_VERSION@" .SH NAME -ripngd \- a RIPNG routing engine for use with Quagga routing software. +ripngd \- a RIPNG routing engine for use with @PACKAGE_FULLNAME@. .SH SYNOPSIS .B ripngd [ @@ -27,7 +27,7 @@ ripngd \- a RIPNG routing engine for use with Quagga routing software. .SH DESCRIPTION .B ripngd is a routing component that works with the -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -40,10 +40,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/ripngd.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/ripngd.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -51,7 +51,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When ripngd starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart ripngd. The likely default is \fB\fI/var/run/ripngd.pid\fR. +restart ripngd. The default is \fB\fI@CFG_STATE@/ripngd.pid\fR. .TP \fB\-P\fR, \fB\-\-vty_port \fR\fIport-number\fR Specify the port that the ripngd VTY will listen on. This defaults to @@ -62,7 +62,7 @@ Specify the address that the ripngd VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-r\fR, \fB\-\-retain\fR When the program terminates, retain routes added by \fBripd\fR. @@ -71,12 +71,12 @@ When the program terminates, retain routes added by \fBripd\fR. Print the version and exit. .SH FILES .TP -.BI /usr/lib/quagga/ripngd +.BI @CFG_SBIN@/ripngd The default location of the .B ripngd binary. .TP -.BI /etc/quagga/ripngd.conf +.BI @CFG_SYSCONF@/ripngd.conf The default location of the .B ripngd config file. @@ -88,7 +88,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBripngd\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The ripngd process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBripngd\fR supports many @@ -104,11 +104,11 @@ debugging options, see the Info file, or the source for details. .SH BUGS .B ripngd eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://www.zebra.org and -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/ripngd.texi b/doc/ripngd.texi index 0e58de6da3..1adda69433 100644 --- a/doc/ripngd.texi +++ b/doc/ripngd.texi @@ -1,7 +1,7 @@ @c -*-texinfo-*- -@c This is part of the Quagga Manual. +@c This is part of the Frr Manual. @c @value{COPYRIGHT_STR} -@c See file quagga.texi for copying conditions. +@c See file frr.texi for copying conditions. @node RIPng @chapter RIPng diff --git a/doc/routeserver.texi b/doc/routeserver.texi index f4a4546214..b25800107d 100644 --- a/doc/routeserver.texi +++ b/doc/routeserver.texi @@ -1,12 +1,12 @@ @c -*-texinfo-*- @c @value{COPYRIGHT_STR} -@c See file quagga.texi for copying conditions. +@c See file frr.texi for copying conditions. @c @c This file is a modified version of Jose Luis Rubio's TeX sources @c of his RS-Manual document -@node Configuring Quagga as a Route Server -@chapter Configuring Quagga as a Route Server +@node Configuring Frr as a Route Server +@chapter Configuring Frr as a Route Server The purpose of a Route Server is to centralize the peerings between BGP speakers. For example if we have an exchange point scenario with four BGP @@ -15,9 +15,9 @@ speakers, each of which maintaining a BGP peering with the other three each of the four establishes a single BGP peering against the Route Server (@pxref{fig:route-server}). -We will first describe briefly the Route Server model implemented by Quagga. +We will first describe briefly the Route Server model implemented by Frr. We will explain the commands that have been added for configuring that -model. And finally we will show a full example of Quagga configured as Route +model. And finally we will show a full example of Frr configured as Route Server. @menu @@ -148,7 +148,7 @@ It is also common to demand from a route server that it does not modify some BGP attributes (next-hop, as-path and MED) that are usually modified by standard BGP speakers before announcing a route. -The announcement processing model implemented by Quagga is shown in +The announcement processing model implemented by Frr is shown in @ref{fig:rs-processing}. The figure shows a mixture of RS-clients (B, C and D) with normal BGP peers (A). There are some details that worth additional comments: @@ -180,7 +180,7 @@ they do not hurt anybody (they can always be left empty). @node Commands for configuring a Route Server @section Commands for configuring a Route Server -Now we will describe the commands that have been added to quagga +Now we will describe the commands that have been added to frr in order to support the route server features. @deffn {Route-Server} {neighbor @var{peer-group} route-server-client} {} @@ -189,7 +189,7 @@ in order to support the route server features. This command configures the peer given by @var{peer}, @var{A.B.C.D} or @var{X:X::X:X} as an RS-client. -Actually this command is not new, it already existed in standard Quagga. It +Actually this command is not new, it already existed in standard Frr. It enables the transparent mode for the specified peer. This means that some BGP attributes (as-path, next-hop and MED) of the routes announced to that peer are not modified. @@ -235,7 +235,7 @@ any normal (in or out) route-map. @node Example of Route Server Configuration @section Example of Route Server Configuration -Finally we are going to show how to configure a Quagga daemon to act as a +Finally we are going to show how to configure a Frr daemon to act as a Route Server. For this purpose we are going to present a scenario without route server, and then we will show how to use the configurations of the BGP routers to generate the configuration of the route server. diff --git a/doc/snmp.texi b/doc/snmp.texi index 0918a462f9..c2c889de76 100644 --- a/doc/snmp.texi +++ b/doc/snmp.texi @@ -3,7 +3,7 @@ @acronym{SNMP,Simple Network Managing Protocol} is a widely implemented feature for collecting network information from router and/or host. -Quagga itself does not support SNMP agent (server daemon) functionality +Frr itself does not support SNMP agent (server daemon) functionality but is able to connect to a SNMP agent using the SMUX protocol (@cite{RFC1227}) or the AgentX protocol (@cite{RFC2741}) and make the routing protocol MIBs available through it. @@ -24,7 +24,7 @@ version of @code{net-snmp} which was formerly known as @code{ucd-snmp}. It is free and open software and available at @uref{http://www.net-snmp.org/} and as binary package for most Linux distributions. @code{net-snmp} has to be compiled with @code{--with-mib-modules=agentx} to -be able to accept connections from Quagga using AgentX protocol or with +be able to accept connections from Frr using AgentX protocol or with @code{--with-mib-modules=smux} to use SMUX protocol. Nowadays, SMUX is a legacy protocol. The AgentX protocol should be @@ -33,11 +33,11 @@ preferred for any new deployment. Both protocols have the same coverage. @node AgentX configuration @section AgentX configuration -To enable AgentX protocol support, Quagga must have been build with the +To enable AgentX protocol support, Frr must have been build with the @code{--enable-snmp} or @code{--enable-snmp=agentx} option. Both the -master SNMP agent (snmpd) and each of the Quagga daemons must be +master SNMP agent (snmpd) and each of the Frr daemons must be configured. In @code{/etc/snmp/snmpd.conf}, @code{master agentx} -directive should be added. In each of the Quagga daemons, @code{agentx} +directive should be added. In each of the Frr daemons, @code{agentx} command will enable AgentX support. @example @@ -54,7 +54,7 @@ command will enable AgentX support. # master agentx -/etc/quagga/ospfd.conf: +/etc/frr/ospfd.conf: ! ... the rest of ospfd.conf has been omitted for clarity ... ! agentx @@ -62,7 +62,7 @@ command will enable AgentX support. @end example Upon successful connection, you should get something like this in the -log of each Quagga daemons: +log of each Frr daemons: @example 2012/05/25 11:39:08 ZEBRA: snmp[info]: NET-SNMP version 5.4.3 AgentX subagent connected @@ -78,11 +78,11 @@ OSPF-MIB::ospfRouterId.0 = IpAddress: 192.168.42.109 The AgentX protocol can be transported over a Unix socket or using TCP or UDP. It usually defaults to a Unix socket and depends on how NetSNMP -was built. If need to configure Quagga to use another transport, you can -configure it through @code{/etc/snmp/quagga.conf}: +was built. If need to configure Frr to use another transport, you can +configure it through @code{/etc/snmp/frr.conf}: @example -/etc/snmp/quagga.conf: +/etc/snmp/frr.conf: [snmpd] # Use a remote master agent agentXSocket tcp:192.168.15.12:705 @@ -91,17 +91,17 @@ configure it through @code{/etc/snmp/quagga.conf}: @node SMUX configuration @section SMUX configuration -To enable SMUX protocol support, Quagga must have been build with the +To enable SMUX protocol support, Frr must have been build with the @code{--enable-snmp=smux} option. A separate connection has then to be established between the -SNMP agent (snmpd) and each of the Quagga daemons. This connections +SNMP agent (snmpd) and each of the Frr daemons. This connections each use different OID numbers and passwords. Be aware that this OID number is not the one that is used in queries by clients, it is solely used for the intercommunication of the daemons. In the following example the ospfd daemon will be connected to the -snmpd daemon using the password "quagga_ospfd". For testing it is +snmpd daemon using the password "frr_ospfd". For testing it is recommending to take exactly the below snmpd.conf as wrong access restrictions can be hard to debug. @@ -115,24 +115,24 @@ restrictions can be hard to debug. view all included .1 80 access MyROGroup "" any noauth exact all none none # - # the following line is relevant for Quagga + # the following line is relevant for Frr # - smuxpeer .1.3.6.1.4.1.3317.1.2.5 quagga_ospfd + smuxpeer .1.3.6.1.4.1.3317.1.2.5 frr_ospfd -/etc/quagga/ospf: +/etc/frr/ospf: ! ... the rest of ospfd.conf has been omitted for clarity ... ! - smux peer .1.3.6.1.4.1.3317.1.2.5 quagga_ospfd + smux peer .1.3.6.1.4.1.3317.1.2.5 frr_ospfd ! @end example -After restarting snmpd and quagga, a successful connection can be verified in +After restarting snmpd and frr, a successful connection can be verified in the syslog and by querying the SNMP daemon: @example snmpd[12300]: [smux_accept] accepted fd 12 from 127.0.0.1:36255 snmpd[12300]: accepted smux peer: \ - oid GNOME-PRODUCT-ZEBRA-MIB::ospfd, quagga-0.96.5 + oid GNOME-PRODUCT-ZEBRA-MIB::ospfd, frr-0.96.5 # snmpwalk -c public -v1 localhost .1.3.6.1.2.1.14.1.1 OSPF-MIB::ospfRouterId.0 = IpAddress: 192.168.42.109 @@ -148,7 +148,7 @@ troublesome @code{snmp_log()} line in the function @section MIB and command reference The following OID numbers are used for the interprocess communication of snmpd and -the Quagga daemons with SMUX only. +the Frr daemons with SMUX only. @example (OIDs below .iso.org.dod.internet.private.enterprises) zebra .1.3.6.1.4.1.3317.1.2.1 .gnome.gnomeProducts.zebra.zserv @@ -168,7 +168,7 @@ ripd .1.3.6.1.2.1.23 .iso.org.dot.internet.mgmt.mib-2.rip2 ospf6d .1.3.6.1.3.102 .iso.org.dod.internet.experimental.ospfv3 @end example -The following syntax is understood by the Quagga daemons for configuring SNMP using SMUX: +The following syntax is understood by the Frr daemons for configuring SNMP using SMUX: @deffn {Command} {smux peer @var{oid}} {} @deffnx {Command} {no smux peer @var{oid}} {} @end deffn diff --git a/doc/snmptrap.texi b/doc/snmptrap.texi index 31145639c2..0dd3a703af 100644 --- a/doc/snmptrap.texi +++ b/doc/snmptrap.texi @@ -1,11 +1,11 @@ -@c Documentation on configuring Quagga and snmpd for SNMP traps +@c Documentation on configuring Frr and snmpd for SNMP traps @c contributed by Jeroen Simonetti, jsimonetti@denit.net @node Handling SNMP Traps @section Handling SNMP Traps -To handle snmp traps make sure your snmp setup of quagga works -correctly as described in the quagga documentation in @xref{SNMP Support}. +To handle snmp traps make sure your snmp setup of frr works +correctly as described in the frr documentation in @xref{SNMP Support}. The BGP4 mib will send traps on peer up/down events. These should be visible in your snmp logs with a message similar to: diff --git a/doc/vnc.texi b/doc/vnc.texi index 341cbfcce8..f375d3a7df 100644 --- a/doc/vnc.texi +++ b/doc/vnc.texi @@ -1,7 +1,7 @@ @c -*-texinfo-*- -@c This is part of the Quagga Manual. +@c This is part of the Frr Manual. @c @value{COPYRIGHT_STR} -@c See file quagga.texi for copying conditions. +@c See file frr.texi for copying conditions. @node VNC and VNC-GW @chapter VNC and VNC-GW @@ -97,8 +97,8 @@ configured. The default is @code{encap-attr}. The protocol that is used to communicate routing and Ethernet / L2 forwarding information between NVAs and NVEs is referred to as the Remote Forwarder Protocol (RFP). Currently, only a simple example RFP -is included in Quagga. Developers may use this example as a starting -point to integrate Quagga with an RFP of their choosing, e.g., +is included in Frr. Developers may use this example as a starting +point to integrate Frr with an RFP of their choosing, e.g., @code{OpenFlow}. The example code includes the following sample configuration: @@ -726,7 +726,7 @@ provided to other protocols, either via zebra or directly to BGP. It is important to note that when exporting routes to other protocols, the downstream protocol must also be configured to import the routes. For example, when VNC routes are exported to unicast BGP, the BGP -configuration must include a corresponding @code{redistribute vpn} +configuration must include a corresponding @code{redistribute vnc-direct} statement. @deffn {VNC} {export bgp|zebra mode none|group-nve|registering-nve|ce} @@ -966,7 +966,7 @@ Print the number of memory items allocated by the NVA. @menu * Mesh NVA Configuration:: * Mesh NVA and VNC-GW Configuration:: -* VNC with Quagga Route Reflector Configuration:: +* VNC with Frr Route Reflector Configuration:: * VNC with Commercial Route Reflector Configuration:: * VNC with Redundant Route Reflectors Configuration:: @c * Interfacing VNC to an IGP:: @@ -1090,10 +1090,10 @@ VNC-GWs, each supporting two CE routers physically attached to the four NVEs. Note that this example is showing a more complex configuration where VNC-GW is separated from normal NVA functions; it is equally possible to simplify the configuration and combine NVA and VNC-GW -functions in a single quagga instance. +functions in a single frr instance. @float Figure,fig:fig-vnc-gw -@center @image{fig-vnc-gw,400pt,,Quagga VNC Gateway} +@center @image{fig-vnc-gw,400pt,,Frr VNC Gateway} @caption{Meshed NVEs and VNC-GWs} @end float @@ -1115,7 +1115,7 @@ The configuration for @code{VNC-GW 1} is shown below. router bgp 64512 bgp router-id 192.168.1.101 bgp cluster-id 1.2.3.4 - redistribute vpn + redistribute vnc-direct neighbor 192.168.1.102 remote-as 64512 no neighbor 192.168.1.102 activate neighbor 192.168.1.103 remote-as 64512 @@ -1177,7 +1177,7 @@ router bgp 64512 @c TBD make this its own example: @c @c @float Figure,fig:fig-vnc-gw-rr -@c @center @image{fig-vnc-gw-rr,400pt,,Quagga VNC Gateway with RR} +@c @center @image{fig-vnc-gw-rr,400pt,,Frr VNC Gateway with RR} @c @end float @c An NVA can also import unicast routes from BGP without advertising the @c imported routes as VPN routes. Such imported routes, while not @@ -1195,17 +1195,17 @@ router bgp 64512 @c vnc redistribute ipv4 bgp-direct-to-nve-groups @c @end verbatim -@node VNC with Quagga Route Reflector Configuration -@subsection VNC with Quagga Route Reflector Configuration +@node VNC with Frr Route Reflector Configuration +@subsection VNC with Frr Route Reflector Configuration A route reflector eliminates the need for a fully meshed NVA network by acting as the hub between NVAs. -@ref{fig:fig-vnc-quagga-route-reflector} shows BGP route reflector +@ref{fig:fig-vnc-frr-route-reflector} shows BGP route reflector @code{BGP Route Reflector 1} (192.168.1.100) as a route reflector for NVAs @code{NVA 2}(192.168.1.101) and @code{NVA 3} (192.168.1.102). -@float Figure,fig:fig-vnc-quagga-route-reflector -@center @image{fig-vnc-quagga-route-reflector,400pt,,Quagga Route Reflector} +@float Figure,fig:fig-vnc-frr-route-reflector +@center @image{fig-vnc-frr-route-reflector,400pt,,Frr Route Reflector} @caption{Two NVAs and a BGP Route Reflector} @end float @@ -1298,7 +1298,7 @@ While not shown, an NVA can also be configured as a route reflector. @node VNC with Commercial Route Reflector Configuration @subsection VNC with Commercial Route Reflector Configuration -This example is identical to @ref{VNC with Quagga Route Reflector +This example is identical to @ref{VNC with Frr Route Reflector Configuration} with the exception that the route reflector is a commercial router. Only the VNC-relevant configuration is provided. @@ -1408,7 +1408,7 @@ exit @node VNC with Redundant Route Reflectors Configuration @subsection VNC with Redundant Route Reflectors Configuration -This example combines the previous two (@ref{VNC with Quagga Route +This example combines the previous two (@ref{VNC with Frr Route Reflector Configuration} and @ref{VNC with Commercial Route Reflector Configuration}) into a redundant route reflector configuration. BGP route reflectors @code{BGP Route Reflector 1} and @code{Commercial Router} @@ -1418,7 +1418,7 @@ route reflectors. @float Figure,fig:fig-vnc-redundant-route-reflectors @center @image{fig-vnc-redundant-route-reflectors,400pt,,Redundant Route Reflectors} -@caption{Quagga-based NVA with redundant route reflectors} +@caption{Frr-based NVA with redundant route reflectors} @end float @file{bgpd.conf} for @code{Bgpd Route Reflector 1} on 192.168.1.100: diff --git a/doc/vtysh.1 b/doc/vtysh.1.in similarity index 73% rename from doc/vtysh.1 rename to doc/vtysh.1.in index d144cb6421..7b5d4f132e 100644 --- a/doc/vtysh.1 +++ b/doc/vtysh.1.in @@ -1,6 +1,6 @@ -.TH VTYSH 1 "27 July 2006" "Quagga VTY shell" "Version 0.96.5" +.TH VTYSH 1 "27 July 2006" "@PACKAGE_FULLNAME@ VTY shell" "Version @PACKAGE_VERSION@" .SH NAME -vtysh \- a integrated shell for Quagga routing software +vtysh \- a integrated shell for @PACKAGE_FULLNAME@. .SH SYNOPSIS .B vtysh [ @@ -21,7 +21,7 @@ vtysh \- a integrated shell for Quagga routing software .SH DESCRIPTION .B vtysh is a integrated shell for -.B Quagga +.B @PACKAGE_FULLNAME@ routing engine. .SH OPTIONS Options available for the @@ -29,8 +29,8 @@ Options available for the command: .IP "\fB\-b, \-\-boot\fP" Execute boot startup configuration. It makes sense only if integrated config -file is in use (not default in Quagga). See Info file \fBQuagga\fR for more -info. +file is in use (not default in @PACKAGE_FULLNAME@). See Info file +\fB@PACKAGE_NAME@\fR for more info. .IP "\fB\-c, \-\-command \fIcommand\fP" Specify command to be executed under batch mode. It behaves like -c option in any other shell - @@ -39,7 +39,7 @@ is executed and .B vtysh exits. -It's useful for gathering info from Quagga routing software or reconfiguring +It's useful for gathering info from @PACKAGE_FULLNAME@ daemons or reconfiguring daemons from inside shell scripts, etc. Note that multiple commands may be executed by using more than one -c option and/or embedding linefeed characters inside the @@ -48,13 +48,13 @@ string. .IP "\fB\-d, \-\-daemon \fIdaemon_name\fP" Specify which daemon to connect to. By default, .B vtysh -attempts to connect to all Quagga daemons running on the system. With this +attempts to connect to all @PACKAGE_FULLNAME@ daemons running on the system. With this flag, one can specify a single daemon to connect to instead. For example, specifying '-d ospfd' will connect only to ospfd. This can be particularly useful inside scripts with -c where the command is targeted for a single daemon. .IP "\fB\-e, \-\-execute \fIcommand\fP" Alias for -c. It's here only for compatibility with Zebra routing software and -older Quagga versions. This will be removed in future. +older Frr versions. This will be removed in future. .IP "\fB\-E, \-\-echo\fP" When the -c option is being used, this flag will cause the standard .B vtysh @@ -68,20 +68,20 @@ Display a usage message on standard output and exit. This should be the name of the pager to use. Default is \fBmore\fR. .SH FILES .TP -.BI /etc/quagga/vtysh.conf +.BI @CFG_SYSCONF@/vtysh.conf The default location of the .B vtysh config file. .TP -.BI /etc/quagga/Quagga.conf -The default location of the integrated Quagga routing engine config file +.BI @CFG_SYSCONF@/Frr.conf +The default location of the integrated @PACKAGE_FULLNAME@ routing engine config file if integrated config file is in use (not default). .TP -.BI ${HOME}/.history_quagga +.BI ${HOME}/.history_frr Location of history of commands entered via cli .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH "SEE ALSO" .BR bgpd (8), .BR ripd (8), @@ -93,11 +93,11 @@ options. The definitive document is the Info file \fBQuagga\fR. .SH BUGS .B vtysh eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://www.zebra.org and -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/doc/vtysh.texi b/doc/vtysh.texi index 69b7acd3b7..f3ebc26a12 100644 --- a/doc/vtysh.texi +++ b/doc/vtysh.texi @@ -5,7 +5,7 @@ * Integrated configuration mode:: @end menu -@command{vtysh} provides a combined frontend to all Quagga daemons in a +@command{vtysh} provides a combined frontend to all Frr daemons in a single combined session. It is enabled by default at build time, but can be disabled through the @option{--disable-vtysh} option to @command{./configure}. @@ -30,7 +30,7 @@ that directory, plus membership in the @emph{@value{INSTALL_VTY_GROUP}} group (which is the group that the daemons will change ownership of their sockets to). -To restrict access to Quagga configuration, make sure no unauthorized users +To restrict access to Frr configuration, make sure no unauthorized users are members of the @emph{@value{INSTALL_VTY_GROUP}} group. @subsection PAM support (experimental) @@ -61,13 +61,13 @@ at all. @section Integrated configuration mode Integrated configuration mode uses a single configuration file, -@file{Quagga.conf}, for all daemons. This replaces the individual files like +@file{Frr.conf}, for all daemons. This replaces the individual files like @file{zebra.conf} or @file{bgpd.conf}. -@file{Quagga.conf} is located in @file{@value{INSTALL_PREFIX_ETC}}. All +@file{Frr.conf} is located in @file{@value{INSTALL_PREFIX_ETC}}. All daemons check for the existence of this file at startup, and if it exists will not load their individual configuration files. Instead, -@command{vtysh -b} must be invoked to process @file{Quagga.conf} and apply +@command{vtysh -b} must be invoked to process @file{Frr.conf} and apply its settings to the individual daemons. @quotation Warning @@ -76,7 +76,7 @@ its settings to the individual daemons. @subsection Configuration saving, file ownership and permissions -The @file{Quagga.conf} file is not written by any of the daemons; instead +The @file{Frr.conf} file is not written by any of the daemons; instead @command{vtysh} contains the neccessary logic to collect configuration from all of the daemons, combine it and write it out. @@ -87,22 +87,22 @@ lost after doing a configuration save. @end quotation Since the @command{vtysh} command may be running as ordinary user on the -system, configuration writes will be tried through @command{watchquagga}, +system, configuration writes will be tried through @command{watchfrr}, using the @command{write integrated} command internally. Since -@command{watchquagga} is running as superuser, @command{vtysh} is able to -ensure correct ownership and permissions on @file{Quagga.conf}. +@command{watchfrr} is running as superuser, @command{vtysh} is able to +ensure correct ownership and permissions on @file{Frr.conf}. -If @command{watchquagga} is not running or the configuration write fails, +If @command{watchfrr} is not running or the configuration write fails, @command{vtysh} will attempt to directly write to the file. This is likely to fail if running as unprivileged user; alternatively it may leave the file with incorrect owner or permissions. Writing the configuration can be triggered directly by invoking @command{vtysh -w}. This may be useful for scripting. Note this command -should be run as either the superuser or the Quagga user. +should be run as either the superuser or the Frr user. We recommend you do not mix the use of the two types of files. Further, it -is better not to use the integrated Quagga.conf file, as any syntax error in +is better not to use the integrated Frr.conf file, as any syntax error in it can lead to /all/ of your daemons being unable to start up. Per daemon files are more robust as impact of errors in configuration are limited to the daemon in whose file the error is made. @@ -110,11 +110,11 @@ the daemon in whose file the error is made. @deffn {Command} {service integrated-vtysh-config} {} @deffnx {Command} {no service integrated-vtysh-config} {} -Control whether integrated @file{Quagga.conf} file is written when +Control whether integrated @file{Frr.conf} file is written when 'write file' is issued. These commands need to be placed in @file{vtysh.conf} to have any effect. -Note that since @file{vtysh.conf} is not written by Quagga itself, they +Note that since @file{vtysh.conf} is not written by Frr itself, they therefore need to be manually placed in that file. This command has 3 states: @@ -122,18 +122,18 @@ This command has 3 states: @item @command{service integrated-vtysh-config} -@command{vtysh} will always write @file{Quagga.conf}. +@command{vtysh} will always write @file{Frr.conf}. @item @command{no service integrated-vtysh-config} -@command{vtysh} will never write @file{Quagga.conf}; instead it will ask +@command{vtysh} will never write @file{Frr.conf}; instead it will ask daemons to write their individual configuration files. @item Neither option present (default) -@command{vtysh} will check whether @file{Quagga.conf} exists. If it does, +@command{vtysh} will check whether @file{Frr.conf} exists. If it does, configuration writes will update that file. Otherwise, writes are performed through the individual daemons. @end itemize @@ -146,8 +146,8 @@ installations. @deffn {Command} {write integrated} {} Unconditionally (regardless of @command{service integrated-vtysh-config} -setting) write out integrated @file{Quagga.conf} file through -@command{watchquagga}. If @command{watchquagga} is not running, this command +setting) write out integrated @file{Frr.conf} file through +@command{watchfrr}. If @command{watchfrr} is not running, this command is unavailable. @end deffn @@ -156,6 +156,6 @@ is unavailable. Configuration changes made while some daemon is not running will be invisible to that daemon. The daemon will start up with its saved configuration -(either in its individual configuration file, or in @file{Quagga.conf}). +(either in its individual configuration file, or in @file{Frr.conf}). This is particularly troublesome for route-maps and prefix lists, which would otherwise be synchronized between daemons. diff --git a/doc/watchquagga.8 b/doc/watchfrr.8.in similarity index 90% rename from doc/watchquagga.8 rename to doc/watchfrr.8.in index ca9916461e..813f87abd3 100644 --- a/doc/watchquagga.8 +++ b/doc/watchfrr.8.in @@ -1,37 +1,37 @@ .\" This file was originally generated by help2man 1.36. -.TH WATCHQUAGGA 8 "July 2010" +.TH WATCHFRR 8 "July 2010" .SH NAME -watchquagga \- a program to monitor the status of quagga daemons +watchfrr \- a program to monitor the status of frr daemons .SH SYNOPSIS -.B watchquagga +.B watchfrr .RI [ option ...] .IR daemon ... .br -.B watchquagga +.B watchfrr .BR \-h " | " \-v .SH DESCRIPTION -.B watchquagga -is a watchdog program that monitors the status of supplied quagga +.B watchfrr +is a watchdog program that monitors the status of supplied frr .IR daemon s and tries to restart them in case they become unresponsive or shut down. .PP To determine whether a daemon is running, it tries to connect to the daemon's VTY UNIX stream socket, and send echo commands to ensure the daemon responds. When the daemon crashes, EOF is received from the socket, -so that watchquagga can react immediately. +so that watchfrr can react immediately. .PP This program can run in one of the following 5 modes: .TP .B Mode 0: monitor In this mode, the program serves as a monitor and reports status changes. .IP -Example usage: watchquagga \-d zebra ospfd bgpd +Example usage: watchfrr \-d zebra ospfd bgpd .TP .B Mode 1: global restart In this mode, whenever a daemon hangs or crashes, the given command is used to restart all watched daemons. .IP -Example usage: watchquagga \-dz \e +Example usage: watchfrr \-dz \e .br -R '/sbin/service zebra restart; /sbin/service ospfd restart' \e .br @@ -41,7 +41,7 @@ zebra ospfd In this mode, whenever a single daemon hangs or crashes, the given command is used to restart this daemon only. .IP -Example usage: watchquagga \-dz \-r '/sbin/service %s restart' \e +Example usage: watchfrr \-dz \-r '/sbin/service %s restart' \e .br zebra ospfd bgpd .TP @@ -52,7 +52,7 @@ daemon; in this case, the following steps are taken: (1) all other daemons are stopped, (2) zebra is restarted, and (3) other daemons are started again. .IP -Example usage: watchquagga \-adz \-r '/sbin/service %s restart' \e +Example usage: watchfrr \-adz \-r '/sbin/service %s restart' \e .br \-s '/sbin/service %s start' \e .br @@ -63,7 +63,7 @@ In this mode, whenever a single daemon hangs or crashes, the following steps are taken: (1) all other daemons are stopped, (2) zebra is restarted, and (3) other daemons are started again. .IP -Example usage: watchquagga \-Adz \-r '/sbin/service %s restart' \e +Example usage: watchfrr \-Adz \-r '/sbin/service %s restart' \e .br \-s '/sbin/service %s start' \e .br @@ -95,7 +95,7 @@ instead of standard output (stdout). .BI \-S " directory" "\fR, \fB\-\-statedir " directory Set the VTY socket .I directory -(the default value is "/var/run/quagga"). +(the default value is "/var/run/frr"). .TP .BR \-e ", " \-\-no\-echo Do not ping the daemons to test whether they respond. This option is @@ -196,7 +196,7 @@ options to be specified. .BI \-p " filename" "\fR, \fB\-\-pid\-file " filename Set the process identifier .I filename -(the default value is "/var/run/quagga/watchquagga.pid"). +(the default value is "/var/run/frr/watchfrr.pid"). .TP .BI \-b " string" "\fR, \fB\-\-blank\-string " string When the supplied @@ -226,6 +226,6 @@ Display the usage information and exit. .BR ripd (8), .BR ripngd (8) .PP -See the project homepage at . +See the project homepage at <@PACKAGE_URL@>. .SH AUTHORS Copyright 2004 Andrew J. Schorr diff --git a/doc/zebra.8 b/doc/zebra.8.in similarity index 84% rename from doc/zebra.8 rename to doc/zebra.8.in index cb431da0aa..e7d00e10a3 100644 --- a/doc/zebra.8 +++ b/doc/zebra.8.in @@ -1,6 +1,6 @@ -.TH ZEBRA 8 "25 November 2004" "Zebra daemon" "Version 0.97.3" +.TH ZEBRA 8 "25 November 2004" "Zebra daemon" "Version @PACKAGE_VERSION@" .SH NAME -zebra \- a routing manager for use with associated Quagga components. +zebra \- a routing manager for use with associated @PACKAGE_FULLNAME@ components. .SH SYNOPSIS .B zebra [ @@ -44,10 +44,10 @@ Runs in daemon mode, forking and exiting from tty. .TP \fB\-f\fR, \fB\-\-config-file \fR\fIconfig-file\fR Specifies the config file to use for startup. If not specified this -option will likely default to \fB\fI/usr/local/etc/zebra.conf\fR. +option will default to \fB\fI@CFG_SYSCONF@/zebra.conf\fR. .TP \fB\-g\fR, \fB\-\-group \fR\fIgroup\fR -Specify the group to run as. Default is \fIquagga\fR. +Specify the group to run as. Default is \fI@enable_group@\fR. .TP \fB\-h\fR, \fB\-\-help\fR A brief message. @@ -55,7 +55,7 @@ A brief message. \fB\-i\fR, \fB\-\-pid_file \fR\fIpid-file\fR When zebra starts its process identifier is written to \fB\fIpid-file\fR. The init system uses the recorded PID to stop or -restart zebra. The likely default is \fB\fI/var/run/zebra.pid\fR. +restart zebra. The default is \fB\fI@CFG_STATE@/zebra.pid\fR. .TP \fB\-k\fR, \fB\-\-keep_kernel\fR On startup, don't delete self inserted routes. @@ -69,7 +69,7 @@ Specify the address that the zebra VTY will listen on. Default is all interfaces. .TP \fB\-u\fR, \fB\-\-user \fR\fIuser\fR -Specify the user to run as. Default is \fIquagga\fR. +Specify the user to run as. Default is \fI@enable_user@\fR. .TP \fB\-r\fR, \fB\-\-retain\fR When the program terminates, retain routes added by \fBzebra\fR. @@ -90,12 +90,12 @@ Note that this affects Linux only. Print the version and exit. .SH FILES .TP -.BI /usr/lib/quagga/zebra +.BI @CFG_SBIN@/zebra The default location of the .B zebra binary. .TP -.BI /etc/quagga/zebra.conf +.BI @CFG_SYSCONF@/zebra.conf The default location of the .B zebra config file. @@ -107,7 +107,7 @@ process is config'd to output logs to a file, then you will find this file in the directory where you started \fBzebra\fR. .SH WARNING This man page is intended to be a quick reference for command line -options. The definitive document is the Info file \fBQuagga\fR. +options. The definitive document is the Info file \fB@PACKAGE_NAME@\fR. .SH DIAGNOSTICS The zebra process may log to standard output, to a VTY, to a log file, or through syslog to the system logs. \fBzebra\fR supports many @@ -123,11 +123,11 @@ debugging options, see the Info file, or the source for details. .SH BUGS .B zebra eats bugs for breakfast. If you have food for the maintainers try -.BI http://bugzilla.quagga.net +.BI @PACKAGE_BUGREPORT@ .SH AUTHORS See .BI http://www.zebra.org and -.BI http://www.quagga.net +.BI @PACKAGE_URL@ or the Info file for an accurate list of authors. diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index 7f8e8deccc..f550924874 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -145,10 +145,8 @@ isis_delete_adj (void *arg) list_delete (adj->area_addrs); if (adj->ipv4_addrs) list_delete (adj->ipv4_addrs); -#ifdef HAVE_IPV6 if (adj->ipv6_addrs) list_delete (adj->ipv6_addrs); -#endif XFREE (MTYPE_ISIS_ADJACENCY, adj); return; @@ -301,10 +299,8 @@ isis_adj_print (struct isis_adjacency *adj) struct isis_dynhn *dyn; struct listnode *node; struct in_addr *ipv4_addr; -#ifdef HAVE_IPV6 struct in6_addr *ipv6_addr; u_char ip6[INET6_ADDRSTRLEN]; -#endif /* HAVE_IPV6 */ if (!adj) return; @@ -323,7 +319,6 @@ isis_adj_print (struct isis_adjacency *adj) zlog_debug ("%s", inet_ntoa (*ipv4_addr)); } -#ifdef HAVE_IPV6 if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0) { zlog_debug ("IPv6 Address(es):"); @@ -333,7 +328,6 @@ isis_adj_print (struct isis_adjacency *adj) zlog_debug ("%s", ip6); } } -#endif /* HAVE_IPV6 */ zlog_debug ("Speaks: %s", nlpid2string (&adj->nlpids)); return; @@ -363,10 +357,8 @@ isis_adj_expire (struct thread *thread) void isis_adj_print_vty (struct isis_adjacency *adj, struct vty *vty, char detail) { -#ifdef HAVE_IPV6 struct in6_addr *ipv6_addr; u_char ip6[INET6_ADDRSTRLEN]; -#endif /* HAVE_IPV6 */ struct in_addr *ip_addr; time_t now; struct isis_dynhn *dyn; @@ -457,7 +449,6 @@ isis_adj_print_vty (struct isis_adjacency *adj, struct vty *vty, char detail) for (ALL_LIST_ELEMENTS_RO (adj->ipv4_addrs, node, ip_addr)) vty_out (vty, " %s%s", inet_ntoa (*ip_addr), VTY_NEWLINE); } -#ifdef HAVE_IPV6 if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0) { vty_out (vty, " IPv6 Address(es):%s", VTY_NEWLINE); @@ -467,7 +458,6 @@ isis_adj_print_vty (struct isis_adjacency *adj, struct vty *vty, char detail) vty_out (vty, " %s%s", ip6, VTY_NEWLINE); } } -#endif /* HAVE_IPV6 */ vty_out (vty, "%s", VTY_NEWLINE); } return; diff --git a/isisd/isis_adjacency.h b/isisd/isis_adjacency.h index 99d0c493ba..8539b03d6b 100644 --- a/isisd/isis_adjacency.h +++ b/isisd/isis_adjacency.h @@ -85,10 +85,8 @@ struct isis_adjacency struct nlpids nlpids; /* protocols spoken ... */ struct list *ipv4_addrs; struct in_addr router_address; -#ifdef HAVE_IPV6 struct list *ipv6_addrs; struct in6_addr router_address6; -#endif /* HAVE_IPV6 */ u_char prio[ISIS_LEVELS]; /* priorityOfNeighbour for DIS */ int circuit_t; /* from hello PDU hdr */ int level; /* level (1 or 2) */ diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index dfa7561484..b138b8950c 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -284,10 +284,8 @@ isis_circuit_del_addr (struct isis_circuit *circuit, struct prefix_ipv4 *ipv4, *ip = NULL; struct listnode *node; char buf[PREFIX2STR_BUFFER]; -#ifdef HAVE_IPV6 struct prefix_ipv6 *ipv6, *ip6 = NULL; int found = 0; -#endif /* HAVE_IPV6 */ if (connected->address->family == AF_INET) { @@ -321,7 +319,6 @@ isis_circuit_del_addr (struct isis_circuit *circuit, prefix_ipv4_free (ipv4); } -#ifdef HAVE_IPV6 if (connected->address->family == AF_INET6) { ipv6 = prefix_ipv6_new (); @@ -379,7 +376,6 @@ isis_circuit_del_addr (struct isis_circuit *circuit, prefix_ipv6_free (ipv6); } -#endif /* HAVE_IPV6 */ return; } @@ -467,10 +463,8 @@ isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp) } circuit->ip_addrs = list_new (); -#ifdef HAVE_IPV6 circuit->ipv6_link = list_new (); circuit->ipv6_non_link = list_new (); -#endif /* HAVE_IPV6 */ for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn)) isis_circuit_add_addr (circuit, conn); @@ -497,7 +491,6 @@ isis_circuit_if_del (struct isis_circuit *circuit, struct interface *ifp) circuit->ip_addrs = NULL; } -#ifdef HAVE_IPV6 if (circuit->ipv6_link) { assert (listcount(circuit->ipv6_link) == 0); @@ -511,7 +504,6 @@ isis_circuit_if_del (struct isis_circuit *circuit, struct interface *ifp) list_delete (circuit->ipv6_non_link); circuit->ipv6_non_link = NULL; } -#endif /* HAVE_IPV6 */ circuit->circ_type = CIRCUIT_T_UNKNOWN; circuit->circuit_id = 0; @@ -857,13 +849,11 @@ circuit_update_nlpids (struct isis_circuit *circuit) circuit->nlpids.nlpids[0] = NLPID_IP; circuit->nlpids.count++; } -#ifdef HAVE_IPV6 if (circuit->ipv6_router) { circuit->nlpids.nlpids[circuit->nlpids.count] = NLPID_IPV6; circuit->nlpids.count++; } -#endif /* HAVE_IPV6 */ return; } @@ -1045,14 +1035,12 @@ isis_interface_config_write (struct vty *vty) vty_out (vty, " isis network point-to-point%s", VTY_NEWLINE); write++; } -#ifdef HAVE_IPV6 if (circuit->ipv6_router) { vty_out (vty, " ipv6 router isis %s%s", area->area_tag, VTY_NEWLINE); write++; } -#endif /* HAVE_IPV6 */ /* ISIS - circuit type */ if (circuit->is_type == IS_LEVEL_1) diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index 035e558c0a..bb0dc0f983 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -124,11 +124,9 @@ struct isis_circuit int ip_router; /* Route IP ? */ int is_passive; /* Is Passive ? */ struct list *ip_addrs; /* our IP addresses */ -#ifdef HAVE_IPV6 int ipv6_router; /* Route IPv6 ? */ struct list *ipv6_link; /* our link local IPv6 addresses */ struct list *ipv6_non_link; /* our non-link local IPv6 addresses */ -#endif /* HAVE_IPV6 */ u_int16_t upadjcount[2]; #define ISIS_CIRCUIT_FLAPPED_AFTER_SPF 0x01 u_char flags; diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index dedf2a71dd..da24a7f0d3 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -156,9 +156,7 @@ lsp_destroy (struct isis_lsp *lsp) } isis_spf_schedule (lsp->area, lsp->level); -#ifdef HAVE_IPV6 isis_spf_schedule6 (lsp->area, lsp->level); -#endif if (lsp->pdu) stream_free (lsp->pdu); @@ -427,9 +425,7 @@ lsp_inc_seqnum (struct isis_lsp *lsp, u_int32_t seq_num) ntohs (lsp->lsp_header->pdu_len) - 12, 12); isis_spf_schedule (lsp->area, lsp->level); -#ifdef HAVE_IPV6 isis_spf_schedule6 (lsp->area, lsp->level); -#endif return; } @@ -510,10 +506,8 @@ lsp_update_data (struct isis_lsp *lsp, struct stream *stream, expected |= TLVFLAG_IPV4_ADDR; expected |= TLVFLAG_IPV4_INT_REACHABILITY; expected |= TLVFLAG_IPV4_EXT_REACHABILITY; -#ifdef HAVE_IPV6 expected |= TLVFLAG_IPV6_ADDR; expected |= TLVFLAG_IPV6_REACHABILITY; -#endif /* HAVE_IPV6 */ retval = parse_tlvs (area->area_tag, STREAM_DATA (lsp->pdu) + ISIS_FIXED_HDR_LEN + ISIS_LSP_HDR_LEN, @@ -550,6 +544,14 @@ lsp_update (struct isis_lsp *lsp, struct stream *stream, if (dnode) dnode_destroy (dict_delete (area->lspdb[level - 1], dnode)); + if (lsp->own_lsp) + { + zlog_err("ISIS-Upd (%s): BUG updating LSP %s still marked as own LSP", + area->area_tag, rawlspid_print(lsp->lsp_header->lsp_id)); + lsp_clear_data(lsp); + lsp->own_lsp = 0; + } + /* rebuild the lsp data */ lsp_update_data (lsp, stream, area, level); @@ -638,9 +640,7 @@ lsp_insert (struct isis_lsp *lsp, dict_t * lspdb) if (lsp->lsp_header->seq_num != 0) { isis_spf_schedule (lsp->area, lsp->level); -#ifdef HAVE_IPV6 isis_spf_schedule6 (lsp->area, lsp->level); -#endif } } @@ -840,11 +840,9 @@ lsp_print_detail (struct isis_lsp *lsp, struct vty *vty, char dynhost) struct ipv4_reachability *ipv4_reach; struct in_addr *ipv4_addr; struct te_ipv4_reachability *te_ipv4_reach; -#ifdef HAVE_IPV6 struct ipv6_reachability *ipv6_reach; struct in6_addr in6; u_char buff[BUFSIZ]; -#endif u_char LSPid[255]; u_char hostname[255]; u_char ipv4_reach_prefix[20]; @@ -953,7 +951,6 @@ lsp_print_detail (struct isis_lsp *lsp, struct vty *vty, char dynhost) } /* IPv6 tlv */ -#ifdef HAVE_IPV6 if (lsp->tlv_data.ipv6_reachs) for (ALL_LIST_ELEMENTS_RO (lsp->tlv_data.ipv6_reachs, lnode, ipv6_reach)) { @@ -971,7 +968,6 @@ lsp_print_detail (struct isis_lsp *lsp, struct vty *vty, char dynhost) ntohl (ipv6_reach->metric), buff, ipv6_reach->prefix_len, VTY_NEWLINE); } -#endif /* TE IS neighbor tlv */ if (lsp->tlv_data.te_is_neighs) @@ -1348,10 +1344,8 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) struct ipv4_reachability *ipreach; struct te_ipv4_reachability *te_ipreach; struct isis_adjacency *nei; -#ifdef HAVE_IPV6 struct prefix_ipv6 *ipv6, ip6prefix; struct ipv6_reachability *ip6reach; -#endif /* HAVE_IPV6 */ struct tlvs tlv_data; struct isis_lsp *lsp0 = lsp; struct in_addr *routerid; @@ -1391,11 +1385,7 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) tlv_add_area_addrs (lsp->tlv_data.area_addrs, lsp->pdu); /* Protocols Supported */ - if (area->ip_circuits > 0 -#ifdef HAVE_IPV6 - || area->ipv6_circuits > 0 -#endif /* HAVE_IPV6 */ - ) + if (area->ip_circuits > 0 || area->ipv6_circuits > 0) { lsp->tlv_data.nlpids = XCALLOC (MTYPE_ISIS_TLV, sizeof (struct nlpids)); lsp->tlv_data.nlpids->count = 0; @@ -1405,7 +1395,6 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) lsp->tlv_data.nlpids->count++; lsp->tlv_data.nlpids->nlpids[0] = NLPID_IP; } -#ifdef HAVE_IPV6 if (area->ipv6_circuits > 0) { lsp_debug("ISIS (%s): Found IPv6 circuit, adding IPv6 to NLPIDs", area->area_tag); @@ -1413,7 +1402,6 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) lsp->tlv_data.nlpids->nlpids[lsp->tlv_data.nlpids->count - 1] = NLPID_IPV6; } -#endif /* HAVE_IPV6 */ tlv_add_nlpid (lsp->tlv_data.nlpids, lsp->pdu); } @@ -1560,7 +1548,6 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) } } -#ifdef HAVE_IPV6 /* * Add IPv6 reachability of this circuit */ @@ -1598,7 +1585,6 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) listnode_add (tlv_data.ipv6_reachs, ip6reach); } } -#endif /* HAVE_IPV6 */ switch (circuit->circ_type) { @@ -1799,7 +1785,6 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) lsp0, area, level); } -#ifdef HAVE_IPV6 while (tlv_data.ipv6_reachs && listcount (tlv_data.ipv6_reachs)) { if (lsp->tlv_data.ipv6_reachs == NULL) @@ -1812,7 +1797,6 @@ lsp_build (struct isis_lsp *lsp, struct isis_area *area) lsp = lsp_next_frag (LSP_FRAGMENT (lsp->lsp_header->lsp_id) + 1, lsp0, area, level); } -#endif /* HAVE_IPV6 */ while (tlv_data.is_neighs && listcount (tlv_data.is_neighs)) { diff --git a/isisd/isis_main.c b/isisd/isis_main.c index 84ebf8ceaa..f34be99eca 100644 --- a/isisd/isis_main.c +++ b/isisd/isis_main.c @@ -66,11 +66,11 @@ zebra_capabilities_t _caps_p[] = { }; struct zebra_privs_t isisd_privs = { -#if defined(QUAGGA_USER) - .user = QUAGGA_USER, +#if defined(FRR_USER) + .user = FRR_USER, #endif -#if defined QUAGGA_GROUP - .group = QUAGGA_GROUP, +#if defined FRR_GROUP + .group = FRR_GROUP, #endif #ifdef VTY_GROUP .vty_group = VTY_GROUP, @@ -150,7 +150,7 @@ Daemon which manages IS-IS routing\n\n\ -C, --dryrun Check configuration for validity and exit\n\ -h, --help Display this help and exit\n\ \n\ -Report bugs to %s\n", progname, ZEBRA_BUG_ADDRESS); +Report bugs to %s\n", progname, FRR_BUG_ADDRESS); } exit (status); @@ -382,7 +382,7 @@ main (int argc, char **argv, char **envp) vty_serv_sock (vty_addr, vty_port, ISIS_VTYSH_PATH); /* Print banner. */ - zlog_notice ("Quagga-ISISd %s starting: vty@%d", QUAGGA_VERSION, vty_port); + zlog_notice ("Quagga-ISISd %s starting: vty@%d", FRR_VERSION, vty_port); /* Start finite state machine. */ while (thread_fetch (master, &thread)) diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 96e459a797..e111a17dee 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -357,7 +357,6 @@ tlvs_to_adj_ipv4_addrs (struct tlvs *tlvs, struct isis_adjacency *adj) } } -#ifdef HAVE_IPV6 static void tlvs_to_adj_ipv6_addrs (struct tlvs *tlvs, struct isis_adjacency *adj) { @@ -381,7 +380,6 @@ tlvs_to_adj_ipv6_addrs (struct tlvs *tlvs, struct isis_adjacency *adj) } } -#endif /* HAVE_IPV6 */ /* * RECEIVE SIDE @@ -527,12 +525,6 @@ process_p2p_hello (struct isis_circuit *circuit) zlog_warn ("ISIS-Adj: IPv4 addresses present but no overlap " "in P2P IIH from %s\n", circuit->interface->name); } -#ifndef HAVE_IPV6 - else /* !(found & TLVFLAG_IPV4_ADDR) */ - zlog_warn ("ISIS-Adj: no IPv4 in P2P IIH from %s " - "(this isisd has no IPv6)\n", circuit->interface->name); - -#else if (found & TLVFLAG_IPV6_ADDR) { /* TBA: check that we have a linklocal ourselves? */ @@ -553,7 +545,6 @@ process_p2p_hello (struct isis_circuit *circuit) if (!(found & (TLVFLAG_IPV4_ADDR | TLVFLAG_IPV6_ADDR))) zlog_warn ("ISIS-Adj: neither IPv4 nor IPv6 addr in P2P IIH from %s\n", circuit->interface->name); -#endif if (!v6_usable && !v4_usable) { @@ -639,10 +630,8 @@ process_p2p_hello (struct isis_circuit *circuit) set_circuitparams_rmt_ipaddr (circuit->mtc, *ip_addr); } -#ifdef HAVE_IPV6 if (found & TLVFLAG_IPV6_ADDR) tlvs_to_adj_ipv6_addrs (&tlvs, adj); -#endif /* HAVE_IPV6 */ /* lets take care of the expiry */ THREAD_TIMER_OFF (adj->t_expire); @@ -1125,12 +1114,6 @@ process_lan_hello (int level, struct isis_circuit *circuit, const u_char *ssnpa) zlog_warn ("ISIS-Adj: IPv4 addresses present but no overlap " "in LAN IIH from %s\n", circuit->interface->name); } -#ifndef HAVE_IPV6 - else /* !(found & TLVFLAG_IPV4_ADDR) */ - zlog_warn ("ISIS-Adj: no IPv4 in LAN IIH from %s " - "(this isisd has no IPv6)\n", circuit->interface->name); - -#else if (found & TLVFLAG_IPV6_ADDR) { /* TBA: check that we have a linklocal ourselves? */ @@ -1151,7 +1134,6 @@ process_lan_hello (int level, struct isis_circuit *circuit, const u_char *ssnpa) if (!(found & (TLVFLAG_IPV4_ADDR | TLVFLAG_IPV6_ADDR))) zlog_warn ("ISIS-Adj: neither IPv4 nor IPv6 addr in LAN IIH from %s\n", circuit->interface->name); -#endif if (!v6_usable && !v4_usable) { @@ -1236,10 +1218,8 @@ process_lan_hello (int level, struct isis_circuit *circuit, const u_char *ssnpa) if (found & TLVFLAG_IPV4_ADDR) tlvs_to_adj_ipv4_addrs (&tlvs, adj); -#ifdef HAVE_IPV6 if (found & TLVFLAG_IPV6_ADDR) tlvs_to_adj_ipv6_addrs (&tlvs, adj); -#endif /* HAVE_IPV6 */ adj->circuit_t = hdr.circuit_t; @@ -2357,13 +2337,11 @@ send_hello (struct isis_circuit *circuit, int level) if (tlv_add_ip_addrs (circuit->ip_addrs, circuit->snd_stream)) return ISIS_WARNING; -#ifdef HAVE_IPV6 /* IPv6 Interface Address TLV */ if (circuit->ipv6_router && circuit->ipv6_link && listcount (circuit->ipv6_link) > 0) if (tlv_add_ipv6_addrs (circuit->ipv6_link, circuit->snd_stream)) return ISIS_WARNING; -#endif /* HAVE_IPV6 */ if (circuit->pad_hellos) if (tlv_add_padding (circuit->snd_stream)) diff --git a/isisd/isis_redist.c b/isisd/isis_redist.c index 045c7daa32..e368180699 100644 --- a/isisd/isis_redist.c +++ b/isisd/isis_redist.c @@ -544,7 +544,7 @@ DEFUN (isis_redistribute, REDIST_STR "Redistribute IPv4 routes\n" "Redistribute IPv6 routes\n" - QUAGGA_REDIST_HELP_STR_ISISD + FRR_REDIST_HELP_STR_ISISD "Redistribute into level-1\n" "Redistribute into level-2\n" "Metric for redistributed routes\n" @@ -564,7 +564,7 @@ DEFUN (isis_redistribute, unsigned long metric; const char *routemap = NULL; - family = str2family(argv[idx_afi]->arg); + family = str2family(argv[idx_afi]->text); if (family < 0) return CMD_WARNING; @@ -572,8 +572,8 @@ DEFUN (isis_redistribute, if (!afi) return CMD_WARNING; - type = proto_redistnum(afi, argv[idx_protocol]->arg); - if (type < 0 || type == ZEBRA_ROUTE_ISIS) + type = proto_redistnum(afi, argv[idx_protocol]->text); + if (type < 0) return CMD_WARNING; if (!strcmp("level-1", argv[idx_level]->arg)) @@ -615,7 +615,7 @@ DEFUN (no_isis_redistribute, REDIST_STR "Redistribute IPv4 routes\n" "Redistribute IPv6 routes\n" - QUAGGA_REDIST_HELP_STR_ISISD + FRR_REDIST_HELP_STR_ISISD "Redistribute into level-1\n" "Redistribute into level-2\n") { @@ -637,7 +637,7 @@ DEFUN (no_isis_redistribute, return CMD_WARNING; type = proto_redistnum(afi, argv[idx_protocol]->text); - if (type < 0 || type == ZEBRA_ROUTE_ISIS) + if (type < 0) return CMD_WARNING; level = strmatch ("level-1", argv[idx_level]->text) ? 1 : 2; diff --git a/isisd/isis_route.c b/isisd/isis_route.c index cc3ecba0d3..b2b858feb7 100644 --- a/isisd/isis_route.c +++ b/isisd/isis_route.c @@ -128,7 +128,6 @@ nexthops_print (struct list *nhs) } #endif /* EXTREME_DEBUG */ -#ifdef HAVE_IPV6 static struct isis_nexthop6 * isis_nexthop6_new (struct in6_addr *ip6, ifindex_t ifindex) { @@ -217,7 +216,6 @@ nexthops6_print (struct list *nhs6) nexthop6_print (nh6); } #endif /* EXTREME_DEBUG */ -#endif /* HAVE_IPV6 */ static void adjinfo2nexthop (struct list *nexthops, struct isis_adjacency *adj) @@ -242,7 +240,6 @@ adjinfo2nexthop (struct list *nexthops, struct isis_adjacency *adj) } } -#ifdef HAVE_IPV6 static void adjinfo2nexthop6 (struct list *nexthops6, struct isis_adjacency *adj) { @@ -265,7 +262,6 @@ adjinfo2nexthop6 (struct list *nexthops6, struct isis_adjacency *adj) } } } -#endif /* HAVE_IPV6 */ static struct isis_route_info * isis_route_info_new (struct prefix *prefix, uint32_t cost, uint32_t depth, @@ -291,7 +287,6 @@ isis_route_info_new (struct prefix *prefix, uint32_t cost, uint32_t depth, adjinfo2nexthop (rinfo->nexthops, adj); } } -#ifdef HAVE_IPV6 if (prefix->family == AF_INET6) { rinfo->nexthops6 = list_new (); @@ -307,8 +302,6 @@ isis_route_info_new (struct prefix *prefix, uint32_t cost, uint32_t depth, } } -#endif /* HAVE_IPV6 */ - rinfo->cost = cost; rinfo->depth = depth; @@ -324,13 +317,11 @@ isis_route_info_delete (struct isis_route_info *route_info) list_delete (route_info->nexthops); } -#ifdef HAVE_IPV6 if (route_info->nexthops6) { route_info->nexthops6->del = (void (*)(void *)) isis_nexthop6_delete; list_delete (route_info->nexthops6); } -#endif /* HAVE_IPV6 */ XFREE (MTYPE_ISIS_ROUTE_INFO, route_info); } @@ -353,9 +344,7 @@ isis_route_info_same (struct isis_route_info *new, { struct listnode *node; struct isis_nexthop *nexthop; -#ifdef HAVE_IPV6 struct isis_nexthop6 *nexthop6; -#endif /* HAVE_IPV6 */ if (!CHECK_FLAG (old->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED)) return 0; @@ -378,7 +367,6 @@ isis_route_info_same (struct isis_route_info *new, == 0) return 0; } -#ifdef HAVE_IPV6 else if (family == AF_INET6) { for (ALL_LIST_ELEMENTS_RO (new->nexthops6, node, nexthop6)) @@ -391,7 +379,6 @@ isis_route_info_same (struct isis_route_info *new, nexthop6->ifindex) == 0) return 0; } -#endif /* HAVE_IPV6 */ return 1; } @@ -414,10 +401,8 @@ isis_route_create (struct prefix *prefix, u_int32_t cost, u_int32_t depth, if (family == AF_INET) route_node = route_node_get (area->route_table[level - 1], prefix); -#ifdef HAVE_IPV6 else if (family == AF_INET6) route_node = route_node_get (area->route_table6[level - 1], prefix); -#endif /* HAVE_IPV6 */ else { isis_route_info_delete (rinfo_new); @@ -547,7 +532,6 @@ isis_route_validate_table (struct isis_area *area, struct route_table *table) drnode->info = NULL; } -#ifdef HAVE_IPV6 if (rnode->p.family == AF_INET6) { drnode = route_node_get (area->route_table6[0], &rnode->p); @@ -557,7 +541,6 @@ isis_route_validate_table (struct isis_area *area, struct route_table *table) if (drnode->info == rnode->info) drnode->info = NULL; } -#endif isis_route_delete (&rnode->p, table); } @@ -585,10 +568,8 @@ isis_route_validate_merge (struct isis_area *area, int family) if (family == AF_INET) table = area->route_table[0]; -#ifdef HAVE_IPV6 else if (family == AF_INET6) table = area->route_table6[0]; -#endif for (rnode = route_top (table); rnode; rnode = route_next (rnode)) { @@ -600,10 +581,8 @@ isis_route_validate_merge (struct isis_area *area, int family) if (family == AF_INET) table = area->route_table[1]; -#ifdef HAVE_IPV6 else if (family == AF_INET6) table = area->route_table6[1]; -#endif for (rnode = route_top (table); rnode; rnode = route_next (rnode)) { @@ -634,14 +613,12 @@ isis_route_validate (struct isis_area *area) else isis_route_validate_merge (area, AF_INET); -#ifdef HAVE_IPV6 if (area->is_type == IS_LEVEL_1) isis_route_validate_table (area, area->route_table6[0]); else if (area->is_type == IS_LEVEL_2) isis_route_validate_table (area, area->route_table6[1]); else isis_route_validate_merge (area, AF_INET6); -#endif if (!area->circuit_list) { return; diff --git a/isisd/isis_route.h b/isisd/isis_route.h index 0d2379cbe8..de23070aa8 100644 --- a/isisd/isis_route.h +++ b/isisd/isis_route.h @@ -25,7 +25,6 @@ #ifndef _ZEBRA_ISIS_ROUTE_H #define _ZEBRA_ISIS_ROUTE_H -#ifdef HAVE_IPV6 struct isis_nexthop6 { ifindex_t ifindex; @@ -33,7 +32,6 @@ struct isis_nexthop6 struct in6_addr router_address6; unsigned int lock; }; -#endif /* HAVE_IPV6 */ struct isis_nexthop { @@ -52,9 +50,7 @@ struct isis_route_info u_int32_t cost; u_int32_t depth; struct list *nexthops; -#ifdef HAVE_IPV6 struct list *nexthops6; -#endif /* HAVE_IPV6 */ }; struct isis_route_info *isis_route_create (struct prefix *prefix, diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c index 041f2ed3f6..086f5b23da 100644 --- a/isisd/isis_spf.c +++ b/isisd/isis_spf.c @@ -139,14 +139,12 @@ vtype2string (enum vertextype vtype) case VTYPE_IPREACH_TE: return "IP TE"; break; -#ifdef HAVE_IPV6 case VTYPE_IP6REACH_INTERNAL: return "IP6 internal"; break; case VTYPE_IP6REACH_EXTERNAL: return "IP6 external"; break; -#endif /* HAVE_IPV6 */ default: return "UNKNOWN"; } @@ -170,10 +168,8 @@ vid2string (struct isis_vertex *vertex, char * buff, int size) case VTYPE_IPREACH_INTERNAL: case VTYPE_IPREACH_EXTERNAL: case VTYPE_IPREACH_TE: -#ifdef HAVE_IPV6 case VTYPE_IP6REACH_INTERNAL: case VTYPE_IP6REACH_EXTERNAL: -#endif /* HAVE_IPV6 */ prefix2str ((struct prefix *) &vertex->N.prefix, buff, size); break; default: @@ -205,10 +201,8 @@ isis_vertex_new (void *id, enum vertextype vtype) case VTYPE_IPREACH_INTERNAL: case VTYPE_IPREACH_EXTERNAL: case VTYPE_IPREACH_TE: -#ifdef HAVE_IPV6 case VTYPE_IP6REACH_INTERNAL: case VTYPE_IP6REACH_EXTERNAL: -#endif /* HAVE_IPV6 */ memcpy (&vertex->N.prefix, (struct prefix *) id, sizeof (struct prefix)); break; @@ -314,20 +308,16 @@ spftree_area_init (struct isis_area *area) { if (area->spftree[0] == NULL) area->spftree[0] = isis_spftree_new (area); -#ifdef HAVE_IPV6 if (area->spftree6[0] == NULL) area->spftree6[0] = isis_spftree_new (area); -#endif } if (area->is_type & IS_LEVEL_2) { if (area->spftree[1] == NULL) area->spftree[1] = isis_spftree_new (area); -#ifdef HAVE_IPV6 if (area->spftree6[1] == NULL) area->spftree6[1] = isis_spftree_new (area); -#endif } return; @@ -343,13 +333,11 @@ spftree_area_del (struct isis_area *area) isis_spftree_del (area->spftree[0]); area->spftree[0] = NULL; } -#ifdef HAVE_IPV6 if (area->spftree6[0]) { isis_spftree_del (area->spftree6[0]); area->spftree6[0] = NULL; } -#endif } if (area->is_type & IS_LEVEL_2) @@ -359,13 +347,11 @@ spftree_area_del (struct isis_area *area) isis_spftree_del (area->spftree[1]); area->spftree[1] = NULL; } -#ifdef HAVE_IPV6 if (area->spftree6[1] != NULL) { isis_spftree_del (area->spftree6[1]); area->spftree6[1] = NULL; } -#endif } return; @@ -378,20 +364,16 @@ spftree_area_adj_del (struct isis_area *area, struct isis_adjacency *adj) { if (area->spftree[0] != NULL) isis_spftree_adj_del (area->spftree[0], adj); -#ifdef HAVE_IPV6 if (area->spftree6[0] != NULL) isis_spftree_adj_del (area->spftree6[0], adj); -#endif } if (area->is_type & IS_LEVEL_2) { if (area->spftree[1] != NULL) isis_spftree_adj_del (area->spftree[1], adj); -#ifdef HAVE_IPV6 if (area->spftree6[1] != NULL) isis_spftree_adj_del (area->spftree6[1], adj); -#endif } return; @@ -475,10 +457,8 @@ isis_find_vertex (struct list *list, void *id, enum vertextype vtype) case VTYPE_IPREACH_INTERNAL: case VTYPE_IPREACH_EXTERNAL: case VTYPE_IPREACH_TE: -#ifdef HAVE_IPV6 case VTYPE_IP6REACH_INTERNAL: case VTYPE_IP6REACH_EXTERNAL: -#endif /* HAVE_IPV6 */ p1 = (struct prefix *) id; p2 = (struct prefix *) &vertex->N.id; if (p1->family == p2->family && p1->prefixlen == p2->prefixlen && @@ -718,9 +698,7 @@ isis_spf_process_lsp (struct isis_spftree *spftree, struct isis_lsp *lsp, struct te_ipv4_reachability *te_ipv4_reach; enum vertextype vtype; struct prefix prefix; -#ifdef HAVE_IPV6 struct ipv6_reachability *ip6reach; -#endif /* HAVE_IPV6 */ static const u_char null_sysid[ISIS_SYS_ID_LEN]; if (!speaks (lsp->tlv_data.nlpids, family)) @@ -820,7 +798,6 @@ lspfragloop: family, parent); } } -#ifdef HAVE_IPV6 if (family == AF_INET6 && lsp->tlv_data.ipv6_reachs) { prefix.family = AF_INET6; @@ -839,7 +816,6 @@ lspfragloop: family, parent); } } -#endif /* HAVE_IPV6 */ if (fragnode == NULL) fragnode = listhead (lsp->lspu.frags); @@ -939,9 +915,7 @@ isis_spf_preload_tent (struct isis_spftree *spftree, int level, int retval = ISIS_OK; u_char lsp_id[ISIS_SYS_ID_LEN + 2]; static u_char null_lsp_id[ISIS_SYS_ID_LEN + 2]; -#ifdef HAVE_IPV6 struct prefix_ipv6 *ipv6; -#endif /* HAVE_IPV6 */ for (ALL_LIST_ELEMENTS_RO (spftree->area->circuit_list, cnode, circuit)) { @@ -951,10 +925,8 @@ isis_spf_preload_tent (struct isis_spftree *spftree, int level, continue; if (family == AF_INET && !circuit->ip_router) continue; -#ifdef HAVE_IPV6 if (family == AF_INET6 && !circuit->ipv6_router) continue; -#endif /* HAVE_IPV6 */ /* * Add IP(v6) addresses of this circuit */ @@ -970,7 +942,6 @@ isis_spf_preload_tent (struct isis_spftree *spftree, int level, NULL, 0, family, parent); } } -#ifdef HAVE_IPV6 if (family == AF_INET6) { prefix.family = AF_INET6; @@ -983,7 +954,6 @@ isis_spf_preload_tent (struct isis_spftree *spftree, int level, &prefix, NULL, 0, family, parent); } } -#endif /* HAVE_IPV6 */ if (circuit->circ_type == CIRCUIT_T_BROADCAST) { /* @@ -1185,20 +1155,16 @@ isis_run_spf (struct isis_area *area, int level, int family, u_char *sysid) if (family == AF_INET) spftree = area->spftree[level - 1]; -#ifdef HAVE_IPV6 else if (family == AF_INET6) spftree = area->spftree6[level - 1]; -#endif assert (spftree); assert (sysid); /* Make all routes in current route table inactive. */ if (family == AF_INET) table = area->route_table[level - 1]; -#ifdef HAVE_IPV6 else if (family == AF_INET6) table = area->route_table6[level - 1]; -#endif isis_route_invalidate_table (area, table); @@ -1382,7 +1348,6 @@ isis_spf_schedule (struct isis_area *area, int level) return ISIS_OK; } -#ifdef HAVE_IPV6 static int isis_run_spf6_l1 (struct thread *thread) { @@ -1479,7 +1444,6 @@ isis_spf_schedule6 (struct isis_area *area, int level) return retval; } -#endif static void isis_print_paths (struct vty *vty, struct list *paths, u_char *root_sysid) @@ -1569,7 +1533,6 @@ DEFUN (show_isis_topology, isis_print_paths (vty, area->spftree[level]->paths, isis->sysid); vty_out (vty, "%s", VTY_NEWLINE); } -#ifdef HAVE_IPV6 if (area->ipv6_circuits > 0 && area->spftree6[level] && area->spftree6[level]->paths->count > 0) { @@ -1579,7 +1542,6 @@ DEFUN (show_isis_topology, isis_print_paths (vty, area->spftree6[level]->paths, isis->sysid); vty_out (vty, "%s", VTY_NEWLINE); } -#endif /* HAVE_IPV6 */ } vty_out (vty, "%s", VTY_NEWLINE); @@ -1615,7 +1577,6 @@ DEFUN (show_isis_topology_l1, isis_print_paths (vty, area->spftree[0]->paths, isis->sysid); vty_out (vty, "%s", VTY_NEWLINE); } -#ifdef HAVE_IPV6 if (area->ipv6_circuits > 0 && area->spftree6[0] && area->spftree6[0]->paths->count > 0) { @@ -1624,7 +1585,6 @@ DEFUN (show_isis_topology_l1, isis_print_paths (vty, area->spftree6[0]->paths, isis->sysid); vty_out (vty, "%s", VTY_NEWLINE); } -#endif /* HAVE_IPV6 */ vty_out (vty, "%s", VTY_NEWLINE); } @@ -1658,7 +1618,6 @@ DEFUN (show_isis_topology_l2, isis_print_paths (vty, area->spftree[1]->paths, isis->sysid); vty_out (vty, "%s", VTY_NEWLINE); } -#ifdef HAVE_IPV6 if (area->ipv6_circuits > 0 && area->spftree6[1] && area->spftree6[1]->paths->count > 0) { @@ -1667,7 +1626,6 @@ DEFUN (show_isis_topology_l2, isis_print_paths (vty, area->spftree6[1]->paths, isis->sysid); vty_out (vty, "%s", VTY_NEWLINE); } -#endif /* HAVE_IPV6 */ vty_out (vty, "%s", VTY_NEWLINE); } diff --git a/isisd/isis_spf.h b/isisd/isis_spf.h index aa543b705d..0e42cac81f 100644 --- a/isisd/isis_spf.h +++ b/isisd/isis_spf.h @@ -33,12 +33,9 @@ enum vertextype VTYPE_ES, VTYPE_IPREACH_INTERNAL, VTYPE_IPREACH_EXTERNAL, - VTYPE_IPREACH_TE -#ifdef HAVE_IPV6 - , + VTYPE_IPREACH_TE, VTYPE_IP6REACH_INTERNAL, VTYPE_IP6REACH_EXTERNAL -#endif /* HAVE_IPV6 */ }; /* @@ -83,7 +80,5 @@ void spftree_area_adj_del (struct isis_area *area, struct isis_adjacency *adj); int isis_spf_schedule (struct isis_area *area, int level); void isis_spf_cmds_init (void); -#ifdef HAVE_IPV6 int isis_spf_schedule6 (struct isis_area *area, int level); -#endif #endif /* _ZEBRA_ISIS_SPF_H */ diff --git a/isisd/isis_te.c b/isisd/isis_te.c index 109f5e4574..34cd8397f4 100644 --- a/isisd/isis_te.c +++ b/isisd/isis_te.c @@ -591,7 +591,7 @@ isis_link_params_update (struct isis_circuit *circuit, struct interface *ifp) else SUBTLV_TYPE(mtc->unrsv_bw) = 0; - if (IS_PARAM_SET(ifp->link_params, LP_TE)) + if (IS_PARAM_SET(ifp->link_params, LP_TE_METRIC)) set_circuitparams_te_metric(mtc, ifp->link_params->te_metric); else SUBTLV_TYPE(mtc->te_metric) = 0; diff --git a/isisd/isis_tlv.c b/isisd/isis_tlv.c index 1d29d78287..c1526af314 100644 --- a/isisd/isis_tlv.c +++ b/isisd/isis_tlv.c @@ -81,12 +81,10 @@ free_tlvs (struct tlvs *tlvs) list_delete (tlvs->ipv4_ext_reachs); if (tlvs->te_ipv4_reachs) list_delete (tlvs->te_ipv4_reachs); -#ifdef HAVE_IPV6 if (tlvs->ipv6_addrs) list_delete (tlvs->ipv6_addrs); if (tlvs->ipv6_reachs) list_delete (tlvs->ipv6_reachs); -#endif /* HAVE_IPV6 */ memset (tlvs, 0, sizeof (struct tlvs)); @@ -111,11 +109,9 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected, struct in_addr *ipv4_addr; struct ipv4_reachability *ipv4_reach; struct te_ipv4_reachability *te_ipv4_reach; -#ifdef HAVE_IPV6 struct in6_addr *ipv6_addr; struct ipv6_reachability *ipv6_reach; int prefix_octets; -#endif /* HAVE_IPV6 */ int value_len, retval = ISIS_OK; u_char *start = stream, *pnt = stream, *endpnt; @@ -626,7 +622,6 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected, pnt = endpnt; break; -#ifdef HAVE_IPV6 case IPV6_ADDR: /* +-------+-------+-------+-------+-------+-------+-------+-------+ * + IP version 6 address + 16 @@ -696,7 +691,6 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected, pnt = endpnt; break; -#endif /* HAVE_IPV6 */ case WAY3_HELLO: /* +---------------------------------------------------------------+ @@ -1095,7 +1089,6 @@ tlv_add_te_ipv4_reachs (struct list *te_ipv4_reachs, struct stream *stream) return add_tlv (TE_IPV4_REACHABILITY, pos - value, value, stream); } -#ifdef HAVE_IPV6 int tlv_add_ipv6_addrs (struct list *ipv6_addrs, struct stream *stream) { @@ -1152,7 +1145,6 @@ tlv_add_ipv6_reachs (struct list *ipv6_reachs, struct stream *stream) return add_tlv (IPV6_REACHABILITY, pos - value, value, stream); } -#endif /* HAVE_IPV6 */ int tlv_add_padding (struct stream *stream) diff --git a/isisd/isis_tlv.h b/isisd/isis_tlv.h index 5a39d564dc..bf2d51daa1 100644 --- a/isisd/isis_tlv.h +++ b/isisd/isis_tlv.h @@ -231,7 +231,6 @@ struct idrp_info u_char *value; }; -#ifdef HAVE_IPV6 struct ipv6_reachability { u_int32_t metric; @@ -250,7 +249,6 @@ struct ipv6_reachability #define DISTRIBUTION_EXTERNAL 0x40 #define CTRL_INFO_SUBTLVS 0x20 -#endif /* HAVE_IPV6 */ /* * Pointer to each tlv type, filled by parse_tlvs() @@ -272,10 +270,8 @@ struct tlvs struct list *ipv4_int_reachs; struct list *ipv4_ext_reachs; struct list *te_ipv4_reachs; -#ifdef HAVE_IPV6 struct list *ipv6_addrs; struct list *ipv6_reachs; -#endif struct isis_passwd auth_info; }; @@ -330,10 +326,8 @@ int tlv_add_lsp_entries (struct list *lsps, struct stream *stream); int tlv_add_ipv4_int_reachs (struct list *ipv4_reachs, struct stream *stream); int tlv_add_ipv4_ext_reachs (struct list *ipv4_reachs, struct stream *stream); int tlv_add_te_ipv4_reachs (struct list *te_ipv4_reachs, struct stream *stream); -#ifdef HAVE_IPV6 int tlv_add_ipv6_addrs (struct list *ipv6_addrs, struct stream *stream); int tlv_add_ipv6_reachs (struct list *ipv6_reachs, struct stream *stream); -#endif /* HAVE_IPV6 */ int tlv_add_padding (struct stream *stream); diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c index 646c5fa88e..dfb9b4d7ab 100644 --- a/isisd/isis_zebra.c +++ b/isisd/isis_zebra.c @@ -187,10 +187,8 @@ isis_zebra_if_address_add (int command, struct zclient *zclient, #ifdef EXTREME_DEBUG if (p->family == AF_INET) zlog_debug ("connected IP address %s", buf); -#ifdef HAVE_IPV6 if (p->family == AF_INET6) zlog_debug ("connected IPv6 address %s", buf); -#endif /* HAVE_IPV6 */ #endif /* EXTREME_DEBUG */ if (if_is_operative (c->ifp)) isis_circuit_add_addr (circuit_scan_by_ifp (c->ifp), c); @@ -223,10 +221,8 @@ isis_zebra_if_address_del (int command, struct zclient *client, if (p->family == AF_INET) zlog_debug ("disconnected IP address %s", buf); -#ifdef HAVE_IPV6 if (p->family == AF_INET6) zlog_debug ("disconnected IPv6 address %s", buf); -#endif /* HAVE_IPV6 */ #endif /* EXTREME_DEBUG */ if (if_is_operative (ifp)) @@ -352,7 +348,6 @@ isis_zebra_route_del_ipv4 (struct prefix *prefix, return; } -#ifdef HAVE_IPV6 static void isis_zebra_route_add_ipv6 (struct prefix *prefix, struct isis_route_info *route_info) @@ -518,8 +513,6 @@ isis_zebra_route_del_ipv6 (struct prefix *prefix, XFREE (MTYPE_ISIS_TMP, ifindex_list); } -#endif /* HAVE_IPV6 */ - void isis_zebra_route_update (struct prefix *prefix, struct isis_route_info *route_info) @@ -535,19 +528,15 @@ isis_zebra_route_update (struct prefix *prefix, { if (prefix->family == AF_INET) isis_zebra_route_add_ipv4 (prefix, route_info); -#ifdef HAVE_IPV6 else if (prefix->family == AF_INET6) isis_zebra_route_add_ipv6 (prefix, route_info); -#endif /* HAVE_IPV6 */ } else { if (prefix->family == AF_INET) isis_zebra_route_del_ipv4 (prefix, route_info); -#ifdef HAVE_IPV6 else if (prefix->family == AF_INET6) isis_zebra_route_del_ipv6 (prefix, route_info); -#endif /* HAVE_IPV6 */ } return; } @@ -709,10 +698,8 @@ isis_zebra_init (struct thread_master *master) zclient->interface_link_params = isis_zebra_link_params; zclient->redistribute_route_ipv4_add = isis_zebra_read_ipv4; zclient->redistribute_route_ipv4_del = isis_zebra_read_ipv4; -#ifdef HAVE_IPV6 zclient->redistribute_route_ipv6_add = isis_zebra_read_ipv6; zclient->redistribute_route_ipv6_del = isis_zebra_read_ipv6; -#endif /* HAVE_IPV6 */ return; } diff --git a/isisd/isisd.c b/isisd/isisd.c index f09afeb931..9bef250883 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -89,9 +89,7 @@ isis_new (unsigned long process_id) isis->init_circ_list = list_new (); isis->uptime = time (NULL); isis->nexthops = list_new (); -#ifdef HAVE_IPV6 isis->nexthops6 = list_new (); -#endif /* HAVE_IPV6 */ dyn_cache_init (); /* * uncomment the next line for full debugs @@ -124,17 +122,13 @@ isis_area_create (const char *area_tag) { area->lspdb[0] = lsp_db_init (); area->route_table[0] = route_table_init (); -#ifdef HAVE_IPV6 area->route_table6[0] = route_table_init (); -#endif /* HAVE_IPV6 */ } if (area->is_type & IS_LEVEL_2) { area->lspdb[1] = lsp_db_init (); area->route_table[1] = route_table_init (); -#ifdef HAVE_IPV6 area->route_table6[1] = route_table_init (); -#endif /* HAVE_IPV6 */ } spftree_area_init (area); @@ -231,9 +225,7 @@ isis_area_destroy (struct vty *vty, const char *area_tag) for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit)) { circuit->ip_router = 0; -#ifdef HAVE_IPV6 circuit->ipv6_router = 0; -#endif isis_csm_state_change (ISIS_DISABLE, circuit, area); } list_delete (area->circuit_list); @@ -267,7 +259,6 @@ isis_area_destroy (struct vty *vty, const char *area_tag) route_table_finish (area->route_table[1]); area->route_table[1] = NULL; } -#ifdef HAVE_IPV6 if (area->route_table6[0]) { route_table_finish (area->route_table6[0]); @@ -278,7 +269,6 @@ isis_area_destroy (struct vty *vty, const char *area_tag) route_table_finish (area->route_table6[1]); area->route_table6[1] = NULL; } -#endif /* HAVE_IPV6 */ isis_redist_area_finish(area); @@ -1355,7 +1345,6 @@ DEFUN (show_isis_summary, vty_out (vty, " run count : %d%s", spftree->runcount, VTY_NEWLINE); -#ifdef HAVE_IPV6 spftree = area->spftree6[level - 1]; if (spftree->pending) vty_out (vty, " IPv6 SPF: (pending)%s", VTY_NEWLINE); @@ -1374,7 +1363,6 @@ DEFUN (show_isis_summary, vty_out (vty, " run count : %d%s", spftree->runcount, VTY_NEWLINE); -#endif } } vty_out (vty, "%s", VTY_NEWLINE); @@ -1658,25 +1646,21 @@ area_resign_level (struct isis_area *area, int level) isis_spftree_del (area->spftree[level - 1]); area->spftree[level - 1] = NULL; } -#ifdef HAVE_IPV6 if (area->spftree6[level - 1]) { isis_spftree_del (area->spftree6[level - 1]); area->spftree6[level - 1] = NULL; } -#endif if (area->route_table[level - 1]) { route_table_finish (area->route_table[level - 1]); area->route_table[level - 1] = NULL; } -#ifdef HAVE_IPV6 if (area->route_table6[level - 1]) { route_table_finish (area->route_table6[level - 1]); area->route_table6[level - 1] = NULL; } -#endif /* HAVE_IPV6 */ sched_debug("ISIS (%s): Resigned from L%d - canceling LSP regeneration timer.", area->area_tag, level); @@ -1707,10 +1691,8 @@ isis_area_is_type_set(struct isis_area *area, int is_type) area->lspdb[1] = lsp_db_init (); if (area->route_table[1] == NULL) area->route_table[1] = route_table_init (); -#ifdef HAVE_IPV6 if (area->route_table6[1] == NULL) area->route_table6[1] = route_table_init (); -#endif /* HAVE_IPV6 */ break; case IS_LEVEL_1_AND_2: @@ -1728,10 +1710,8 @@ isis_area_is_type_set(struct isis_area *area, int is_type) area->lspdb[0] = lsp_db_init (); if (area->route_table[0] == NULL) area->route_table[0] = route_table_init (); -#ifdef HAVE_IPV6 if (area->route_table6[0] == NULL) area->route_table6[0] = route_table_init (); -#endif /* HAVE_IPV6 */ break; default: @@ -1749,10 +1729,13 @@ isis_area_is_type_set(struct isis_area *area, int is_type) spftree_area_init (area); - if (is_type & IS_LEVEL_1) - lsp_generate (area, IS_LEVEL_1); - if (is_type & IS_LEVEL_2) - lsp_generate (area, IS_LEVEL_2); + if (listcount (area->area_addrs) > 0) + { + if (is_type & IS_LEVEL_1) + lsp_generate (area, IS_LEVEL_1); + if (is_type & IS_LEVEL_2) + lsp_generate (area, IS_LEVEL_2); + } lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1); return; diff --git a/isisd/isisd.h b/isisd/isisd.h index f7dc0efe25..efbfafc5fb 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -48,9 +48,7 @@ struct isis struct list *area_list; /* list of IS-IS areas */ struct list *init_circ_list; struct list *nexthops; /* IPv4 next hops from this IS */ -#ifdef HAVE_IPV6 struct list *nexthops6; /* IPv6 next hops from this IS */ -#endif /* HAVE_IPV6 */ u_char max_area_addrs; /* maximumAreaAdresses */ struct area_addr *man_area_addrs; /* manualAreaAddresses */ u_int32_t debugs; /* bitmap for debug */ @@ -71,10 +69,8 @@ struct isis_area dict_t *lspdb[ISIS_LEVELS]; /* link-state dbs */ struct isis_spftree *spftree[ISIS_LEVELS]; /* The v4 SPTs */ struct route_table *route_table[ISIS_LEVELS]; /* IPv4 routes */ -#ifdef HAVE_IPV6 struct isis_spftree *spftree6[ISIS_LEVELS]; /* The v6 SPTs */ struct route_table *route_table6[ISIS_LEVELS]; /* IPv6 routes */ -#endif #define DEFAULT_LSP_MTU 1497 unsigned int lsp_mtu; /* Size of LSPs to generate */ struct list *circuit_list; /* IS-IS circuits */ @@ -124,9 +120,7 @@ struct isis_area int ip_circuits; /* logging adjacency changes? */ u_char log_adj_changes; -#ifdef HAVE_IPV6 int ipv6_circuits; -#endif /* HAVE_IPV6 */ /* Counters */ u_int32_t circuit_state_changes; struct isis_redist redist_settings[REDIST_PROTOCOL_COUNT] diff --git a/ldpd/.gitignore b/ldpd/.gitignore index be90d42119..e4ee82587a 100644 --- a/ldpd/.gitignore +++ b/ldpd/.gitignore @@ -15,4 +15,4 @@ TAGS .arch-ids *~ *.loT - +ldp_vty_cmds.c diff --git a/ldpd/Makefile.am b/ldpd/Makefile.am index c292adf6fc..6dc7c077de 100644 --- a/ldpd/Makefile.am +++ b/ldpd/Makefile.am @@ -3,12 +3,16 @@ AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\" INSTALL_SDATA=@INSTALL@ -m 600 +EXTRA_DIST= AM_CFLAGS = $(WERROR) noinst_LIBRARIES = libldp.a sbin_PROGRAMS = ldpd +BUILT_SOURCES = ldp_vty_cmds.c +EXTRA_DIST += ldp_vty.xml + libldp_a_SOURCES = \ accept.c address.c adjacency.c control.c hello.c init.c interface.c \ keepalive.c l2vpn.c labelmapping.c lde.c lde_lib.c ldpd.c \ @@ -19,6 +23,9 @@ libldp_a_SOURCES = \ noinst_HEADERS = \ control.h lde.h ldpd.h ldpe.h ldp.h log.h ldp_debug.h ldp_vty.h +ldp_vty_cmds.c: $(srcdir)/ldp_vty.xml $(srcdir)/../tools/xml2cli.pl + @PERL@ $(srcdir)/../tools/xml2cli.pl $(srcdir)/ldp_vty.xml > $@ + ldpd_SOURCES = ldpd.c ldpd_LDADD = libldp.a ../lib/libzebra.la @LIBCAP@ diff --git a/ldpd/adjacency.c b/ldpd/adjacency.c index 3607ee96b3..2e7b43296a 100644 --- a/ldpd/adjacency.c +++ b/ldpd/adjacency.c @@ -25,12 +25,55 @@ #include "ldpe.h" #include "log.h" +static __inline int adj_compare(struct adj *, struct adj *); static int adj_itimer(struct thread *); -static void tnbr_del(struct tnbr *); +static __inline int tnbr_compare(struct tnbr *, struct tnbr *); +static void tnbr_del(struct ldpd_conf *, struct tnbr *); static int tnbr_hello_timer(struct thread *); static void tnbr_start_hello_timer(struct tnbr *); static void tnbr_stop_hello_timer(struct tnbr *); +RB_GENERATE(global_adj_head, adj, global_entry, adj_compare) +RB_GENERATE(nbr_adj_head, adj, nbr_entry, adj_compare) +RB_GENERATE(ia_adj_head, adj, ia_entry, adj_compare) +RB_GENERATE(tnbr_head, tnbr, entry, tnbr_compare) + +static __inline int +adj_compare(struct adj *a, struct adj *b) +{ + if (a->source.type < b->source.type) + return (-1); + if (a->source.type > b->source.type) + return (1); + + switch (a->source.type) { + case HELLO_LINK: + if (strcmp(a->source.link.ia->iface->name, + b->source.link.ia->iface->name) < 0) + return (-1); + if (strcmp(a->source.link.ia->iface->name, + b->source.link.ia->iface->name) > 0) + return (1); + if (a->source.link.ia->af < b->source.link.ia->af) + return (-1); + if (a->source.link.ia->af > b->source.link.ia->af) + return (1); + return (ldp_addrcmp(a->source.link.ia->af, + &a->source.link.src_addr, &b->source.link.src_addr)); + case HELLO_TARGETED: + if (a->source.target->af < b->source.target->af) + return (-1); + if (a->source.target->af > b->source.target->af) + return (1); + return (ldp_addrcmp(a->source.target->af, + &a->source.target->addr, &b->source.target->addr)); + default: + fatalx("adj_get_af: unknown hello type"); + } + + return (0); +} + struct adj * adj_new(struct in_addr lsr_id, struct hello_source *source, union ldpd_addr *addr) @@ -48,11 +91,11 @@ adj_new(struct in_addr lsr_id, struct hello_source *source, adj->source = *source; adj->trans_addr = *addr; - LIST_INSERT_HEAD(&global.adj_list, adj, global_entry); + RB_INSERT(global_adj_head, &global.adj_tree, adj); switch (source->type) { case HELLO_LINK: - LIST_INSERT_HEAD(&source->link.ia->adj_list, adj, ia_entry); + RB_INSERT(ia_adj_head, &source->link.ia->adj_tree, adj); break; case HELLO_TARGETED: source->target->adj = adj; @@ -70,12 +113,12 @@ adj_del_single(struct adj *adj) adj_stop_itimer(adj); - LIST_REMOVE(adj, global_entry); + RB_REMOVE(global_adj_head, &global.adj_tree, adj); if (adj->nbr) - LIST_REMOVE(adj, nbr_entry); + RB_REMOVE(nbr_adj_head, &adj->nbr->adj_tree, adj); switch (adj->source.type) { case HELLO_LINK: - LIST_REMOVE(adj, ia_entry); + RB_REMOVE(ia_adj_head, &adj->source.link.ia->adj_tree, adj); break; case HELLO_TARGETED: adj->source.target->adj = NULL; @@ -99,7 +142,7 @@ adj_del(struct adj *adj, uint32_t notif_status) * then delete it. */ if (nbr && nbr_adj_count(nbr, nbr->af) == 0) { - LIST_FOREACH_SAFE(adj, &nbr->adj_list, nbr_entry, atmp) + RB_FOREACH_SAFE(adj, nbr_adj_head, &nbr->adj_tree, atmp) adj_del_single(adj); session_shutdown(nbr, notif_status, 0, 0); nbr_del(nbr); @@ -109,27 +152,9 @@ adj_del(struct adj *adj, uint32_t notif_status) struct adj * adj_find(struct hello_source *source) { - struct adj *adj; - - LIST_FOREACH(adj, &global.adj_list, global_entry) { - if (adj->source.type != source->type) - continue; - - switch (source->type) { - case HELLO_LINK: - if (ldp_addrcmp(source->link.ia->af, - &adj->source.link.src_addr, - &source->link.src_addr) == 0) - return (adj); - break; - case HELLO_TARGETED: - if (adj->source.target == source->target) - return (adj); - break; - } - } - - return (NULL); + struct adj adj; + adj.source = *source; + return (RB_FIND(global_adj_head, &global.adj_tree, &adj)); } int @@ -161,7 +186,7 @@ adj_itimer(struct thread *thread) if (!(adj->source.target->flags & F_TNBR_CONFIGURED) && adj->source.target->pw_count == 0) { /* remove dynamic targeted neighbor */ - tnbr_del(adj->source.target); + tnbr_del(leconf, adj->source.target); return (0); } adj->source.target->adj = NULL; @@ -188,6 +213,17 @@ adj_stop_itimer(struct adj *adj) /* targeted neighbors */ +static __inline int +tnbr_compare(struct tnbr *a, struct tnbr *b) +{ + if (a->af < b->af) + return (-1); + if (a->af > b->af) + return (1); + + return (ldp_addrcmp(a->af, &a->addr, &b->addr)); +} + struct tnbr * tnbr_new(int af, union ldpd_addr *addr) { @@ -204,34 +240,30 @@ tnbr_new(int af, union ldpd_addr *addr) } static void -tnbr_del(struct tnbr *tnbr) +tnbr_del(struct ldpd_conf *xconf, struct tnbr *tnbr) { tnbr_stop_hello_timer(tnbr); if (tnbr->adj) adj_del(tnbr->adj, S_SHUTDOWN); - LIST_REMOVE(tnbr, entry); + RB_REMOVE(tnbr_head, &xconf->tnbr_tree, tnbr); free(tnbr); } struct tnbr * tnbr_find(struct ldpd_conf *xconf, int af, union ldpd_addr *addr) { - struct tnbr *tnbr; - - LIST_FOREACH(tnbr, &xconf->tnbr_list, entry) - if (af == tnbr->af && - ldp_addrcmp(af, addr, &tnbr->addr) == 0) - return (tnbr); - - return (NULL); + struct tnbr tnbr; + tnbr.af = af; + tnbr.addr = *addr; + return (RB_FIND(tnbr_head, &xconf->tnbr_tree, &tnbr)); } struct tnbr * -tnbr_check(struct tnbr *tnbr) +tnbr_check(struct ldpd_conf *xconf, struct tnbr *tnbr) { if (!(tnbr->flags & (F_TNBR_CONFIGURED|F_TNBR_DYNAMIC)) && tnbr->pw_count == 0) { - tnbr_del(tnbr); + tnbr_del(xconf, tnbr); return (NULL); } @@ -276,7 +308,7 @@ tnbr_update_all(int af) struct tnbr *tnbr; /* update targeted neighbors */ - LIST_FOREACH(tnbr, &leconf->tnbr_list, entry) + RB_FOREACH(tnbr, tnbr_head, &leconf->tnbr_tree) if (tnbr->af == af || af == AF_UNSPEC) tnbr_update(tnbr); } diff --git a/ldpd/hello.c b/ldpd/hello.c index 755b25aa85..95be1d5111 100644 --- a/ldpd/hello.c +++ b/ldpd/hello.c @@ -261,7 +261,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, if (tnbr && (tnbr->flags & F_TNBR_DYNAMIC) && !((flags & F_HELLO_REQ_TARG))) { tnbr->flags &= ~F_TNBR_DYNAMIC; - tnbr = tnbr_check(tnbr); + tnbr = tnbr_check(leconf, tnbr); } if (!tnbr) { @@ -273,7 +273,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, tnbr = tnbr_new(af, src); tnbr->flags |= F_TNBR_DYNAMIC; tnbr_update(tnbr); - LIST_INSERT_HEAD(&leconf->tnbr_list, tnbr, entry); + RB_INSERT(tnbr_head, &leconf->tnbr_tree, tnbr); } source.type = HELLO_TARGETED; @@ -364,7 +364,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af, adj = adj_new(lsr_id, &source, &trans_addr); if (nbr) { adj->nbr = nbr; - LIST_INSERT_HEAD(&nbr->adj_list, adj, nbr_entry); + RB_INSERT(nbr_adj_head, &nbr->adj_tree, adj); } } diff --git a/ldpd/interface.c b/ldpd/interface.c index b6472fe5e8..8fea91b878 100644 --- a/ldpd/interface.c +++ b/ldpd/interface.c @@ -26,6 +26,7 @@ #include "sockopt.h" +static __inline int iface_compare(struct iface *, struct iface *); static struct if_addr *if_addr_new(struct kaddr *); static struct if_addr *if_addr_lookup(struct if_addr_head *, struct kaddr *); static int if_start(struct iface *, int); @@ -39,6 +40,14 @@ static int if_leave_ipv4_group(struct iface *, struct in_addr *); static int if_join_ipv6_group(struct iface *, struct in6_addr *); static int if_leave_ipv6_group(struct iface *, struct in6_addr *); +RB_GENERATE(iface_head, iface, entry, iface_compare) + +static __inline int +iface_compare(struct iface *a, struct iface *b) +{ + return (strcmp(a->name, b->name)); +} + struct iface * if_new(struct kif *kif) { @@ -57,30 +66,18 @@ if_new(struct kif *kif) iface->ipv4.iface = iface; iface->ipv4.enabled = 0; iface->ipv4.state = IF_STA_DOWN; - LIST_INIT(&iface->ipv4.adj_list); + RB_INIT(&iface->ipv4.adj_tree); /* ipv6 */ iface->ipv6.af = AF_INET6; iface->ipv6.iface = iface; iface->ipv6.enabled = 0; iface->ipv6.state = IF_STA_DOWN; - LIST_INIT(&iface->ipv6.adj_list); + RB_INIT(&iface->ipv6.adj_tree); return (iface); } -struct iface * -if_lookup(struct ldpd_conf *xconf, unsigned short ifindex) -{ - struct iface *iface; - - LIST_FOREACH(iface, &xconf->iface_list, entry) - if (iface->ifindex == ifindex) - return (iface); - - return (NULL); -} - void if_exit(struct iface *iface) { @@ -100,17 +97,25 @@ if_exit(struct iface *iface) } struct iface * -if_lookup_name(struct ldpd_conf *xconf, const char *ifname) +if_lookup(struct ldpd_conf *xconf, unsigned short ifindex) { struct iface *iface; - LIST_FOREACH(iface, &xconf->iface_list, entry) - if (strcmp(iface->name, ifname) == 0) + RB_FOREACH(iface, iface_head, &xconf->iface_tree) + if (iface->ifindex == ifindex) return (iface); return (NULL); } +struct iface * +if_lookup_name(struct ldpd_conf *xconf, const char *ifname) +{ + struct iface iface; + strlcpy(iface.name, ifname, sizeof(iface.name)); + return (RB_FIND(iface_head, &xconf->iface_tree, &iface)); +} + void if_update_info(struct iface *iface, struct kif *kif) { @@ -288,7 +293,7 @@ if_reset(struct iface *iface, int af) ia = iface_af_get(iface, af); if_stop_hello_timer(ia); - while ((adj = LIST_FIRST(&ia->adj_list)) != NULL) + while ((adj = RB_ROOT(&ia->adj_tree)) != NULL) adj_del(adj, S_SHUTDOWN); /* try to cleanup */ @@ -380,7 +385,7 @@ if_update_all(int af) { struct iface *iface; - LIST_FOREACH(iface, &leconf->iface_list, entry) + RB_FOREACH(iface, iface_head, &leconf->iface_tree) if_update(iface, af); } @@ -460,7 +465,7 @@ if_to_ctl(struct iface_af *ia) ictl.uptime = 0; ictl.adj_cnt = 0; - LIST_FOREACH(adj, &ia->adj_list, ia_entry) + RB_FOREACH(adj, ia_adj_head, &ia->adj_tree) ictl.adj_cnt++; return (&ictl); diff --git a/ldpd/l2vpn.c b/ldpd/l2vpn.c index 851ff77b73..c1d0437fba 100644 --- a/ldpd/l2vpn.c +++ b/ldpd/l2vpn.c @@ -26,7 +26,20 @@ #include "lde.h" #include "log.h" -static void l2vpn_pw_fec(struct l2vpn_pw *, struct fec *); +static void l2vpn_pw_fec(struct l2vpn_pw *, struct fec *); +static __inline int l2vpn_compare(struct l2vpn *, struct l2vpn *); +static __inline int l2vpn_if_compare(struct l2vpn_if *, struct l2vpn_if *); +static __inline int l2vpn_pw_compare(struct l2vpn_pw *, struct l2vpn_pw *); + +RB_GENERATE(l2vpn_head, l2vpn, entry, l2vpn_compare) +RB_GENERATE(l2vpn_if_head, l2vpn_if, entry, l2vpn_if_compare) +RB_GENERATE(l2vpn_pw_head, l2vpn_pw, entry, l2vpn_pw_compare) + +static __inline int +l2vpn_compare(struct l2vpn *a, struct l2vpn *b) +{ + return (strcmp(a->name, b->name)); +} struct l2vpn * l2vpn_new(const char *name) @@ -42,9 +55,9 @@ l2vpn_new(const char *name) l2vpn->mtu = DEFAULT_L2VPN_MTU; l2vpn->pw_type = DEFAULT_PW_TYPE; - LIST_INIT(&l2vpn->if_list); - LIST_INIT(&l2vpn->pw_list); - LIST_INIT(&l2vpn->pw_inactive_list); + RB_INIT(&l2vpn->if_tree); + RB_INIT(&l2vpn->pw_tree); + RB_INIT(&l2vpn->pw_inactive_tree); return (l2vpn); } @@ -52,13 +65,9 @@ l2vpn_new(const char *name) struct l2vpn * l2vpn_find(struct ldpd_conf *xconf, const char *name) { - struct l2vpn *l2vpn; - - LIST_FOREACH(l2vpn, &xconf->l2vpn_list, entry) - if (strcmp(l2vpn->name, name) == 0) - return (l2vpn); - - return (NULL); + struct l2vpn l2vpn; + strlcpy(l2vpn.name, name, sizeof(l2vpn.name)); + return (RB_FIND(l2vpn_head, &xconf->l2vpn_tree, &l2vpn)); } void @@ -67,16 +76,16 @@ l2vpn_del(struct l2vpn *l2vpn) struct l2vpn_if *lif; struct l2vpn_pw *pw; - while ((lif = LIST_FIRST(&l2vpn->if_list)) != NULL) { - LIST_REMOVE(lif, entry); + while ((lif = RB_ROOT(&l2vpn->if_tree)) != NULL) { + RB_REMOVE(l2vpn_if_head, &l2vpn->if_tree, lif); free(lif); } - while ((pw = LIST_FIRST(&l2vpn->pw_list)) != NULL) { - LIST_REMOVE(pw, entry); + while ((pw = RB_ROOT(&l2vpn->pw_tree)) != NULL) { + RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_tree, pw); free(pw); } - while ((pw = LIST_FIRST(&l2vpn->pw_inactive_list)) != NULL) { - LIST_REMOVE(pw, entry); + while ((pw = RB_ROOT(&l2vpn->pw_inactive_tree)) != NULL) { + RB_REMOVE(l2vpn_pw_head, &l2vpn->pw_inactive_tree, pw); free(pw); } @@ -88,7 +97,7 @@ l2vpn_init(struct l2vpn *l2vpn) { struct l2vpn_pw *pw; - LIST_FOREACH(pw, &l2vpn->pw_list, entry) + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) l2vpn_pw_init(pw); } @@ -97,10 +106,16 @@ l2vpn_exit(struct l2vpn *l2vpn) { struct l2vpn_pw *pw; - LIST_FOREACH(pw, &l2vpn->pw_list, entry) + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) l2vpn_pw_exit(pw); } +static __inline int +l2vpn_if_compare(struct l2vpn_if *a, struct l2vpn_if *b) +{ + return (strcmp(a->ifname, b->ifname)); +} + struct l2vpn_if * l2vpn_if_new(struct l2vpn *l2vpn, struct kif *kif) { @@ -122,7 +137,7 @@ l2vpn_if_find(struct l2vpn *l2vpn, unsigned int ifindex) { struct l2vpn_if *lif; - LIST_FOREACH(lif, &l2vpn->if_list, entry) + RB_FOREACH(lif, l2vpn_if_head, &l2vpn->if_tree) if (lif->ifindex == ifindex) return (lif); @@ -132,15 +147,16 @@ l2vpn_if_find(struct l2vpn *l2vpn, unsigned int ifindex) struct l2vpn_if * l2vpn_if_find_name(struct l2vpn *l2vpn, const char *ifname) { - struct l2vpn_if *lif; - - LIST_FOREACH(lif, &l2vpn->if_list, entry) - if (strcmp(lif->ifname, ifname) == 0) - return (lif); - - return (NULL); + struct l2vpn_if lif; + strlcpy(lif.ifname, ifname, sizeof(lif.ifname)); + return (RB_FIND(l2vpn_if_head, &l2vpn->if_tree, &lif)); } +static __inline int +l2vpn_pw_compare(struct l2vpn_pw *a, struct l2vpn_pw *b) +{ + return (strcmp(a->ifname, b->ifname)); +} struct l2vpn_pw * l2vpn_pw_new(struct l2vpn *l2vpn, struct kif *kif) @@ -162,10 +178,10 @@ l2vpn_pw_find(struct l2vpn *l2vpn, unsigned int ifindex) { struct l2vpn_pw *pw; - LIST_FOREACH(pw, &l2vpn->pw_list, entry) + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) if (pw->ifindex == ifindex) return (pw); - LIST_FOREACH(pw, &l2vpn->pw_inactive_list, entry) + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_inactive_tree) if (pw->ifindex == ifindex) return (pw); @@ -176,15 +192,13 @@ struct l2vpn_pw * l2vpn_pw_find_name(struct l2vpn *l2vpn, const char *ifname) { struct l2vpn_pw *pw; + struct l2vpn_pw s; - LIST_FOREACH(pw, &l2vpn->pw_list, entry) - if (strcmp(pw->ifname, ifname) == 0) - return (pw); - LIST_FOREACH(pw, &l2vpn->pw_inactive_list, entry) - if (strcmp(pw->ifname, ifname) == 0) - return (pw); - - return (NULL); + strlcpy(s.ifname, ifname, sizeof(s.ifname)); + pw = RB_FIND(l2vpn_pw_head, &l2vpn->pw_tree, &s); + if (pw) + return (pw); + return (RB_FIND(l2vpn_pw_head, &l2vpn->pw_inactive_tree, &s)); } void @@ -399,8 +413,8 @@ l2vpn_sync_pws(int af, union ldpd_addr *addr) struct fec_node *fn; struct fec_nh *fnh; - LIST_FOREACH(l2vpn, &ldeconf->l2vpn_list, entry) { - LIST_FOREACH(pw, &l2vpn->pw_list, entry) { + RB_FOREACH(l2vpn, l2vpn_head, &ldeconf->l2vpn_tree) { + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) { if (af != pw->af || ldp_addrcmp(af, &pw->addr, addr)) continue; @@ -428,8 +442,8 @@ l2vpn_pw_ctl(pid_t pid) struct l2vpn_pw *pw; static struct ctl_pw pwctl; - LIST_FOREACH(l2vpn, &ldeconf->l2vpn_list, entry) - LIST_FOREACH(pw, &l2vpn->pw_list, entry) { + RB_FOREACH(l2vpn, l2vpn_head, &ldeconf->l2vpn_tree) + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) { memset(&pwctl, 0, sizeof(pwctl)); strlcpy(pwctl.l2vpn_name, pw->l2vpn->name, sizeof(pwctl.l2vpn_name)); @@ -459,7 +473,7 @@ l2vpn_binding_ctl(pid_t pid) fn = (struct fec_node *)f; if (fn->local_label == NO_LABEL && - LIST_EMPTY(&fn->downstream)) + RB_EMPTY(&fn->downstream)) continue; memset(&pwctl, 0, sizeof(pwctl)); @@ -477,7 +491,7 @@ l2vpn_binding_ctl(pid_t pid) } else pwctl.local_label = NO_LABEL; - LIST_FOREACH(me, &fn->downstream, entry) + RB_FOREACH(me, lde_map_head, &fn->downstream) if (f->u.pwid.lsr_id.s_addr == me->nexthop->id.s_addr) break; @@ -508,7 +522,7 @@ ldpe_l2vpn_init(struct l2vpn *l2vpn) { struct l2vpn_pw *pw; - LIST_FOREACH(pw, &l2vpn->pw_list, entry) + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) ldpe_l2vpn_pw_init(pw); } @@ -517,7 +531,7 @@ ldpe_l2vpn_exit(struct l2vpn *l2vpn) { struct l2vpn_pw *pw; - LIST_FOREACH(pw, &l2vpn->pw_list, entry) + RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) ldpe_l2vpn_pw_exit(pw); } @@ -530,7 +544,7 @@ ldpe_l2vpn_pw_init(struct l2vpn_pw *pw) if (tnbr == NULL) { tnbr = tnbr_new(pw->af, &pw->addr); tnbr_update(tnbr); - LIST_INSERT_HEAD(&leconf->tnbr_list, tnbr, entry); + RB_INSERT(tnbr_head, &leconf->tnbr_tree, tnbr); } tnbr->pw_count++; @@ -544,6 +558,6 @@ ldpe_l2vpn_pw_exit(struct l2vpn_pw *pw) tnbr = tnbr_find(leconf, pw->af, &pw->addr); if (tnbr) { tnbr->pw_count--; - tnbr_check(tnbr); + tnbr_check(leconf, tnbr); } } diff --git a/ldpd/lde.c b/ldpd/lde.c index 67ed982ec5..0aa422c23a 100644 --- a/ldpd/lde.c +++ b/ldpd/lde.c @@ -45,12 +45,14 @@ static struct lde_nbr *lde_nbr_find(uint32_t); static void lde_nbr_clear(void); static void lde_nbr_addr_update(struct lde_nbr *, struct lde_addr *, int); +static __inline int lde_map_compare(struct lde_map *, struct lde_map *); static void lde_map_free(void *); static int lde_address_add(struct lde_nbr *, struct lde_addr *); static int lde_address_del(struct lde_nbr *, struct lde_addr *); static void lde_address_list_free(struct lde_nbr *); RB_GENERATE(nbr_tree, lde_nbr, entry, lde_nbr_compare) +RB_GENERATE(lde_map_head, lde_map, entry, lde_map_compare) struct ldpd_conf *ldeconf; struct nbr_tree lde_nbrs = RB_INITIALIZER(&lde_nbrs); @@ -69,9 +71,9 @@ static zebra_capabilities_t _caps_p [] = static struct zebra_privs_t lde_privs = { -#if defined(QUAGGA_USER) && defined(QUAGGA_GROUP) - .user = QUAGGA_USER, - .group = QUAGGA_GROUP, +#if defined(FRR_USER) && defined(FRR_GROUP) + .user = FRR_USER, + .group = FRR_GROUP, #endif #if defined(VTY_GROUP) .vty_group = VTY_GROUP, @@ -471,10 +473,10 @@ lde_dispatch_parent(struct thread *thread) fatal(NULL); memcpy(nconf, imsg.data, sizeof(struct ldpd_conf)); - LIST_INIT(&nconf->iface_list); - LIST_INIT(&nconf->tnbr_list); - LIST_INIT(&nconf->nbrp_list); - LIST_INIT(&nconf->l2vpn_list); + RB_INIT(&nconf->iface_tree); + RB_INIT(&nconf->tnbr_tree); + RB_INIT(&nconf->nbrp_tree); + RB_INIT(&nconf->l2vpn_tree); break; case IMSG_RECONF_IFACE: if ((niface = malloc(sizeof(struct iface))) == NULL) @@ -482,37 +484,37 @@ lde_dispatch_parent(struct thread *thread) memcpy(niface, imsg.data, sizeof(struct iface)); LIST_INIT(&niface->addr_list); - LIST_INIT(&niface->ipv4.adj_list); - LIST_INIT(&niface->ipv6.adj_list); + RB_INIT(&niface->ipv4.adj_tree); + RB_INIT(&niface->ipv6.adj_tree); niface->ipv4.iface = niface; niface->ipv6.iface = niface; - LIST_INSERT_HEAD(&nconf->iface_list, niface, entry); + RB_INSERT(iface_head, &nconf->iface_tree, niface); break; case IMSG_RECONF_TNBR: if ((ntnbr = malloc(sizeof(struct tnbr))) == NULL) fatal(NULL); memcpy(ntnbr, imsg.data, sizeof(struct tnbr)); - LIST_INSERT_HEAD(&nconf->tnbr_list, ntnbr, entry); + RB_INSERT(tnbr_head, &nconf->tnbr_tree, ntnbr); break; case IMSG_RECONF_NBRP: if ((nnbrp = malloc(sizeof(struct nbr_params))) == NULL) fatal(NULL); memcpy(nnbrp, imsg.data, sizeof(struct nbr_params)); - LIST_INSERT_HEAD(&nconf->nbrp_list, nnbrp, entry); + RB_INSERT(nbrp_head, &nconf->nbrp_tree, nnbrp); break; case IMSG_RECONF_L2VPN: if ((nl2vpn = malloc(sizeof(struct l2vpn))) == NULL) fatal(NULL); memcpy(nl2vpn, imsg.data, sizeof(struct l2vpn)); - LIST_INIT(&nl2vpn->if_list); - LIST_INIT(&nl2vpn->pw_list); - LIST_INIT(&nl2vpn->pw_inactive_list); + RB_INIT(&nl2vpn->if_tree); + RB_INIT(&nl2vpn->pw_tree); + RB_INIT(&nl2vpn->pw_inactive_tree); - LIST_INSERT_HEAD(&nconf->l2vpn_list, nl2vpn, entry); + RB_INSERT(l2vpn_head, &nconf->l2vpn_tree, nl2vpn); break; case IMSG_RECONF_L2VPN_IF: if ((nlif = malloc(sizeof(struct l2vpn_if))) == NULL) @@ -520,7 +522,7 @@ lde_dispatch_parent(struct thread *thread) memcpy(nlif, imsg.data, sizeof(struct l2vpn_if)); nlif->l2vpn = nl2vpn; - LIST_INSERT_HEAD(&nl2vpn->if_list, nlif, entry); + RB_INSERT(l2vpn_if_head, &nl2vpn->if_tree, nlif); break; case IMSG_RECONF_L2VPN_PW: if ((npw = malloc(sizeof(struct l2vpn_pw))) == NULL) @@ -528,7 +530,7 @@ lde_dispatch_parent(struct thread *thread) memcpy(npw, imsg.data, sizeof(struct l2vpn_pw)); npw->l2vpn = nl2vpn; - LIST_INSERT_HEAD(&nl2vpn->pw_list, npw, entry); + RB_INSERT(l2vpn_pw_head, &nl2vpn->pw_tree, npw); break; case IMSG_RECONF_L2VPN_IPW: if ((npw = malloc(sizeof(struct l2vpn_pw))) == NULL) @@ -536,7 +538,7 @@ lde_dispatch_parent(struct thread *thread) memcpy(npw, imsg.data, sizeof(struct l2vpn_pw)); npw->l2vpn = nl2vpn; - LIST_INSERT_HEAD(&nl2vpn->pw_inactive_list, npw, entry); + RB_INSERT(l2vpn_pw_head, &nl2vpn->pw_inactive_tree, npw); break; case IMSG_RECONF_END: merge_config(ldeconf, nconf); @@ -1141,6 +1143,13 @@ lde_nbr_addr_update(struct lde_nbr *ln, struct lde_addr *lde_addr, int removed) } } +static __inline int +lde_map_compare(struct lde_map *a, struct lde_map *b) +{ + return (ldp_addrcmp(AF_INET, (union ldpd_addr *)&a->nexthop->id, + (union ldpd_addr *)&b->nexthop->id)); +} + struct lde_map * lde_map_add(struct lde_nbr *ln, struct fec_node *fn, int sent) { @@ -1154,13 +1163,15 @@ lde_map_add(struct lde_nbr *ln, struct fec_node *fn, int sent) me->nexthop = ln; if (sent) { - LIST_INSERT_HEAD(&fn->upstream, me, entry); + RB_INSERT(lde_map_head, &fn->upstream, me); + me->head = &fn->upstream; if (fec_insert(&ln->sent_map, &me->fec)) log_warnx("failed to add %s to sent map", log_fec(&me->fec)); /* XXX on failure more cleanup is needed */ } else { - LIST_INSERT_HEAD(&fn->downstream, me, entry); + RB_INSERT(lde_map_head, &fn->downstream, me); + me->head = &fn->downstream; if (fec_insert(&ln->recv_map, &me->fec)) log_warnx("failed to add %s to recv map", log_fec(&me->fec)); @@ -1185,7 +1196,7 @@ lde_map_free(void *ptr) { struct lde_map *map = ptr; - LIST_REMOVE(map, entry); + RB_REMOVE(lde_map_head, map->head, map); free(map); } diff --git a/ldpd/lde.h b/ldpd/lde.h index 5f5d37defb..fe90b2c852 100644 --- a/ldpd/lde.h +++ b/ldpd/lde.h @@ -62,10 +62,13 @@ struct lde_req { /* mapping entries */ struct lde_map { struct fec fec; - LIST_ENTRY(lde_map) entry; + struct lde_map_head *head; /* fec_node's upstream/downstream */ + RB_ENTRY(lde_map) entry; struct lde_nbr *nexthop; struct map map; }; +RB_HEAD(lde_map_head, lde_map); +RB_PROTOTYPE(lde_map_head, lde_map, entry, lde_map_cmp); /* withdraw entries */ struct lde_wdraw { @@ -112,8 +115,8 @@ struct fec_node { struct fec fec; LIST_HEAD(, fec_nh) nexthops; /* fib nexthops */ - LIST_HEAD(, lde_map) downstream; /* recv mappings */ - LIST_HEAD(, lde_map) upstream; /* sent mappings */ + struct lde_map_head downstream; /* recv mappings */ + struct lde_map_head upstream; /* sent mappings */ uint32_t local_label; void *data; /* fec specific data */ diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c index 14ac592af9..df65edad1a 100644 --- a/ldpd/lde_lib.c +++ b/ldpd/lde_lib.c @@ -159,7 +159,7 @@ rt_dump(pid_t pid) RB_FOREACH(f, fec_tree, &ft) { fn = (struct fec_node *)f; if (fn->local_label == NO_LABEL && - LIST_EMPTY(&fn->downstream)) + RB_EMPTY(&fn->downstream)) continue; rtctl.first = 1; @@ -179,7 +179,7 @@ rt_dump(pid_t pid) } rtctl.local_label = fn->local_label; - LIST_FOREACH(me, &fn->downstream, entry) { + RB_FOREACH(me, lde_map_head, &fn->downstream) { rtctl.in_use = lde_nbr_is_nexthop(fn, me->nexthop); rtctl.nexthop = me->nexthop->id; rtctl.remote_label = me->map.label; @@ -188,7 +188,7 @@ rt_dump(pid_t pid) &rtctl, sizeof(rtctl)); rtctl.first = 0; } - if (LIST_EMPTY(&fn->downstream)) { + if (RB_EMPTY(&fn->downstream)) { rtctl.in_use = 0; rtctl.nexthop.s_addr = INADDR_ANY; rtctl.remote_label = NO_LABEL; @@ -224,10 +224,10 @@ fec_free(void *arg) while ((fnh = LIST_FIRST(&fn->nexthops))) fec_nh_del(fnh); - if (!LIST_EMPTY(&fn->downstream)) + if (!RB_EMPTY(&fn->downstream)) log_warnx("%s: fec %s downstream list not empty", __func__, log_fec(&fn->fec)); - if (!LIST_EMPTY(&fn->upstream)) + if (!RB_EMPTY(&fn->upstream)) log_warnx("%s: fec %s upstream list not empty", __func__, log_fec(&fn->fec)); @@ -251,8 +251,8 @@ fec_add(struct fec *fec) fn->fec = *fec; fn->local_label = NO_LABEL; - LIST_INIT(&fn->upstream); - LIST_INIT(&fn->downstream); + RB_INIT(&fn->upstream); + RB_INIT(&fn->downstream); LIST_INIT(&fn->nexthops); if (fec_insert(&ft, &fn->fec)) @@ -774,8 +774,8 @@ lde_gc_timer(struct thread *thread) fn = (struct fec_node *) fec; if (!LIST_EMPTY(&fn->nexthops) || - !LIST_EMPTY(&fn->downstream) || - !LIST_EMPTY(&fn->upstream)) + !RB_EMPTY(&fn->downstream) || + !RB_EMPTY(&fn->upstream)) continue; fec_remove(&ft, &fn->fec); diff --git a/ldpd/ldp_debug.c b/ldpd/ldp_debug.c index 15dd06a0f3..86b679d8aa 100644 --- a/ldpd/ldp_debug.c +++ b/ldpd/ldp_debug.c @@ -74,7 +74,7 @@ ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) DEBUG_OFF(event, EVENT); else DEBUG_ON(event, EVENT); - } else if (strcmp(type_str, "messages") == 0) { + } else if (strcmp(type_str, "messages") == 0) { all = (vty_get_arg_value(args, "all")) ? 1 : 0; dir_str = vty_get_arg_value(args, "dir"); if (dir_str == NULL) @@ -99,7 +99,7 @@ ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) DEBUG_ON(msg, MSG_SEND_ALL); } } - } else if (strcmp(type_str, "zebra") == 0) { + } else if (strcmp(type_str, "zebra") == 0) { if (disable) DEBUG_OFF(zebra, ZEBRA); else diff --git a/ldpd/ldp_vty.xml b/ldpd/ldp_vty.xml index ee5c6e4df2..9103dd0898 100644 --- a/ldpd/ldp_vty.xml +++ b/ldpd/ldp_vty.xml @@ -1,5 +1,5 @@ - +