From c4c205b091934d96a173f4c0d75ef7e888298ac7 Mon Sep 17 00:00:00 2001 From: Takeru Hayasaka Date: Fri, 30 Dec 2022 16:41:44 +0900 Subject: sr: support define src ipv6 per encap policy Can to define src ip of outer IPv6 Hdr for each encap policy. Along with that, I decided to develop it as API version V2. This is useful in the SRv6 MUP case. For example, it will be possible to handle multiple UPF destinations. Type: feature Change-Id: I44ff7b54e8868619069621ab53e194e2c7a17435 Signed-off-by: Takeru Hayasaka --- test/vpp_srv6.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 2 deletions(-) (limited to 'test/vpp_srv6.py') diff --git a/test/vpp_srv6.py b/test/vpp_srv6.py index d789105d7a7..1b09103f297 100644 --- a/test/vpp_srv6.py +++ b/test/vpp_srv6.py @@ -6,6 +6,7 @@ from vpp_object import VppObject from socket import inet_pton, inet_ntop, AF_INET, AF_INET6 +import copy class SRv6LocalSIDBehaviors: @@ -28,6 +29,7 @@ class SRv6PolicyType: # from src/vnet/srv6/sr.h SR_POLICY_TYPE_DEFAULT = 0 SR_POLICY_TYPE_SPRAY = 1 + SR_POLICY_TYPE_TEF = 2 class SRv6PolicySteeringTypes: @@ -148,6 +150,79 @@ class VppSRv6Policy(VppObject): ) +class VppSRv6PolicyV2(VppObject): + """ + SRv6 Policy + """ + + def __init__( + self, + test, + bsid, + is_encap, + sr_type, + weight, + fib_table, + segments, + encap_src, + source, + ): + self._test = test + self.bsid = bsid + self.is_encap = is_encap + self.sr_type = sr_type + self.weight = weight + self.fib_table = fib_table + self.segments = segments + self.encap_src = encap_src + self.n_segments = len(segments) + + # source not passed to API + # self.source = inet_pton(AF_INET6, source) + self.source = source + self._configured = False + + def add_vpp_config(self): + self._test.vapi.sr_policy_add_v2( + bsid_addr=self.bsid, + weight=self.weight, + is_encap=self.is_encap, + type=self.sr_type, + fib_table=self.fib_table, + encap_src=self.encap_src, + sids={ + "num_sids": self.n_segments, + "sids": self._get_fixed_segments(), + "weight": 1, + }, + ) + self._configured = True + + def remove_vpp_config(self): + self._test.vapi.sr_policy_del(self.bsid) + self._configured = False + + def query_vpp_config(self): + # no API to query SR Policies + # use _configured flag for now + return self._configured + + def object_id(self): + return "%d;%s-><%s>;%d" % ( + self.sr_type, + self.bsid, + ",".join(self.segments), + self.is_encap, + ) + + def _get_fixed_segments(self): + segs = copy.copy(self.segments) + # note: array expect size is 16 + for _ in range(16 - self.n_segments): + segs.append("") + return segs + + class VppSRv6Steering(VppObject): """ SRv6 Steering @@ -177,7 +252,7 @@ class VppSRv6Steering(VppObject): def add_vpp_config(self): self._test.vapi.sr_steering_add_del( is_del=0, - bsid=self.bsid, + bsid_addr=self.bsid, sr_policy_index=self.sr_policy_index, table_id=self.table_id, prefix={"address": self.prefix, "len": self.mask_width}, @@ -189,7 +264,7 @@ class VppSRv6Steering(VppObject): def remove_vpp_config(self): self._test.vapi.sr_steering_add_del( is_del=1, - bsid=self.bsid, + bsid_addr=self.bsid, sr_policy_index=self.sr_policy_index, table_id=self.table_id, prefix={"address": self.prefix, "len": self.mask_width}, -- cgit 1.2.3-korg