diff options
| author | Dmytro Shytyi <dmytro.shytyi@6wind.com> | 2023-07-26 17:56:32 +0200 | 
|---|---|---|
| committer | Dmytro Shytyi <dmytro.shytyi@6wind.com> | 2023-09-20 15:07:15 +0200 | 
| commit | f20cf1457d43c3d5f61845ea5db1c1743b29cfbf (patch) | |
| tree | 933e0cc401c582be7b63878b1daea96b322a89a7 /zebra/zebra_rnh.c | |
| parent | bc6d311d28b11af7533762a9e85f5dd8c7b5c525 (diff) | |
bgpd,lib,sharpd,zebra: srv6 introduce multiple segs/SIDs in nexthop
Append zebra and lib to use muliple SRv6 segs SIDs, and keep one
seg SID for bgpd and sharpd.
Note: bgpd and sharpd compilation relies on the lib and zebra files,
i.e if we separate this: lib or zebra or bgpd or sharpd in different
commits - this will not compile.
Signed-off-by: Dmytro Shytyi <dmytro.shytyi@6wind.com>
Diffstat (limited to 'zebra/zebra_rnh.c')
| -rw-r--r-- | zebra/zebra_rnh.c | 49 | 
1 files changed, 40 insertions, 9 deletions
diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c index 28b83ce8b6..30d92c30f4 100644 --- a/zebra/zebra_rnh.c +++ b/zebra/zebra_rnh.c @@ -1268,6 +1268,7 @@ void show_nexthop_json_helper(json_object *json_nexthop,  	json_object *json_backups = NULL;  	json_object *json_seg6local = NULL;  	json_object *json_seg6 = NULL; +	json_object *json_segs = NULL;  	int i;  	json_object_int_add(json_nexthop, "flags", nexthop->flags); @@ -1425,11 +1426,31 @@ void show_nexthop_json_helper(json_object *json_nexthop,  				nexthop->nh_srv6->seg6local_action));  		json_object_object_add(json_nexthop, "seg6local",  				       json_seg6local); - -		json_seg6 = json_object_new_object(); -		json_object_string_addf(json_seg6, "segs", "%pI6", -					&nexthop->nh_srv6->seg6_segs); -		json_object_object_add(json_nexthop, "seg6", json_seg6); +		if (nexthop->nh_srv6->seg6_segs && +		    nexthop->nh_srv6->seg6_segs->num_segs == 1) { +			json_seg6 = json_object_new_object(); +			json_object_string_addf(json_seg6, "segs", "%pI6", +						&nexthop->nh_srv6->seg6_segs +							 ->seg[0]); +			json_object_object_add(json_nexthop, "seg6", json_seg6); +		} else { +			json_segs = json_object_new_array(); +			if (nexthop->nh_srv6->seg6_segs) { +				for (int seg_idx = 0; +				     seg_idx < +				     nexthop->nh_srv6->seg6_segs->num_segs; +				     seg_idx++) +					json_object_array_add( +						json_segs, +						json_object_new_stringf( +							"%pI6", +							&nexthop->nh_srv6 +								 ->seg6_segs +								 ->seg[seg_idx])); +				json_object_object_add(json_nexthop, "seg6", +						       json_segs); +			} +		}  	}  } @@ -1440,7 +1461,9 @@ void show_route_nexthop_helper(struct vty *vty, const struct route_entry *re,  			       const struct nexthop *nexthop)  {  	char buf[MPLS_LABEL_STRLEN]; -	int i; +	char seg_buf[SRV6_SEG_STRLEN]; +	struct seg6_segs segs; +	uint8_t i;  	switch (nexthop->type) {  	case NEXTHOP_TYPE_IPV4: @@ -1538,9 +1561,17 @@ void show_route_nexthop_helper(struct vty *vty, const struct route_entry *re,  				seg6local_action2str(  					nexthop->nh_srv6->seg6local_action),  				buf); -		if (IPV6_ADDR_CMP(&nexthop->nh_srv6->seg6_segs, &in6addr_any)) -			vty_out(vty, ", seg6 %pI6", -				&nexthop->nh_srv6->seg6_segs); +		if (nexthop->nh_srv6->seg6_segs && +		    IPV6_ADDR_CMP(&nexthop->nh_srv6->seg6_segs->seg[0], +				  &in6addr_any)) { +			segs.num_segs = nexthop->nh_srv6->seg6_segs->num_segs; +			for (i = 0; i < segs.num_segs; i++) +				memcpy(&segs.segs[i], +				       &nexthop->nh_srv6->seg6_segs->seg[i], +				       sizeof(struct in6_addr)); +			snprintf_seg6_segs(seg_buf, SRV6_SEG_STRLEN, &segs); +			vty_out(vty, ", seg6 %s", seg_buf); +		}  	}  	if (nexthop->weight)  | 
