Merge pull request #37 from LabNConsulting/working/2.0/patch-set-170102a

Working/2.0/patch set 170102a
This commit is contained in:
David Lamparter 2017-01-03 16:44:44 +01:00 committed by GitHub
commit 9b532e09f9
22 changed files with 594 additions and 389 deletions

View File

@ -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. */

View File

@ -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 */

View File

@ -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;
}

View File

@ -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)
{
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_ipv6_vpn_route,
show_bgp_ipv6_vpn_route_cmd,
"show bgp ipv6 vpn 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)
{
return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MPLS_VPN, NULL, 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}",
SHOW_STR
BGP_STR
IP_STR
"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"
"Network in the BGP routing table to display\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, 0, 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_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"
"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"
"Network in the BGP routing table to display\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_ENCAP, &prd, 0, BGP_PATH_ALL, use_json (argc, argv));
}
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
"Address Family\n"
"Address Family Modifier\n"
"Address Family Modifier\n"
"Display information for a route distinguisher\n"
"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;
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, 1, BGP_PATH_ALL, use_json (argc, argv));
}
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"
"Address Family Modifier\n"
"Address Family Modifier\n"
"Display information for a route distinguisher\n"
"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;
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, &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);

View File

@ -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);

View File

@ -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 */

View File

@ -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,

View File

@ -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,

View File

@ -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);
}
}
/*

View File

@ -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

View File

@ -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))
{

View File

@ -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

View File

@ -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 */

View File

@ -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"

View File

@ -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

View File

@ -726,7 +726,7 @@ provided to other protocols, either via zebra or directly to BGP.
It is important to note that when exporting routes to other protocols,
the downstream protocol must also be configured to import the routes.
For example, when VNC routes are exported to unicast BGP, the BGP
configuration must include a corresponding @code{redistribute vpn}
configuration must include a corresponding @code{redistribute vnc-direct}
statement.
@deffn {VNC} {export bgp|zebra mode none|group-nve|registering-nve|ce}
@ -1115,7 +1115,7 @@ The configuration for @code{VNC-GW 1} is shown below.
router bgp 64512
bgp router-id 192.168.1.101
bgp cluster-id 1.2.3.4
redistribute vpn
redistribute vnc-direct
neighbor 192.168.1.102 remote-as 64512
no neighbor 192.168.1.102 activate
neighbor 192.168.1.103 remote-as 64512

View File

@ -1061,6 +1061,7 @@ cmd_ipv6_prefix_match (const char *str)
const char *delim = "/\0";
char *dupe, *prefix, *mask, *context, *endptr;
int nmask = -1;
enum match_type ret;
if (str == NULL)
return partly_match;
@ -1074,21 +1075,26 @@ cmd_ipv6_prefix_match (const char *str)
prefix = strtok_r(dupe, delim, &context);
mask = strtok_r(NULL, delim, &context);
ret = exact_match;
if (!mask)
return partly_match;
/* validate prefix */
if (inet_pton(AF_INET6, prefix, &sin6_dummy.sin6_addr) != 1)
return no_match;
/* validate mask */
nmask = strtol (mask, &endptr, 10);
if (*endptr != '\0' || nmask < 0 || nmask > 128)
return no_match;
ret = partly_match;
else
{
/* validate prefix */
if (inet_pton(AF_INET6, prefix, &sin6_dummy.sin6_addr) != 1)
ret = no_match;
else
{
/* validate mask */
nmask = strtol (mask, &endptr, 10);
if (*endptr != '\0' || nmask < 0 || nmask > 128)
ret = no_match;
}
}
XFREE(MTYPE_TMP, dupe);
return exact_match;
return ret;
}
#endif /* HAVE_IPV6 */

View File

@ -1077,10 +1077,10 @@ proto_redistnum(int afi, const char *s)
return ZEBRA_ROUTE_BGP;
else if (strncmp (s, "ta", 2) == 0)
return ZEBRA_ROUTE_TABLE;
else if (strncmp (s, "v", 1) == 0)
return ZEBRA_ROUTE_VNC;
else if (strncmp (s, "vd", 1) == 0)
else if (strcmp (s, "vnc-direct") == 0)
return ZEBRA_ROUTE_VNC_DIRECT;
else if (strcmp (s, "vnc") == 0)
return ZEBRA_ROUTE_VNC;
}
if (afi == AFI_IP6)
{
@ -1100,10 +1100,10 @@ proto_redistnum(int afi, const char *s)
return ZEBRA_ROUTE_BGP;
else if (strncmp (s, "ta", 2) == 0)
return ZEBRA_ROUTE_TABLE;
else if (strncmp (s, "v", 1) == 0)
return ZEBRA_ROUTE_VNC;
else if (strncmp (s, "vd", 1) == 0)
else if (strcmp (s, "vnc-direct") == 0)
return ZEBRA_ROUTE_VNC_DIRECT;
else if (strcmp (s, "vnc") == 0)
return ZEBRA_ROUTE_VNC;
}
return -1;
}

View File

@ -665,7 +665,7 @@ str2prefix_ipv6 (const char *str, struct prefix_ipv6 *p)
strncpy (cp, str, pnt - str);
*(cp + (pnt - str)) = '\0';
ret = inet_pton (AF_INET6, cp, &p->prefix);
free (cp);
XFREE (MTYPE_TMP, cp);
if (ret == 0)
return 0;
plen = (u_char) atoi (++pnt);

View File

@ -56,7 +56,7 @@ while (<STDIN>) {
# else: 7-field line
my @f = split(/,/, $_);
unless (@f == 7) {
unless (@f == 7 || @f == 8) {
die "invalid input on route_types line $.\n";
}
@ -73,6 +73,7 @@ while (<STDIN>) {
"ipv4" => int($f[4]),
"ipv6" => int($f[5]),
"shorthelp" => $f[6],
"restrict2" => $f[7],
};
push @protos, $proto;
$daemons{$f[2]} = {
@ -137,6 +138,8 @@ sub collect {
my (@names, @help) = ((), ());
for my $p (@protos) {
next if ($protodetail{$p}->{"daemon"} eq $daemon && $daemon ne "zebra");
next if ($protodetail{$p}->{"restrict2"} ne "" &&
$protodetail{$p}->{"restrict2"} ne $daemon);
next unless (($ipv4 && $protodetail{$p}->{"ipv4"})
|| ($ipv6 && $protodetail{$p}->{"ipv6"}));
push @names, $protodetail{$p}->{"cname"};

View File

@ -64,9 +64,9 @@ ZEBRA_ROUTE_LDP, ldp, ldpd, 'L', 0, 0, "LDP"
#vnc when sent to zebra
ZEBRA_ROUTE_VNC, vnc, NULL, 'v', 1, 1, "VNC"
# vnc when sent to bgp
ZEBRA_ROUTE_VNC_DIRECT, vpn, NULL, 'V', 1, 1, "VPN"
# vnc when sent to bgp (remote next hop?)
ZEBRA_ROUTE_VNC_DIRECT_RH, vpn-rh, NULL, 'V', 0, 0, "VPN"
ZEBRA_ROUTE_VNC_DIRECT, vnc-direct,NULL, 'V', 1, 1, "VNC-Direct", bgpd
# vnc when sent to bgp (resolve NVE mode)
ZEBRA_ROUTE_VNC_DIRECT_RH, vnc-rn, NULL, 'V', 0, 0, "VNC-RN"
# bgp unicast -> vnc
ZEBRA_ROUTE_BGP_DIRECT, bgp-direct, NULL, 'b', 0, 0, "BGP-Direct"
# bgp unicast -> vnc
@ -90,4 +90,4 @@ ZEBRA_ROUTE_VNC, "Virtual Network Control (VNC)"
ZEBRA_ROUTE_OLSR, "Optimised Link State Routing (OLSR)"
ZEBRA_ROUTE_TABLE, "Non-main Kernel Routing Table"
ZEBRA_ROUTE_LDP, "Label Distribution Protocol (LDP)"
ZEBRA_ROUTE_VNC_DIRECT, "VPN routes(VPN)"
ZEBRA_ROUTE_VNC_DIRECT, "VNC direct (not via zebra) routes"

View File

@ -216,7 +216,9 @@ zclient_socket(void)
ret = connect (sock, (struct sockaddr *) &serv, sizeof (serv));
if (ret < 0)
{
zlog_warn ("%s connect failure: %d", __PRETTY_FUNCTION__, errno);
if (zclient_debug)
zlog_warn ("%s connect failure: %d(%s)", __PRETTY_FUNCTION__,
errno, safe_strerror (errno));
close (sock);
return -1;
}
@ -252,7 +254,9 @@ zclient_socket_un (const char *path)
ret = connect (sock, (struct sockaddr *) &addr, len);
if (ret < 0)
{
zlog_warn ("%s connect failure: %d", __PRETTY_FUNCTION__, errno);
if (zclient_debug)
zlog_warn ("%s connect failure: %d(%s)", __PRETTY_FUNCTION__,
errno, safe_strerror (errno));
close (sock);
return -1;
}
@ -572,23 +576,11 @@ zclient_start (struct zclient *zclient)
if (zclient->t_connect)
return 0;
/*
* If we fail to connect to the socket on initialization,
* Let's wait a second and see if we can reconnect.
* Cause if we don't connect, we never attempt to
* reconnect. On startup if zebra is slow we
* can get into this situation.
*/
while (zclient_socket_connect(zclient) < 0 && zclient->fail < 5)
if (zclient_socket_connect(zclient) < 0)
{
if (zclient_debug)
zlog_debug ("zclient connection fail");
zclient->fail++;
sleep (1);
}
if (zclient->sock < 0)
{
zclient_event (ZCLIENT_CONNECT, zclient);
return -1;
}
@ -1727,11 +1719,9 @@ zclient_event (enum event event, struct zclient *zclient)
thread_add_event (zclient->master, zclient_connect, zclient, 0);
break;
case ZCLIENT_CONNECT:
if (zclient->fail >= 10)
return;
if (zclient_debug)
zlog_debug ("zclient connect schedule interval is %d",
zclient->fail < 3 ? 10 : 60);
zlog_debug ("zclient connect failures: %d schedule interval is now %d",
zclient->fail, zclient->fail < 3 ? 10 : 60);
if (! zclient->t_connect)
zclient->t_connect =
thread_add_timer (zclient->master, zclient_connect, zclient,