From a21bd7a3b973f5717fc4f47de51281827309b80b Mon Sep 17 00:00:00 2001 From: Dario Wiesner Date: Thu, 4 Jan 2018 12:34:24 +0100 Subject: [PATCH] bgpd: add PMSI_TUNNEL_ATTRIBUTE to EVPN IMET routes Signed-off-by: Dario Wiesner --- bgpd/bgp_attr.c | 14 ++++++++++++++ bgpd/bgp_evpn.c | 2 ++ bgpd/bgpd.h | 1 + 3 files changed, 17 insertions(+) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 00bad08fbe..5b917fc814 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -74,6 +74,7 @@ static const struct message attr_str[] = { {BGP_ATTR_AS4_PATH, "AS4_PATH"}, {BGP_ATTR_AS4_AGGREGATOR, "AS4_AGGREGATOR"}, {BGP_ATTR_AS_PATHLIMIT, "AS_PATHLIMIT"}, + {BGP_ATTR_PMSI_TUNNEL, "PMSI_TUNNEL_ATTRIBUTE"}, {BGP_ATTR_ENCAP, "ENCAP"}, #if ENABLE_BGP_VNC {BGP_ATTR_VNC, "VNC"}, @@ -1034,6 +1035,8 @@ const u_int8_t attr_flags_values[] = { BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANS, [BGP_ATTR_AS4_AGGREGATOR] = BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANS, + [BGP_ATTR_PMSI_TUNNEL] = + BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANS, [BGP_ATTR_LARGE_COMMUNITIES] = BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANS, [BGP_ATTR_PREFIX_SID] = @@ -3246,6 +3249,17 @@ bgp_size_t bgp_packet_attribute(struct bgp *bgp, struct peer *peer, #endif } + /* PMSI Tunnel */ + if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_PMSI_TUNNEL)) { + stream_putc(s, BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANS); + stream_putc(s, BGP_ATTR_PMSI_TUNNEL); + stream_putc(s, 9); // Length + stream_putc(s, 0); // Flags + stream_putc(s, 6); // Tunnel type: Ingress Replication (6) + stream_put(s, &(attr->label), BGP_LABEL_BYTES); // MPLS Label / VXLAN VNI + stream_put_ipv4(s, attr->nexthop.s_addr); // Unicast tunnel endpoint IP address + } + /* Unknown transit attribute. */ if (attr->transit) stream_put(s, attr->transit->val, attr->transit->length); diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index 182a6c64f2..ca2e1a54d4 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -834,6 +834,8 @@ static int update_evpn_route(struct bgp *bgp, struct bgpevpn *vpn, attr.mp_nexthop_global_in = vpn->originator_ip; attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4; attr.sticky = CHECK_FLAG(flags, ZEBRA_MAC_TYPE_STICKY) ? 1 : 0; + attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_PMSI_TUNNEL); + vni2label(vpn->vni, &(attr.label)); /* Set up RT and ENCAP extended community. */ build_evpn_route_extcomm(vpn, &attr); diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 6bb49e0c53..ce56587727 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1020,6 +1020,7 @@ struct bgp_nlri { #define BGP_ATTR_AS4_PATH 17 #define BGP_ATTR_AS4_AGGREGATOR 18 #define BGP_ATTR_AS_PATHLIMIT 21 +#define BGP_ATTR_PMSI_TUNNEL 22 #define BGP_ATTR_ENCAP 23 #define BGP_ATTR_LARGE_COMMUNITIES 32 #define BGP_ATTR_PREFIX_SID 40 -- 2.39.5