diff options
Diffstat (limited to 'bgpd/bgp_evpn_vty.c')
| -rw-r--r-- | bgpd/bgp_evpn_vty.c | 3028 | 
1 files changed, 1448 insertions, 1580 deletions
diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index b5a58f0147..4b39ee8627 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -42,305 +42,289 @@  /*   * Context for VNI hash walk - used by callbacks.   */ -struct vni_walk_ctx -{ -  struct bgp *bgp; -  struct vty *vty; -  struct in_addr vtep_ip; +struct vni_walk_ctx { +	struct bgp *bgp; +	struct vty *vty; +	struct in_addr vtep_ip;  }; -struct evpn_config_write -{ -  int write; -  struct vty *vty; +struct evpn_config_write { +	int write; +	struct vty *vty;  }; -#if defined (HAVE_CUMULUS) -static void -display_import_rt (struct vty *vty, struct irt_node *irt) +#if defined(HAVE_CUMULUS) +static void display_import_rt(struct vty *vty, struct irt_node *irt) +{ +	u_char *pnt; +	u_char type, sub_type; +	struct ecommunity_as { +		as_t as; +		u_int32_t val; +	} eas; +	struct ecommunity_ip { +		struct in_addr ip; +		u_int16_t val; +	} eip; +	struct listnode *node, *nnode; +	struct bgpevpn *tmp_vpn; + + +	/* TODO: This needs to go into a function */ + +	pnt = (u_char *)&irt->rt.val; +	type = *pnt++; +	sub_type = *pnt++; +	if (sub_type != ECOMMUNITY_ROUTE_TARGET) +		return; + +	switch (type) { +	case ECOMMUNITY_ENCODE_AS: +		eas.as = (*pnt++ << 8); +		eas.as |= (*pnt++); + +		eas.val = (*pnt++ << 24); +		eas.val |= (*pnt++ << 16); +		eas.val |= (*pnt++ << 8); +		eas.val |= (*pnt++); + +		vty_out(vty, "Route-target: %u:%u", eas.as, eas.val); +		break; + +	case ECOMMUNITY_ENCODE_IP: +		memcpy(&eip.ip, pnt, 4); +		pnt += 4; +		eip.val = (*pnt++ << 8); +		eip.val |= (*pnt++); + +		vty_out(vty, "Route-target: %s:%u", inet_ntoa(eip.ip), eip.val); +		break; + +	case ECOMMUNITY_ENCODE_AS4: +		eas.as = (*pnt++ << 24); +		eas.as |= (*pnt++ << 16); +		eas.as |= (*pnt++ << 8); +		eas.as |= (*pnt++); + +		eas.val = (*pnt++ << 8); +		eas.val |= (*pnt++); + +		vty_out(vty, "Route-target: %u:%u", eas.as, eas.val); +		break; + +	default: +		return; +	} + +	vty_out(vty, "\n"); +	vty_out(vty, "List of VNIs importing routes with this route-target:\n"); + +	for (ALL_LIST_ELEMENTS(irt->vnis, node, nnode, tmp_vpn)) +		vty_out(vty, "  %u\n", tmp_vpn->vni); +} + +static void show_import_rt_entry(struct hash_backet *backet, struct vty *vty)  { -  u_char *pnt; -  u_char type, sub_type; -  struct ecommunity_as -  { -    as_t as; -    u_int32_t val; -  } eas; -  struct ecommunity_ip -  { -    struct in_addr ip; -    u_int16_t val; -  } eip; -  struct listnode *node, *nnode; -  struct bgpevpn *tmp_vpn; +	struct irt_node *irt = (struct irt_node *)backet->data; +	display_import_rt(vty, irt); +} +static void bgp_evpn_show_route_rd_header(struct vty *vty, +					  struct bgp_node *rd_rn) +{ +	u_int16_t type; +	struct rd_as rd_as; +	struct rd_ip rd_ip; +	u_char *pnt; -  /* TODO: This needs to go into a function */ +	pnt = rd_rn->p.u.val; -  pnt = (u_char *)&irt->rt.val; -  type = *pnt++; -  sub_type = *pnt++; -  if (sub_type != ECOMMUNITY_ROUTE_TARGET) -    return; +	/* Decode RD type. */ +	type = decode_rd_type(pnt); -  switch (type) -    { -      case ECOMMUNITY_ENCODE_AS: -        eas.as = (*pnt++ << 8); -        eas.as |= (*pnt++); +	vty_out(vty, "Route Distinguisher: "); -        eas.val = (*pnt++ << 24); -        eas.val |= (*pnt++ << 16); -        eas.val |= (*pnt++ << 8); -        eas.val |= (*pnt++); +	switch (type) { +	case RD_TYPE_AS: +		decode_rd_as(pnt + 2, &rd_as); +		vty_out(vty, "%u:%d", rd_as.as, rd_as.val); +		break; -        vty_out (vty, "Route-target: %u:%u", eas.as, eas.val); -        break; +	case RD_TYPE_IP: +		decode_rd_ip(pnt + 2, &rd_ip); +		vty_out(vty, "%s:%d", inet_ntoa(rd_ip.ip), rd_ip.val); +		break; -      case ECOMMUNITY_ENCODE_IP: -        memcpy (&eip.ip, pnt, 4); -        pnt += 4; -        eip.val = (*pnt++ << 8); -        eip.val |= (*pnt++); +	default: +		vty_out(vty, "Unknown RD type"); +		break; +	} + +	vty_out(vty, "\n"); +} + +static void bgp_evpn_show_route_header(struct vty *vty, struct bgp *bgp) +{ +	char ri_header[] = +		"   Network          Next Hop            Metric LocPrf Weight Path\n"; -        vty_out (vty, "Route-target: %s:%u", -                 inet_ntoa (eip.ip), eip.val); -        break; +	vty_out(vty, "BGP table version is 0, local router ID is %s\n", +		inet_ntoa(bgp->router_id)); +	vty_out(vty, +		"Status codes: s suppressed, d damped, h history, " +		"* valid, > best, i - internal\n"); +	vty_out(vty, "Origin codes: i - IGP, e - EGP, ? - incomplete\n"); +	vty_out(vty, +		"EVPN type-2 prefix: [2]:[ESI]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]\n"); +	vty_out(vty, "EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]\n\n"); +	vty_out(vty, "%s", ri_header); +} -      case ECOMMUNITY_ENCODE_AS4: -        eas.as = (*pnt++ << 24); -        eas.as |= (*pnt++ << 16); -        eas.as |= (*pnt++ << 8); -        eas.as |= (*pnt++); +static void display_vni(struct vty *vty, struct bgpevpn *vpn) +{ +	char buf1[INET6_ADDRSTRLEN]; +	char *ecom_str; +	struct listnode *node, *nnode; +	struct ecommunity *ecom; -        eas.val = (*pnt++ << 8); -        eas.val |= (*pnt++); +	vty_out(vty, "VNI: %d", vpn->vni); +	if (is_vni_live(vpn)) +		vty_out(vty, " (known to the kernel)"); +	vty_out(vty, "\n"); -        vty_out (vty, "Route-target: %u:%u", eas.as, eas.val); -        break; - -      default: -        return; -    } +	vty_out(vty, "  RD: %s\n", +		prefix_rd2str(&vpn->prd, buf1, RD_ADDRSTRLEN)); +	vty_out(vty, "  Originator IP: %s\n", inet_ntoa(vpn->originator_ip)); -  vty_out (vty, "\n"); -  vty_out (vty, "List of VNIs importing routes with this route-target:\n"); +	vty_out(vty, "  Import Route Target:\n"); +	for (ALL_LIST_ELEMENTS(vpn->import_rtl, node, nnode, ecom)) { +		ecom_str = ecommunity_ecom2str(ecom, +					       ECOMMUNITY_FORMAT_ROUTE_MAP, 0); +		vty_out(vty, "    %s\n", ecom_str); +		XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); +	} -  for (ALL_LIST_ELEMENTS (irt->vnis, node, nnode, tmp_vpn)) -    vty_out (vty, "  %u\n", tmp_vpn->vni); +	vty_out(vty, "  Export Route Target:\n"); +	for (ALL_LIST_ELEMENTS(vpn->export_rtl, node, nnode, ecom)) { +		ecom_str = ecommunity_ecom2str(ecom, +					       ECOMMUNITY_FORMAT_ROUTE_MAP, 0); +		vty_out(vty, "    %s\n", ecom_str); +		XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); +	}  } - -static void -show_import_rt_entry (struct hash_backet *backet, struct vty *vty) + +static void show_vni_routes(struct bgp *bgp, struct bgpevpn *vpn, int type, +			    struct vty *vty, struct in_addr vtep_ip)  { -  struct irt_node *irt = (struct irt_node *) backet->data; -  display_import_rt (vty, irt); +	struct bgp_node *rn; +	struct bgp_info *ri; +	int header = 1; +	u_int32_t prefix_cnt, path_cnt; + +	prefix_cnt = path_cnt = 0; + +	for (rn = bgp_table_top(vpn->route_table); rn; +	     rn = bgp_route_next(rn)) { +		struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p; + +		if (type && evp->prefix.route_type != type) +			continue; + +		if (rn->info) { +			/* Overall header/legend displayed once. */ +			if (header) { +				bgp_evpn_show_route_header(vty, bgp); +				header = 0; +			} + +			prefix_cnt++; +		} + +		/* For EVPN, the prefix is displayed for each path (to fit in +		 * with code that already exists). +		 */ +		for (ri = rn->info; ri; ri = ri->next) { +			if (vtep_ip.s_addr +			    && !IPV4_ADDR_SAME(&(vtep_ip), +					       &(ri->attr->nexthop))) +				continue; + +			path_cnt++; +			route_vty_out(vty, &rn->p, ri, 0, SAFI_EVPN, NULL); +		} +	} + +	if (prefix_cnt == 0) +		vty_out(vty, "No EVPN prefixes %sexist for this VNI\n", +			type ? "(of requested type) " : ""); +	else +		vty_out(vty, "\nDisplayed %u prefixes (%u paths)%s\n", +			prefix_cnt, path_cnt, +			type ? " (of requested type)" : "");  } -static void -bgp_evpn_show_route_rd_header (struct vty *vty, struct bgp_node *rd_rn) +static void show_vni_routes_hash(struct hash_backet *backet, void *arg)  { -  u_int16_t type; -  struct rd_as rd_as; -  struct rd_ip rd_ip; -  u_char *pnt; +	struct bgpevpn *vpn = (struct bgpevpn *)backet->data; +	struct vni_walk_ctx *wctx = arg; +	struct vty *vty = wctx->vty; -  pnt = rd_rn->p.u.val; - -  /* Decode RD type. */ -  type = decode_rd_type (pnt); - -  vty_out (vty, "Route Distinguisher: "); - -  switch (type) -    { -      case RD_TYPE_AS: -        decode_rd_as (pnt + 2, &rd_as); -        vty_out (vty, "%u:%d", rd_as.as, rd_as.val); -        break; - -      case RD_TYPE_IP: -        decode_rd_ip (pnt + 2, &rd_ip); -        vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val); -        break; - -      default: -        vty_out (vty, "Unknown RD type"); -        break; -    } - -  vty_out (vty, "\n"); -} - -static void -bgp_evpn_show_route_header (struct vty *vty, struct bgp *bgp) -{ -  char ri_header[] = "   Network          Next Hop            Metric LocPrf Weight Path\n"; - -  vty_out (vty, "BGP table version is 0, local router ID is %s\n", -           inet_ntoa (bgp->router_id)); -  vty_out (vty, "Status codes: s suppressed, d damped, h history, " -           "* valid, > best, i - internal\n"); -  vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete\n"); -  vty_out (vty, "EVPN type-2 prefix: [2]:[ESI]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]\n"); -  vty_out (vty, "EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]\n\n"); -  vty_out (vty, "%s", ri_header); +	vty_out(vty, "\nVNI: %d\n\n", vpn->vni); +	show_vni_routes(wctx->bgp, vpn, 0, wctx->vty, wctx->vtep_ip);  } -static void -display_vni (struct vty *vty, struct bgpevpn *vpn) +static void show_vni_entry(struct hash_backet *backet, struct vty *vty)  { -  char buf1[INET6_ADDRSTRLEN]; -  char *ecom_str; -  struct listnode *node, *nnode; -  struct ecommunity *ecom; +	struct bgpevpn *vpn = (struct bgpevpn *)backet->data; +	char buf1[10]; +	char buf2[INET6_ADDRSTRLEN]; +	char rt_buf[25]; +	char *ecom_str; +	struct listnode *node, *nnode; +	struct ecommunity *ecom; -  vty_out (vty, "VNI: %d", vpn->vni); -  if (is_vni_live (vpn)) -    vty_out (vty, " (known to the kernel)"); -  vty_out (vty, "\n"); +	buf1[0] = '\0'; +	if (is_vni_live(vpn)) +		sprintf(buf1, "*"); -  vty_out (vty, "  RD: %s\n", -           prefix_rd2str (&vpn->prd, buf1, RD_ADDRSTRLEN)); -  vty_out (vty, "  Originator IP: %s\n", -           inet_ntoa(vpn->originator_ip)); +	vty_out(vty, "%-1s %-10u %-15s %-21s", buf1, vpn->vni, +		inet_ntoa(vpn->originator_ip), +		prefix_rd2str(&vpn->prd, buf2, RD_ADDRSTRLEN)); -  vty_out (vty, "  Import Route Target:\n"); -  for (ALL_LIST_ELEMENTS (vpn->import_rtl, node, nnode, ecom)) -    { -      ecom_str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); -      vty_out (vty, "    %s\n", ecom_str); -      XFREE (MTYPE_ECOMMUNITY_STR, ecom_str); -    } +	for (ALL_LIST_ELEMENTS(vpn->import_rtl, node, nnode, ecom)) { +		ecom_str = ecommunity_ecom2str(ecom, +					       ECOMMUNITY_FORMAT_ROUTE_MAP, 0); -  vty_out (vty, "  Export Route Target:\n"); -  for (ALL_LIST_ELEMENTS (vpn->export_rtl, node, nnode, ecom)) -    { -      ecom_str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); -      vty_out (vty, "    %s\n", ecom_str); -      XFREE (MTYPE_ECOMMUNITY_STR, ecom_str); -    } -} +		if (listcount(vpn->import_rtl) > 1) +			sprintf(rt_buf, "%s, ...", ecom_str); +		else +			sprintf(rt_buf, "%s", ecom_str); +		vty_out(vty, " %-25s", rt_buf); -static void -show_vni_routes (struct bgp *bgp, struct bgpevpn *vpn, int type, -                 struct vty *vty, struct in_addr vtep_ip) -{ -  struct bgp_node *rn; -  struct bgp_info *ri; -  int header = 1; -  u_int32_t prefix_cnt, path_cnt; - -  prefix_cnt = path_cnt = 0; - -  for (rn = bgp_table_top (vpn->route_table); rn; rn = bgp_route_next (rn)) -    { -      struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p; - -      if (type && -          evp->prefix.route_type != type) -        continue; - -      if (rn->info) -        { -          /* Overall header/legend displayed once. */ -          if (header) -            { -              bgp_evpn_show_route_header (vty, bgp); -              header = 0; -            } - -          prefix_cnt++; -        } - -      /* For EVPN, the prefix is displayed for each path (to fit in -       * with code that already exists). -       */ -      for (ri = rn->info; ri; ri = ri->next) -        { -          if (vtep_ip.s_addr && -              !IPV4_ADDR_SAME(&(vtep_ip), &(ri->attr->nexthop))) -            continue; - -          path_cnt++; -          route_vty_out (vty, &rn->p, ri, 0, SAFI_EVPN, NULL); -        } -    } - -  if (prefix_cnt == 0) -    vty_out (vty, "No EVPN prefixes %sexist for this VNI\n", -             type ? "(of requested type) " : ""); -  else -    vty_out (vty, "\nDisplayed %u prefixes (%u paths)%s\n", -             prefix_cnt, path_cnt, -             type ? " (of requested type)" : ""); -} - -static void -show_vni_routes_hash (struct hash_backet *backet, void *arg) -{ -  struct bgpevpn *vpn = (struct bgpevpn *) backet->data; -  struct vni_walk_ctx *wctx = arg; -  struct vty *vty = wctx->vty; - -  vty_out (vty, "\nVNI: %d\n\n", vpn->vni); -  show_vni_routes (wctx->bgp, vpn, 0, wctx->vty, wctx->vtep_ip); -} - -static void -show_vni_entry (struct hash_backet *backet, struct vty *vty) -{ -  struct bgpevpn *vpn = (struct bgpevpn *) backet->data; -  char buf1[10]; -  char buf2[INET6_ADDRSTRLEN]; -  char rt_buf[25]; -  char *ecom_str; -  struct listnode *node, *nnode; -  struct ecommunity *ecom; - -  buf1[0] = '\0'; -  if (is_vni_live (vpn)) -    sprintf (buf1, "*"); - -  vty_out(vty, "%-1s %-10u %-15s %-21s", -          buf1, vpn->vni, inet_ntoa(vpn->originator_ip), -          prefix_rd2str (&vpn->prd, buf2, RD_ADDRSTRLEN)); - -  for (ALL_LIST_ELEMENTS (vpn->import_rtl, node, nnode, ecom)) -    { -      ecom_str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); - -      if (listcount(vpn->import_rtl) > 1) -        sprintf (rt_buf, "%s, ...", ecom_str); -      else -        sprintf (rt_buf, "%s", ecom_str); -      vty_out (vty, " %-25s", rt_buf); - -      XFREE (MTYPE_ECOMMUNITY_STR, ecom_str); -      break; -    } - -  for (ALL_LIST_ELEMENTS (vpn->export_rtl, node, nnode, ecom)) -    { -      ecom_str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); - -      if (listcount(vpn->export_rtl) > 1) -        sprintf (rt_buf, "%s, ...", ecom_str); -      else -        sprintf (rt_buf, "%s", ecom_str); -      vty_out (vty, " %-25s", rt_buf); - -      XFREE (MTYPE_ECOMMUNITY_STR, ecom_str); -      break; -    } -  vty_out (vty, "\n"); +		XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); +		break; +	} + +	for (ALL_LIST_ELEMENTS(vpn->export_rtl, node, nnode, ecom)) { +		ecom_str = ecommunity_ecom2str(ecom, +					       ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + +		if (listcount(vpn->export_rtl) > 1) +			sprintf(rt_buf, "%s, ...", ecom_str); +		else +			sprintf(rt_buf, "%s", ecom_str); +		vty_out(vty, " %-25s", rt_buf); + +		XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); +		break; +	} +	vty_out(vty, "\n");  }  #endif /* HAVE_CUMULUS */ -static int -bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd, -		      enum bgp_show_type type, void *output_arg, int option, -		      u_char use_json) +static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd, +				 enum bgp_show_type type, void *output_arg, +				 int option, u_char use_json)  {  	afi_t afi = AFI_L2VPN;  	struct bgp *bgp; @@ -362,7 +346,7 @@ bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,  	bgp = bgp_get_default();  	if (bgp == NULL) {  		if (!use_json) -			vty_out (vty,"No BGP process is configured\n"); +			vty_out(vty, "No BGP process is configured\n");  		return CMD_WARNING;  	} @@ -387,7 +371,7 @@ bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,  	for (rn = bgp_table_top(bgp->rib[afi][SAFI_EVPN]); rn;  	     rn = bgp_route_next(rn)) {  		if (use_json) -			continue;	/* XXX json TODO */ +			continue; /* XXX json TODO */  		if (prd && memcmp(rn->p.u.val, prd->val, 8) != 0)  			continue; @@ -401,54 +385,57 @@ bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,  					total_count++;  					if (type == bgp_show_type_neighbor) {  						union sockunion *su = -						    output_arg; +							output_arg;  						if (ri->peer->su_remote == NULL -						    || !sockunion_same(ri-> -								       peer-> -								       su_remote, -								       su)) +						    || !sockunion_same( +							       ri->peer->su_remote, +							       su))  							continue;  					}  					if (header == 0) {  						if (use_json) { -							if (option == -							    SHOW_DISPLAY_TAGS) { -								json_object_int_add -								    (json, -								     "bgpTableVersion", -								     0); -								json_object_string_add -								    (json, -								     "bgpLocalRouterId", -								     inet_ntoa -								     (bgp-> -								      router_id)); -								json_object_object_add -								    (json, -								     "bgpStatusCodes", -								     json_scode); -								json_object_object_add -								    (json, -								     "bgpOriginCodes", -								     json_ocode); +							if (option +							    == SHOW_DISPLAY_TAGS) { +								json_object_int_add( +									json, +									"bgpTableVersion", +									0); +								json_object_string_add( +									json, +									"bgpLocalRouterId", +									inet_ntoa( +										bgp->router_id)); +								json_object_object_add( +									json, +									"bgpStatusCodes", +									json_scode); +								json_object_object_add( +									json, +									"bgpOriginCodes", +									json_ocode);  							}  						} else { -							if (option == -							    SHOW_DISPLAY_TAGS) -								vty_out(vty, V4_HEADER_TAG); -							else if (option == -								 SHOW_DISPLAY_OVERLAY) -								vty_out(vty, V4_HEADER_OVERLAY); +							if (option +							    == SHOW_DISPLAY_TAGS) +								vty_out(vty, +									V4_HEADER_TAG); +							else if ( +								option +								== SHOW_DISPLAY_OVERLAY) +								vty_out(vty, +									V4_HEADER_OVERLAY);  							else { -								vty_out (vty, +								vty_out(vty,  									"BGP table version is 0, local router ID is %s\n", -									inet_ntoa(bgp->router_id)); -								vty_out (vty, +									inet_ntoa( +										bgp->router_id)); +								vty_out(vty,  									"Status codes: s suppressed, d damped, h history, * valid, > best, i - internal\n"); -								vty_out (vty, +								vty_out(vty,  									"Origin codes: i - IGP, e - EGP, ? - incomplete\n\n"); -								vty_out(vty, V4_HEADER); +								vty_out(vty, +									V4_HEADER);  							}  						}  						header = 0; @@ -476,73 +463,60 @@ bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,  						if (use_json) {  							char buffer[BUFSIZ];  							if (type == RD_TYPE_AS -							    || type == -							    RD_TYPE_AS4) +							    || type == RD_TYPE_AS4)  								sprintf(buffer,  									"%u:%d", -									rd_as. -									as, -									rd_as. -									val); -							else if (type == -								 RD_TYPE_IP) +									rd_as.as, +									rd_as.val); +							else if (type +								 == RD_TYPE_IP)  								sprintf(buffer,  									"%s:%d", -									inet_ntoa -									(rd_ip. -									 ip), -									rd_ip. -									val); -							json_object_string_add -							    (json_nroute, -							     "routeDistinguisher", -							     buffer); +									inet_ntoa( +										rd_ip.ip), +									rd_ip.val); +							json_object_string_add( +								json_nroute, +								"routeDistinguisher", +								buffer);  						} else {  							vty_out(vty,  								"Route Distinguisher: ");  							if (type == RD_TYPE_AS)  								vty_out(vty,  									"as2 %u:%d", -									rd_as. -									as, -									rd_as. -									val); -							else if (type == -								 RD_TYPE_AS4) +									rd_as.as, +									rd_as.val); +							else if (type +								 == RD_TYPE_AS4)  								vty_out(vty,  									"as4 %u:%d", -									rd_as. -									as, -									rd_as. -									val); -							else if (type == -								 RD_TYPE_IP) +									rd_as.as, +									rd_as.val); +							else if (type +								 == RD_TYPE_IP)  								vty_out(vty,  									"ip %s:%d", -									inet_ntoa -									(rd_ip. -									 ip), -									rd_ip. -									val); -							vty_out (vty, "\n\n"); +									inet_ntoa( +										rd_ip.ip), +									rd_ip.val); +							vty_out(vty, "\n\n");  						}  						rd_header = 0;  					}  					if (use_json)  						json_array = -						    json_object_new_array(); +							json_object_new_array();  					else  						json_array = NULL;  					if (option == SHOW_DISPLAY_TAGS) -						route_vty_out_tag(vty, &rm->p, -								  ri, 0, -								  SAFI_EVPN, -								  json_array); +						route_vty_out_tag( +							vty, &rm->p, ri, 0, +							SAFI_EVPN, json_array);  					else if (option == SHOW_DISPLAY_OVERLAY) -						route_vty_out_overlay(vty, -								      &rm->p, -								      ri, 0, -								      json_array); +						route_vty_out_overlay( +							vty, &rm->p, ri, 0, +							json_array);  					else  						route_vty_out(vty, &rm->p, ri,  							      0, SAFI_EVPN, @@ -553,10 +527,10 @@ bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,  		}  	}  	if (output_count == 0) -		vty_out (vty, "No prefixes displayed, %ld exist\n", -			  total_count); +		vty_out(vty, "No prefixes displayed, %ld exist\n", total_count);  	else -		vty_out (vty, "\nDisplayed %ld out of %ld total prefixes\n", output_count, total_count); +		vty_out(vty, "\nDisplayed %ld out of %ld total prefixes\n", +			output_count, total_count);  	return CMD_SUCCESS;  } @@ -584,11 +558,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd,  	int ret;  	struct prefix_rd prd; -	argv_find (argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community); +	argv_find(argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community);  	ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);  	if (!ret) { -		vty_out (vty, "%% Malformed Route Distinguisher\n"); +		vty_out(vty, "%% Malformed Route Distinguisher\n");  		return CMD_WARNING;  	}  	return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_normal, NULL, 0, @@ -625,11 +599,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_tags,  	int ret;  	struct prefix_rd prd; -	argv_find (argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community); +	argv_find(argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community);  	ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);  	if (!ret) { -		vty_out (vty, "%% Malformed Route Distinguisher\n"); +		vty_out(vty, "%% Malformed Route Distinguisher\n");  		return CMD_WARNING;  	}  	return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_normal, NULL, 1, @@ -655,7 +629,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_routes,  	int ret;  	u_char uj = use_json(argc, argv); -	argv_find (argv, argc, "A.B.C.D", &idx_ipv4); +	argv_find(argv, argc, "A.B.C.D", &idx_ipv4);  	ret = str2sockunion(argv[idx_ipv4]->arg, &su);  	if (ret < 0) { @@ -664,11 +638,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_routes,  			json_no = json_object_new_object();  			json_object_string_add(json_no, "warning",  					       "Malformed address"); -			vty_out (vty, "%s\n", +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, "Malformed address: %s\n", +			vty_out(vty, "Malformed address: %s\n",  				argv[idx_ipv4]->arg);  		return CMD_WARNING;  	} @@ -678,14 +652,14 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_routes,  		if (uj) {  			json_object *json_no = NULL;  			json_no = json_object_new_object(); -			json_object_string_add(json_no, "warning", -					       "No such neighbor or address family"); -			vty_out (vty, "%s\n", +			json_object_string_add( +				json_no, "warning", +				"No such neighbor or address family"); +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, -				  "%% No such neighbor or address family\n"); +			vty_out(vty, "%% No such neighbor or address family\n");  		return CMD_WARNING;  	} @@ -715,8 +689,8 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,  	struct prefix_rd prd;  	u_char uj = use_json(argc, argv); -	argv_find (argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community); -	argv_find (argv, argc, "A.B.C.D", &idx_ipv4); +	argv_find(argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community); +	argv_find(argv, argc, "A.B.C.D", &idx_ipv4);  	ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);  	if (!ret) { @@ -725,11 +699,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,  			json_no = json_object_new_object();  			json_object_string_add(json_no, "warning",  					       "Malformed Route Distinguisher"); -			vty_out (vty, "%s\n", +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty,"%% Malformed Route Distinguisher\n"); +			vty_out(vty, "%% Malformed Route Distinguisher\n");  		return CMD_WARNING;  	} @@ -740,11 +714,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,  			json_no = json_object_new_object();  			json_object_string_add(json_no, "warning",  					       "Malformed address"); -			vty_out (vty, "%s\n", +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, "Malformed address: %s\n", +			vty_out(vty, "Malformed address: %s\n",  				argv[idx_ext_community]->arg);  		return CMD_WARNING;  	} @@ -754,14 +728,14 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,  		if (uj) {  			json_object *json_no = NULL;  			json_no = json_object_new_object(); -			json_object_string_add(json_no, "warning", -					       "No such neighbor or address family"); -			vty_out (vty, "%s\n", +			json_object_string_add( +				json_no, "warning", +				"No such neighbor or address family"); +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, -				  "%% No such neighbor or address family\n"); +			vty_out(vty, "%% No such neighbor or address family\n");  		return CMD_WARNING;  	} @@ -788,7 +762,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_advertised_routes,  	union sockunion su;  	u_char uj = use_json(argc, argv); -	argv_find (argv, argc, "A.B.C.D", &idx_ipv4); +	argv_find(argv, argc, "A.B.C.D", &idx_ipv4);  	ret = str2sockunion(argv[idx_ipv4]->arg, &su);  	if (ret < 0) { @@ -797,11 +771,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_advertised_routes,  			json_no = json_object_new_object();  			json_object_string_add(json_no, "warning",  					       "Malformed address"); -			vty_out (vty, "%s\n", +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, "Malformed address: %s\n", +			vty_out(vty, "Malformed address: %s\n",  				argv[idx_ipv4]->arg);  		return CMD_WARNING;  	} @@ -810,14 +784,14 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_advertised_routes,  		if (uj) {  			json_object *json_no = NULL;  			json_no = json_object_new_object(); -			json_object_string_add(json_no, "warning", -					       "No such neighbor or address family"); -			vty_out (vty, "%s\n", +			json_object_string_add( +				json_no, "warning", +				"No such neighbor or address family"); +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, -				  "%% No such neighbor or address family\n"); +			vty_out(vty, "%% No such neighbor or address family\n");  		return CMD_WARNING;  	} @@ -846,8 +820,8 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,  	union sockunion su;  	u_char uj = use_json(argc, argv); -	argv_find (argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community); -	argv_find (argv, argc, "A.B.C.D", &idx_ipv4); +	argv_find(argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community); +	argv_find(argv, argc, "A.B.C.D", &idx_ipv4);  	ret = str2sockunion(argv[idx_ipv4]->arg, &su);  	if (ret < 0) { @@ -856,11 +830,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,  			json_no = json_object_new_object();  			json_object_string_add(json_no, "warning",  					       "Malformed address"); -			vty_out (vty, "%s\n", +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, "Malformed address: %s\n", +			vty_out(vty, "Malformed address: %s\n",  				argv[idx_ext_community]->arg);  		return CMD_WARNING;  	} @@ -869,14 +843,14 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,  		if (uj) {  			json_object *json_no = NULL;  			json_no = json_object_new_object(); -			json_object_string_add(json_no, "warning", -					       "No such neighbor or address family"); -			vty_out (vty, "%s\n", +			json_object_string_add( +				json_no, "warning", +				"No such neighbor or address family"); +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty, -				  "%% No such neighbor or address family\n"); +			vty_out(vty, "%% No such neighbor or address family\n");  		return CMD_WARNING;  	} @@ -887,11 +861,11 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,  			json_no = json_object_new_object();  			json_object_string_add(json_no, "warning",  					       "Malformed Route Distinguisher"); -			vty_out (vty, "%s\n", +			vty_out(vty, "%s\n",  				json_object_to_json_string(json_no));  			json_object_free(json_no);  		} else -			vty_out (vty,"%% Malformed Route Distinguisher\n"); +			vty_out(vty, "%% Malformed Route Distinguisher\n");  		return CMD_WARNING;  	} @@ -910,8 +884,8 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_overlay,        "Display BGP Overlay Information for prefixes\n")  {  	return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal, NULL, -				     SHOW_DISPLAY_OVERLAY, use_json(argc, -								    argv)); +				     SHOW_DISPLAY_OVERLAY, +				     use_json(argc, argv));  }  DEFUN(show_ip_bgp_evpn_rd_overlay, @@ -930,16 +904,16 @@ DEFUN(show_ip_bgp_evpn_rd_overlay,  	int ret;  	struct prefix_rd prd; -	argv_find (argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community); +	argv_find(argv, argc, "ASN:nn_or_IP-address:nn", &idx_ext_community);  	ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);  	if (!ret) { -		vty_out (vty, "%% Malformed Route Distinguisher\n"); +		vty_out(vty, "%% Malformed Route Distinguisher\n");  		return CMD_WARNING;  	}  	return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_normal, NULL, -				     SHOW_DISPLAY_OVERLAY, use_json(argc, -								    argv)); +				     SHOW_DISPLAY_OVERLAY, +				     use_json(argc, argv));  }  /* For testing purpose, static route of MPLS-VPN. */ @@ -973,14 +947,13 @@ DEFUN(evpnrt5_network,  	int idx_ethtag = 5;  	int idx_routermac = 13;  	int idx_rmap = 15; -	return bgp_static_set_safi(AFI_L2VPN, SAFI_EVPN, vty, -				   argv[idx_ipv4_prefixlen]->arg, -				   argv[idx_ext_community]->arg, -				   argv[idx_word]->arg, -				   argv[idx_rmap] ? argv[idx_gwip]->arg : NULL, -				   BGP_EVPN_IP_PREFIX_ROUTE, argv[idx_esi]->arg, -				   argv[idx_gwip]->arg, argv[idx_ethtag]->arg, -				   argv[idx_routermac]->arg); +	return bgp_static_set_safi( +		AFI_L2VPN, SAFI_EVPN, vty, argv[idx_ipv4_prefixlen]->arg, +		argv[idx_ext_community]->arg, argv[idx_word]->arg, +		argv[idx_rmap] ? argv[idx_gwip]->arg : NULL, +		BGP_EVPN_IP_PREFIX_ROUTE, argv[idx_esi]->arg, +		argv[idx_gwip]->arg, argv[idx_ethtag]->arg, +		argv[idx_routermac]->arg);  }  /* For testing purpose, static route of MPLS-VPN. */ @@ -1007,147 +980,135 @@ DEFUN(no_evpnrt5_network,  	int idx_ethtag = 6;  	int idx_esi = 10;  	int idx_gwip = 12; -	return bgp_static_unset_safi(AFI_L2VPN, SAFI_EVPN, vty, -				     argv[idx_ipv4_prefixlen]->arg, -				     argv[idx_ext_community]->arg, -				     argv[idx_label]->arg, BGP_EVPN_IP_PREFIX_ROUTE, -				     argv[idx_esi]->arg, argv[idx_gwip]->arg, -				     argv[idx_ethtag]->arg); +	return bgp_static_unset_safi( +		AFI_L2VPN, SAFI_EVPN, vty, argv[idx_ipv4_prefixlen]->arg, +		argv[idx_ext_community]->arg, argv[idx_label]->arg, +		BGP_EVPN_IP_PREFIX_ROUTE, argv[idx_esi]->arg, +		argv[idx_gwip]->arg, argv[idx_ethtag]->arg);  }  #if defined(HAVE_CUMULUS) -static void -evpn_rt_delete_auto (struct bgp *bgp, struct bgpevpn *vpn, struct list *rtl) +static void evpn_rt_delete_auto(struct bgp *bgp, struct bgpevpn *vpn, +				struct list *rtl)  { -  struct listnode *node, *nnode, *node_to_del; -  struct ecommunity *ecom, *ecom_auto; -  struct ecommunity_val eval; +	struct listnode *node, *nnode, *node_to_del; +	struct ecommunity *ecom, *ecom_auto; +	struct ecommunity_val eval; -  encode_route_target_as ((bgp->as & 0xFFFF), vpn->vni, &eval); +	encode_route_target_as((bgp->as & 0xFFFF), vpn->vni, &eval); -  ecom_auto = ecommunity_new (); -  ecommunity_add_val (ecom_auto, &eval); -  node_to_del = NULL; +	ecom_auto = ecommunity_new(); +	ecommunity_add_val(ecom_auto, &eval); +	node_to_del = NULL; -  for (ALL_LIST_ELEMENTS (rtl, node, nnode, ecom)) -    { -      if (ecommunity_match (ecom, ecom_auto)) -        { -          ecommunity_free (&ecom); -          node_to_del = node; -        } -    } +	for (ALL_LIST_ELEMENTS(rtl, node, nnode, ecom)) { +		if (ecommunity_match(ecom, ecom_auto)) { +			ecommunity_free(&ecom); +			node_to_del = node; +		} +	} -  if (node_to_del) -    list_delete_node(rtl, node_to_del); +	if (node_to_del) +		list_delete_node(rtl, node_to_del); -  ecommunity_free(&ecom_auto); +	ecommunity_free(&ecom_auto);  } -static void -evpn_import_rt_delete_auto (struct bgp *bgp, struct bgpevpn *vpn) +static void evpn_import_rt_delete_auto(struct bgp *bgp, struct bgpevpn *vpn)  { -  evpn_rt_delete_auto (bgp, vpn, vpn->import_rtl); +	evpn_rt_delete_auto(bgp, vpn, vpn->import_rtl);  } -static void -evpn_export_rt_delete_auto (struct bgp *bgp, struct bgpevpn *vpn) +static void evpn_export_rt_delete_auto(struct bgp *bgp, struct bgpevpn *vpn)  { -  evpn_rt_delete_auto (bgp, vpn, vpn->export_rtl); +	evpn_rt_delete_auto(bgp, vpn, vpn->export_rtl);  }  /*   * Configure the Import RTs for a VNI (vty handler). Caller expected to   * check that this is a change.   */ -static void -evpn_configure_import_rt (struct bgp *bgp, struct bgpevpn *vpn, -                          struct ecommunity *ecomadd) +static void evpn_configure_import_rt(struct bgp *bgp, struct bgpevpn *vpn, +				     struct ecommunity *ecomadd)  { -  /* If the VNI is "live", we need to uninstall routes using the current -   * import RT(s) first before we update the import RT, and subsequently -   * install routes. -   */ -  if (is_vni_live (vpn)) -    bgp_evpn_uninstall_routes (bgp, vpn); +	/* If the VNI is "live", we need to uninstall routes using the current +	 * import RT(s) first before we update the import RT, and subsequently +	 * install routes. +	 */ +	if (is_vni_live(vpn)) +		bgp_evpn_uninstall_routes(bgp, vpn); -  /* Cleanup the RT to VNI mapping and get rid of existing import RT. */ -  bgp_evpn_unmap_vni_from_its_rts (bgp, vpn); +	/* Cleanup the RT to VNI mapping and get rid of existing import RT. */ +	bgp_evpn_unmap_vni_from_its_rts(bgp, vpn); -  /* If the auto route-target is in use we must remove it */ -  evpn_import_rt_delete_auto(bgp, vpn); +	/* If the auto route-target is in use we must remove it */ +	evpn_import_rt_delete_auto(bgp, vpn); -  /* Add new RT and rebuild the RT to VNI mapping */ -  listnode_add_sort (vpn->import_rtl, ecomadd); +	/* Add new RT and rebuild the RT to VNI mapping */ +	listnode_add_sort(vpn->import_rtl, ecomadd); -  SET_FLAG (vpn->flags, VNI_FLAG_IMPRT_CFGD); -  bgp_evpn_map_vni_to_its_rts (bgp, vpn); +	SET_FLAG(vpn->flags, VNI_FLAG_IMPRT_CFGD); +	bgp_evpn_map_vni_to_its_rts(bgp, vpn); -  /* Install routes that match new import RT */ -  if (is_vni_live (vpn)) -    bgp_evpn_install_routes (bgp, vpn); +	/* Install routes that match new import RT */ +	if (is_vni_live(vpn)) +		bgp_evpn_install_routes(bgp, vpn);  }  /*   * Unconfigure Import RT(s) for a VNI (vty handler).   */ -static void -evpn_unconfigure_import_rt (struct bgp *bgp, struct bgpevpn *vpn, -                            struct ecommunity *ecomdel) -{ -  struct listnode *node, *nnode, *node_to_del; -  struct ecommunity *ecom; - -  /* Along the lines of "configure" except we have to reset to the -   * automatic value. -   */ -  if (is_vni_live (vpn)) -    bgp_evpn_uninstall_routes (bgp, vpn); - -  /* Cleanup the RT to VNI mapping and get rid of existing import RT. */ -  bgp_evpn_unmap_vni_from_its_rts (bgp, vpn); - -  /* Delete all import RTs */ -  if (ecomdel == NULL) -    { -      for (ALL_LIST_ELEMENTS (vpn->import_rtl, node, nnode, ecom)) -        ecommunity_free (&ecom); - -      list_delete_all_node(vpn->import_rtl); -    } - -  /* Delete a specific import RT */ -  else -    { -      node_to_del = NULL; - -      for (ALL_LIST_ELEMENTS (vpn->import_rtl, node, nnode, ecom)) -        { -          if (ecommunity_match (ecom, ecomdel)) -            { -              ecommunity_free (&ecom); -              node_to_del = node; -              break; -            } -        } - -      if (node_to_del) -        list_delete_node(vpn->import_rtl, node_to_del); -    } - -  /* Reset to auto RT - this also rebuilds the RT to VNI mapping */ -  if (list_isempty(vpn->import_rtl)) -    { -      UNSET_FLAG (vpn->flags, VNI_FLAG_IMPRT_CFGD); -      bgp_evpn_derive_auto_rt_import (bgp, vpn); -    } -  /* Rebuild the RT to VNI mapping */ -  else -    bgp_evpn_map_vni_to_its_rts (bgp, vpn); - -  /* Install routes that match new import RT */ -  if (is_vni_live (vpn)) -    bgp_evpn_install_routes (bgp, vpn); +static void evpn_unconfigure_import_rt(struct bgp *bgp, struct bgpevpn *vpn, +				       struct ecommunity *ecomdel) +{ +	struct listnode *node, *nnode, *node_to_del; +	struct ecommunity *ecom; + +	/* Along the lines of "configure" except we have to reset to the +	 * automatic value. +	 */ +	if (is_vni_live(vpn)) +		bgp_evpn_uninstall_routes(bgp, vpn); + +	/* Cleanup the RT to VNI mapping and get rid of existing import RT. */ +	bgp_evpn_unmap_vni_from_its_rts(bgp, vpn); + +	/* Delete all import RTs */ +	if (ecomdel == NULL) { +		for (ALL_LIST_ELEMENTS(vpn->import_rtl, node, nnode, ecom)) +			ecommunity_free(&ecom); + +		list_delete_all_node(vpn->import_rtl); +	} + +	/* Delete a specific import RT */ +	else { +		node_to_del = NULL; + +		for (ALL_LIST_ELEMENTS(vpn->import_rtl, node, nnode, ecom)) { +			if (ecommunity_match(ecom, ecomdel)) { +				ecommunity_free(&ecom); +				node_to_del = node; +				break; +			} +		} + +		if (node_to_del) +			list_delete_node(vpn->import_rtl, node_to_del); +	} + +	/* Reset to auto RT - this also rebuilds the RT to VNI mapping */ +	if (list_isempty(vpn->import_rtl)) { +		UNSET_FLAG(vpn->flags, VNI_FLAG_IMPRT_CFGD); +		bgp_evpn_derive_auto_rt_import(bgp, vpn); +	} +	/* Rebuild the RT to VNI mapping */ +	else +		bgp_evpn_map_vni_to_its_rts(bgp, vpn); + +	/* Install routes that match new import RT */ +	if (is_vni_live(vpn)) +		bgp_evpn_install_routes(bgp, vpn);  }  /* @@ -1156,137 +1117,126 @@ evpn_unconfigure_import_rt (struct bgp *bgp, struct bgpevpn *vpn,   * allowed for a VNI and any change to configuration is implemented as   * a "replace" (similar to other configuration).   */ -static void -evpn_configure_export_rt (struct bgp *bgp, struct bgpevpn *vpn, -                          struct ecommunity *ecomadd) +static void evpn_configure_export_rt(struct bgp *bgp, struct bgpevpn *vpn, +				     struct ecommunity *ecomadd)  { -  /* If the auto route-target is in use we must remove it */ -  evpn_export_rt_delete_auto (bgp, vpn); +	/* If the auto route-target is in use we must remove it */ +	evpn_export_rt_delete_auto(bgp, vpn); -  listnode_add_sort (vpn->export_rtl, ecomadd); -  SET_FLAG (vpn->flags, VNI_FLAG_EXPRT_CFGD); +	listnode_add_sort(vpn->export_rtl, ecomadd); +	SET_FLAG(vpn->flags, VNI_FLAG_EXPRT_CFGD); -  if (is_vni_live (vpn)) -    bgp_evpn_handle_export_rt_change (bgp, vpn); +	if (is_vni_live(vpn)) +		bgp_evpn_handle_export_rt_change(bgp, vpn);  }  /*   * Unconfigure the Export RT for a VNI (vty handler)   */ -static void -evpn_unconfigure_export_rt (struct bgp *bgp, struct bgpevpn *vpn, -                            struct ecommunity *ecomdel) -{ -  struct listnode *node, *nnode, *node_to_del; -  struct ecommunity *ecom; - -  /* Delete all export RTs */ -  if (ecomdel == NULL) -    { -      /* Reset to default and process all routes. */ -      for (ALL_LIST_ELEMENTS (vpn->export_rtl, node, nnode, ecom)) -        ecommunity_free (&ecom); - -      list_delete_all_node(vpn->export_rtl); -    } - -  /* Delete a specific export RT */ -  else -    { -      node_to_del = NULL; - -      for (ALL_LIST_ELEMENTS (vpn->export_rtl, node, nnode, ecom)) -        { -          if (ecommunity_match (ecom, ecomdel)) -            { -              ecommunity_free (&ecom); -              node_to_del = node; -              break; -            } -        } - -      if (node_to_del) -        list_delete_node(vpn->export_rtl, node_to_del); -    } - -  if (list_isempty(vpn->export_rtl)) -    { -      UNSET_FLAG (vpn->flags, VNI_FLAG_EXPRT_CFGD); -      bgp_evpn_derive_auto_rt_export (bgp, vpn); -    } - -  if (is_vni_live (vpn)) -    bgp_evpn_handle_export_rt_change (bgp, vpn); +static void evpn_unconfigure_export_rt(struct bgp *bgp, struct bgpevpn *vpn, +				       struct ecommunity *ecomdel) +{ +	struct listnode *node, *nnode, *node_to_del; +	struct ecommunity *ecom; + +	/* Delete all export RTs */ +	if (ecomdel == NULL) { +		/* Reset to default and process all routes. */ +		for (ALL_LIST_ELEMENTS(vpn->export_rtl, node, nnode, ecom)) +			ecommunity_free(&ecom); + +		list_delete_all_node(vpn->export_rtl); +	} + +	/* Delete a specific export RT */ +	else { +		node_to_del = NULL; + +		for (ALL_LIST_ELEMENTS(vpn->export_rtl, node, nnode, ecom)) { +			if (ecommunity_match(ecom, ecomdel)) { +				ecommunity_free(&ecom); +				node_to_del = node; +				break; +			} +		} + +		if (node_to_del) +			list_delete_node(vpn->export_rtl, node_to_del); +	} + +	if (list_isempty(vpn->export_rtl)) { +		UNSET_FLAG(vpn->flags, VNI_FLAG_EXPRT_CFGD); +		bgp_evpn_derive_auto_rt_export(bgp, vpn); +	} + +	if (is_vni_live(vpn)) +		bgp_evpn_handle_export_rt_change(bgp, vpn);  }  /*   * Configure RD for a VNI (vty handler)   */ -static void -evpn_configure_rd (struct bgp *bgp, struct bgpevpn *vpn, -                   struct prefix_rd *rd) +static void evpn_configure_rd(struct bgp *bgp, struct bgpevpn *vpn, +			      struct prefix_rd *rd)  { -  /* If the VNI is "live", we need to delete and withdraw this VNI's -   * local routes with the prior RD first. Then, after updating RD, -   * need to re-advertise. -   */ -  if (is_vni_live (vpn)) -    bgp_evpn_handle_rd_change (bgp, vpn, 1); +	/* If the VNI is "live", we need to delete and withdraw this VNI's +	 * local routes with the prior RD first. Then, after updating RD, +	 * need to re-advertise. +	 */ +	if (is_vni_live(vpn)) +		bgp_evpn_handle_rd_change(bgp, vpn, 1); -  /* update RD */ -  memcpy(&vpn->prd, rd, sizeof (struct prefix_rd)); -  SET_FLAG (vpn->flags, VNI_FLAG_RD_CFGD); +	/* update RD */ +	memcpy(&vpn->prd, rd, sizeof(struct prefix_rd)); +	SET_FLAG(vpn->flags, VNI_FLAG_RD_CFGD); -  if (is_vni_live (vpn)) -    bgp_evpn_handle_rd_change (bgp, vpn, 0); +	if (is_vni_live(vpn)) +		bgp_evpn_handle_rd_change(bgp, vpn, 0);  }  /*   * Unconfigure RD for a VNI (vty handler)   */ -static void -evpn_unconfigure_rd (struct bgp *bgp, struct bgpevpn *vpn) +static void evpn_unconfigure_rd(struct bgp *bgp, struct bgpevpn *vpn)  { -  /* If the VNI is "live", we need to delete and withdraw this VNI's -   * local routes with the prior RD first. Then, after resetting RD -   * to automatic value, need to re-advertise. -   */ -  if (is_vni_live (vpn)) -    bgp_evpn_handle_rd_change (bgp, vpn, 1); +	/* If the VNI is "live", we need to delete and withdraw this VNI's +	 * local routes with the prior RD first. Then, after resetting RD +	 * to automatic value, need to re-advertise. +	 */ +	if (is_vni_live(vpn)) +		bgp_evpn_handle_rd_change(bgp, vpn, 1); -  /* reset RD to default */ -  bgp_evpn_derive_auto_rd (bgp, vpn); +	/* reset RD to default */ +	bgp_evpn_derive_auto_rd(bgp, vpn); -  if (is_vni_live (vpn)) -    bgp_evpn_handle_rd_change (bgp, vpn, 0); +	if (is_vni_live(vpn)) +		bgp_evpn_handle_rd_change(bgp, vpn, 0);  }  /*   * Create VNI, if not already present (VTY handler). Mark as configured.   */ -static struct bgpevpn * -evpn_create_update_vni (struct bgp *bgp, vni_t vni) +static struct bgpevpn *evpn_create_update_vni(struct bgp *bgp, vni_t vni)  { -  struct bgpevpn *vpn; +	struct bgpevpn *vpn; -  if (!bgp->vnihash) -    return NULL; +	if (!bgp->vnihash) +		return NULL; -  vpn = bgp_evpn_lookup_vni (bgp, vni); -  if (!vpn) -    { -      vpn = bgp_evpn_new (bgp, vni, bgp->router_id); -      if (!vpn) -        { -          zlog_err ("%u: Failed to allocate VNI entry for VNI %u - at Config", -                    bgp->vrf_id, vni); -          return NULL; -        } -    } +	vpn = bgp_evpn_lookup_vni(bgp, vni); +	if (!vpn) { +		vpn = bgp_evpn_new(bgp, vni, bgp->router_id); +		if (!vpn) { +			zlog_err( +				"%u: Failed to allocate VNI entry for VNI %u - at Config", +				bgp->vrf_id, vni); +			return NULL; +		} +	} -  /* Mark as configured. */ -  SET_FLAG (vpn->flags, VNI_FLAG_CFGD); -  return vpn; +	/* Mark as configured. */ +	SET_FLAG(vpn->flags, VNI_FLAG_CFGD); +	return vpn;  }  /* @@ -1296,166 +1246,154 @@ evpn_create_update_vni (struct bgp *bgp, vni_t vni)   * appropriate action) and the VNI marked as unconfigured; the   * VNI will continue to exist, purely as a "learnt" entity.   */ -static int -evpn_delete_vni (struct bgp *bgp, struct bgpevpn *vpn) +static int evpn_delete_vni(struct bgp *bgp, struct bgpevpn *vpn)  { -  assert (bgp->vnihash); +	assert(bgp->vnihash); -  if (!is_vni_live (vpn)) -    { -      bgp_evpn_free (bgp, vpn); -      return 0; -    } +	if (!is_vni_live(vpn)) { +		bgp_evpn_free(bgp, vpn); +		return 0; +	} -  /* We need to take the unconfigure action for each parameter of this VNI -   * that is configured. Some optimization is possible, but not worth the -   * additional code for an operation that should be pretty rare. -   */ -  UNSET_FLAG (vpn->flags, VNI_FLAG_CFGD); +	/* We need to take the unconfigure action for each parameter of this VNI +	 * that is configured. Some optimization is possible, but not worth the +	 * additional code for an operation that should be pretty rare. +	 */ +	UNSET_FLAG(vpn->flags, VNI_FLAG_CFGD); -  /* First, deal with the export side - RD and export RT changes. */ -  if (is_rd_configured (vpn)) -    evpn_unconfigure_rd (bgp, vpn); -  if (is_export_rt_configured (vpn)) -    evpn_unconfigure_export_rt (bgp, vpn, NULL); +	/* First, deal with the export side - RD and export RT changes. */ +	if (is_rd_configured(vpn)) +		evpn_unconfigure_rd(bgp, vpn); +	if (is_export_rt_configured(vpn)) +		evpn_unconfigure_export_rt(bgp, vpn, NULL); -  /* Next, deal with the import side. */ -  if (is_import_rt_configured (vpn)) -    evpn_unconfigure_import_rt (bgp, vpn, NULL); +	/* Next, deal with the import side. */ +	if (is_import_rt_configured(vpn)) +		evpn_unconfigure_import_rt(bgp, vpn, NULL); -  return 0; +	return 0;  }  /*   * Display import RT mapping to VNIs (vty handler)   */ -static void -evpn_show_import_rts (struct vty *vty, struct bgp *bgp) +static void evpn_show_import_rts(struct vty *vty, struct bgp *bgp)  { -  hash_iterate (bgp->import_rt_hash, -                (void (*) (struct hash_backet *, void *)) -                show_import_rt_entry, vty); +	hash_iterate( +		bgp->import_rt_hash, +		(void (*)(struct hash_backet *, void *))show_import_rt_entry, +		vty);  }  /*   * Display EVPN routes for all VNIs - vty handler.   */ -static void -evpn_show_routes_vni_all (struct vty *vty, struct bgp *bgp, struct in_addr vtep_ip) +static void evpn_show_routes_vni_all(struct vty *vty, struct bgp *bgp, +				     struct in_addr vtep_ip)  { -  u_int32_t num_vnis; -  struct vni_walk_ctx wctx; +	u_int32_t num_vnis; +	struct vni_walk_ctx wctx; -  num_vnis = hashcount(bgp->vnihash); -  if (!num_vnis) -    return; -  memset (&wctx, 0, sizeof (struct vni_walk_ctx)); -  wctx.bgp = bgp; -  wctx.vty = vty; -  wctx.vtep_ip = vtep_ip; -  hash_iterate (bgp->vnihash, -                (void (*) (struct hash_backet *, void *)) -                show_vni_routes_hash, &wctx); +	num_vnis = hashcount(bgp->vnihash); +	if (!num_vnis) +		return; +	memset(&wctx, 0, sizeof(struct vni_walk_ctx)); +	wctx.bgp = bgp; +	wctx.vty = vty; +	wctx.vtep_ip = vtep_ip; +	hash_iterate(bgp->vnihash, (void (*)(struct hash_backet *, +					     void *))show_vni_routes_hash, +		     &wctx);  }  /*   * Display EVPN routes for a VNI -- for specific type-3 route (vty handler).   */ -static void -evpn_show_route_vni_multicast (struct vty *vty, struct bgp *bgp, -                               vni_t vni, struct in_addr orig_ip) -{ -  struct bgpevpn *vpn; -  struct prefix_evpn p; -  struct bgp_node *rn; -  struct bgp_info *ri; -  u_int32_t path_cnt = 0; -  afi_t afi; -  safi_t safi; - -  afi = AFI_L2VPN; -  safi = SAFI_EVPN; - -  /* Locate VNI. */ -  vpn = bgp_evpn_lookup_vni (bgp, vni); -  if (!vpn) -    { -      vty_out (vty, "VNI not found\n"); -      return; -    } - -  /* See if route exists. */ -  build_evpn_type3_prefix (&p, orig_ip); -  rn = bgp_node_lookup (vpn->route_table, (struct prefix *)&p); -  if (!rn || !rn->info) -    { -      vty_out (vty, "%% Network not in table\n"); -      return; -    } - -  /* Prefix and num paths displayed once per prefix. */ -  route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi, NULL); - -  /* Display each path for this prefix. */ -  for (ri = rn->info; ri; ri = ri->next) -    { -      route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi, NULL); -      path_cnt++; -    } - -  vty_out (vty, "\nDisplayed %u paths for requested prefix\n", -           path_cnt); +static void evpn_show_route_vni_multicast(struct vty *vty, struct bgp *bgp, +					  vni_t vni, struct in_addr orig_ip) +{ +	struct bgpevpn *vpn; +	struct prefix_evpn p; +	struct bgp_node *rn; +	struct bgp_info *ri; +	u_int32_t path_cnt = 0; +	afi_t afi; +	safi_t safi; + +	afi = AFI_L2VPN; +	safi = SAFI_EVPN; + +	/* Locate VNI. */ +	vpn = bgp_evpn_lookup_vni(bgp, vni); +	if (!vpn) { +		vty_out(vty, "VNI not found\n"); +		return; +	} + +	/* See if route exists. */ +	build_evpn_type3_prefix(&p, orig_ip); +	rn = bgp_node_lookup(vpn->route_table, (struct prefix *)&p); +	if (!rn || !rn->info) { +		vty_out(vty, "%% Network not in table\n"); +		return; +	} + +	/* Prefix and num paths displayed once per prefix. */ +	route_vty_out_detail_header(vty, bgp, rn, NULL, afi, safi, NULL); + +	/* Display each path for this prefix. */ +	for (ri = rn->info; ri; ri = ri->next) { +		route_vty_out_detail(vty, bgp, &rn->p, ri, afi, safi, NULL); +		path_cnt++; +	} + +	vty_out(vty, "\nDisplayed %u paths for requested prefix\n", path_cnt);  }  /*   * Display EVPN routes for a VNI -- for specific MAC and/or IP (vty handler).   * By definition, only matching type-2 route will be displayed.   */ -static void -evpn_show_route_vni_macip (struct vty *vty, struct bgp *bgp, -                           vni_t vni, struct ethaddr *mac, -                           struct ipaddr *ip) -{ -  struct bgpevpn *vpn; -  struct prefix_evpn p; -  struct bgp_node *rn; -  struct bgp_info *ri; -  u_int32_t path_cnt = 0; -  afi_t afi; -  safi_t safi; - -  afi = AFI_L2VPN; -  safi = SAFI_EVPN; - -  /* Locate VNI. */ -  vpn = bgp_evpn_lookup_vni (bgp, vni); -  if (!vpn) -    { -      vty_out (vty, "VNI not found\n"); -      return; -    } - -  /* See if route exists. Look for both non-sticky and sticky. */ -  build_evpn_type2_prefix (&p, mac, ip); -  rn = bgp_node_lookup (vpn->route_table, (struct prefix *)&p); -  if (!rn || !rn->info) -    { -      vty_out (vty, "%% Network not in table\n"); -      return; -    } - -  /* Prefix and num paths displayed once per prefix. */ -  route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi, NULL); - -  /* Display each path for this prefix. */ -  for (ri = rn->info; ri; ri = ri->next) -    { -      route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi, NULL); -      path_cnt++; -    } - -  vty_out (vty, "\nDisplayed %u paths for requested prefix\n", -           path_cnt); +static void evpn_show_route_vni_macip(struct vty *vty, struct bgp *bgp, +				      vni_t vni, struct ethaddr *mac, +				      struct ipaddr *ip) +{ +	struct bgpevpn *vpn; +	struct prefix_evpn p; +	struct bgp_node *rn; +	struct bgp_info *ri; +	u_int32_t path_cnt = 0; +	afi_t afi; +	safi_t safi; + +	afi = AFI_L2VPN; +	safi = SAFI_EVPN; + +	/* Locate VNI. */ +	vpn = bgp_evpn_lookup_vni(bgp, vni); +	if (!vpn) { +		vty_out(vty, "VNI not found\n"); +		return; +	} + +	/* See if route exists. Look for both non-sticky and sticky. */ +	build_evpn_type2_prefix(&p, mac, ip); +	rn = bgp_node_lookup(vpn->route_table, (struct prefix *)&p); +	if (!rn || !rn->info) { +		vty_out(vty, "%% Network not in table\n"); +		return; +	} + +	/* Prefix and num paths displayed once per prefix. */ +	route_vty_out_detail_header(vty, bgp, rn, NULL, afi, safi, NULL); + +	/* Display each path for this prefix. */ +	for (ri = rn->info; ri; ri = ri->next) { +		route_vty_out_detail(vty, bgp, &rn->p, ri, afi, safi, NULL); +		path_cnt++; +	} + +	vty_out(vty, "\nDisplayed %u paths for requested prefix\n", path_cnt);  }  /* @@ -1463,22 +1401,20 @@ evpn_show_route_vni_macip (struct vty *vty, struct bgp *bgp,   * If 'type' is non-zero, only routes matching that type are shown.   * If the vtep_ip is non zero, only routes behind that vtep are shown   */ -static void -evpn_show_routes_vni (struct vty *vty, struct bgp *bgp, -                      vni_t vni, int type, struct in_addr vtep_ip) +static void evpn_show_routes_vni(struct vty *vty, struct bgp *bgp, vni_t vni, +				 int type, struct in_addr vtep_ip)  { -  struct bgpevpn *vpn; +	struct bgpevpn *vpn; -  /* Locate VNI. */ -  vpn = bgp_evpn_lookup_vni (bgp, vni); -  if (!vpn) -    { -      vty_out (vty, "VNI not found\n"); -      return; -    } +	/* Locate VNI. */ +	vpn = bgp_evpn_lookup_vni(bgp, vni); +	if (!vpn) { +		vty_out(vty, "VNI not found\n"); +		return; +	} -  /* Walk this VNI's route table and display appropriate routes. */ -  show_vni_routes (bgp, vpn, type, vty, vtep_ip); +	/* Walk this VNI's route table and display appropriate routes. */ +	show_vni_routes(bgp, vpn, type, vty, vtep_ip);  }  /* @@ -1486,321 +1422,305 @@ evpn_show_routes_vni (struct vty *vty, struct bgp *bgp,   * IP (vty handler). By definition, only matching type-2 route will be   * displayed.   */ -static void -evpn_show_route_rd_macip (struct vty *vty, struct bgp *bgp, -                          struct prefix_rd *prd, struct ethaddr *mac, -                          struct ipaddr *ip) -{ -  struct prefix_evpn p; -  struct bgp_node *rn; -  struct bgp_info *ri; -  afi_t afi; -  safi_t safi; -  u_int32_t path_cnt = 0; - -  afi = AFI_L2VPN; -  safi = SAFI_EVPN; - -  /* See if route exists. Look for both non-sticky and sticky. */ -  build_evpn_type2_prefix (&p, mac, ip); -  rn = bgp_afi_node_lookup (bgp->rib[afi][safi], afi, safi, -                            (struct prefix *)&p, prd); -  if (!rn || !rn->info) -    { -      vty_out (vty, "%% Network not in table\n"); -      return; -    } - -  /* Prefix and num paths displayed once per prefix. */ -  route_vty_out_detail_header (vty, bgp, rn, prd, afi, safi, NULL); - -  /* Display each path for this prefix. */ -  for (ri = rn->info; ri; ri = ri->next) -    { -      route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi, NULL); -      path_cnt++; -    } - -  vty_out (vty, "\nDisplayed %u paths for requested prefix\n", -           path_cnt); +static void evpn_show_route_rd_macip(struct vty *vty, struct bgp *bgp, +				     struct prefix_rd *prd, struct ethaddr *mac, +				     struct ipaddr *ip) +{ +	struct prefix_evpn p; +	struct bgp_node *rn; +	struct bgp_info *ri; +	afi_t afi; +	safi_t safi; +	u_int32_t path_cnt = 0; + +	afi = AFI_L2VPN; +	safi = SAFI_EVPN; + +	/* See if route exists. Look for both non-sticky and sticky. */ +	build_evpn_type2_prefix(&p, mac, ip); +	rn = bgp_afi_node_lookup(bgp->rib[afi][safi], afi, safi, +				 (struct prefix *)&p, prd); +	if (!rn || !rn->info) { +		vty_out(vty, "%% Network not in table\n"); +		return; +	} + +	/* Prefix and num paths displayed once per prefix. */ +	route_vty_out_detail_header(vty, bgp, rn, prd, afi, safi, NULL); + +	/* Display each path for this prefix. */ +	for (ri = rn->info; ri; ri = ri->next) { +		route_vty_out_detail(vty, bgp, &rn->p, ri, afi, safi, NULL); +		path_cnt++; +	} + +	vty_out(vty, "\nDisplayed %u paths for requested prefix\n", path_cnt);  }  /*   * Display BGP EVPN routing table -- for specific RD (vty handler)   * If 'type' is non-zero, only routes matching that type are shown.   */ -static void -evpn_show_route_rd (struct vty *vty, struct bgp *bgp, -                    struct prefix_rd *prd, int type) -{ -  struct bgp_node *rd_rn; -  struct bgp_table *table; -  struct bgp_node *rn; -  struct bgp_info *ri; -  int rd_header = 1; -  afi_t afi; -  safi_t safi; -  u_int32_t prefix_cnt, path_cnt; - -  afi = AFI_L2VPN; -  safi = SAFI_EVPN; -  prefix_cnt = path_cnt = 0; - -  rd_rn = bgp_node_lookup (bgp->rib[afi][safi], (struct prefix *) prd); -  if (!rd_rn) -    return; -  table = (struct bgp_table *)rd_rn->info; -  if (table == NULL) -    return; - -  /* Display all prefixes with this RD. */ -  for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) -    { -      struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p; - -      if (type && -          evp->prefix.route_type != type) -        continue; - -      if (rn->info) -        { -          /* RD header and legend - once overall. */ -          if (rd_header) -            { -              vty_out (vty, "EVPN type-2 prefix: [2]:[ESI]:[EthTag]:[MAClen]:" -                       "[MAC]\n"); -              vty_out (vty, "EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:" -                       "[OrigIP]\n\n"); -              rd_header = 0; -            } - -          /* Prefix and num paths displayed once per prefix. */ -          route_vty_out_detail_header (vty, bgp, rn, prd, afi, safi, NULL); - -          prefix_cnt++; -        } - -      /* Display each path for this prefix. */ -      for (ri = rn->info; ri; ri = ri->next) -        { -          route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi, NULL); -          path_cnt++; -        } -    } - -  if (prefix_cnt == 0) -    vty_out (vty, "No prefixes exist with this RD%s\n", -             type ? " (of requested type)" : ""); -  else -    vty_out (vty, "\nDisplayed %u prefixes (%u paths) with this RD%s\n", -             prefix_cnt, path_cnt, -             type ? " (of requested type)" : ""); +static void evpn_show_route_rd(struct vty *vty, struct bgp *bgp, +			       struct prefix_rd *prd, int type) +{ +	struct bgp_node *rd_rn; +	struct bgp_table *table; +	struct bgp_node *rn; +	struct bgp_info *ri; +	int rd_header = 1; +	afi_t afi; +	safi_t safi; +	u_int32_t prefix_cnt, path_cnt; + +	afi = AFI_L2VPN; +	safi = SAFI_EVPN; +	prefix_cnt = path_cnt = 0; + +	rd_rn = bgp_node_lookup(bgp->rib[afi][safi], (struct prefix *)prd); +	if (!rd_rn) +		return; +	table = (struct bgp_table *)rd_rn->info; +	if (table == NULL) +		return; + +	/* Display all prefixes with this RD. */ +	for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { +		struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p; + +		if (type && evp->prefix.route_type != type) +			continue; + +		if (rn->info) { +			/* RD header and legend - once overall. */ +			if (rd_header) { +				vty_out(vty, +					"EVPN type-2 prefix: [2]:[ESI]:[EthTag]:[MAClen]:" +					"[MAC]\n"); +				vty_out(vty, +					"EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:" +					"[OrigIP]\n\n"); +				rd_header = 0; +			} + +			/* Prefix and num paths displayed once per prefix. */ +			route_vty_out_detail_header(vty, bgp, rn, prd, afi, +						    safi, NULL); + +			prefix_cnt++; +		} + +		/* Display each path for this prefix. */ +		for (ri = rn->info; ri; ri = ri->next) { +			route_vty_out_detail(vty, bgp, &rn->p, ri, afi, safi, +					     NULL); +			path_cnt++; +		} +	} + +	if (prefix_cnt == 0) +		vty_out(vty, "No prefixes exist with this RD%s\n", +			type ? " (of requested type)" : ""); +	else +		vty_out(vty, +			"\nDisplayed %u prefixes (%u paths) with this RD%s\n", +			prefix_cnt, path_cnt, +			type ? " (of requested type)" : "");  }  /*   * Display BGP EVPN routing table - all routes (vty handler).   * If 'type' is non-zero, only routes matching that type are shown.   */ -static void -evpn_show_all_routes (struct vty *vty, struct bgp *bgp, int type) -{ -  struct bgp_node *rd_rn; -  struct bgp_table *table; -  struct bgp_node *rn; -  struct bgp_info *ri; -  int header = 1; -  int rd_header; -  afi_t afi; -  safi_t safi; -  u_int32_t prefix_cnt, path_cnt; - -  afi = AFI_L2VPN; -  safi = SAFI_EVPN; -  prefix_cnt = path_cnt = 0; - -  /* EVPN routing table is a 2-level table with the first level being -   * the RD. -   */ -  for (rd_rn = bgp_table_top (bgp->rib[afi][safi]); rd_rn; -       rd_rn = bgp_route_next (rd_rn)) -    { -      table = (struct bgp_table *)rd_rn->info; -      if (table == NULL) -        continue; - -      rd_header = 1; - -      /* Display all prefixes for an RD */ -      for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) -        { -          struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p; - -          if (type && -              evp->prefix.route_type != type) -            continue; - -          if (rn->info) -            { -              /* Overall header/legend displayed once. */ -              if (header) -                { -                  bgp_evpn_show_route_header (vty, bgp); -                  header = 0; -                } - -              /* RD header - per RD. */ -              if (rd_header) -                { -                  bgp_evpn_show_route_rd_header (vty, rd_rn); -                  rd_header = 0; -                } - -              prefix_cnt++; -            } - -          /* For EVPN, the prefix is displayed for each path (to fit in -           * with code that already exists). -           */ -          for (ri = rn->info; ri; ri = ri->next) -            { -              path_cnt++; -              route_vty_out (vty, &rn->p, ri, 0, SAFI_EVPN, NULL); -            } -        } -    } - -  if (prefix_cnt == 0) -    vty_out (vty, "No EVPN prefixes %sexist\n", -             type ? "(of requested type) " : ""); -  else -    vty_out (vty, "\nDisplayed %u prefixes (%u paths)%s\n", -             prefix_cnt, path_cnt, -             type ? " (of requested type)" : ""); +static void evpn_show_all_routes(struct vty *vty, struct bgp *bgp, int type) +{ +	struct bgp_node *rd_rn; +	struct bgp_table *table; +	struct bgp_node *rn; +	struct bgp_info *ri; +	int header = 1; +	int rd_header; +	afi_t afi; +	safi_t safi; +	u_int32_t prefix_cnt, path_cnt; + +	afi = AFI_L2VPN; +	safi = SAFI_EVPN; +	prefix_cnt = path_cnt = 0; + +	/* EVPN routing table is a 2-level table with the first level being +	 * the RD. +	 */ +	for (rd_rn = bgp_table_top(bgp->rib[afi][safi]); rd_rn; +	     rd_rn = bgp_route_next(rd_rn)) { +		table = (struct bgp_table *)rd_rn->info; +		if (table == NULL) +			continue; + +		rd_header = 1; + +		/* Display all prefixes for an RD */ +		for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { +			struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p; + +			if (type && evp->prefix.route_type != type) +				continue; + +			if (rn->info) { +				/* Overall header/legend displayed once. */ +				if (header) { +					bgp_evpn_show_route_header(vty, bgp); +					header = 0; +				} + +				/* RD header - per RD. */ +				if (rd_header) { +					bgp_evpn_show_route_rd_header(vty, +								      rd_rn); +					rd_header = 0; +				} + +				prefix_cnt++; +			} + +			/* For EVPN, the prefix is displayed for each path (to +			 * fit in +			 * with code that already exists). +			 */ +			for (ri = rn->info; ri; ri = ri->next) { +				path_cnt++; +				route_vty_out(vty, &rn->p, ri, 0, SAFI_EVPN, +					      NULL); +			} +		} +	} + +	if (prefix_cnt == 0) +		vty_out(vty, "No EVPN prefixes %sexist\n", +			type ? "(of requested type) " : ""); +	else +		vty_out(vty, "\nDisplayed %u prefixes (%u paths)%s\n", +			prefix_cnt, path_cnt, +			type ? " (of requested type)" : "");  }  /*   * Display specified VNI (vty handler)   */ -static void -evpn_show_vni (struct vty *vty, struct bgp *bgp, vni_t vni) +static void evpn_show_vni(struct vty *vty, struct bgp *bgp, vni_t vni)  { -  struct bgpevpn *vpn; +	struct bgpevpn *vpn; -  vpn = bgp_evpn_lookup_vni (bgp, vni); -  if (!vpn) -    { -      vty_out (vty, "VNI not found\n"); -      return; -    } +	vpn = bgp_evpn_lookup_vni(bgp, vni); +	if (!vpn) { +		vty_out(vty, "VNI not found\n"); +		return; +	} -  display_vni (vty, vpn); +	display_vni(vty, vpn);  }  /*   * Display a VNI (upon user query).   */ -static void -evpn_show_all_vnis (struct vty *vty, struct bgp *bgp) +static void evpn_show_all_vnis(struct vty *vty, struct bgp *bgp)  { -  u_int32_t num_vnis; +	u_int32_t num_vnis; -  num_vnis = hashcount(bgp->vnihash); -  if (!num_vnis) -    return; -  vty_out(vty, "Number of VNIs: %u\n", num_vnis); -  vty_out(vty, "Flags: * - Kernel \n"); -  vty_out(vty, "  %-10s %-15s %-21s %-25s %-25s\n", -          "VNI", "Orig IP", "RD", "Import RT", "Export RT"); -  hash_iterate (bgp->vnihash, -                (void (*) (struct hash_backet *, void *)) -                show_vni_entry, vty); +	num_vnis = hashcount(bgp->vnihash); +	if (!num_vnis) +		return; +	vty_out(vty, "Number of VNIs: %u\n", num_vnis); +	vty_out(vty, "Flags: * - Kernel \n"); +	vty_out(vty, "  %-10s %-15s %-21s %-25s %-25s\n", "VNI", "Orig IP", +		"RD", "Import RT", "Export RT"); +	hash_iterate(bgp->vnihash, +		     (void (*)(struct hash_backet *, void *))show_vni_entry, +		     vty);  }  /*   * EVPN (VNI advertisement) enabled. Register with zebra.   */ -static void -evpn_set_advertise_all_vni (struct bgp *bgp) +static void evpn_set_advertise_all_vni(struct bgp *bgp)  { -  bgp->advertise_all_vni = 1; -  bgp_zebra_advertise_all_vni (bgp, bgp->advertise_all_vni); +	bgp->advertise_all_vni = 1; +	bgp_zebra_advertise_all_vni(bgp, bgp->advertise_all_vni);  }  /*   * EVPN (VNI advertisement) disabled. De-register with zebra. Cleanup VNI   * cache, EVPN routes (delete and withdraw from peers).   */ -static void -evpn_unset_advertise_all_vni (struct bgp *bgp) +static void evpn_unset_advertise_all_vni(struct bgp *bgp)  { -  bgp->advertise_all_vni = 0; -  bgp_zebra_advertise_all_vni (bgp, bgp->advertise_all_vni); -  bgp_evpn_cleanup_on_disable (bgp); +	bgp->advertise_all_vni = 0; +	bgp_zebra_advertise_all_vni(bgp, bgp->advertise_all_vni); +	bgp_evpn_cleanup_on_disable(bgp);  }  #endif /* HAVE_CUMULUS */ -static void -write_vni_config (struct vty *vty, struct bgpevpn *vpn, int *write) -{ -  char buf1[INET6_ADDRSTRLEN]; -  afi_t afi = AFI_L2VPN; -  safi_t safi = SAFI_EVPN; -  char *ecom_str; -  struct listnode *node, *nnode; -  struct ecommunity *ecom; - -  if (is_vni_configured (vpn)) -    { -      bgp_config_write_family_header (vty, afi, safi, write); -      vty_out (vty, "  vni %d\n", vpn->vni); -      if (is_rd_configured (vpn)) -          vty_out (vty, "   rd %s\n", -                        prefix_rd2str (&vpn->prd, buf1, RD_ADDRSTRLEN)); - -      if (is_import_rt_configured (vpn)) -        { -          for (ALL_LIST_ELEMENTS (vpn->import_rtl, node, nnode, ecom)) -            { -              ecom_str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); -              vty_out (vty, "   route-target import %s\n", ecom_str); -              XFREE (MTYPE_ECOMMUNITY_STR, ecom_str); -            } -        } - -      if (is_export_rt_configured (vpn)) -        { -          for (ALL_LIST_ELEMENTS (vpn->export_rtl, node, nnode, ecom)) -            { -              ecom_str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); -              vty_out (vty, "   route-target export %s\n", ecom_str); -              XFREE (MTYPE_ECOMMUNITY_STR, ecom_str); -            } -        } - -      vty_out (vty, "  exit-vni\n"); -    } -} - -static void -write_vni_config_for_entry (struct hash_backet *backet, -                            struct evpn_config_write *cfg) -{ -  struct bgpevpn *vpn = (struct bgpevpn *) backet->data; -  write_vni_config (cfg->vty, vpn, &cfg->write); -} - -#if defined (HAVE_CUMULUS) +static void write_vni_config(struct vty *vty, struct bgpevpn *vpn, int *write) +{ +	char buf1[INET6_ADDRSTRLEN]; +	afi_t afi = AFI_L2VPN; +	safi_t safi = SAFI_EVPN; +	char *ecom_str; +	struct listnode *node, *nnode; +	struct ecommunity *ecom; + +	if (is_vni_configured(vpn)) { +		bgp_config_write_family_header(vty, afi, safi, write); +		vty_out(vty, "  vni %d\n", vpn->vni); +		if (is_rd_configured(vpn)) +			vty_out(vty, "   rd %s\n", +				prefix_rd2str(&vpn->prd, buf1, RD_ADDRSTRLEN)); + +		if (is_import_rt_configured(vpn)) { +			for (ALL_LIST_ELEMENTS(vpn->import_rtl, node, nnode, +					       ecom)) { +				ecom_str = ecommunity_ecom2str( +					ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); +				vty_out(vty, "   route-target import %s\n", +					ecom_str); +				XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); +			} +		} + +		if (is_export_rt_configured(vpn)) { +			for (ALL_LIST_ELEMENTS(vpn->export_rtl, node, nnode, +					       ecom)) { +				ecom_str = ecommunity_ecom2str( +					ecom, ECOMMUNITY_FORMAT_ROUTE_MAP, 0); +				vty_out(vty, "   route-target export %s\n", +					ecom_str); +				XFREE(MTYPE_ECOMMUNITY_STR, ecom_str); +			} +		} + +		vty_out(vty, "  exit-vni\n"); +	} +} + +static void write_vni_config_for_entry(struct hash_backet *backet, +				       struct evpn_config_write *cfg) +{ +	struct bgpevpn *vpn = (struct bgpevpn *)backet->data; +	write_vni_config(cfg->vty, vpn, &cfg->write); +} + +#if defined(HAVE_CUMULUS)  DEFUN (bgp_evpn_advertise_all_vni,         bgp_evpn_advertise_all_vni_cmd,         "advertise-all-vni",         "Advertise All local VNIs\n")  { -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  if (!bgp) -    return CMD_WARNING; -  evpn_set_advertise_all_vni (bgp); -  return CMD_SUCCESS; +	if (!bgp) +		return CMD_WARNING; +	evpn_set_advertise_all_vni(bgp); +	return CMD_SUCCESS;  }  DEFUN (no_bgp_evpn_advertise_all_vni, @@ -1809,12 +1729,12 @@ DEFUN (no_bgp_evpn_advertise_all_vni,         NO_STR         "Advertise All local VNIs\n")  { -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  if (!bgp) -    return CMD_WARNING; -  evpn_unset_advertise_all_vni (bgp); -  return CMD_SUCCESS; +	if (!bgp) +		return CMD_WARNING; +	evpn_unset_advertise_all_vni(bgp); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_vni, @@ -1825,17 +1745,17 @@ DEFUN (show_bgp_evpn_vni,         EVPN_HELP_STR         "Show VNI\n")  { -  struct bgp *bgp; +	struct bgp *bgp; -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; -  vty_out (vty, "Advertise All VNI flag: %s\n", -           bgp->advertise_all_vni? "Enabled" : "Disabled"); +	vty_out(vty, "Advertise All VNI flag: %s\n", +		bgp->advertise_all_vni ? "Enabled" : "Disabled"); -  evpn_show_all_vnis (vty, bgp); -  return CMD_SUCCESS; +	evpn_show_all_vnis(vty, bgp); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_vni_num, @@ -1847,17 +1767,17 @@ DEFUN (show_bgp_evpn_vni_num,         "Show VNI\n"         "VNI number\n")  { -  vni_t vni; -  struct bgp *bgp; +	vni_t vni; +	struct bgp *bgp; -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; -  vni = strtoul(argv[4]->arg, NULL, 10); +	vni = strtoul(argv[4]->arg, NULL, 10); -  evpn_show_vni (vty, bgp, vni); -  return CMD_SUCCESS; +	evpn_show_vni(vty, bgp, vni); +	return CMD_SUCCESS;  }  /* `show bgp evpn summary' commands. */ @@ -1870,8 +1790,8 @@ DEFUN (show_bgp_evpn_summary,         "Summary of BGP neighbor status\n"         "JavaScript Object Notation\n")  { -  u_char uj = use_json(argc, argv); -  return bgp_show_summary_vty (vty, NULL, AFI_L2VPN, SAFI_EVPN, uj); +	u_char uj = use_json(argc, argv); +	return bgp_show_summary_vty(vty, NULL, AFI_L2VPN, SAFI_EVPN, uj);  }  /* Show bgp evpn route */ @@ -1886,25 +1806,24 @@ DEFUN (show_bgp_evpn_route,         "MAC-IP (Type-2) route\n"         "Multicast (Type-3) route\n")  { -  struct bgp *bgp; -  int type = 0; +	struct bgp *bgp; +	int type = 0; -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; -  if (argc == 6) -    { -      if (strncmp (argv[5]->arg, "ma", 2) == 0) -        type = BGP_EVPN_MAC_IP_ROUTE; -      else if (strncmp (argv[5]->arg, "mu", 2) == 0) -        type = BGP_EVPN_IMET_ROUTE; -      else -        return CMD_WARNING; -    } +	if (argc == 6) { +		if (strncmp(argv[5]->arg, "ma", 2) == 0) +			type = BGP_EVPN_MAC_IP_ROUTE; +		else if (strncmp(argv[5]->arg, "mu", 2) == 0) +			type = BGP_EVPN_IMET_ROUTE; +		else +			return CMD_WARNING; +	} -  evpn_show_all_routes (vty, bgp, type); -  return CMD_SUCCESS; +	evpn_show_all_routes(vty, bgp, type); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_route_rd, @@ -1920,34 +1839,32 @@ DEFUN (show_bgp_evpn_route_rd,         "MAC-IP (Type-2) route\n"         "Multicast (Type-3) route\n")  { -  struct bgp *bgp; -  int ret; -  struct prefix_rd prd; -  int type = 0; +	struct bgp *bgp; +	int ret; +	struct prefix_rd prd; +	int type = 0; -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; -  ret = str2prefix_rd (argv[5]->arg, &prd); -  if (! ret) -    { -      vty_out (vty, "%% Malformed Route Distinguisher\n"); -      return CMD_WARNING; -    } +	ret = str2prefix_rd(argv[5]->arg, &prd); +	if (!ret) { +		vty_out(vty, "%% Malformed Route Distinguisher\n"); +		return CMD_WARNING; +	} -  if (argc == 8) -    { -      if (strncmp (argv[7]->arg, "ma", 2) == 0) -        type = BGP_EVPN_MAC_IP_ROUTE; -      else if (strncmp (argv[7]->arg, "mu", 2) == 0) -        type = BGP_EVPN_IMET_ROUTE; -      else -        return CMD_WARNING; -    } +	if (argc == 8) { +		if (strncmp(argv[7]->arg, "ma", 2) == 0) +			type = BGP_EVPN_MAC_IP_ROUTE; +		else if (strncmp(argv[7]->arg, "mu", 2) == 0) +			type = BGP_EVPN_IMET_ROUTE; +		else +			return CMD_WARNING; +	} -  evpn_show_route_rd (vty, bgp, &prd, type); -  return CMD_SUCCESS; +	evpn_show_route_rd(vty, bgp, &prd, type); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_route_rd_macip, @@ -1964,39 +1881,35 @@ DEFUN (show_bgp_evpn_route_rd_macip,         "IP\n"         "IP address (IPv4 or IPv6)\n")  { -  struct bgp *bgp; -  int ret; -  struct prefix_rd prd; -  struct ethaddr mac; -  struct ipaddr ip; - -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; - -  ret = str2prefix_rd (argv[5]->arg, &prd); -  if (! ret) -    { -      vty_out (vty, "%% Malformed Route Distinguisher\n"); -      return CMD_WARNING; -    } -  if (!prefix_str2mac (argv[7]->arg, &mac)) -    { -      vty_out (vty, "%% Malformed MAC address\n"); -      return CMD_WARNING; -    } -  memset (&ip, 0, sizeof (ip)); -  if (argc == 10 && argv[9]->arg != NULL) -    { -      if (str2ipaddr (argv[9]->arg, &ip) != 0) -        { -          vty_out (vty, "%% Malformed IP address\n"); -          return CMD_WARNING; -        } -    } - -  evpn_show_route_rd_macip (vty, bgp, &prd, &mac, &ip); -  return CMD_SUCCESS; +	struct bgp *bgp; +	int ret; +	struct prefix_rd prd; +	struct ethaddr mac; +	struct ipaddr ip; + +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; + +	ret = str2prefix_rd(argv[5]->arg, &prd); +	if (!ret) { +		vty_out(vty, "%% Malformed Route Distinguisher\n"); +		return CMD_WARNING; +	} +	if (!prefix_str2mac(argv[7]->arg, &mac)) { +		vty_out(vty, "%% Malformed MAC address\n"); +		return CMD_WARNING; +	} +	memset(&ip, 0, sizeof(ip)); +	if (argc == 10 && argv[9]->arg != NULL) { +		if (str2ipaddr(argv[9]->arg, &ip) != 0) { +			vty_out(vty, "%% Malformed IP address\n"); +			return CMD_WARNING; +		} +	} + +	evpn_show_route_rd_macip(vty, bgp, &prd, &mac, &ip); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_route_vni, @@ -2014,44 +1927,38 @@ DEFUN (show_bgp_evpn_route_vni,         "Remote VTEP\n"         "Remote VTEP IP address\n")  { -  vni_t vni; -  struct bgp *bgp; -  struct in_addr vtep_ip; -  int type = 0; - -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; - -  vtep_ip.s_addr  = 0; - -  vni = strtoul(argv[5]->arg, NULL, 10); - -  if (argc == 8 && argv[6]->arg) -    { -      if (strncmp (argv[6]->arg, "type", 4) == 0) -        { -          if (strncmp (argv[7]->arg, "ma", 2) == 0) -            type = BGP_EVPN_MAC_IP_ROUTE; -          else if (strncmp (argv[7]->arg, "mu", 2) == 0) -            type = BGP_EVPN_IMET_ROUTE; -          else -            return CMD_WARNING; -        } -      else if (strncmp (argv[6]->arg, "vtep", 4) == 0) -        { -          if (!inet_aton (argv[7]->arg, &vtep_ip)) -            { -              vty_out (vty, "%% Malformed VTEP IP address\n"); -              return CMD_WARNING; -            } -        } -      else -        return CMD_WARNING; -    } - -  evpn_show_routes_vni (vty, bgp, vni, type, vtep_ip); -  return CMD_SUCCESS; +	vni_t vni; +	struct bgp *bgp; +	struct in_addr vtep_ip; +	int type = 0; + +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; + +	vtep_ip.s_addr = 0; + +	vni = strtoul(argv[5]->arg, NULL, 10); + +	if (argc == 8 && argv[6]->arg) { +		if (strncmp(argv[6]->arg, "type", 4) == 0) { +			if (strncmp(argv[7]->arg, "ma", 2) == 0) +				type = BGP_EVPN_MAC_IP_ROUTE; +			else if (strncmp(argv[7]->arg, "mu", 2) == 0) +				type = BGP_EVPN_IMET_ROUTE; +			else +				return CMD_WARNING; +		} else if (strncmp(argv[6]->arg, "vtep", 4) == 0) { +			if (!inet_aton(argv[7]->arg, &vtep_ip)) { +				vty_out(vty, "%% Malformed VTEP IP address\n"); +				return CMD_WARNING; +			} +		} else +			return CMD_WARNING; +	} + +	evpn_show_routes_vni(vty, bgp, vni, type, vtep_ip); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_route_vni_macip, @@ -2068,33 +1975,30 @@ DEFUN (show_bgp_evpn_route_vni_macip,         "IP\n"         "IP address (IPv4 or IPv6)\n")  { -  vni_t vni; -  struct bgp *bgp; -  struct ethaddr mac; -  struct ipaddr ip; - -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; - -  vni = strtoul(argv[5]->arg, NULL, 10); -  if (!prefix_str2mac (argv[7]->arg, &mac)) -    { -      vty_out (vty, "%% Malformed MAC address\n"); -      return CMD_WARNING; -    } -  memset (&ip, 0, sizeof (ip)); -  if (argc == 10 && argv[9]->arg != NULL) -    { -      if (str2ipaddr (argv[9]->arg, &ip) != 0) -        { -          vty_out (vty, "%% Malformed IP address\n"); -          return CMD_WARNING; -        } -    } - -  evpn_show_route_vni_macip (vty, bgp, vni, &mac, &ip); -  return CMD_SUCCESS; +	vni_t vni; +	struct bgp *bgp; +	struct ethaddr mac; +	struct ipaddr ip; + +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; + +	vni = strtoul(argv[5]->arg, NULL, 10); +	if (!prefix_str2mac(argv[7]->arg, &mac)) { +		vty_out(vty, "%% Malformed MAC address\n"); +		return CMD_WARNING; +	} +	memset(&ip, 0, sizeof(ip)); +	if (argc == 10 && argv[9]->arg != NULL) { +		if (str2ipaddr(argv[9]->arg, &ip) != 0) { +			vty_out(vty, "%% Malformed IP address\n"); +			return CMD_WARNING; +		} +	} + +	evpn_show_route_vni_macip(vty, bgp, vni, &mac, &ip); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_route_vni_multicast, @@ -2109,25 +2013,24 @@ DEFUN (show_bgp_evpn_route_vni_multicast,         "Multicast (Type-3) route\n"         "Originating Router IP address\n")  { -  vni_t vni; -  struct bgp *bgp; -  int ret; -  struct in_addr orig_ip; +	vni_t vni; +	struct bgp *bgp; +	int ret; +	struct in_addr orig_ip; -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; -  vni = strtoul(argv[5]->arg, NULL, 10); -  ret = inet_aton (argv[7]->arg, &orig_ip); -  if (!ret) -    { -      vty_out (vty, "%% Malformed Originating Router IP address\n"); -      return CMD_WARNING; -    } +	vni = strtoul(argv[5]->arg, NULL, 10); +	ret = inet_aton(argv[7]->arg, &orig_ip); +	if (!ret) { +		vty_out(vty, "%% Malformed Originating Router IP address\n"); +		return CMD_WARNING; +	} -  evpn_show_route_vni_multicast (vty, bgp, vni, orig_ip); -  return CMD_SUCCESS; +	evpn_show_route_vni_multicast(vty, bgp, vni, orig_ip); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_route_vni_all, @@ -2142,25 +2045,23 @@ DEFUN (show_bgp_evpn_route_vni_all,         "Remote VTEP\n"         "Remote VTEP IP address\n")  { -  struct bgp *bgp; -  struct in_addr vtep_ip; +	struct bgp *bgp; +	struct in_addr vtep_ip; -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; -  vtep_ip.s_addr  = 0; -  if (argc == 8 && argv[7]->arg) -    { -      if (!inet_aton (argv[7]->arg, &vtep_ip)) -        { -          vty_out (vty, "%% Malformed VTEP IP address\n"); -          return CMD_WARNING; -        } -    } +	vtep_ip.s_addr = 0; +	if (argc == 8 && argv[7]->arg) { +		if (!inet_aton(argv[7]->arg, &vtep_ip)) { +			vty_out(vty, "%% Malformed VTEP IP address\n"); +			return CMD_WARNING; +		} +	} -  evpn_show_routes_vni_all (vty, bgp, vtep_ip); -  return CMD_SUCCESS; +	evpn_show_routes_vni_all(vty, bgp, vtep_ip); +	return CMD_SUCCESS;  }  DEFUN (show_bgp_evpn_import_rt, @@ -2171,14 +2072,14 @@ DEFUN (show_bgp_evpn_import_rt,         "Address family modifier\n"         "Show import route target\n")  { -  struct bgp *bgp; +	struct bgp *bgp; -  bgp = bgp_get_default(); -  if (!bgp) -    return CMD_WARNING; +	bgp = bgp_get_default(); +	if (!bgp) +		return CMD_WARNING; -  evpn_show_import_rts (vty, bgp); -  return CMD_SUCCESS; +	evpn_show_import_rts(vty, bgp); +	return CMD_SUCCESS;  }  DEFUN_NOSH (bgp_evpn_vni, @@ -2187,25 +2088,24 @@ DEFUN_NOSH (bgp_evpn_vni,              "VXLAN Network Identifier\n"              "VNI number\n")  { -  vni_t vni; -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  struct bgpevpn *vpn; +	vni_t vni; +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	struct bgpevpn *vpn; -  if (!bgp) -    return CMD_WARNING; +	if (!bgp) +		return CMD_WARNING; -  vni = strtoul(argv[1]->arg, NULL, 10); +	vni = strtoul(argv[1]->arg, NULL, 10); -  /* Create VNI, or mark as configured. */ -  vpn = evpn_create_update_vni (bgp, vni); -  if (!vpn) -    { -      vty_out (vty, "%% Failed to create VNI \n"); -      return CMD_WARNING; -    } +	/* Create VNI, or mark as configured. */ +	vpn = evpn_create_update_vni(bgp, vni); +	if (!vpn) { +		vty_out(vty, "%% Failed to create VNI \n"); +		return CMD_WARNING; +	} -  VTY_PUSH_CONTEXT_SUB (BGP_EVPN_VNI_NODE, vpn); -  return CMD_SUCCESS; +	VTY_PUSH_CONTEXT_SUB(BGP_EVPN_VNI_NODE, vpn); +	return CMD_SUCCESS;  }  DEFUN (no_bgp_evpn_vni, @@ -2215,30 +2115,28 @@ DEFUN (no_bgp_evpn_vni,         "VXLAN Network Identifier\n"         "VNI number\n")  { -  vni_t vni; -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  struct bgpevpn *vpn; +	vni_t vni; +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	struct bgpevpn *vpn; -  if (!bgp) -    return CMD_WARNING; +	if (!bgp) +		return CMD_WARNING; -  vni = strtoul(argv[2]->arg, NULL, 10); +	vni = strtoul(argv[2]->arg, NULL, 10); -  /* Check if we should disallow. */ -  vpn = bgp_evpn_lookup_vni (bgp, vni); -  if (!vpn) -    { -      vty_out (vty, "%% Specified VNI does not exist\n"); -      return CMD_WARNING; -    } -  if (!is_vni_configured (vpn)) -    { -      vty_out (vty, "%% Specified VNI is not configured\n"); -      return CMD_WARNING; -    } +	/* Check if we should disallow. */ +	vpn = bgp_evpn_lookup_vni(bgp, vni); +	if (!vpn) { +		vty_out(vty, "%% Specified VNI does not exist\n"); +		return CMD_WARNING; +	} +	if (!is_vni_configured(vpn)) { +		vty_out(vty, "%% Specified VNI is not configured\n"); +		return CMD_WARNING; +	} -  evpn_delete_vni (bgp, vpn); -  return CMD_SUCCESS; +	evpn_delete_vni(bgp, vpn); +	return CMD_SUCCESS;  }  DEFUN_NOSH (exit_vni, @@ -2246,9 +2144,9 @@ DEFUN_NOSH (exit_vni,              "exit-vni",              "Exit from VNI mode\n")  { -  if (vty->node == BGP_EVPN_VNI_NODE) -    vty->node = BGP_EVPN_NODE; -  return CMD_SUCCESS; +	if (vty->node == BGP_EVPN_VNI_NODE) +		vty->node = BGP_EVPN_NODE; +	return CMD_SUCCESS;  }  DEFUN (bgp_evpn_vni_rd, @@ -2257,28 +2155,27 @@ DEFUN (bgp_evpn_vni_rd,         "Route Distinguisher\n"         "ASN:XX or A.B.C.D:XX\n")  { -  struct prefix_rd prd; -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); -  int ret; +	struct prefix_rd prd; +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); +	int ret; -  if (!bgp || !vpn) -    return CMD_WARNING; +	if (!bgp || !vpn) +		return CMD_WARNING; -  ret = str2prefix_rd (argv[1]->arg, &prd); -  if (! ret) -    { -      vty_out (vty, "%% Malformed Route Distinguisher\n"); -      return CMD_WARNING; -    } +	ret = str2prefix_rd(argv[1]->arg, &prd); +	if (!ret) { +		vty_out(vty, "%% Malformed Route Distinguisher\n"); +		return CMD_WARNING; +	} -  /* If same as existing value, there is nothing more to do. */ -  if (bgp_evpn_rd_matches_existing (vpn, &prd)) -    return CMD_SUCCESS; +	/* If same as existing value, there is nothing more to do. */ +	if (bgp_evpn_rd_matches_existing(vpn, &prd)) +		return CMD_SUCCESS; -  /* Configure or update the RD. */ -  evpn_configure_rd (bgp, vpn, &prd); -  return CMD_SUCCESS; +	/* Configure or update the RD. */ +	evpn_configure_rd(bgp, vpn, &prd); +	return CMD_SUCCESS;  }  DEFUN (no_bgp_evpn_vni_rd, @@ -2288,36 +2185,34 @@ DEFUN (no_bgp_evpn_vni_rd,         "Route Distinguisher\n"         "ASN:XX or A.B.C.D:XX\n")  { -  struct prefix_rd prd; -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); -  int ret; +	struct prefix_rd prd; +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); +	int ret; -  if (!bgp || !vpn) -    return CMD_WARNING; +	if (!bgp || !vpn) +		return CMD_WARNING; -  ret = str2prefix_rd (argv[2]->arg, &prd); -  if (! ret) -    { -      vty_out (vty, "%% Malformed Route Distinguisher\n"); -      return CMD_WARNING; -    } +	ret = str2prefix_rd(argv[2]->arg, &prd); +	if (!ret) { +		vty_out(vty, "%% Malformed Route Distinguisher\n"); +		return CMD_WARNING; +	} -  /* Check if we should disallow. */ -  if (!is_rd_configured (vpn)) -    { -      vty_out (vty, "%% RD is not configured for this VNI\n"); -      return CMD_WARNING; -    } +	/* Check if we should disallow. */ +	if (!is_rd_configured(vpn)) { +		vty_out(vty, "%% RD is not configured for this VNI\n"); +		return CMD_WARNING; +	} -  if (!bgp_evpn_rd_matches_existing(vpn, &prd)) -    { -      vty_out (vty, "%% RD specified does not match configuration for this VNI\n"); -      return CMD_WARNING; -    } +	if (!bgp_evpn_rd_matches_existing(vpn, &prd)) { +		vty_out(vty, +			"%% RD specified does not match configuration for this VNI\n"); +		return CMD_WARNING; +	} -  evpn_unconfigure_rd (bgp, vpn); -  return CMD_SUCCESS; +	evpn_unconfigure_rd(bgp, vpn); +	return CMD_SUCCESS;  }  DEFUN (no_bgp_evpn_vni_rd_without_val, @@ -2326,41 +2221,38 @@ DEFUN (no_bgp_evpn_vni_rd_without_val,         NO_STR         "Route Distinguisher\n")  { -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); -  if (!bgp || !vpn) -    return CMD_WARNING; +	if (!bgp || !vpn) +		return CMD_WARNING; -  /* Check if we should disallow. */ -  if (!is_rd_configured (vpn)) -    { -      vty_out (vty, "%% RD is not configured for this VNI\n"); -      return CMD_WARNING; -    } +	/* Check if we should disallow. */ +	if (!is_rd_configured(vpn)) { +		vty_out(vty, "%% RD is not configured for this VNI\n"); +		return CMD_WARNING; +	} -  evpn_unconfigure_rd (bgp, vpn); -  return CMD_SUCCESS; +	evpn_unconfigure_rd(bgp, vpn); +	return CMD_SUCCESS;  }  /*   * Loop over all extended-communities in the route-target list rtl and   * return 1 if we find ecomtarget   */ -static int -bgp_evpn_rt_matches_existing (struct list *rtl, -                              struct ecommunity *ecomtarget) +static int bgp_evpn_rt_matches_existing(struct list *rtl, +					struct ecommunity *ecomtarget)  { -  struct listnode *node, *nnode; -  struct ecommunity *ecom; +	struct listnode *node, *nnode; +	struct ecommunity *ecom; -  for (ALL_LIST_ELEMENTS (rtl, node, nnode, ecom)) -    { -      if (ecommunity_match (ecom, ecomtarget)) -        return 1; -    } +	for (ALL_LIST_ELEMENTS(rtl, node, nnode, ecom)) { +		if (ecommunity_match(ecom, ecomtarget)) +			return 1; +	} -  return 0; +	return 0;  } @@ -2373,61 +2265,56 @@ DEFUN (bgp_evpn_vni_rt,         "export\n"         "Route target (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")  { -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); -  int rt_type; -  struct ecommunity *ecomadd = NULL; - -  if (!bgp || !vpn) -    return CMD_WARNING; - -  if (!strcmp (argv[1]->arg, "import")) -    rt_type = RT_TYPE_IMPORT; -  else if (!strcmp (argv[1]->arg, "export")) -    rt_type = RT_TYPE_EXPORT; -  else if (!strcmp (argv[1]->arg, "both")) -    rt_type = RT_TYPE_BOTH; -  else -    { -      vty_out (vty, "%% Invalid Route Target type\n"); -      return CMD_WARNING; -    } - -  /* Add/update the import route-target */ -  if (rt_type == RT_TYPE_BOTH || rt_type == RT_TYPE_IMPORT) -    { -      ecomadd = ecommunity_str2com (argv[2]->arg, -                                    ECOMMUNITY_ROUTE_TARGET, 0); -      ecommunity_str(ecomadd); -      if (!ecomadd) -        { -          vty_out (vty, "%% Malformed Route Target list\n"); -          return CMD_WARNING; -        } - -      /* Do nothing if we already have this import route-target */ -      if (! bgp_evpn_rt_matches_existing (vpn->import_rtl, ecomadd)) -        evpn_configure_import_rt (bgp, vpn, ecomadd); -    } - -  /* Add/update the export route-target */ -  if (rt_type == RT_TYPE_BOTH || rt_type == RT_TYPE_EXPORT) -    { -      ecomadd = ecommunity_str2com (argv[2]->arg, -                                    ECOMMUNITY_ROUTE_TARGET, 0); -      ecommunity_str(ecomadd); -      if (!ecomadd) -        { -          vty_out (vty, "%% Malformed Route Target list\n"); -          return CMD_WARNING; -        } - -      /* Do nothing if we already have this export route-target */ -      if (! bgp_evpn_rt_matches_existing (vpn->export_rtl, ecomadd)) -        evpn_configure_export_rt (bgp, vpn, ecomadd); -    } - -  return CMD_SUCCESS; +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); +	int rt_type; +	struct ecommunity *ecomadd = NULL; + +	if (!bgp || !vpn) +		return CMD_WARNING; + +	if (!strcmp(argv[1]->arg, "import")) +		rt_type = RT_TYPE_IMPORT; +	else if (!strcmp(argv[1]->arg, "export")) +		rt_type = RT_TYPE_EXPORT; +	else if (!strcmp(argv[1]->arg, "both")) +		rt_type = RT_TYPE_BOTH; +	else { +		vty_out(vty, "%% Invalid Route Target type\n"); +		return CMD_WARNING; +	} + +	/* Add/update the import route-target */ +	if (rt_type == RT_TYPE_BOTH || rt_type == RT_TYPE_IMPORT) { +		ecomadd = ecommunity_str2com(argv[2]->arg, +					     ECOMMUNITY_ROUTE_TARGET, 0); +		ecommunity_str(ecomadd); +		if (!ecomadd) { +			vty_out(vty, "%% Malformed Route Target list\n"); +			return CMD_WARNING; +		} + +		/* Do nothing if we already have this import route-target */ +		if (!bgp_evpn_rt_matches_existing(vpn->import_rtl, ecomadd)) +			evpn_configure_import_rt(bgp, vpn, ecomadd); +	} + +	/* Add/update the export route-target */ +	if (rt_type == RT_TYPE_BOTH || rt_type == RT_TYPE_EXPORT) { +		ecomadd = ecommunity_str2com(argv[2]->arg, +					     ECOMMUNITY_ROUTE_TARGET, 0); +		ecommunity_str(ecomadd); +		if (!ecomadd) { +			vty_out(vty, "%% Malformed Route Target list\n"); +			return CMD_WARNING; +		} + +		/* Do nothing if we already have this export route-target */ +		if (!bgp_evpn_rt_matches_existing(vpn->export_rtl, ecomadd)) +			evpn_configure_export_rt(bgp, vpn, ecomadd); +	} + +	return CMD_SUCCESS;  }  DEFUN (no_bgp_evpn_vni_rt, @@ -2440,103 +2327,90 @@ DEFUN (no_bgp_evpn_vni_rt,         "export\n"         "ASN:XX or A.B.C.D:XX\n")  { -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); -  int rt_type, found_ecomdel; -  struct ecommunity *ecomdel = NULL; - -  if (!bgp || !vpn) -    return CMD_WARNING; - -  if (!strcmp (argv[2]->arg, "import")) -    rt_type = RT_TYPE_IMPORT; -  else if (!strcmp (argv[2]->arg, "export")) -    rt_type = RT_TYPE_EXPORT; -  else if (!strcmp (argv[2]->arg, "both")) -    rt_type = RT_TYPE_BOTH; -  else -    { -      vty_out (vty, "%% Invalid Route Target type\n"); -      return CMD_WARNING; -    } - -  /* The user did "no route-target import", check to see if there are any -   * import route-targets configured. */ -  if (rt_type == RT_TYPE_IMPORT) -    { -      if (!is_import_rt_configured (vpn)) -        { -          vty_out (vty, "%% Import RT is not configured for this VNI\n"); -          return CMD_WARNING; -        } -    } -  else if (rt_type == RT_TYPE_EXPORT) -    { -      if (!is_export_rt_configured (vpn)) -        { -          vty_out (vty, "%% Export RT is not configured for this VNI\n"); -          return CMD_WARNING; -        } -    } -  else if (rt_type == RT_TYPE_BOTH) -    { -      if (!is_import_rt_configured (vpn) && !is_export_rt_configured (vpn)) -        { -          vty_out (vty, "%% Import/Export RT is not configured for this VNI\n"); -          return CMD_WARNING; -        } -    } - -  ecomdel = ecommunity_str2com (argv[3]->arg, ECOMMUNITY_ROUTE_TARGET, 0); -  ecommunity_str(ecomdel); -  if (!ecomdel) -    { -      vty_out (vty, "%% Malformed Route Target list\n"); -      return CMD_WARNING; -    } - -  if (rt_type == RT_TYPE_IMPORT) -    { -      if (!bgp_evpn_rt_matches_existing (vpn->import_rtl, ecomdel)) -        { -          vty_out (vty, "%% RT specified does not match configuration for this VNI\n"); -          return CMD_WARNING; -        } -      evpn_unconfigure_import_rt (bgp, vpn, ecomdel); -    } -  else if (rt_type == RT_TYPE_EXPORT) -    { -      if (!bgp_evpn_rt_matches_existing (vpn->export_rtl, ecomdel)) -        { -          vty_out (vty, "%% RT specified does not match configuration for this VNI\n"); -          return CMD_WARNING; -        } -      evpn_unconfigure_export_rt (bgp, vpn, ecomdel); -    } -  else if (rt_type == RT_TYPE_BOTH) -    { -      found_ecomdel = 0; - -      if (bgp_evpn_rt_matches_existing (vpn->import_rtl, ecomdel)) -        { -          evpn_unconfigure_import_rt (bgp, vpn, ecomdel); -          found_ecomdel = 1; -        } - -      if (bgp_evpn_rt_matches_existing (vpn->export_rtl, ecomdel)) -        { -          evpn_unconfigure_export_rt (bgp, vpn, ecomdel); -          found_ecomdel = 1; -        } - -      if (! found_ecomdel) -        { -          vty_out (vty, "%% RT specified does not match configuration for this VNI\n"); -          return CMD_WARNING; -        } -    } - -  return CMD_SUCCESS; +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); +	int rt_type, found_ecomdel; +	struct ecommunity *ecomdel = NULL; + +	if (!bgp || !vpn) +		return CMD_WARNING; + +	if (!strcmp(argv[2]->arg, "import")) +		rt_type = RT_TYPE_IMPORT; +	else if (!strcmp(argv[2]->arg, "export")) +		rt_type = RT_TYPE_EXPORT; +	else if (!strcmp(argv[2]->arg, "both")) +		rt_type = RT_TYPE_BOTH; +	else { +		vty_out(vty, "%% Invalid Route Target type\n"); +		return CMD_WARNING; +	} + +	/* The user did "no route-target import", check to see if there are any +	 * import route-targets configured. */ +	if (rt_type == RT_TYPE_IMPORT) { +		if (!is_import_rt_configured(vpn)) { +			vty_out(vty, +				"%% Import RT is not configured for this VNI\n"); +			return CMD_WARNING; +		} +	} else if (rt_type == RT_TYPE_EXPORT) { +		if (!is_export_rt_configured(vpn)) { +			vty_out(vty, +				"%% Export RT is not configured for this VNI\n"); +			return CMD_WARNING; +		} +	} else if (rt_type == RT_TYPE_BOTH) { +		if (!is_import_rt_configured(vpn) +		    && !is_export_rt_configured(vpn)) { +			vty_out(vty, +				"%% Import/Export RT is not configured for this VNI\n"); +			return CMD_WARNING; +		} +	} + +	ecomdel = ecommunity_str2com(argv[3]->arg, ECOMMUNITY_ROUTE_TARGET, 0); +	ecommunity_str(ecomdel); +	if (!ecomdel) { +		vty_out(vty, "%% Malformed Route Target list\n"); +		return CMD_WARNING; +	} + +	if (rt_type == RT_TYPE_IMPORT) { +		if (!bgp_evpn_rt_matches_existing(vpn->import_rtl, ecomdel)) { +			vty_out(vty, +				"%% RT specified does not match configuration for this VNI\n"); +			return CMD_WARNING; +		} +		evpn_unconfigure_import_rt(bgp, vpn, ecomdel); +	} else if (rt_type == RT_TYPE_EXPORT) { +		if (!bgp_evpn_rt_matches_existing(vpn->export_rtl, ecomdel)) { +			vty_out(vty, +				"%% RT specified does not match configuration for this VNI\n"); +			return CMD_WARNING; +		} +		evpn_unconfigure_export_rt(bgp, vpn, ecomdel); +	} else if (rt_type == RT_TYPE_BOTH) { +		found_ecomdel = 0; + +		if (bgp_evpn_rt_matches_existing(vpn->import_rtl, ecomdel)) { +			evpn_unconfigure_import_rt(bgp, vpn, ecomdel); +			found_ecomdel = 1; +		} + +		if (bgp_evpn_rt_matches_existing(vpn->export_rtl, ecomdel)) { +			evpn_unconfigure_export_rt(bgp, vpn, ecomdel); +			found_ecomdel = 1; +		} + +		if (!found_ecomdel) { +			vty_out(vty, +				"%% RT specified does not match configuration for this VNI\n"); +			return CMD_WARNING; +		} +	} + +	return CMD_SUCCESS;  }  DEFUN (no_bgp_evpn_vni_rt_without_val, @@ -2547,120 +2421,114 @@ DEFUN (no_bgp_evpn_vni_rt_without_val,         "import\n"         "export\n")  { -  struct bgp *bgp = VTY_GET_CONTEXT(bgp); -  VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); -  int rt_type; - -  if (!bgp || !vpn) -    return CMD_WARNING; - -  if (!strcmp (argv[2]->arg, "import")) -    { -      rt_type = RT_TYPE_IMPORT; -    } -  else if (!strcmp (argv[2]->arg, "export")) -    { -      rt_type = RT_TYPE_EXPORT; -    } -  else -    { -      vty_out (vty, "%% Invalid Route Target type\n"); -      return CMD_WARNING; -    } - -  /* Check if we should disallow. */ -  if (rt_type == RT_TYPE_IMPORT) -    { -      if (!is_import_rt_configured (vpn)) -        { -          vty_out (vty, "%% Import RT is not configured for this VNI\n"); -          return CMD_WARNING; -        } -    } -  else -    { -      if (!is_export_rt_configured (vpn)) -        { -          vty_out (vty, "%% Export RT is not configured for this VNI\n"); -          return CMD_WARNING; -        } -    } - -  /* Unconfigure the RT. */ -  if (rt_type == RT_TYPE_IMPORT) -    evpn_unconfigure_import_rt (bgp, vpn, NULL); -  else -    evpn_unconfigure_export_rt (bgp, vpn, NULL); -  return CMD_SUCCESS; +	struct bgp *bgp = VTY_GET_CONTEXT(bgp); +	VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn); +	int rt_type; + +	if (!bgp || !vpn) +		return CMD_WARNING; + +	if (!strcmp(argv[2]->arg, "import")) { +		rt_type = RT_TYPE_IMPORT; +	} else if (!strcmp(argv[2]->arg, "export")) { +		rt_type = RT_TYPE_EXPORT; +	} else { +		vty_out(vty, "%% Invalid Route Target type\n"); +		return CMD_WARNING; +	} + +	/* Check if we should disallow. */ +	if (rt_type == RT_TYPE_IMPORT) { +		if (!is_import_rt_configured(vpn)) { +			vty_out(vty, +				"%% Import RT is not configured for this VNI\n"); +			return CMD_WARNING; +		} +	} else { +		if (!is_export_rt_configured(vpn)) { +			vty_out(vty, +				"%% Export RT is not configured for this VNI\n"); +			return CMD_WARNING; +		} +	} + +	/* Unconfigure the RT. */ +	if (rt_type == RT_TYPE_IMPORT) +		evpn_unconfigure_import_rt(bgp, vpn, NULL); +	else +		evpn_unconfigure_export_rt(bgp, vpn, NULL); +	return CMD_SUCCESS;  }  #endif  /*   * Output EVPN configuration information.   */ -void -bgp_config_write_evpn_info (struct vty *vty, struct bgp *bgp, afi_t afi, -                            safi_t safi, int *write) -{ -  struct evpn_config_write cfg; - -  if (bgp->vnihash) -    { -      cfg.write = *write; -      cfg.vty = vty; -      hash_iterate (bgp->vnihash, -                    (void (*) (struct hash_backet *, void *)) -                    write_vni_config_for_entry, &cfg); -      *write = cfg.write; -    } +void bgp_config_write_evpn_info(struct vty *vty, struct bgp *bgp, afi_t afi, +				safi_t safi, int *write) +{ +	struct evpn_config_write cfg; + +	if (bgp->vnihash) { +		cfg.write = *write; +		cfg.vty = vty; +		hash_iterate(bgp->vnihash, +			     (void (*)(struct hash_backet *, +				       void *))write_vni_config_for_entry, +			     &cfg); +		*write = cfg.write; +	} -  if (bgp->advertise_all_vni) -    { -      bgp_config_write_family_header (vty, afi, safi, write); -      vty_out (vty, "  advertise-all-vni\n"); -    } +	if (bgp->advertise_all_vni) { +		bgp_config_write_family_header(vty, afi, safi, write); +		vty_out(vty, "  advertise-all-vni\n"); +	}  }  void bgp_ethernetvpn_init(void)  { -  install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_cmd); -  install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_rd_cmd); -  install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_all_tags_cmd); -  install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_rd_tags_cmd); -  install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_all_neighbor_routes_cmd); -  install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_rd_neighbor_routes_cmd); -  install_element(VIEW_NODE, -                  &show_ip_bgp_l2vpn_evpn_all_neighbor_advertised_routes_cmd); -  install_element(VIEW_NODE, -                  &show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes_cmd); -  install_element(VIEW_NODE, &show_ip_bgp_evpn_rd_overlay_cmd); -  install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_all_overlay_cmd); -  install_element(BGP_EVPN_NODE, &no_evpnrt5_network_cmd); -  install_element(BGP_EVPN_NODE, &evpnrt5_network_cmd); +	install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_cmd); +	install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_rd_cmd); +	install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_all_tags_cmd); +	install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_rd_tags_cmd); +	install_element(VIEW_NODE, +			&show_ip_bgp_l2vpn_evpn_all_neighbor_routes_cmd); +	install_element(VIEW_NODE, +			&show_ip_bgp_l2vpn_evpn_rd_neighbor_routes_cmd); +	install_element( +		VIEW_NODE, +		&show_ip_bgp_l2vpn_evpn_all_neighbor_advertised_routes_cmd); +	install_element( +		VIEW_NODE, +		&show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes_cmd); +	install_element(VIEW_NODE, &show_ip_bgp_evpn_rd_overlay_cmd); +	install_element(VIEW_NODE, &show_ip_bgp_l2vpn_evpn_all_overlay_cmd); +	install_element(BGP_EVPN_NODE, &no_evpnrt5_network_cmd); +	install_element(BGP_EVPN_NODE, &evpnrt5_network_cmd);  #if defined(HAVE_CUMULUS) -  install_element (BGP_EVPN_NODE, &bgp_evpn_advertise_all_vni_cmd); -  install_element (BGP_EVPN_NODE, &no_bgp_evpn_advertise_all_vni_cmd); - -  /* "show bgp evpn" commands. */ -  install_element (VIEW_NODE, &show_bgp_evpn_vni_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_vni_num_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_summary_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_route_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_route_rd_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_route_rd_macip_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_route_vni_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_route_vni_multicast_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_route_vni_macip_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_route_vni_all_cmd); -  install_element (VIEW_NODE, &show_bgp_evpn_import_rt_cmd); - -  install_element (BGP_EVPN_NODE, &bgp_evpn_vni_cmd); -  install_element (BGP_EVPN_NODE, &no_bgp_evpn_vni_cmd); -  install_element (BGP_EVPN_VNI_NODE, &exit_vni_cmd); -  install_element (BGP_EVPN_VNI_NODE, &bgp_evpn_vni_rd_cmd); -  install_element (BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rd_cmd); -  install_element (BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rd_without_val_cmd); -  install_element (BGP_EVPN_VNI_NODE, &bgp_evpn_vni_rt_cmd); -  install_element (BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rt_cmd); -  install_element (BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rt_without_val_cmd); +	install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_all_vni_cmd); +	install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_all_vni_cmd); + +	/* "show bgp evpn" commands. */ +	install_element(VIEW_NODE, &show_bgp_evpn_vni_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_vni_num_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_summary_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_route_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_route_rd_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_route_rd_macip_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_route_vni_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_route_vni_multicast_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_route_vni_macip_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_route_vni_all_cmd); +	install_element(VIEW_NODE, &show_bgp_evpn_import_rt_cmd); + +	install_element(BGP_EVPN_NODE, &bgp_evpn_vni_cmd); +	install_element(BGP_EVPN_NODE, &no_bgp_evpn_vni_cmd); +	install_element(BGP_EVPN_VNI_NODE, &exit_vni_cmd); +	install_element(BGP_EVPN_VNI_NODE, &bgp_evpn_vni_rd_cmd); +	install_element(BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rd_cmd); +	install_element(BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rd_without_val_cmd); +	install_element(BGP_EVPN_VNI_NODE, &bgp_evpn_vni_rt_cmd); +	install_element(BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rt_cmd); +	install_element(BGP_EVPN_VNI_NODE, &no_bgp_evpn_vni_rt_without_val_cmd);  #endif  }  | 
