Skip to content

Commit 152fc8f

Browse files
committed
Add 128 SRv6 sids support
1.Auto generate 128 SRv6 locators and sids 2.Auto generate 128 matching packets 2.1.Test DIP shift 2.2.Test uSID container copy action 2.3.Test USD flavor 2.4.Test DSCP mapping 2.5.Test ttl and hop limit change 3.Split SRH and non SRH packets test into two test cases required by MSFT 3.1.Test reboot and BGP restart test randomly to save time 4.Test SRv6 counter 5.Test SRv6 CRM resource 6.Add static route for 128 sids validation 7.Add check for route asic db installation 8.Add timeout when captureing packet to override large scale of BGP update packets affection
1 parent b3007c4 commit 152fc8f

File tree

4 files changed

+815
-275
lines changed

4 files changed

+815
-275
lines changed

tests/common/helpers/srv6_helper.py

Lines changed: 208 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -20,175 +20,216 @@ class SRv6Packets():
2020
Define the ipv6 packets used in srv6 test
2121
Each item was defined with actions and packet type as well as segment left and segment list, destination ip
2222
'''
23-
srv6_packets = [
24-
{
25-
'action': SRv6.uN,
26-
'packet_type': 'reduced_srh',
27-
'srh_seg_left': None,
28-
'srh_seg_list': None,
29-
'inner_dscp': None,
30-
'outer_dscp': None,
31-
'dst_ipv6': '2001:1000:0100:0200::',
32-
'exp_dst_ipv6': '2001:1000:0200::',
33-
'exp_inner_dscp_pipe': None,
34-
'exp_outer_dscp_uniform': None,
35-
'exp_srh_seg_left': None,
36-
'inner_pkt_ver': '4',
37-
'exp_process_result': 'forward',
38-
},
39-
{
40-
'action': SRv6.uN,
41-
'packet_type': 'reduced_srh',
42-
'srh_seg_left': None,
43-
'srh_seg_list': None,
44-
'inner_dscp': None,
45-
'outer_dscp': None,
46-
'dst_ipv6': '2001:1001:0200:0300::',
47-
'exp_dst_ipv6': '2001:1001:0300::',
48-
'exp_inner_dscp_pipe': None,
49-
'exp_outer_dscp_uniform': None,
50-
'exp_srh_seg_left': None,
51-
'inner_pkt_ver': '6',
52-
'exp_process_result': 'forward'
53-
},
54-
{
55-
'action': SRv6.uN,
56-
'packet_type': 'one_u_sid',
57-
'srh_seg_left': 1,
58-
'inner_dscp': None,
59-
'outer_dscp': None,
60-
'srh_seg_list': ['2001:2000:0300:0400:0500:0600::'],
61-
'dst_ipv6': '2001:2000:0300::',
62-
'exp_dst_ipv6': '2001:2000:0300:0400:0500:0600::',
63-
'exp_inner_dscp_pipe': None,
64-
'exp_outer_dscp_uniform': None,
65-
'exp_srh_seg_left': 0,
66-
'inner_pkt_ver': '4',
67-
'exp_process_result': 'forward'
68-
},
69-
{
70-
'action': SRv6.uN,
71-
'packet_type': 'one_u_sid',
72-
'srh_seg_left': 1,
73-
'inner_dscp': None,
74-
'outer_dscp': None,
75-
'srh_seg_list': ['2001:2001:0400:0500:0600::'],
76-
'dst_ipv6': '2001:2001:0400:0500::',
77-
'exp_dst_ipv6': '2001:2001:0500::',
78-
'exp_inner_dscp_pipe': None,
79-
'exp_outer_dscp_uniform': None,
80-
'exp_srh_seg_left': 1,
81-
'inner_pkt_ver': '6',
82-
'exp_process_result': 'forward'
83-
},
84-
{
85-
'action': SRv6.uN,
86-
'packet_type': 'two_u_sid',
87-
'srh_seg_left': 1,
88-
'inner_dscp': None,
89-
'outer_dscp': None,
90-
'srh_seg_list': [
91-
'2001:3000:0500:0600::',
92-
'2001:3000:0600:0700:0800:0900:0a00::'
93-
],
94-
'dst_ipv6': '2001:3000:0500::',
95-
'exp_dst_ipv6': '2001:3000:0500:0600::',
96-
'exp_inner_dscp_pipe': None,
97-
'exp_outer_dscp_uniform': None,
98-
'exp_srh_seg_left': 0,
99-
'inner_pkt_ver': '4',
100-
'exp_process_result': 'forward'
101-
},
102-
{
103-
'action': SRv6.uN,
104-
'packet_type': 'two_u_sid',
105-
'srh_seg_left': 2,
106-
'inner_dscp': None,
107-
'outer_dscp': None,
108-
'srh_seg_list': [
109-
'2001:3001:0500::',
110-
'2001:3000:0600:0700:0800:0900:0a00::'
111-
],
112-
'dst_ipv6': '2001:3001:0600::',
113-
'exp_dst_ipv6': '2001:3000:0600:0700:0800:0900:0a00::',
114-
'exp_inner_dscp_pipe': None,
115-
'exp_outer_dscp_uniform': None,
116-
'exp_srh_seg_left': 1,
117-
'inner_pkt_ver': '6',
118-
'exp_process_result': 'forward'
119-
},
120-
{
121-
'action': SRv6.uN,
122-
'packet_type': 'reduced_srh',
123-
'srh_seg_left': None,
124-
'srh_seg_list': None,
125-
'inner_dscp': 20,
126-
'outer_dscp': 40,
127-
'dst_ipv6': '2001:4000:0700::',
128-
'exp_dst_ipv6': None,
129-
'exp_srh_seg_left': None,
130-
'exp_inner_dscp_pipe': 20,
131-
'exp_outer_dscp_uniform': 40,
132-
'inner_pkt_ver': '4',
133-
'exp_process_result': 'forward'
134-
},
135-
{
136-
'action': SRv6.uN,
137-
'packet_type': 'one_u_sid',
138-
'srh_seg_left': 0,
139-
'inner_dscp': 32,
140-
'outer_dscp': 31,
141-
'srh_seg_list': [
142-
'2001:3001:0500::',
143-
'2001:3000:0600:0700:0800:0900:0a00::'
144-
],
145-
'dst_ipv6': '2001:4001:0800::',
146-
'exp_inner_dscp_pipe': 32,
147-
'exp_outer_dscp_uniform': 31,
148-
'exp_dst_ipv6': None,
149-
'exp_srh_seg_left': None,
150-
'inner_pkt_ver': '4',
151-
'exp_process_result': 'forward'
152-
},
153-
{
154-
'action': SRv6.uN,
155-
'packet_type': 'two_u_sid',
156-
'srh_seg_left': 0,
157-
'inner_dscp': 2,
158-
'outer_dscp': 62,
159-
'srh_seg_list': [
160-
'2001:3001:0500::',
161-
'2001:3000:0600:0700:0800:0900:0a00::'
162-
],
163-
'dst_ipv6': '2001:5000:0900::',
164-
'exp_inner_dscp_pipe': 2,
165-
'exp_outer_dscp_uniform': 62,
166-
'exp_dst_ipv6': None,
167-
'exp_srh_seg_left': None,
168-
'inner_pkt_ver': '6',
169-
'exp_process_result': 'forward'
170-
},
171-
{
172-
'action': SRv6.uN,
173-
'packet_type': 'reduced_srh',
174-
'srh_seg_left': None,
175-
'srh_seg_list': None,
176-
'inner_dscp': 63,
177-
'outer_dscp': 1,
178-
'dst_ipv6': '2001:5001:0a00::',
179-
'exp_inner_dscp_pipe': 63,
180-
'exp_outer_dscp_uniform': 1,
181-
'exp_dst_ipv6': None,
182-
'exp_srh_seg_left': None,
183-
'inner_pkt_ver': '6',
184-
'exp_process_result': 'forward'
185-
}
186-
]
18723
srv6_next_header = {
18824
scapy.IP: 4,
18925
scapy.IPv6: 41
19026
}
19127

28+
@classmethod
29+
def generate_srv6_packets(cls, my_locator_list, srv6_packet_type):
30+
"""
31+
Generate SRv6 test packets based on the provided locator list.
32+
Each packet will have different configurations for comprehensive testing.
33+
34+
Args:
35+
my_locator_list (list): List of locator entries
36+
srv6_packet_type (str): Type of SRv6 packet to generate
37+
38+
Returns:
39+
list: List of SRv6 packet configurations
40+
"""
41+
srv6_packets = []
42+
43+
# Define base packet types with different configurations
44+
base_packets = [
45+
{ # 1
46+
'action': 'uN',
47+
'srv6_packet_type': 'no_srh',
48+
'validate_dip_shift': True,
49+
'validate_usd_flavor': False,
50+
'srh_seg_list': None,
51+
'srh_seg_left': 0,
52+
'inner_pkt_ver': '6',
53+
'outer_dscp': 0,
54+
'inner_dscp': 0,
55+
'exp_dst_ipv6': None,
56+
'exp_srh_seg_left': 0,
57+
'exp_inner_dscp_pipe': 0,
58+
'exp_outer_dscp_uniform': 0,
59+
'exp_process_result': 'forward'
60+
},
61+
{ # 2
62+
'action': 'uN',
63+
'srv6_packet_type': 'srh',
64+
'validate_dip_shift': True,
65+
'validate_usd_flavor': False,
66+
'srh_seg_list': 1,
67+
'srh_seg_left': 0,
68+
'inner_pkt_ver': '6',
69+
'outer_dscp': 0,
70+
'inner_dscp': 0,
71+
'exp_dst_ipv6': None,
72+
'exp_srh_seg_left': 0,
73+
'exp_inner_dscp_pipe': 0,
74+
'exp_outer_dscp_uniform': 0,
75+
'exp_process_result': 'forward'
76+
},
77+
{ # 3
78+
'action': 'uN',
79+
'srv6_packet_type': 'srh',
80+
'validate_dip_shift': True,
81+
'validate_usd_flavor': False,
82+
'srh_seg_list': 2,
83+
'srh_seg_left': 0,
84+
'inner_pkt_ver': '6',
85+
'outer_dscp': 0,
86+
'inner_dscp': 0,
87+
'exp_dst_ipv6': None,
88+
'exp_srh_seg_left': 0,
89+
'exp_inner_dscp_pipe': 0,
90+
'exp_outer_dscp_uniform': 0,
91+
'exp_process_result': 'forward'
92+
},
93+
{ # 4
94+
'action': 'uN',
95+
'srv6_packet_type': 'srh',
96+
'validate_dip_shift': False,
97+
'validate_usd_flavor': False,
98+
'srh_seg_list': 1,
99+
'srh_seg_left': 1,
100+
'inner_pkt_ver': '6',
101+
'outer_dscp': 32,
102+
'inner_dscp': 48,
103+
'exp_dst_ipv6': None,
104+
'exp_srh_seg_left': 0,
105+
'exp_inner_dscp_pipe': 48,
106+
'exp_outer_dscp_uniform': 32,
107+
'exp_process_result': 'forward'
108+
},
109+
{ # 5
110+
'action': 'uN',
111+
'srv6_packet_type': 'srh',
112+
'validate_dip_shift': False,
113+
'validate_usd_flavor': False,
114+
'srh_seg_list': 2,
115+
'srh_seg_left': 2,
116+
'inner_pkt_ver': '6',
117+
'outer_dscp': 16,
118+
'inner_dscp': 24,
119+
'exp_dst_ipv6': None,
120+
'exp_srh_seg_left': 1,
121+
'exp_inner_dscp_pipe': 24,
122+
'exp_outer_dscp_uniform': 16,
123+
'exp_process_result': 'forward'
124+
},
125+
{ # 6
126+
'action': 'uN',
127+
'srv6_packet_type': 'no_srh',
128+
'validate_dip_shift': False,
129+
'validate_usd_flavor': True,
130+
'srh_seg_list': None,
131+
'srh_seg_left': 0,
132+
'inner_pkt_ver': '6',
133+
'outer_dscp': 48,
134+
'inner_dscp': 56,
135+
'exp_dst_ipv6': None,
136+
'exp_srh_seg_left': 0,
137+
'exp_inner_dscp_pipe': 56,
138+
'exp_outer_dscp_uniform': 48,
139+
'exp_process_result': 'forward'
140+
},
141+
{ # 7
142+
'action': 'uN',
143+
'srv6_packet_type': 'srh',
144+
'validate_dip_shift': False,
145+
'validate_usd_flavor': True,
146+
'srh_seg_list': 1,
147+
'srh_seg_left': 0,
148+
'inner_pkt_ver': '6',
149+
'outer_dscp': 48,
150+
'inner_dscp': 56,
151+
'exp_dst_ipv6': None,
152+
'exp_srh_seg_left': 0,
153+
'exp_inner_dscp_pipe': 56,
154+
'exp_outer_dscp_uniform': 48,
155+
'exp_process_result': 'forward'
156+
},
157+
{ # 8
158+
'action': 'uN',
159+
'srv6_packet_type': 'srh',
160+
'validate_dip_shift': False,
161+
'validate_usd_flavor': True,
162+
'srh_seg_list': 2,
163+
'srh_seg_left': 0,
164+
'inner_pkt_ver': '6',
165+
'outer_dscp': 48,
166+
'inner_dscp': 56,
167+
'exp_dst_ipv6': None,
168+
'exp_srh_seg_left': 0,
169+
'exp_inner_dscp_pipe': 56,
170+
'exp_outer_dscp_uniform': 48,
171+
'exp_process_result': 'forward'
172+
}
173+
]
174+
175+
# Use dictionary mapping for packet type filtering
176+
packet_type_map = {
177+
'srh': 'srh',
178+
'no_srh': 'no_srh'
179+
}
180+
filtered_base_packets = [
181+
packet for packet in base_packets
182+
if packet['srv6_packet_type'] == packet_type_map.get(srv6_packet_type, 'no_srh')
183+
]
184+
# Generate packets for each SID
185+
for i, sid_entry in enumerate(my_locator_list):
186+
# Select base packet type based on index
187+
base_type = filtered_base_packets[i % len(filtered_base_packets)]
188+
current_sid_container = sid_entry[1]
189+
usid = sid_entry[2]
190+
191+
# Create packet configuration
192+
packet = base_type.copy()
193+
packet['inner_src_ip'] = '1.1.1.1'
194+
packet['inner_dst_ip'] = '2.2.2.2'
195+
packet['inner_src_ipv6'] = '2000::1'
196+
packet['inner_dst_ipv6'] = '3000::2'
197+
packet['outer_src_ipv6'] = '1000:1000::1'
198+
packet['dst_ipv6'] = current_sid_container
199+
next_sid_index = (i + 1) % len(my_locator_list)
200+
next_usid = my_locator_list[next_sid_index][2]
201+
202+
if base_type['validate_dip_shift']:
203+
# Prepare the expected destination IPv6 address for DIP shift validation
204+
packet['dst_ipv6'] = current_sid_container.replace(f'{usid}::', f'{usid}:{next_usid}::')
205+
packet['exp_dst_ipv6'] = current_sid_container.replace(f'{usid}::', f'{next_usid}::')
206+
207+
temp_sid_container = current_sid_container.replace(f'{usid}::', f'{next_usid}::')
208+
# Set segment list based on base type
209+
if base_type['srh_seg_list'] == 1:
210+
packet['srh_seg_list'] = [temp_sid_container]
211+
elif base_type['srh_seg_list'] == 2:
212+
packet['srh_seg_list'] = [current_sid_container, temp_sid_container]
213+
214+
# Set expected destination IPv6 if not validating USD flavor
215+
if not base_type['validate_usd_flavor']:
216+
packet['exp_dst_ipv6'] = temp_sid_container
217+
218+
packet['exp_inner_dscp_pipe'] = packet['inner_dscp'] = packet['exp_outer_dscp_uniform'] = \
219+
packet['outer_dscp'] = i % 64
220+
221+
if packet['validate_usd_flavor']:
222+
packet['exp_outer_dscp_uniform'] = packet['outer_dscp'] = i % 64
223+
packet['exp_inner_dscp_pipe'] = packet['inner_dscp'] = (packet['outer_dscp'] + 8) % 64
224+
225+
# Alternate between IPv4 and IPv6 for inner packet
226+
if i % 2 == 1:
227+
packet['inner_pkt_ver'] = '4'
228+
229+
srv6_packets.append(packet)
230+
231+
return srv6_packets
232+
192233

193234
def dump_packet_detail(pkt):
194235
_stdout, sys.stdout = sys.stdout, StringIO()
@@ -399,6 +440,7 @@ def send_verify_srv6_packet(
399440
packet_num (int): Number of packets to send (default: 10)
400441
"""
401442
ptfadapter.dataplane.flush()
443+
ptfadapter.dataplane.set_qlen(1000000)
402444
logger.info(f'Send SRv6 packet(s) from PTF port {ptf_src_port_id} to upstream')
403445
testutils.send(ptfadapter, ptf_src_port_id, pkt, count=packet_num)
404446
logger.info('SRv6 packet format:\n ---------------------------')
@@ -408,7 +450,8 @@ def send_verify_srv6_packet(
408450

409451
try:
410452
if exp_pro == 'forward':
411-
port_index, _ = testutils.verify_packet_any_port(ptfadapter, exp_pkt, ports=ptf_dst_port_ids)
453+
# set timeout to 60 to override the affection of huge BGP update exchange after config reload or bgp restart
454+
port_index, _ = testutils.verify_packet_any_port(ptfadapter, exp_pkt, timeout=60, ports=ptf_dst_port_ids)
412455
logger.info(f'Received packet(s) on port {ptf_dst_port_ids[port_index]}\n')
413456
elif exp_pro == 'drop':
414457
testutils.verify_no_packet_any(ptfadapter, exp_pkt, ports=ptf_dst_port_ids)

0 commit comments

Comments
 (0)