diff options
author | David Lamparter <equinox@diac24.net> | 2017-01-03 16:44:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-03 16:44:44 +0100 |
commit | 9b532e09f9a612884b2f394fe17d2d3386d3e3a9 (patch) | |
tree | 416ce8e13e3fd965cee263946e6c86f7e2efa68b /bgpd | |
parent | Merge pull request #28 from opensourcerouting/dev/osr/rename-part1 (diff) | |
parent | lib: Partial Revert of 4ecc09d and modify zclient connect behavior (diff) | |
download | frr-9b532e09f9a612884b2f394fe17d2d3386d3e3a9.tar.xz frr-9b532e09f9a612884b2f394fe17d2d3386d3e3a9.zip |
Merge pull request #37 from LabNConsulting/working/2.0/patch-set-170102a
Working/2.0/patch set 170102a
Diffstat (limited to 'bgpd')
-rw-r--r-- | bgpd/bgp_attr.c | 223 | ||||
-rw-r--r-- | bgpd/bgp_attr.h | 2 | ||||
-rw-r--r-- | bgpd/bgp_ecommunity.c | 8 | ||||
-rw-r--r-- | bgpd/bgp_route.c | 301 | ||||
-rw-r--r-- | bgpd/bgp_vty.c | 154 | ||||
-rw-r--r-- | bgpd/bgp_vty.h | 10 | ||||
-rw-r--r-- | bgpd/rfapi/bgp_rfapi_cfg.c | 2 | ||||
-rw-r--r-- | bgpd/rfapi/bgp_rfapi_cfg.h | 6 | ||||
-rw-r--r-- | bgpd/rfapi/rfapi.c | 28 | ||||
-rw-r--r-- | bgpd/rfapi/rfapi.h | 1 | ||||
-rw-r--r-- | bgpd/rfapi/rfapi_import.c | 49 | ||||
-rw-r--r-- | bgpd/rfapi/rfapi_import.h | 3 | ||||
-rw-r--r-- | bgpd/rfapi/rfapi_rib.c | 2 | ||||
-rw-r--r-- | bgpd/rfapi/rfapi_vty.c | 84 | ||||
-rw-r--r-- | bgpd/rfapi/vnc_export_bgp.c | 1 |
15 files changed, 540 insertions, 334 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 827e4610f..2115fb5ef 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -220,6 +220,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) { @@ -287,14 +292,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) { @@ -325,6 +326,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; @@ -433,16 +524,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; } @@ -480,28 +561,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 } } @@ -522,6 +587,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 } } @@ -542,6 +613,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 } } @@ -598,7 +675,12 @@ attrhash_key_make (void *p) MIX(cluster_hash_key_make (extra->cluster)); if (extra->transit) MIX(transit_hash_key_make (extra->transit)); - + 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 #ifdef HAVE_IPV6 MIX(extra->mp_nexthop_len); key = jhash(extra->mp_nexthop_global.s6_addr, IPV6_MAX_BYTELEN, key); @@ -711,13 +793,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 } @@ -772,11 +853,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; } @@ -810,6 +907,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; @@ -935,6 +1040,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 } } @@ -1000,11 +1113,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 } } @@ -2492,10 +2611,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; } @@ -3183,6 +3310,7 @@ bgp_attr_init (void) ecommunity_init (); cluster_init (); transit_init (); + encap_init (); } void @@ -3194,6 +3322,7 @@ bgp_attr_finish (void) ecommunity_finish (); cluster_finish (); transit_finish (); + encap_finish (); } /* Make attribute packet. */ diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index d4f45ba60..6e639078d 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_ecommunity.c b/bgpd/bgp_ecommunity.c index 6c72aa36d..65415dcee 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_route.c b/bgpd/bgp_route.c index a61899447..c717a930b 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -631,8 +631,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); @@ -868,9 +869,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; @@ -1800,6 +1800,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; @@ -4479,7 +4480,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", @@ -8167,12 +8167,10 @@ DEFUN (show_ip_bgp_ipv4, "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal, - NULL, uj); - return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL, uj); + return bgp_show (vty, NULL, AFI_IP, + bgp_vty_safi_from_arg(argv[0]), + bgp_show_type_normal, NULL, uj); } ALIAS (show_ip_bgp_ipv4, @@ -8218,12 +8216,10 @@ DEFUN (show_ip_bgp_route_pathtype, DEFUN (show_bgp_ipv4_safi_route_pathtype, show_bgp_ipv4_safi_route_pathtype_cmd, - "show bgp ipv4 (unicast|multicast) A.B.C.D (bestpath|multipath) {json}", + "show bgp ipv4 (unicast|multicast|vpn|encap) A.B.C.D (bestpath|multipath) {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "Display only the bestpath\n" "Display only multipaths\n" @@ -8231,16 +8227,14 @@ DEFUN (show_bgp_ipv4_safi_route_pathtype, { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0, BGP_PATH_MULTIPATH, uj); + if (strncmp (argv[2], "b", 1) == 0) + return bgp_show_route (vty, NULL, argv[1], AFI_IP, + bgp_vty_safi_from_arg(argv[0]), + NULL, 0, BGP_PATH_BESTPATH, uj); else - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0, BGP_PATH_MULTIPATH, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP, + bgp_vty_safi_from_arg(argv[0]), + NULL, 0, BGP_PATH_MULTIPATH, uj); } DEFUN (show_bgp_ipv4_prefix, @@ -8281,32 +8275,27 @@ DEFUN (show_bgp_ipv6_prefix, DEFUN (show_ip_bgp_ipv4_route, show_ip_bgp_ipv4_route_cmd, - "show ip bgp ipv4 (unicast|multicast) A.B.C.D {json}", + "show ip bgp ipv4 (unicast|multicast|vpn|encap) A.B.C.D {json}", SHOW_STR IP_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Network in the BGP routing table to display\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0, BGP_PATH_ALL, uj); - - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0, BGP_PATH_ALL, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP, + bgp_vty_safi_from_arg(argv[0]), + NULL, 0, BGP_PATH_ALL, uj); } ALIAS (show_ip_bgp_ipv4_route, show_bgp_ipv4_safi_route_cmd, - "show bgp ipv4 (unicast|multicast) A.B.C.D {json}", + "show bgp ipv4 (unicast|multicast|vpn|encap) A.B.C.D {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Network in the BGP routing table to display\n" "JavaScript Object Notation\n") @@ -8324,78 +8313,123 @@ DEFUN (show_ip_bgp_vpnv4_all_route, return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0, BGP_PATH_ALL, use_json(argc, argv)); } -DEFUN (show_bgp_ipv4_vpn_route, - show_bgp_ipv4_vpn_route_cmd, - "show bgp ipv4 vpn A.B.C.D {json}", +DEFUN (show_bgp_ipv4_safi_rd_route, + show_bgp_ipv4_safi_rd_route_cmd, + "show bgp ipv4 (encap|vpn) rd ASN:nn_or_IP-address:nn A.B.C.D {json}", SHOW_STR BGP_STR "Address Family\n" - "Display VPN NLRI specific information\n" - "Network in the BGP routing table to display\n" - JSON_STR) + "Address Family Modifier\n" + "Address Family Modifier\n" + "Display information for a route distinguisher\n" + "ENCAP Route Distinguisher\n" + "Network in the BGP routing table to display\n") { - return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0, BGP_PATH_ALL, use_json (argc, argv)); + int ret; + struct prefix_rd prd; + safi_t safi; + + if (bgp_parse_safi(argv[0], &safi)) { + vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE); + return CMD_WARNING; + } + ret = str2prefix_rd (argv[1], &prd); + if (! ret) + { + vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); + return CMD_WARNING; + } + return bgp_show_route (vty, NULL, argv[2], AFI_IP, safi, &prd, 0, BGP_PATH_ALL, use_json (argc, argv)); } -DEFUN (show_bgp_ipv6_vpn_route, - show_bgp_ipv6_vpn_route_cmd, - "show bgp ipv6 vpn X:X::X:X {json}", +DEFUN (show_bgp_ipv6_safi_rd_route, + show_bgp_ipv6_safi_rd_route_cmd, + "show bgp ipv6 (encap|vpn) rd ASN:nn_or_IP-address:nn X:X::X:X {json}", SHOW_STR BGP_STR "Address Family\n" - "Display VPN NLRI specific information\n" - "Network in the BGP routing table to display\n" - JSON_STR) + "Address Family Modifier\n" + "Address Family Modifier\n" + "Display information for a route distinguisher\n" + "ENCAP Route Distinguisher\n" + "Network in the BGP routing table to display\n") { - return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MPLS_VPN, NULL, 0, BGP_PATH_ALL, use_json (argc, argv)); + int ret; + struct prefix_rd prd; + safi_t safi; + + if (bgp_parse_safi(argv[0], &safi)) { + vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE); + return CMD_WARNING; + } + ret = str2prefix_rd (argv[1], &prd); + if (! ret) + { + vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); + return CMD_WARNING; + } + return bgp_show_route (vty, NULL, argv[2], AFI_IP6, SAFI_ENCAP, &prd, 0, BGP_PATH_ALL, use_json (argc, argv)); } -DEFUN (show_bgp_ipv4_vpn_rd_route, - show_bgp_ipv4_vpn_rd_route_cmd, - "show bgp ipv4 vpn rd ASN:nn_or_IP-address:nn A.B.C.D {json}", + +DEFUN (show_bgp_ipv4_safi_rd_prefix, + show_bgp_ipv4_safi_rd_prefix_cmd, + "show bgp ipv4 (encap|vpn) rd ASN:nn_or_IP-address:nn A.B.C.D/M {json}", SHOW_STR BGP_STR - IP_STR - "Display VPN NLRI specific information\n" + "Address Family\n" + "Address Family Modifier\n" + "Address Family Modifier\n" "Display information for a route distinguisher\n" - "VPN Route Distinguisher\n" - "Network in the BGP routing table to display\n" - JSON_STR) + "ENCAP Route Distinguisher\n" + "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n") { int ret; struct prefix_rd prd; + safi_t safi; - ret = str2prefix_rd (argv[0], &prd); + if (bgp_parse_safi(argv[0], &safi)) { + vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE); + return CMD_WARNING; + } + + ret = str2prefix_rd (argv[1], &prd); if (! ret) { vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); return CMD_WARNING; } - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0, BGP_PATH_ALL, use_json (argc, argv)); + return bgp_show_route (vty, NULL, argv[2], AFI_IP, safi, &prd, 1, BGP_PATH_ALL, use_json (argc, argv)); } -DEFUN (show_bgp_ipv6_vpn_rd_route, - show_bgp_ipv6_vpn_rd_route_cmd, - "show bgp ipv6 vpn rd ASN:nn_or_IP-address:nn X:X::X:X {json}", +DEFUN (show_bgp_ipv6_safi_rd_prefix, + show_bgp_ipv6_safi_rd_prefix_cmd, + "show bgp ipv6 (encap|vpn) rd ASN:nn_or_IP-address:nn X:X::X:X/M {json}", SHOW_STR BGP_STR "Address Family\n" - "Display VPN NLRI specific information\n" + "Address Family Modifier\n" + "Address Family Modifier\n" "Display information for a route distinguisher\n" - "VPN Route Distinguisher\n" - "Network in the BGP routing table to display\n" - JSON_STR) + "ENCAP Route Distinguisher\n" + "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n") { int ret; struct prefix_rd prd; + safi_t safi; - ret = str2prefix_rd (argv[0], &prd); + if (bgp_parse_safi(argv[0], &safi)) { + vty_out (vty, "Error: Bad SAFI: %s%s", argv[0], VTY_NEWLINE); + return CMD_WARNING; + } + + ret = str2prefix_rd (argv[1], &prd); if (! ret) { vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE); return CMD_WARNING; } - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MPLS_VPN, &prd, 0, BGP_PATH_ALL, use_json (argc, argv)); + return bgp_show_route (vty, NULL, argv[2], AFI_IP6, safi, &prd, 1, BGP_PATH_ALL, use_json (argc, argv)); } DEFUN (show_ip_bgp_vpnv4_rd_route, @@ -8455,44 +8489,37 @@ DEFUN (show_ip_bgp_prefix_pathtype, DEFUN (show_ip_bgp_ipv4_prefix, show_ip_bgp_ipv4_prefix_cmd, - "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M {json}", + "show ip bgp ipv4 (unicast|multicast|vpn|encap) A.B.C.D/M {json}", SHOW_STR IP_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1, BGP_PATH_ALL, uj); - - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1, BGP_PATH_ALL, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP, + bgp_vty_safi_from_arg(argv[0]), + NULL, 1, BGP_PATH_ALL, uj); } ALIAS (show_ip_bgp_ipv4_prefix, show_bgp_ipv4_safi_prefix_cmd, - "show bgp ipv4 (unicast|multicast) A.B.C.D/M {json}", + "show bgp ipv4 (unicast|multicast|vpn|encap) A.B.C.D/M {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "JavaScript Object Notation\n") DEFUN (show_ip_bgp_ipv4_prefix_pathtype, show_ip_bgp_ipv4_prefix_pathtype_cmd, - "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M (bestpath|multipath) {json}", + "show ip bgp ipv4 (unicast|multicast|vpn|encap) A.B.C.D/M (bestpath|multipath) {json}", SHOW_STR IP_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "Display only the bestpath\n" "Display only multipaths\n" @@ -8500,26 +8527,22 @@ DEFUN (show_ip_bgp_ipv4_prefix_pathtype, { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1, BGP_PATH_MULTIPATH, uj); + if (strncmp (argv[2], "b", 1) == 0) + return bgp_show_route (vty, NULL, argv[1], AFI_IP, + bgp_vty_safi_from_arg(argv[0]), + NULL, 1, BGP_PATH_BESTPATH, uj); else - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1, BGP_PATH_MULTIPATH, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP, + bgp_vty_safi_from_arg(argv[0]), + NULL, 1, BGP_PATH_MULTIPATH, uj); } ALIAS (show_ip_bgp_ipv4_prefix_pathtype, show_bgp_ipv4_safi_prefix_pathtype_cmd, - "show bgp ipv4 (unicast|multicast) A.B.C.D/M (bestpath|multipath) {json}", + "show bgp ipv4 (unicast|multicast|vpn|encap) A.B.C.D/M (bestpath|multipath) {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "Display only the bestpath\n" "Display only multipaths\n" @@ -8693,14 +8716,14 @@ DEFUN (show_bgp_ipv6_safi, "Address family\n" "Address Family modifier\n" "Address Family modifier\n" + AFI_SAFI_STR "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal, - NULL, uj); - return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL, uj); + return bgp_show (vty, NULL, AFI_IP6, + bgp_vty_safi_from_arg(argv[0]), + bgp_show_type_normal, NULL, uj); } static void @@ -8738,20 +8761,18 @@ DEFUN (show_bgp_route, DEFUN (show_bgp_ipv6_safi_route, show_bgp_ipv6_safi_route_cmd, - "show bgp ipv6 (unicast|multicast) X:X::X:X {json}", + "show bgp ipv6 (unicast|multicast|vpn|encap) X:X::X:X {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Network in the BGP routing table to display\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0, BGP_PATH_ALL, uj); - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0, BGP_PATH_ALL, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP6, + bgp_vty_safi_from_arg(argv[0]), + NULL, 0, BGP_PATH_ALL, uj); } DEFUN (show_bgp_route_pathtype, @@ -8784,28 +8805,24 @@ ALIAS (show_bgp_route_pathtype, DEFUN (show_bgp_ipv6_safi_route_pathtype, show_bgp_ipv6_safi_route_pathtype_cmd, - "show bgp ipv6 (unicast|multicast) X:X::X:X (bestpath|multipath) {json}", + "show bgp ipv6 (unicast|multicast|vpn|encap) X:X::X:X (bestpath|multipath) {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Network in the BGP routing table to display\n" "Display only the bestpath\n" "Display only multipaths\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0, BGP_PATH_MULTIPATH, uj); + if (strncmp (argv[2], "b", 1) == 0) + return bgp_show_route (vty, NULL, argv[1], AFI_IP6, + bgp_vty_safi_from_arg(argv[0]), + NULL, 0, BGP_PATH_BESTPATH, uj); else - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0, BGP_PATH_MULTIPATH, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP6, + bgp_vty_safi_from_arg(argv[0]), + NULL, 0, BGP_PATH_MULTIPATH, uj); } /* old command */ @@ -8835,20 +8852,18 @@ DEFUN (show_bgp_prefix, DEFUN (show_bgp_ipv6_safi_prefix, show_bgp_ipv6_safi_prefix_cmd, - "show bgp ipv6 (unicast|multicast) X:X::X:X/M {json}", + "show bgp ipv6 (unicast|multicast|vpn|encap) X:X::X:X/M {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1, BGP_PATH_ALL, uj); - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1, BGP_PATH_ALL, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP6, + bgp_vty_safi_from_arg(argv[0]), + NULL, 1, BGP_PATH_ALL, uj); } DEFUN (show_bgp_prefix_pathtype, @@ -8881,28 +8896,23 @@ ALIAS (show_bgp_prefix_pathtype, DEFUN (show_bgp_ipv6_safi_prefix_pathtype, show_bgp_ipv6_safi_prefix_pathtype_cmd, - "show bgp ipv6 (unicast|multicast) X:X::X:X/M (bestpath|multipath) {json}", + "show bgp ipv6 (unicast|multicast|vpn|encap) X:X::X:X/M (bestpath|multipath) {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n" "Display only the bestpath\n" "Display only multipaths\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1, BGP_PATH_MULTIPATH, uj); + if (strncmp (argv[2], "b", 1) == 0) + return bgp_show_route (vty, NULL, argv[1], AFI_IP6, + bgp_vty_safi_from_arg(argv[0]), + NULL, 1, BGP_PATH_BESTPATH, uj); else - if (strncmp (argv[2], "b", 1) == 0) - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1, BGP_PATH_BESTPATH, uj); - else - return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1, BGP_PATH_MULTIPATH, uj); + return bgp_show_route (vty, NULL, argv[1], AFI_IP6, + bgp_vty_safi_from_arg(argv[0]), NULL, 1, BGP_PATH_MULTIPATH, uj); } /* old command */ @@ -14983,11 +14993,10 @@ bgp_route_init (void) install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd); install_element (VIEW_NODE, &show_bgp_ipv4_prefix_cmd); - install_element (VIEW_NODE, &show_bgp_ipv4_vpn_rd_route_cmd); - install_element (VIEW_NODE, &show_bgp_ipv4_vpn_route_cmd); - - install_element (VIEW_NODE, &show_bgp_ipv6_vpn_rd_route_cmd); - install_element (VIEW_NODE, &show_bgp_ipv6_vpn_route_cmd); + install_element (VIEW_NODE, &show_bgp_ipv4_safi_rd_route_cmd); + install_element (VIEW_NODE, &show_bgp_ipv6_safi_rd_route_cmd); + install_element (VIEW_NODE, &show_bgp_ipv4_safi_rd_prefix_cmd); + install_element (VIEW_NODE, &show_bgp_ipv6_safi_rd_prefix_cmd); /* BGP dampening clear commands */ install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd); diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 5b5fd01ab..29649c5b2 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -123,25 +123,29 @@ bgp_parse_afi(const char *str, afi_t *afi) return -1; } +/* supports (unicast|multicast|vpn|encap) */ +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; } @@ -6050,14 +6054,24 @@ DEFUN (address_family_ipv4_safi, address_family_ipv4_safi_cmd, "address-family ipv4 (unicast|multicast)", "Enter Address Family command mode\n" - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n") + AFI_SAFI_STR) { - if (strncmp (argv[0], "m", 1) == 0) - vty->node = BGP_IPV4M_NODE; - else - vty->node = BGP_IPV4_NODE; + switch (bgp_vty_safi_from_arg(argv[0])) + { + 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; } @@ -10755,60 +10769,27 @@ DEFUN (show_ip_bgp_instance_all_summary, DEFUN (show_ip_bgp_ipv4_summary, show_ip_bgp_ipv4_summary_cmd, - "show ip bgp ipv4 (unicast|multicast) summary {json}", + "show ip bgp ipv4 (unicast|multicast|vpn|encap) summary {json}", SHOW_STR IP_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Summary of BGP neighbor status\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, uj); - return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_UNICAST, uj); + return bgp_show_summary_vty (vty, NULL, AFI_IP, bgp_vty_safi_from_arg(argv[0]), uj); } ALIAS (show_ip_bgp_ipv4_summary, show_bgp_ipv4_safi_summary_cmd, - "show bgp ipv4 (unicast|multicast) summary {json}", + "show bgp ipv4 (unicast|multicast|vpn|encap) summary {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Summary of BGP neighbor status\n") -DEFUN (show_bgp_ipv4_vpn_summary, - show_bgp_ipv4_vpn_summary_cmd, - "show bgp ipv4 vpn summary {json}", - SHOW_STR - BGP_STR - "IPv4\n" - "Display VPN NLRI specific information\n" - "Summary of BGP neighbor status\n" - JSON_STR) -{ - return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, use_json (argc, argv)); -} - -/* `show ip bgp summary' commands. */ -DEFUN (show_bgp_ipv6_vpn_summary, - show_bgp_ipv6_vpn_summary_cmd, - "show bgp ipv6 vpn summary {json}", - SHOW_STR - BGP_STR - "IPv6\n" - "Display VPN NLRI specific information\n" - "Summary of BGP neighbor status\n" - JSON_STR) -{ - return bgp_show_summary_vty (vty, NULL, AFI_IP6, SAFI_MPLS_VPN, use_json (argc, argv)); -} - DEFUN (show_ip_bgp_instance_ipv4_summary, show_ip_bgp_instance_ipv4_summary_cmd, "show ip bgp view WORD ipv4 (unicast|multicast) summary {json}", @@ -10837,9 +10818,7 @@ ALIAS (show_ip_bgp_instance_ipv4_summary, BGP_STR "BGP view\n" "View name\n" - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Summary of BGP neighbor status\n") DEFUN (show_ip_bgp_vpnv4_all_summary, @@ -10941,20 +10920,16 @@ ALIAS (show_bgp_instance_summary, DEFUN (show_bgp_ipv6_safi_summary, show_bgp_ipv6_safi_summary_cmd, - "show bgp ipv6 (unicast|multicast) summary {json}", + "show bgp ipv6 (unicast|multicast|vpn|encap) summary {json}", SHOW_STR BGP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Summary of BGP neighbor status\n" "JavaScript Object Notation\n") { u_char uj = use_json(argc, argv); - if (strncmp (argv[0], "m", 1) == 0) - return bgp_show_summary_vty (vty, NULL, AFI_IP6, SAFI_MULTICAST, uj); - return bgp_show_summary_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, uj); + return bgp_show_summary_vty (vty, NULL, AFI_IP6, bgp_vty_safi_from_arg(argv[0]), uj); } DEFUN (show_bgp_instance_ipv6_safi_summary, @@ -10963,9 +10938,7 @@ DEFUN (show_bgp_instance_ipv6_safi_summary, SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Summary of BGP neighbor status\n" "JavaScript Object Notation\n") { @@ -13249,7 +13222,7 @@ DEFUN (show_bgp_instance_all_ipv6_updgrps, DEFUN (show_bgp_updgrps, show_bgp_updgrps_cmd, - "show bgp (ipv4|ipv6) (unicast|multicast) update-groups", + "show bgp (ipv4|ipv6) (unicast|multicast|vpn|encap) update-groups", SHOW_STR BGP_STR "Address family\n" @@ -13262,7 +13235,7 @@ DEFUN (show_bgp_updgrps, safi_t safi; afi = (strcmp(argv[0], "ipv4") == 0) ? AFI_IP : AFI_IP6; - safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST; + safi = bgp_vty_safi_from_arg(argv[1]); return (bgp_show_update_groups(vty, NULL, afi, safi, 0)); } @@ -13327,13 +13300,11 @@ DEFUN (show_bgp_instance_ipv6_updgrps_s, DEFUN (show_bgp_updgrps_s, show_bgp_updgrps_s_cmd, - "show bgp (ipv4|ipv6) (unicast|multicast) update-groups SUBGROUP-ID", + "show bgp (ipv4|ipv6) (unicast|multicast|vpn|encap) update-groups SUBGROUP-ID", SHOW_STR BGP_STR "Address family\n" - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "Detailed info about v6 dynamic update groups\n" "Specific subgroup to display detailed info for") { @@ -13342,8 +13313,7 @@ DEFUN (show_bgp_updgrps_s, uint64_t subgrp_id; afi = (strcmp(argv[0], "ipv4") == 0) ? AFI_IP : AFI_IP6; - safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST; - + safi = bgp_vty_safi_from_arg(argv[1]); VTY_GET_ULL("subgroup-id", subgrp_id, argv[2]); return(bgp_show_update_groups(vty, NULL, afi, safi, subgrp_id)); } @@ -13441,13 +13411,11 @@ DEFUN (show_ip_bgp_instance_updgrps_adj, DEFUN (show_bgp_updgrps_afi_adj, show_bgp_updgrps_afi_adj_cmd, - "show bgp (ipv4|ipv6) (unicast|multicast) update-groups (advertise-queue|advertised-routes|packet-queue)", + "show bgp (ipv4|ipv6) (unicast|multicast|vpn|encap) update-groups (advertise-queue|advertised-routes|packet-queue)", SHOW_STR BGP_STR "Address family\n" - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "BGP update groups\n" "Advertisement queue\n" "Announced routes\n" @@ -13458,7 +13426,7 @@ DEFUN (show_bgp_updgrps_afi_adj, safi_t safi; afi = (strcmp(argv[0], "ipv4") == 0) ? AFI_IP : AFI_IP6; - safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST; + safi = bgp_vty_safi_from_arg(argv[1]); show_bgp_updgrps_adj_info_aux(vty, NULL, afi, safi, argv[2], 0); return CMD_SUCCESS; } @@ -13537,13 +13505,11 @@ DEFUN (show_ip_bgp_instance_updgrps_adj_s, DEFUN (show_bgp_updgrps_afi_adj_s, show_bgp_updgrps_afi_adj_s_cmd, - "show bgp (ipv4|ipv6) (unicast|multicast) update-groups SUBGROUP-ID (advertise-queue|advertised-routes|packet-queue)", + "show bgp (ipv4|ipv6) (unicast|multicast|vpn|encap) update-groups SUBGROUP-ID (advertise-queue|advertised-routes|packet-queue)", SHOW_STR BGP_STR "Address family\n" - "Address family\n" - "Address Family modifier\n" - "Address Family modifier\n" + AFI_SAFI_STR "BGP update groups\n" "Specific subgroup to display info for\n" "Advertisement queue\n" @@ -13556,7 +13522,7 @@ DEFUN (show_bgp_updgrps_afi_adj_s, uint64_t subgrp_id; afi = (strcmp(argv[0], "ipv4") == 0) ? AFI_IP : AFI_IP6; - safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST; + safi = bgp_vty_safi_from_arg(argv[1]); VTY_GET_ULL("subgroup-id", subgrp_id, argv[2]); show_bgp_updgrps_adj_info_aux(vty, NULL, afi, safi, argv[3], subgrp_id); @@ -16023,10 +15989,6 @@ bgp_vty_init (void) install_element (VIEW_NODE, &show_bgp_instance_ipv6_safi_summary_cmd); #endif /* HAVE_IPV6 */ - install_element (VIEW_NODE, &show_bgp_ipv4_vpn_summary_cmd); - - install_element (VIEW_NODE, &show_bgp_ipv6_vpn_summary_cmd); - /* "show ip bgp neighbors" commands. */ install_element (VIEW_NODE, &show_ip_bgp_neighbors_cmd); install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbors_cmd); diff --git a/bgpd/bgp_vty.h b/bgpd/bgp_vty.h index 573e8c707..6b4e51bc5 100644 --- a/bgpd/bgp_vty.h +++ b/bgpd/bgp_vty.h @@ -30,6 +30,13 @@ struct bgp; #define BGP_INSTANCE_ALL_CMD "(view|vrf) all" #define BGP_INSTANCE_ALL_HELP_STR "BGP view\nBGP VRF\nAll Views/VRFs\n" +#define AFI_SAFI_STR \ + "Address family\n" \ + "Address Family modifier\n" \ + "Address Family modifier\n" \ + "Address Family modifier\n" \ + "Address Family modifier\n" + extern void bgp_vty_init (void); extern const char *afi_safi_print (afi_t, safi_t); extern int bgp_config_write_update_delay (struct vty *, struct bgp *); @@ -46,4 +53,7 @@ bgp_parse_afi(const char *str, afi_t *afi); extern int bgp_parse_safi(const char *str, safi_t *safi); +extern safi_t +bgp_vty_safi_from_arg(const char *safi_str); + #endif /* _QUAGGA_BGP_VTY_H */ diff --git a/bgpd/rfapi/bgp_rfapi_cfg.c b/bgpd/rfapi/bgp_rfapi_cfg.c index b27febbbe..202abc61d 100644 --- a/bgpd/rfapi/bgp_rfapi_cfg.c +++ b/bgpd/rfapi/bgp_rfapi_cfg.c @@ -3778,7 +3778,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 50ab3e27a..897b4be76 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 3e97b7353..5945eb09e 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 7d108432a..420c6e0d7 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 0b46702bb..25c05e65f 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)) { diff --git a/bgpd/rfapi/rfapi_import.h b/bgpd/rfapi/rfapi_import.h index 3a1ae3573..3cf55462a 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 daedbeede..6aae35e63 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 9b12ad3f7..fe9b8a3f5 100644 --- a/bgpd/rfapi/rfapi_vty.c +++ b/bgpd/rfapi/rfapi_vty.c @@ -2546,7 +2546,7 @@ DEFUN (add_vnc_prefix_cost_life_lnh, "add 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) 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" @@ -2572,7 +2572,7 @@ DEFUN (add_vnc_prefix_life_cost_lnh, "add 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) 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" @@ -2598,7 +2598,7 @@ DEFUN (add_vnc_prefix_cost_lnh, "add 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) 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" @@ -2622,7 +2622,7 @@ DEFUN (add_vnc_prefix_life_lnh, "add 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) 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" @@ -2646,7 +2646,7 @@ DEFUN (add_vnc_prefix_lnh, "add 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) .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" @@ -2671,7 +2671,7 @@ DEFUN (add_vnc_prefix_cost_life, "add 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) 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" @@ -2697,7 +2697,7 @@ DEFUN (add_vnc_prefix_life_cost, "add 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) 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" @@ -2723,7 +2723,7 @@ DEFUN (add_vnc_prefix_cost, "add 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) 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" @@ -2747,7 +2747,7 @@ DEFUN (add_vnc_prefix_life, "add 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) 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" @@ -2771,7 +2771,7 @@ DEFUN (add_vnc_prefix, "add 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)", "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" @@ -2796,7 +2796,7 @@ DEFUN (add_vnc_mac_vni_prefix_cost_life, "add 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) 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" @@ -2806,7 +2806,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" @@ -2826,7 +2826,7 @@ DEFUN (add_vnc_mac_vni_prefix_life, "add 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) 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" @@ -2836,7 +2836,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" @@ -2853,7 +2853,7 @@ DEFUN (add_vnc_mac_vni_prefix_cost, "add 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) 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" @@ -2863,7 +2863,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") @@ -2879,7 +2879,7 @@ DEFUN (add_vnc_mac_vni_prefix, "add 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)", "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" @@ -2889,7 +2889,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 */ @@ -2903,7 +2903,7 @@ DEFUN (add_vnc_mac_vni_cost_life, "add 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) 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" @@ -2930,7 +2930,7 @@ DEFUN (add_vnc_mac_vni_cost, "add 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) 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" @@ -2954,7 +2954,7 @@ DEFUN (add_vnc_mac_vni_life, "add 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) 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" @@ -2979,7 +2979,7 @@ DEFUN (add_vnc_mac_vni, "add 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)", "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" @@ -3723,7 +3723,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" @@ -3753,7 +3753,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" @@ -3783,7 +3783,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") { @@ -3808,7 +3808,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") { @@ -3841,7 +3841,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" @@ -3871,7 +3871,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" @@ -3901,7 +3901,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" @@ -3927,7 +3927,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" @@ -3953,7 +3953,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" @@ -3983,7 +3983,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" @@ -4018,7 +4018,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" @@ -4052,7 +4052,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" @@ -4081,7 +4081,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" @@ -4110,7 +4110,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" @@ -4140,7 +4140,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" @@ -4155,7 +4155,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") @@ -4179,7 +4179,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" @@ -4213,7 +4213,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" @@ -4243,7 +4243,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" @@ -4273,7 +4273,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 bcfa145c6..f20e9ed67 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 |