]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: change the treatment for SRv6 routes 10658/head
authorRyoga Saito <ryoga.saito@linecorp.com>
Fri, 25 Feb 2022 13:44:07 +0000 (13:44 +0000)
committerRyoga Saito <ryoga.saito@linecorp.com>
Fri, 25 Feb 2022 15:34:28 +0000 (15:34 +0000)
This patch adds transpostion_offset and transposition_len to bgp_sid_info,
and transposes SID only at bgp_zebra_announce.

Signed-off-by: Ryoga Saito <ryoga.saito@linecorp.com>
bgpd/bgp_mplsvpn.c
bgpd/bgp_mplsvpn.h
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_zebra.c

index 62b6f91b51f244ab4ba22b429de255fd1ecc24df..32a1d9a1520e6de196e2f6de80b4eeb16f7a5196 100644 (file)
@@ -856,16 +856,11 @@ leak_update(struct bgp *bgp, /* destination bgp instance */
                                        new_attr->srv6_l3vpn->func_len;
                                extra->sid[0].arg_len =
                                        new_attr->srv6_l3vpn->arg_len;
-
-                               if (new_attr->srv6_l3vpn->transposition_len
-                                   != 0)
-                                       transpose_sid(
-                                               &extra->sid[0].sid,
-                                               decode_label(label),
-                                               new_attr->srv6_l3vpn
-                                                       ->transposition_offset,
-                                               new_attr->srv6_l3vpn
-                                                       ->transposition_len);
+                               extra->sid[0].transposition_len =
+                                       new_attr->srv6_l3vpn->transposition_len;
+                               extra->sid[0].transposition_offset =
+                                       new_attr->srv6_l3vpn
+                                               ->transposition_offset;
                        } else if (new_attr->srv6_vpn)
                                setsids(bpi, &new_attr->srv6_vpn->sid,
                                        num_sids);
@@ -960,14 +955,10 @@ leak_update(struct bgp *bgp, /* destination bgp instance */
                                new_attr->srv6_l3vpn->loc_node_len;
                        extra->sid[0].func_len = new_attr->srv6_l3vpn->func_len;
                        extra->sid[0].arg_len = new_attr->srv6_l3vpn->arg_len;
-
-                       if (new_attr->srv6_l3vpn->transposition_len != 0)
-                               transpose_sid(&extra->sid[0].sid,
-                                             decode_label(label),
-                                             new_attr->srv6_l3vpn
-                                                     ->transposition_offset,
-                                             new_attr->srv6_l3vpn
-                                                     ->transposition_len);
+                       extra->sid[0].transposition_len =
+                               new_attr->srv6_l3vpn->transposition_len;
+                       extra->sid[0].transposition_offset =
+                               new_attr->srv6_l3vpn->transposition_offset;
                } else if (new_attr->srv6_vpn)
                        setsids(new, &new_attr->srv6_vpn->sid, num_sids);
        } else
index b0d586223fa96c0723701c3b9b5357ddb9214c80..5bf772fefeed025bb159647c48d70e1dda5c2953 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef _QUAGGA_BGP_MPLSVPN_H
 #define _QUAGGA_BGP_MPLSVPN_H
 
+#include "bgpd/bgp_attr.h"
 #include "bgpd/bgp_route.h"
 #include "bgpd/bgp_rd.h"
 #include "bgpd/bgp_zebra.h"
index bd7031defedc40e5b0c3a03c1445f247eb38330f..eb1e57de2e8e5ed246e2d76549013be64f0336f3 100644 (file)
@@ -4198,6 +4198,8 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                                extra->sid[0].loc_node_len = 0;
                                extra->sid[0].func_len = 0;
                                extra->sid[0].arg_len = 0;
+                               extra->sid[0].transposition_len = 0;
+                               extra->sid[0].transposition_offset = 0;
 
                                if (attr->srv6_l3vpn->loc_block_len != 0) {
                                        extra->sid[0].loc_block_len =
@@ -4208,21 +4210,13 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                                                attr->srv6_l3vpn->func_len;
                                        extra->sid[0].arg_len =
                                                attr->srv6_l3vpn->arg_len;
-                               }
-
-                               /*
-                                * draft-ietf-bess-srv6-services-07
-                                * The part of SRv6 SID may be encoded as MPLS
-                                * Label for the efficient packing.
-                                */
-                               if (attr->srv6_l3vpn->transposition_len != 0)
-                                       transpose_sid(
-                                               &extra->sid[0].sid,
-                                               decode_label(label),
+                                       extra->sid[0].transposition_len =
                                                attr->srv6_l3vpn
-                                                       ->transposition_offset,
+                                                       ->transposition_len;
+                                       extra->sid[0].transposition_offset =
                                                attr->srv6_l3vpn
-                                                       ->transposition_len);
+                                                       ->transposition_offset;
+                               }
                        }
                } else if (attr->srv6_vpn) {
                        extra = bgp_path_info_extra_get(pi);
@@ -4419,17 +4413,10 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                                attr->srv6_l3vpn->loc_node_len;
                        extra->sid[0].func_len = attr->srv6_l3vpn->func_len;
                        extra->sid[0].arg_len = attr->srv6_l3vpn->arg_len;
-
-                       /*
-                        * draft-ietf-bess-srv6-services-07
-                        * The part of SRv6 SID may be encoded as MPLS Label for
-                        * the efficient packing.
-                        */
-                       if (attr->srv6_l3vpn->transposition_len != 0)
-                               transpose_sid(
-                                       &extra->sid[0].sid, decode_label(label),
-                                       attr->srv6_l3vpn->transposition_offset,
-                                       attr->srv6_l3vpn->transposition_len);
+                       extra->sid[0].transposition_len =
+                               attr->srv6_l3vpn->transposition_len;
+                       extra->sid[0].transposition_offset =
+                               attr->srv6_l3vpn->transposition_offset;
                } else if (attr->srv6_vpn) {
                        sid_copy(&extra->sid[0].sid, &attr->srv6_vpn->sid);
                        extra->num_sids = 1;
index a8ec2dc907cae45d7995dad56ed87efdf95d34ec..743b369bfa444e36608df7a4d81044e87ce69ede 100644 (file)
@@ -154,6 +154,8 @@ struct bgp_sid_info {
        uint8_t loc_node_len;
        uint8_t func_len;
        uint8_t arg_len;
+       uint8_t transposition_len;
+       uint8_t transposition_offset;
 };
 
 /* Ancillary information to struct bgp_path_info,
index c295b0660122f5adbe1d49f827553202f9cf4827..5a060d46f5235b7382514025251c85413afc8e95 100644 (file)
@@ -1260,6 +1260,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
        struct bgp_path_info *mpinfo_cp = &local_info;
        route_tag_t tag;
        mpls_label_t label;
+       struct bgp_sid_info *sid_info;
        int nh_othervrf = 0;
        bool is_evpn;
        bool nh_updated = false;
@@ -1476,9 +1477,22 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
 
                if (mpinfo->extra && !sid_zero(&mpinfo->extra->sid[0].sid)
                    && !CHECK_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE)) {
-                       memcpy(&api_nh->seg6_segs, &mpinfo->extra->sid[0].sid,
+                       sid_info = &mpinfo->extra->sid[0];
+
+                       memcpy(&api_nh->seg6_segs, &sid_info->sid,
                               sizeof(api_nh->seg6_segs));
 
+                       if (sid_info->transposition_len != 0) {
+                               if (!bgp_is_valid_label(
+                                           &mpinfo->extra->label[0]))
+                                       continue;
+
+                               label = label_pton(&mpinfo->extra->label[0]);
+                               transpose_sid(&api_nh->seg6_segs, label,
+                                             sid_info->transposition_offset,
+                                             sid_info->transposition_len);
+                       }
+
                        SET_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_SEG6);
                }