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);
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
#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"
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 =
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);
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;
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,
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;
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);
}