Mailing List Archive

[PATCH 50/57] bgpd: enhance network command for evpn route type 2
A vty command is available for entering mac/ip advertisements within
address family evpn subnode. Following command is defined as follows:

network A.B.C.D rd ASN:nn_or_IP-address:nn ethtag WORD mac WORD
esi WORD l2label WORD l3label WORD routermac WORD

The no form of above command exists. To be consistent, a check is done
against mac format (aa:bb:cc:dd:ee:ff format), as well as host IP
address that must either be a host 32 bit IP address, or 0.0.0.0. In
the case where 0.0.0.0 is give, a MAC-only message will be propagated.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
---
bgpd/bgp_encap.c | 6 +++--
bgpd/bgp_evpn.c | 52 ++++++++++++++++++++++++++++++++++++---
bgpd/bgp_mplsvpn.c | 9 ++++---
bgpd/bgp_route.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++-----
bgpd/bgp_route.h | 6 +++--
5 files changed, 128 insertions(+), 16 deletions(-)

diff --git a/bgpd/bgp_encap.c b/bgpd/bgp_encap.c
index 3fe0d8c9f817..1e966fdf5378 100644
--- a/bgpd/bgp_encap.c
+++ b/bgpd/bgp_encap.c
@@ -211,7 +211,8 @@ DEFUN (encap_network,
"BGP tag\n"
"tag value\n")
{
- return bgp_static_set_safi (SAFI_ENCAP, vty, argv[0], argv[1], argv[2], NULL, NULL, NULL, NULL, NULL);
+ return bgp_static_set_safi (SAFI_ENCAP, vty, argv[0], argv[1], argv[2],
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}

/* For testing purpose, static route of ENCAP. */
@@ -226,7 +227,8 @@ DEFUN (no_encap_network,
"BGP tag\n"
"tag value\n")
{
- return bgp_static_unset_safi (SAFI_ENCAP, vty, argv[0], argv[1], argv[2], NULL, NULL, NULL);
+ return bgp_static_unset_safi (SAFI_ENCAP, vty, argv[0], argv[1], argv[2],
+ NULL, NULL, NULL, NULL);
}

static int
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 6ae4db51caba..32b3a598e73f 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -879,7 +879,7 @@ DEFUN (evpnrt5_network,
"Router Mac address Value ( aa:bb:cc:dd:ee:ff format)\n")
{
return bgp_static_set_safi (SAFI_INTERNAL_EVPN, vty, argv[0], argv[1], argv[3], NULL,
- argv[4], argv[5], argv[2], argv[6]);
+ argv[4], argv[5], argv[2], argv[6], NULL, NULL);
}

/* For testing purpose, static route of MPLS-VPN. */
@@ -900,10 +900,54 @@ DEFUN (no_evpnrt5_network,
"Gateway IP\n"
"Gateway IP ( A.B.C.D )\n")
{
- return bgp_static_unset_safi (SAFI_INTERNAL_EVPN, vty, argv[0], argv[1], argv[3],
- argv[4], argv[5], argv[2]);
+ return bgp_static_unset_safi (SAFI_INTERNAL_EVPN, vty, argv[0], argv[1],
+ argv[3], argv[4], argv[5], argv[2], NULL);
}

+/* For testing purpose, static route of MPLS-VPN. */
+DEFUN (evpnrt2_network,
+ evpnrt2_network_cmd,
+ "network A.B.C.D rd ASN:nn_or_IP-address:nn ethtag WORD mac WORD esi WORD l2label WORD l3label WORD routermac WORD",
+ "Specify a host address to announce via BGP\n"
+ "IP host 32 bits, e.g., 10.1.2.32\n"
+ "Specify Route Distinguisher\n"
+ "VPN Route Distinguisher\n"
+ "Ethernet Tag\n"
+ "Ethernet Tag Value\n"
+ "Mac Address Associated\n"
+ "Mac address Value ( aa:bb:cc:dd:ee:ff format)\n"
+ "Ethernet Segment Identifier\n"
+ "ESI value ( 00:11:22:33:44:55:66:77:88:99 format) \n"
+ "BGP Layer 2 label\n"
+ "label Layer 2 value\n"
+ "BGP Layer 3 label\n"
+ "label Layer 3 value\n"
+ "Router Mac Ext Comm\n"
+ "Router Mac address Value ( aa:bb:cc:dd:ee:ff format)\n")
+{
+ return bgp_static_set_safi (SAFI_INTERNAL_EVPN, vty, argv[0], argv[1], argv[6], NULL,
+ argv[4], NULL, argv[2], argv[7], argv[3], argv[5]);
+}
+
+/* For testing purpose, static route of MPLS-VPN. */
+DEFUN (no_evpnrt2_network,
+ no_evpnrt2_network_cmd,
+ "no network A.B.C.D rd ASN:nn_or_IP-address:nn ethtag WORD mac WORD esi WORD",
+ NO_STR
+ "Specify a host address to announce via BGP\n"
+ "IP host 32 bits, e.g., 10.1.2.32\n"
+ "Specify Route Distinguisher\n"
+ "VPN Route Distinguisher\n"
+ "Ethernet Tag\n"
+ "Ethernet Tag Value\n"
+ "Mac Address Associated\n"
+ "Mac address Value ( aa:bb:cc:dd:ee:ff format)\n"
+ "Ethernet Segment Identifier\n"
+ "ESI value ( 00:11:22:33:44:55:66:77:88:99 format) \n")
+{
+ return bgp_static_unset_safi (SAFI_INTERNAL_EVPN, vty, argv[0], argv[1],
+ NULL, argv[4], NULL, argv[2], argv[3]);
+}

void
bgp_ethernetvpn_init (void)
@@ -924,4 +968,6 @@ bgp_ethernetvpn_init (void)
install_element (VIEW_NODE, &show_bgp_l2vpn_evpn_rd_neighbor_received_routes_cmd);
install_element (BGP_EVPN_NODE, &no_evpnrt5_network_cmd);
install_element (BGP_EVPN_NODE, &evpnrt5_network_cmd);
+ install_element (BGP_EVPN_NODE, &no_evpnrt2_network_cmd);
+ install_element (BGP_EVPN_NODE, &evpnrt2_network_cmd);
}
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c
index 2385bfade3b9..cc0551c2123a 100644
--- a/bgpd/bgp_mplsvpn.c
+++ b/bgpd/bgp_mplsvpn.c
@@ -407,7 +407,8 @@ DEFUN (vpnv4_network,
"BGP tag\n"
"tag value\n")
{
- return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], NULL, NULL, NULL, NULL, NULL);
+ return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2],
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}

DEFUN (vpnv4_network_route_map,
@@ -422,7 +423,8 @@ DEFUN (vpnv4_network_route_map,
"route map\n"
"route map name\n")
{
- return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], argv[3], NULL, NULL, NULL, NULL);
+ return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], argv[3],
+ NULL, NULL, NULL, NULL, NULL, NULL);
}

/* For testing purpose, static route of MPLS-VPN. */
@@ -437,7 +439,8 @@ DEFUN (no_vpnv4_network,
"BGP tag\n"
"tag value\n")
{
- return bgp_static_unset_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2], NULL, NULL, NULL);
+ return bgp_static_unset_safi (SAFI_MPLS_VPN, vty, argv[0], argv[1], argv[2],
+ NULL, NULL, NULL, NULL);
}

static int
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 17b6d94a6caa..191e889634d7 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -5109,7 +5109,8 @@ int
bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str,
const char *rd_str, const char *tag_str,
const char *rmap_str, const char *esi, const char *gwip,
- const char *ethtag, const char *routermac)
+ const char *ethtag, const char *routermac,
+ const char *macaddress, const char *l2label)
{
int ret;
struct prefix p;
@@ -5153,6 +5154,32 @@ bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str,
}
if (safi == SAFI_INTERNAL_EVPN)
{
+ if( macaddress && str2mac (macaddress, NULL) != 0)
+ {
+ struct macipaddr *m = &p.u.prefix_macip;
+ struct prefix_ipv4 dummy;
+
+ p.family = AF_L2VPN;
+ p.prefixlen = L2VPN_IPV4_PREFIX_LEN;
+
+ str2mac(macaddress, (char*) &m->mac);
+ if (strncmp(ip_str, "0.0.0.0", 8))
+ {
+ str2prefix_ipv4(ip_str,&dummy);
+
+ if (dummy.prefixlen != 0 && dummy.prefixlen != 32)
+ {
+ vty_out (vty, "%% Malformed Network%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ memcpy(&m->ip.in4, &dummy.prefix, sizeof(struct in_addr));
+ m->eth_tag_id = atol(ethtag);
+ m->ip_len = 32;
+ }
+ else
+ m->ip_len = 0;
+ m->mac_len = ETHER_ADDR_LEN * 8;
+ }
if( esi && str2esi (esi, NULL) == 0)
{
vty_out (vty, "%% Malformed ESI%s", VTY_NEWLINE);
@@ -5168,6 +5195,27 @@ bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str,
vty_out (vty, "%% Eth Tag Compulsory%s", VTY_NEWLINE);
return CMD_WARNING;
}
+ if(nlabels != 1)
+ {
+ vty_out (vty, "%% L3 Label Format not valid%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ if(l2label)
+ {
+ labels[nlabels - 1] &= ~1;
+ labels[nlabels] = atol(l2label) << 4;
+ labels[nlabels] |= 1;
+ nlabels++;
+ }
+ else
+ {
+ if(macaddress) /* required to have a second label */
+ {
+ labels[nlabels] &= ~1;
+ labels[nlabels] = 0;
+ labels[nlabels] |= 1;
+ }
+ }
}
prn = bgp_node_get (bgp->route[afi][safi],
(struct prefix *)&prd);
@@ -5238,7 +5286,8 @@ bgp_static_set_safi (safi_t safi, struct vty *vty, const char *ip_str,
int
bgp_static_unset_safi(safi_t safi, struct vty *vty, const char *ip_str,
const char *rd_str, const char *tag_str,
- const char *esi, const char *gwip, const char *ethtag)
+ const char *esi, const char *gwip, const char *ethtag,
+ const char *mac)
{
int ret;
struct bgp *bgp;
@@ -17399,10 +17448,20 @@ bgp_config_write_network_evpn (struct vty *vty, struct bgp *bgp,
bgp_static->labels, bgp_static->nlabels);
inet_ntop (AF_INET, &bgp_static->igpnexthop, buf2, SU_ADDRSTRLEN);

- vty_out (vty, " network %s/%d rd %s ethtag %u tag %s esi %s gwip %s routermac %s",
- inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
- p->prefixlen,
- rdbuf, bgp_static->eth_t_id, lblbuf, esi, buf2 , macrouter);
+ if(p->family == AF_L2VPN)
+ {
+ char *mac = mac2str((char *)&p->u.prefix_macip);
+ vty_out (vty, " network %s rd %s ethtag %u mac %s esi %s l2label %u l3label %u routermac %s",
+ inet_ntop (AF_INET, &(p->u.prefix_macip.ip.in4), buf2, SU_ADDRSTRLEN),
+ rdbuf, bgp_static->eth_t_id, mac, esi,
+ bgp_static->labels[0] >> 4 , bgp_static->labels[1] >> 4 ,
+ macrouter);
+ }
+ else
+ vty_out (vty, " network %s/%d rd %s ethtag %u tag %s esi %s gwip %s routermac %s",
+ inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
+ p->prefixlen,
+ rdbuf, bgp_static->eth_t_id, lblbuf, esi, buf2 , macrouter);
vty_out (vty, "%s", VTY_NEWLINE);
}
return 0;
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h
index c266d8c30f5b..42fe71e224f6 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -253,11 +253,13 @@ extern void bgp_static_withdraw (struct bgp *, struct prefix *, afi_t, safi_t);

extern int bgp_static_set_safi (safi_t safi, struct vty *vty, const char *,
const char *, const char *, const char *,
- const char *, const char *, const char *, const char *);
+ const char *, const char *, const char *, const char *,
+ const char *, const char *);

extern int bgp_static_unset_safi (safi_t safi, struct vty *, const char *,
const char *, const char *,
- const char *, const char *, const char *);
+ const char *, const char *, const char *,
+ const char *);

/* this is primarily for MPLS-VPN */
extern int bgp_update (struct peer *, struct prefix *, struct attr *,
--
2.1.4


_______________________________________________
Quagga-dev mailing list
Quagga-dev@lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev