]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Use SRv6 codepoints in the BGP Advertisement
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Thu, 27 Oct 2022 17:47:11 +0000 (19:47 +0200)
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Tue, 8 Nov 2022 21:44:23 +0000 (22:44 +0100)
Currently bgpd uses the opaque codepoint (0xFFFF) in the BGP
advertisement. In this commit, we update bgpd to use the SRv6 codepoints
defined in the IANA SRv6 Endpoint Behaviors Registry
(https://www.iana.org/assignments/segment-routing/segment-routing.xhtml)

Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
bgpd/bgp_attr.c
bgpd/bgp_mplsvpn.c

index b7d0958bac02b3e10140061ef95a3618f67f74d9..ce50378c8111d6acb605ea25b61acbc80f0d757e 100644 (file)
@@ -4355,7 +4355,9 @@ bgp_size_t bgp_packet_attribute(struct bgp *bgp, struct peer *peer,
                        stream_put(s, &attr->srv6_l3vpn->sid,
                                   sizeof(attr->srv6_l3vpn->sid)); /* sid */
                        stream_putc(s, 0);      /* sid_flags */
-                       stream_putw(s, 0xffff); /* endpoint */
+                       stream_putw(s,
+                                   attr->srv6_l3vpn
+                                           ->endpoint_behavior); /* endpoint */
                        stream_putc(s, 0);      /* reserved */
                        stream_putc(
                                s,
index a68167977de870f99dd2ceb21505649a39068e34..63f436029396fd2c59de985993bb7fcc075a8c7d 100644 (file)
@@ -1562,13 +1562,22 @@ void vpn_leak_from_vrf_update(struct bgp *to_bgp,            /* to */
 
        /* Set SID for SRv6 VPN */
        if (from_bgp->vpn_policy[afi].tovpn_sid_locator) {
+               struct srv6_locator_chunk *locator =
+                       from_bgp->vpn_policy[afi].tovpn_sid_locator;
                encode_label(
                        from_bgp->vpn_policy[afi].tovpn_sid_transpose_label,
                        &label);
                static_attr.srv6_l3vpn = XCALLOC(MTYPE_BGP_SRV6_L3VPN,
                                sizeof(struct bgp_attr_srv6_l3vpn));
                static_attr.srv6_l3vpn->sid_flags = 0x00;
-               static_attr.srv6_l3vpn->endpoint_behavior = 0xffff;
+               static_attr.srv6_l3vpn->endpoint_behavior =
+                       afi == AFI_IP
+                               ? (CHECK_FLAG(locator->flags, SRV6_LOCATOR_USID)
+                                          ? SRV6_ENDPOINT_BEHAVIOR_END_DT4_USID
+                                          : SRV6_ENDPOINT_BEHAVIOR_END_DT4)
+                               : (CHECK_FLAG(locator->flags, SRV6_LOCATOR_USID)
+                                          ? SRV6_ENDPOINT_BEHAVIOR_END_DT6_USID
+                                          : SRV6_ENDPOINT_BEHAVIOR_END_DT6);
                static_attr.srv6_l3vpn->loc_block_len =
                        from_bgp->vpn_policy[afi]
                                .tovpn_sid_locator->block_bits_length;
@@ -1595,12 +1604,17 @@ void vpn_leak_from_vrf_update(struct bgp *to_bgp,            /* to */
                                .tovpn_sid_locator->prefix.prefix,
                       sizeof(struct in6_addr));
        } else if (from_bgp->tovpn_sid_locator) {
+               struct srv6_locator_chunk *locator =
+                       from_bgp->tovpn_sid_locator;
                encode_label(from_bgp->tovpn_sid_transpose_label, &label);
                static_attr.srv6_l3vpn =
                        XCALLOC(MTYPE_BGP_SRV6_L3VPN,
                                sizeof(struct bgp_attr_srv6_l3vpn));
                static_attr.srv6_l3vpn->sid_flags = 0x00;
-               static_attr.srv6_l3vpn->endpoint_behavior = 0xffff;
+               static_attr.srv6_l3vpn->endpoint_behavior =
+                       CHECK_FLAG(locator->flags, SRV6_LOCATOR_USID)
+                               ? SRV6_ENDPOINT_BEHAVIOR_END_DT46_USID
+                               : SRV6_ENDPOINT_BEHAVIOR_END_DT46;
                static_attr.srv6_l3vpn->loc_block_len =
                        from_bgp->tovpn_sid_locator->block_bits_length;
                static_attr.srv6_l3vpn->loc_node_len =