diff options
| -rw-r--r-- | bgpd/bgp_mplsvpn.c | 27 | ||||
| -rw-r--r-- | bgpd/bgp_mplsvpn.h | 1 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 35 | ||||
| -rw-r--r-- | bgpd/bgp_route.h | 2 | ||||
| -rw-r--r-- | bgpd/bgp_zebra.c | 16 | 
5 files changed, 38 insertions, 43 deletions
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index 62b6f91b51..32a1d9a152 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -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 diff --git a/bgpd/bgp_mplsvpn.h b/bgpd/bgp_mplsvpn.h index b0d586223f..5bf772fefe 100644 --- a/bgpd/bgp_mplsvpn.h +++ b/bgpd/bgp_mplsvpn.h @@ -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" diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index bd7031defe..eb1e57de2e 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -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; diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index a8ec2dc907..743b369bfa 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -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, diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index c295b06601..5a060d46f5 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -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);  		}  | 
