4040sys .path .append (str (FILE_DIR .joinpath ("../../tools" )))
4141sys .path .append (str (FILE_DIR .joinpath ("../ebpf/targets" )))
4242
43+ import ipaddress
44+
4345import testutils
4446from ptf .pcap_writer import LINKTYPE_ETHERNET , PcapWriter , rdpcap
4547from stf .stf_parser import STFParser
@@ -126,20 +128,37 @@ def int_to_mac(int_val):
126128 return mac
127129
128130
131+ def hex_to_ipv4 (hex_ipv4 ):
132+ ipv4_address = ipaddress .IPv4Address (hex_ipv4 )
133+ return str (ipv4_address )
134+
135+
136+ def hex_to_ipv6 (hex_ipv6 ):
137+ ipv6_address = ipaddress .IPv6Address (hex_ipv6 )
138+ return str (ipv6_address )
139+
140+
129141def map_value (value , port_mapping , json_type ):
130142 if json_type == 'dev' :
131143 return port_mapping [int (value , 16 )]
132144
133145 if json_type == 'macaddr' :
134146 return int_to_mac (int (value , 16 ))
135147
148+ if json_type == "ipv4" :
149+ return hex_to_ipv4 (int (value , 16 ))
150+
151+ if json_type == "ipv6" :
152+ return hex_to_ipv6 (int (value , 16 ))
153+
136154 return value
137155
138156
139157def build_runtime_file (rules_file , json_file , cmds , port_mapping ):
140158 json_data = parse_p4_json (json_file )
159+ generated = ""
141160 for index , cmd in enumerate (cmds ):
142- generated = "$TC p4ctrl create "
161+ generated + = "$TC p4ctrl create "
143162 table_name = cmd .table
144163 table_name = table_name .replace ("." , "/" )
145164 generated += f"{ cmd .pipe_name } /table/{ table_name } "
@@ -158,8 +177,8 @@ def build_runtime_file(rules_file, json_file, cmds, port_mapping):
158177 # Support for LPM key
159178 generated += f"{ field } "
160179 if isinstance (key_field_val [1 ], tuple ):
161- key_field_val = map_value (key_field_val [1 ][0 ], port_mapping , key_json ['type' ])
162- generated += f"{ key_field_val [ 1 ][ 0 ] } /{ key_field_val [1 ][1 ]} "
180+ value = map_value (key_field_val [1 ][0 ], port_mapping , key_json ['type' ])
181+ generated += f"{ value } /{ key_field_val [1 ][1 ]} "
163182 else :
164183 key_field_val = map_value (key_field_val [1 ], port_mapping , key_json ['type' ])
165184 generated += f"{ key_field_val } "
@@ -171,6 +190,7 @@ def build_runtime_file(rules_file, json_file, cmds, port_mapping):
171190 param_json = action_json ['params' ][i ]
172191 param_val = map_value (val_field [1 ], port_mapping , param_json ['type' ])
173192 generated += f"param { val_field [0 ]} { param_val } "
193+ generated += "\n "
174194 file = open (rules_file , "w" )
175195 file .write (generated )
176196 st = os .stat (rules_file )
@@ -448,7 +468,11 @@ def _init_tcpdump_listeners(self):
448468 def send_packets (self , input_pkts ):
449469 return self ._send_pcap_files (input_pkts )
450470
451- def run (self , testfile ):
471+ def _load_extern_mods (self , extern_mods ):
472+ for extern_mod , _ in extern_mods .items ():
473+ self .virtme .run (f"modprobe { extern_mod } " )
474+
475+ def run (self , testfile , extern_mods ):
452476 # Root is necessary to load ebpf into the kernel
453477 if not testutils .check_root ():
454478 testutils .log .warning ("This test requires root privileges; skipping execution." )
@@ -458,6 +482,8 @@ def run(self, testfile):
458482 result = self .virtme .ns_init ()
459483 if result != testutils .SUCCESS :
460484 return result
485+
486+ self ._load_extern_mods (extern_mods )
461487 # Load template script
462488 self .base_template = os .path .basename (self .template )
463489 result = self .virtme .run_intros ("{introspection}/" + f"{ self .base_template } .template" )
0 commit comments