]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: add PMSI_TUNNEL_ATTRIBUTE to EVPN IMET routes 1595/head
authorDario Wiesner <dario.wiesner@gmail.com>
Thu, 4 Jan 2018 11:34:24 +0000 (12:34 +0100)
committerDario Wiesner <dario.wiesner@gmail.com>
Thu, 4 Jan 2018 12:51:15 +0000 (13:51 +0100)
Signed-off-by: Dario Wiesner <dario.wiesner@gmail.com>
bgpd/bgp_attr.c
bgpd/bgp_evpn.c
bgpd/bgpd.h

index 00bad08fbe7faee3e29a927cb85f359e474dbb12..5b917fc81460e16e28a4759c30cdfa196094b58c 100644 (file)
@@ -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);
index 182a6c64f2b3aad2a4c7dfef627959b4b77fd0d9..ca2e1a54d408e8ba3688669fad6a28467365135e 100644 (file)
@@ -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);
index 6bb49e0c53ea7939e268bcf635d251ce18afabf9..ce565877275f02d3118746f635b667029a839996 100644 (file)
@@ -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