@@ -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
193234def 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