summaryrefslogtreecommitdiffstats
path: root/bgpd
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2017-01-03 16:44:44 +0100
committerGitHub <noreply@github.com>2017-01-03 16:44:44 +0100
commit9b532e09f9a612884b2f394fe17d2d3386d3e3a9 (patch)
tree416ce8e13e3fd965cee263946e6c86f7e2efa68b /bgpd
parentMerge pull request #28 from opensourcerouting/dev/osr/rename-part1 (diff)
parentlib: Partial Revert of 4ecc09d and modify zclient connect behavior (diff)
downloadfrr-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.c223
-rw-r--r--bgpd/bgp_attr.h2
-rw-r--r--bgpd/bgp_ecommunity.c8
-rw-r--r--bgpd/bgp_route.c301
-rw-r--r--bgpd/bgp_vty.c154
-rw-r--r--bgpd/bgp_vty.h10
-rw-r--r--bgpd/rfapi/bgp_rfapi_cfg.c2
-rw-r--r--bgpd/rfapi/bgp_rfapi_cfg.h6
-rw-r--r--bgpd/rfapi/rfapi.c28
-rw-r--r--bgpd/rfapi/rfapi.h1
-rw-r--r--bgpd/rfapi/rfapi_import.c49
-rw-r--r--bgpd/rfapi/rfapi_import.h3
-rw-r--r--bgpd/rfapi/rfapi_rib.c2
-rw-r--r--bgpd/rfapi/rfapi_vty.c84
-rw-r--r--bgpd/rfapi/vnc_export_bgp.c1
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