From: Donald Sharp Date: Fri, 19 May 2017 13:41:15 +0000 (-0400) Subject: Merge remote-tracking branch 'origin/stable/3.0' X-Git-Tag: reindent-master-before~131 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=78ca62a7b221defb21e4ab724de72b3634132996;hp=ee9de2cce5c464ec60cbebc1c2dd78716f4676ab;p=mirror_frr.git Merge remote-tracking branch 'origin/stable/3.0' --- diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 9c06c74aa..ec4f34ff4 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -3030,7 +3030,8 @@ bgp_packet_mpattr_tea( case BGP_ATTR_ENCAP: attrname = "Tunnel Encap"; subtlvs = attr->extra->encap_subtlvs; - + if (subtlvs == NULL) /* nothing to do */ + return; /* * The tunnel encap attr has an "outer" tlv. * T = tunneltype, @@ -3045,6 +3046,8 @@ bgp_packet_mpattr_tea( case BGP_ATTR_VNC: attrname = "VNC"; subtlvs = attr->extra->vnc_subtlvs; + if (subtlvs == NULL) /* nothing to do */ + return; attrlenfield = 0; /* no outer T + L */ attrhdrlen = 2 + 2; /* subTLV T + L */ break; diff --git a/bgpd/bgp_encap.c b/bgpd/bgp_encap.c index a1a0c1710..bc86a541e 100644 --- a/bgpd/bgp_encap.c +++ b/bgpd/bgp_encap.c @@ -202,25 +202,22 @@ bgp_nlri_parse_encap( /* For testing purpose, static route of ENCAP. */ DEFUN (encap_network, encap_network_cmd, - "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD", + "network A.B.C.D/M rd ASN:nn_or_IP-address:nn", "Specify a network to announce via BGP\n" "IPv4 prefix\n" "Specify Route Distinguisher\n" - "ENCAP Route Distinguisher\n" - "BGP tag\n" - "tag value\n") + "ENCAP Route Distinguisher\n") { int idx_ipv4 = 1; int idx_rd = 3; - int idx_word = 5; - return bgp_static_set_safi (AFI_IP, SAFI_ENCAP, vty, argv[idx_ipv4]->arg, argv[idx_rd]->arg, argv[idx_word]->arg, + return bgp_static_set_safi (AFI_IP, SAFI_ENCAP, vty, argv[idx_ipv4]->arg, argv[idx_rd]->arg, NULL, NULL, 0, NULL, NULL, NULL, NULL); } /* For testing purpose, static route of ENCAP. */ DEFUN (no_encap_network, no_encap_network_cmd, - "no network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD", + "no network A.B.C.D/M rd ASN:nn_or_IP-address:nn", NO_STR "Specify a network to announce via BGP\n" "IPv4 prefix\n" @@ -231,8 +228,7 @@ DEFUN (no_encap_network, { int idx_ipv4 = 2; int idx_rd = 4; - int idx_word = 6; - return bgp_static_unset_safi (AFI_IP, SAFI_ENCAP, vty, argv[idx_ipv4]->arg, argv[idx_rd]->arg, argv[idx_word]->arg, + return bgp_static_unset_safi (AFI_IP, SAFI_ENCAP, vty, argv[idx_ipv4]->arg, argv[idx_rd]->arg, NULL, 0, NULL, NULL, NULL); } diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index 2d13d05c0..60e0a212e 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -460,99 +460,104 @@ prefix_rd2str (struct prefix_rd *prd, char *buf, size_t size) /* For testing purpose, static route of MPLS-VPN. */ DEFUN (vpnv4_network, vpnv4_network_cmd, - "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD", + "network A.B.C.D/M rd ASN:nn_or_IP-address:nn (0-1048575)", "Specify a network to announce via BGP\n" "IPv4 prefix\n" "Specify Route Distinguisher\n" "VPN Route Distinguisher\n" - "BGP tag\n" - "tag value\n") + "VPN NLRI label (tag)\n" + "VPN NLRI label (tag)\n" + "Label value\n") { int idx_ipv4_prefixlen = 1; int idx_ext_community = 3; - int idx_word = 5; + int idx_label = 5; return bgp_static_set_safi (AFI_IP, SAFI_MPLS_VPN, vty, argv[idx_ipv4_prefixlen]->arg, argv[idx_ext_community]->arg, - argv[idx_word]->arg, NULL, 0, NULL, NULL, NULL, NULL); + argv[idx_label]->arg, NULL, 0, NULL, NULL, NULL, NULL); } DEFUN (vpnv4_network_route_map, vpnv4_network_route_map_cmd, - "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD route-map WORD", + "network A.B.C.D/M rd ASN:nn_or_IP-address:nn (0-1048575) route-map WORD", "Specify a network to announce via BGP\n" "IPv4 prefix\n" "Specify Route Distinguisher\n" "VPN Route Distinguisher\n" - "BGP tag\n" - "tag value\n" + "VPN NLRI label (tag)\n" + "VPN NLRI label (tag)\n" + "Label value\n" "route map\n" "route map name\n") { int idx_ipv4_prefixlen = 1; int idx_ext_community = 3; - int idx_word = 5; + int idx_label = 5; int idx_word_2 = 7; - return bgp_static_set_safi (AFI_IP, SAFI_MPLS_VPN, vty, argv[idx_ipv4_prefixlen]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg, + return bgp_static_set_safi (AFI_IP, SAFI_MPLS_VPN, vty, argv[idx_ipv4_prefixlen]->arg, argv[idx_ext_community]->arg, argv[idx_label]->arg, argv[idx_word_2]->arg, 0, NULL, NULL, NULL, NULL); } /* For testing purpose, static route of MPLS-VPN. */ DEFUN (no_vpnv4_network, no_vpnv4_network_cmd, - "no network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD", + "no network A.B.C.D/M rd ASN:nn_or_IP-address:nn (0-1048575)", NO_STR "Specify a network to announce via BGP\n" "IPv4 prefix\n" "Specify Route Distinguisher\n" "VPN Route Distinguisher\n" - "BGP tag\n" - "tag value\n") + "VPN NLRI label (tag)\n" + "VPN NLRI label (tag)\n" + "Label value\n") { int idx_ipv4_prefixlen = 2; int idx_ext_community = 4; - int idx_word = 6; + int idx_label = 6; return bgp_static_unset_safi (AFI_IP, SAFI_MPLS_VPN, vty, argv[idx_ipv4_prefixlen]->arg, - argv[idx_ext_community]->arg, argv[idx_word]->arg, + argv[idx_ext_community]->arg, argv[idx_label]->arg, 0, NULL, NULL, NULL); } DEFUN (vpnv6_network, vpnv6_network_cmd, - "network X:X::X:X/M rd ASN:nn_or_IP-address:nn tag WORD [route-map WORD]", + "network X:X::X:X/M rd ASN:nn_or_IP-address:nn (0-1048575) [route-map WORD]", "Specify a network to announce via BGP\n" "IPv6 prefix /, e.g., 3ffe::/16\n" "Specify Route Distinguisher\n" "VPN Route Distinguisher\n" - "BGP tag\n" - "tag value\n" + "VPN NLRI label (tag)\n" + "VPN NLRI label (tag)\n" + "Label value\n" "route map\n" "route map name\n") { int idx_ipv6_prefix = 1; int idx_ext_community = 3; - int idx_word = 5; + int idx_label = 5; int idx_word_2 = 7; if (argc == 8) - return bgp_static_set_safi (AFI_IP6, SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg, argv[idx_word_2]->arg, 0, NULL, NULL, NULL, NULL); + return bgp_static_set_safi (AFI_IP6, SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_label]->arg, argv[idx_word_2]->arg, 0, NULL, NULL, NULL, NULL); else - return bgp_static_set_safi (AFI_IP6, SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg, NULL, 0, NULL, NULL, NULL, NULL); + return bgp_static_set_safi (AFI_IP6, SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_label]->arg, NULL, 0, NULL, NULL, NULL, NULL); } /* For testing purpose, static route of MPLS-VPN. */ DEFUN (no_vpnv6_network, no_vpnv6_network_cmd, - "no network X:X::X:X/M rd ASN:nn_or_IP-address:nn tag WORD", + "no network X:X::X:X/M rd ASN:nn_or_IP-address:nn (0-1048575)", NO_STR "Specify a network to announce via BGP\n" "IPv6 prefix /, e.g., 3ffe::/16\n" "Specify Route Distinguisher\n" "VPN Route Distinguisher\n" - "BGP tag\n" - "tag value\n") + "VPN NLRI label (tag)\n" + "VPN NLRI label (tag)\n" + "Label value\n") { int idx_ipv6_prefix = 2; int idx_ext_community = 4; - int idx_word = 6; - return bgp_static_unset_safi (AFI_IP6, SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_word]->arg, 0, NULL, NULL, NULL); + int idx_label = 6; + return bgp_static_unset_safi (AFI_IP6, SAFI_MPLS_VPN, vty, argv[idx_ipv6_prefix]->arg, argv[idx_ext_community]->arg, argv[idx_label]->arg, 0, NULL, NULL, NULL); } int diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 0f719d553..172ef2e91 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -4086,7 +4086,7 @@ bgp_static_update_safi (struct bgp *bgp, struct prefix *p, if ((safi == SAFI_EVPN) || (safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP)) { - if (bgp_static->igpnexthop.s_addr) + if (afi == AFI_IP) { bgp_attr_extra_get (&attr)->mp_nexthop_global_in = bgp_static->igpnexthop; bgp_attr_extra_get (&attr)->mp_nexthop_len = IPV4_MAX_BYTELEN; @@ -4541,7 +4541,7 @@ bgp_purge_static_redist_routes (struct bgp *bgp) */ int bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *ip_str, - const char *rd_str, const char *tag_str, + const char *rd_str, const char *label_str, const char *rmap_str, int evpn_type, const char *esi, const char *gwip, const char *ethtag, const char *routermac) { @@ -4578,18 +4578,15 @@ bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *ip_str return CMD_WARNING; } - if (tag_str) + if (label_str) { - ret = str2tag (tag_str, tag); - if (! ret) - { - vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE); - return CMD_WARNING; - } + unsigned long label_val; + VTY_GET_INTEGER_RANGE("Label/tag", label_val, label_str, 0, 16777215); + encode_label (label_val, tag); } else { - encode_label (0, tag); + memset (tag, 0, sizeof(tag)); /* empty, not even BoS */ } if (safi == SAFI_EVPN) { @@ -4649,8 +4646,8 @@ bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *ip_str if (rmap_str) { if (bgp_static->rmap.name) - free (bgp_static->rmap.name); - bgp_static->rmap.name = strdup (rmap_str); + XFREE(MTYPE_ROUTE_MAP_NAME, bgp_static->rmap.name); + bgp_static->rmap.name = XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap_str); bgp_static->rmap.map = route_map_lookup_by_name (rmap_str); } @@ -4681,7 +4678,7 @@ bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *ip_str /* Configure static BGP network. */ int bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *vty, const char *ip_str, - const char *rd_str, const char *tag_str, + const char *rd_str, const char *label_str, int evpn_type, const char *esi, const char *gwip, const char *ethtag) { VTY_DECLVAR_CONTEXT(bgp, bgp); @@ -4715,11 +4712,15 @@ bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *vty, const char *ip_st return CMD_WARNING; } - ret = str2tag (tag_str, tag); - if (! ret) + if (label_str) { - vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE); - return CMD_WARNING; + unsigned long label_val; + VTY_GET_INTEGER_RANGE("Label/tag", label_val, label_str, 0, MPLS_LABEL_MAX); + encode_label (label_val, tag); + } + else + { + memset (tag, 0, sizeof(tag)); /* empty, not even BoS */ } prn = bgp_node_get (bgp->route[afi][safi], @@ -10671,10 +10672,17 @@ bgp_config_write_network_vpn (struct vty *vty, struct bgp *bgp, prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN); label = decode_label (bgp_static->tag); - vty_out (vty, " network %s/%d rd %s tag %d", + vty_out (vty, " network %s/%d rd %s label %d", inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN), p->prefixlen, rdbuf, label); + if (bgp_static->rmap.name) + vty_out (vty, " route-map %s", bgp_static->rmap.name); + else + { + if (bgp_static->backdoor) + vty_out (vty, " backdoor"); + } vty_out (vty, "%s", VTY_NEWLINE); } return 0;