diff options
Diffstat (limited to 'VNFs/DPPD-PROX/helper-scripts')
16 files changed, 76 insertions, 36 deletions
diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/config_file b/VNFs/DPPD-PROX/helper-scripts/rapid/config_file index f31ed25e..0cd5c707 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/config_file +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/config_file @@ -5,4 +5,5 @@ heat_template= openstack-rapid.yaml heat_param = params_rapid.yaml keypair_name = rapid_key user = centos +dataplane_subnet_mask = 24 ;push_gateway = http://192.168.36.61:9091/metrics/job/ diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py b/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py index e488f352..1658cff4 100755 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/createrapid.py @@ -32,6 +32,8 @@ class RapidStackManager(object): options = config.options(section) for option in options: rapid_stack_params[option] = config.get(section, option) + if 'dataplane_subnet_mask' not in rapid_stack_params.keys(): + rapid_stack_params['dataplane_subnet_mask'] = 24 return (rapid_stack_params) @staticmethod @@ -42,9 +44,10 @@ class RapidStackManager(object): heat_param = rapid_stack_params['heat_param'] keypair_name = rapid_stack_params['keypair_name'] user = rapid_stack_params['user'] + dataplane_subnet_mask = rapid_stack_params['dataplane_subnet_mask'] deployment = StackDeployment(cloud_name) deployment.deploy(stack_name, keypair_name, heat_template, heat_param) - deployment.generate_env_file(user) + deployment.generate_env_file(user, dataplane_subnet_mask) def main(): rapid_stack_params = {} diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/format.yaml b/VNFs/DPPD-PROX/helper-scripts/rapid/format.yaml index 1ac48abb..f4220775 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/format.yaml +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/format.yaml @@ -45,6 +45,9 @@ rapid_flowsizetest: AvgLatency: AvgLatency PCTLatency: PCTLatency MaxLatency: MaxLatency + Distribution: + bucket_size: bucket_size + buckets: buckets Absolute Packet Count: PacketsSent: PacketsSent PacketsReceived: PacketsReceived diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/gen.cfg b/VNFs/DPPD-PROX/helper-scripts/rapid/gen.cfg index 717915d1..1827395f 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/gen.cfg +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/gen.cfg @@ -28,7 +28,7 @@ rx desc=2048 tx desc=2048 vlan=yes vdev=gen_tap -local ipv4=${local_ip1}/24 +local ipv4=${local_ip1} [variables] diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/gen_gw.cfg b/VNFs/DPPD-PROX/helper-scripts/rapid/gen_gw.cfg index f53b41d5..fc3b6a68 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/gen_gw.cfg +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/gen_gw.cfg @@ -28,7 +28,7 @@ rx desc=2048 tx desc=2048 vlan=yes vdev=gen_tap -local ipv4=${local_ip1}/24 +local ipv4=${local_ip1} [variables] $mbs=8 diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/helper.lua b/VNFs/DPPD-PROX/helper-scripts/rapid/helper.lua index 237c385b..1b4c657b 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/helper.lua +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/helper.lua @@ -21,6 +21,22 @@ function convertIPToHex(ip) return "IP ADDRESS ERROR" end + local chunks = {ip:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)(\/%d+)$")} + if #chunks == 5 then + for i,v in ipairs(chunks) do + if i < 5 then + if tonumber(v) > 255 then + print ("IPV4 ADDRESS ERROR: ", ip) + return "IPV4 ADDRESS ERROR" + end + address_chunks[#address_chunks + 1] = string.format ("%02x", v) + end + end + result = table.concat(address_chunks, " ") + print ("Hex IPV4: ", result) + return result + end + local chunks = {ip:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")} if #chunks == 4 then for i,v in ipairs(chunks) do diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/impair.cfg b/VNFs/DPPD-PROX/helper-scripts/rapid/impair.cfg index cb3f349e..95d6516f 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/impair.cfg +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/impair.cfg @@ -29,7 +29,7 @@ rx desc=2048 tx desc=2048 vlan=yes vdev=impair_tap -local ipv4=${local_ip1}/24 +local ipv4=${local_ip1} [defaults] diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py index ca3b5a2f..f547b3c4 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py @@ -138,7 +138,7 @@ class FlowSizeTest(RapidTest): self.set_background_speed(self.background_machines, speed) self.start_background_traffic(self.background_machines) # Get statistics now that the generation is stable and initial ARP messages are dealt with - pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg,lat_perc , lat_perc_max, lat_max, abs_tx,abs_rx,abs_dropped, abs_tx_fail, drop_rate, lat_min, lat_used, r, actual_duration, avg_bg_rate = self.run_iteration(float(self.test['runtime']),flow_number,size,speed) + pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg,lat_perc , lat_perc_max, lat_max, abs_tx,abs_rx,abs_dropped, abs_tx_fail, drop_rate, lat_min, lat_used, r, actual_duration, avg_bg_rate, bucket_size, buckets = self.run_iteration(float(self.test['runtime']),flow_number,size,speed) self.stop_background_traffic(self.background_machines) if r > 1: retry_warning = bcolors.WARNING + ' {:1} retries needed'.format(r) + bcolors.ENDC @@ -160,6 +160,7 @@ class FlowSizeTest(RapidTest): endlat_perc = lat_perc endlat_perc_max = lat_perc_max endlat_max = lat_max + endbuckets = buckets endabs_dropped = abs_dropped enddrop_rate = drop_rate endabs_tx = abs_tx @@ -193,6 +194,7 @@ class FlowSizeTest(RapidTest): endlat_perc = lat_perc endlat_perc_max = lat_perc_max endlat_max = lat_max + endbuckets = buckets endabs_dropped = None enddrop_rate = drop_rate endabs_tx = abs_tx @@ -267,7 +269,9 @@ class FlowSizeTest(RapidTest): 'MaxLatency': endlat_max, 'PacketsSent': endabs_tx, 'PacketsReceived': endabs_rx, - 'PacketsLost': abs_dropped} + 'PacketsLost': abs_dropped, + 'bucket_size': bucket_size, + 'buckets': endbuckets} self.post_data('rapid_flowsizetest', variables) else: RapidLog.info('|{:>7}'.format(str(flow_number))+" | Speed 0 or close to 0") diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_generator_machine.py b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_generator_machine.py index dee40d94..293720de 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_generator_machine.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_generator_machine.py @@ -49,7 +49,7 @@ class RapidGeneratorMachine(RapidMachine): """ Class to deal with a generator PROX instance (VM, bare metal, container) """ - def __init__(self, key, user, vim, rundir, machine_params, ipv6): + def __init__(self, key, user, vim, rundir, machine_params, configonly, ipv6): mac_address_size = 6 ethertype_size = 2 FCS_size = 4 @@ -73,7 +73,7 @@ class RapidGeneratorMachine(RapidMachine): self.udp_dest_port_offset = udp_header_start_offset + 2 self.udp_length_offset = udp_header_start_offset + 4 self.ipv6 = ipv6 - super().__init__(key, user, vim, rundir, machine_params) + super().__init__(key, user, vim, rundir, machine_params, configonly) def get_cores(self): return (self.machine_params['gencores'] + @@ -103,10 +103,10 @@ class RapidGeneratorMachine(RapidMachine): appendix = appendix + 'heartbeat="60"\n' super().generate_lua(vim, appendix) - def start_prox(self, configonly=False): + def start_prox(self): # Start the generator with the -e option so that the cores don't # start automatically - super().start_prox(configonly, '-e') + super().start_prox('-e') def set_generator_speed(self, speed): # The assumption is that we only use task 0 for generating diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_impairtest.py b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_impairtest.py index 74d624d5..8b7f876e 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_impairtest.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_impairtest.py @@ -57,7 +57,7 @@ class ImpairTest(RapidTest): sys.stdout.flush() time.sleep(1) # Get statistics now that the generation is stable and NO ARP messages any more - pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg, lat_perc, lat_perc_max, lat_max, abs_tx, abs_rx, abs_dropped, abs_tx_fail, drop_rate, lat_min, lat_used, r, actual_duration, _ = self.run_iteration(float(self.test['runtime']),flow_number,size,speed) + pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg, lat_perc, lat_perc_max, lat_max, abs_tx, abs_rx, abs_dropped, abs_tx_fail, drop_rate, lat_min, lat_used, r, actual_duration, _,bucket_size, buckets = self.run_iteration(float(self.test['runtime']),flow_number,size,speed) # Drop rate is expressed in percentage. lat_used is a ratio (0 to 1). The sum of these 2 should be 100%. # If the sum is lower than 95, it means that more than 5% of the latency measurements where dropped for accuracy reasons. if (drop_rate + lat_used * 100) < 95: @@ -78,7 +78,9 @@ class ImpairTest(RapidTest): 'PCTLatency': lat_perc, 'MaxLatency': lat_max, 'PacketsLost': abs_dropped, - 'DropRate': drop_rate} + 'DropRate': drop_rate, + 'bucket_size': bucket_size, + 'buckets': buckets} self.post_data('rapid_impairtest', variables) self.gen_machine.stop_latency_cores() return (True) diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_machine.py b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_machine.py index 4a0bcb82..8466c856 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_machine.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_machine.py @@ -24,7 +24,7 @@ class RapidMachine(object): """ Class to deal with a PROX instance (VM, bare metal, container) """ - def __init__(self, key, user, vim, rundir, machine_params): + def __init__(self, key, user, vim, rundir, machine_params, configonly): self.name = machine_params['name'] self.ip = machine_params['admin_ip'] self.key = key @@ -32,6 +32,7 @@ class RapidMachine(object): self.rundir = rundir self.dp_ports = [] self.dpdk_port_index = [] + self.configonly = configonly index = 1 while True: ip_key = 'dp_ip{}'.format(index) @@ -48,13 +49,13 @@ class RapidMachine(object): self.vim = vim def __del__(self): - if self.machine_params['prox_socket']: + if ((not self.configonly) and self.machine_params['prox_socket']): self._client.scp_get('/prox.log', './{}.prox.log'.format(self.name)) def get_cores(self): return (self.machine_params['cores']) - def devbind(self, configonly): + def devbind(self): # Script to bind the right network interface to the poll mode driver for index, dp_port in enumerate(self.dp_ports, start = 1): DevBindFileName = self.rundir + '/devbind-{}-port{}.sh'.format(self.ip, index) @@ -62,7 +63,7 @@ class RapidMachine(object): cmd = 'sed -i \'s/MACADDRESS/' + dp_port['mac'] + '/\' ' + DevBindFileName result = self._client.run_cmd(cmd) RapidLog.debug('devbind.sh MAC updated for port {} on {} {}'.format(index, self.name, result)) - if ((not configonly) and self.machine_params['prox_launch_exit']): + if ((not self.configonly) and self.machine_params['prox_launch_exit']): result = self._client.run_cmd(DevBindFileName) RapidLog.debug('devbind.sh running for port {} on {} {}'.format(index, self.name, result)) @@ -95,15 +96,15 @@ class RapidMachine(object): self._client.scp_put(self.LuaFileName, self.rundir + '/parameters.lua') self._client.scp_put('helper.lua', self.rundir + '/helper.lua') - def start_prox(self, configonly=False, autostart=''): + def start_prox(self, autostart=''): if self.machine_params['prox_socket']: self._client = prox_ctrl(self.ip, self.key, self.user) self._client.connect() if self.vim in ['OpenStack']: - self.devbind(configonly) + self.devbind() self.generate_lua(self.vim) self._client.scp_put(self.machine_params['config_file'], '{}/{}'.format(self.rundir, self.machine_params['config_file'])) - if ((not configonly) and self.machine_params['prox_launch_exit']): + if ((not self.configonly) and self.machine_params['prox_launch_exit']): cmd = 'sudo {}/prox {} -t -o cli -f {}/{}'.format(self.rundir, autostart, self.rundir, self.machine_params['config_file']) RapidLog.debug("Starting PROX on {}: {}".format(self.name, cmd)) result = self._client.run_cmd(cmd, 'PROX Testing on {}'.format(self.name)) @@ -111,7 +112,7 @@ class RapidMachine(object): RapidLog.debug("Finished PROX on {}: {}".format(self.name, cmd)) def close_prox(self): - if self.machine_params['prox_socket'] and self.machine_params['prox_launch_exit']: + if (not self.configonly) and self.machine_params['prox_socket'] and self.machine_params['prox_launch_exit']: self.socket.quit() def connect_prox(self): diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_parser.py b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_parser.py index af595704..992d2d0a 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_parser.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_parser.py @@ -106,6 +106,8 @@ class RapidConfigParser(object): section, option)) elif option in ['bucket_size_exp']: machine[option] = int(testconfig.get(section, option)) + if machine[option] < 11: + RapidLog.exception("Minimum Value for bucket_size_exp is 11") else: machine[option] = testconfig.get(section, option) for key in ['prox_socket','prox_launch_exit']: diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_test.py b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_test.py index cdacb801..2babd340 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_test.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_test.py @@ -285,8 +285,9 @@ class RapidTest(object): if sample_count > lat_samples * LAT_PERCENTILE: break percentile_max = (sample_percentile == len(buckets)) - sample_percentile = sample_percentile * float(2 ** BUCKET_SIZE_EXP) / (old_div(float(lat_hz),float(10**6))) - buckets_total = [buckets_total[i] + buckets[i] for i in range(len(buckets_total))] + bucket_size = float(2 ** BUCKET_SIZE_EXP) / (old_div(float(lat_hz),float(10**6))) + sample_percentile = sample_percentile * bucket_size + buckets_total = [buckets_total[i] + buckets[i] for i in range(len(buckets_total))] t2_lat_tsc = t3_lat_tsc lat_avail = True t3_rx, t3_non_dp_rx, t3_tx, t3_non_dp_tx, t3_drop, t3_tx_fail, t3_tsc, tsc_hz = self.gen_machine.core_stats() @@ -351,7 +352,10 @@ class RapidTest(object): 'MaxLatency': lat_max_sample, 'PacketsSent': delta_dp_tx, 'PacketsReceived': delta_dp_rx, - 'PacketsLost': tot_dp_drop} + 'PacketsLost': tot_dp_drop, + 'bucket_size': bucket_size, + 'buckets': buckets} + self.post_data('rapid_flowsizetest', variables) end_bg_gen_stats = [] for bg_gen_machine in self.background_machines: @@ -393,7 +397,7 @@ class RapidTest(object): if sample_count > lat_samples * LAT_PERCENTILE: break percentile_max = (percentile == len(buckets)) - percentile = percentile * float(2 ** BUCKET_SIZE_EXP) / (old_div(float(lat_hz),float(10**6))) + percentile = percentile * bucket_size lat_max = lat_max_sample lat_avg = lat_avg_sample delta_rx = t4_rx - t2_rx @@ -414,12 +418,13 @@ class RapidTest(object): break ## Not really needed since the while loop will stop when evaluating the value of r else: sample_count = 0 + buckets = buckets_total for percentile, bucket in enumerate(buckets_total,start=1): sample_count += bucket if sample_count > tot_lat_samples * LAT_PERCENTILE: break percentile_max = (percentile == len(buckets_total)) - percentile = percentile * float(2 ** BUCKET_SIZE_EXP) / (old_div(float(lat_hz),float(10**6))) + percentile = percentile * bucket_size pps_req_tx = (tot_tx + tot_drop - tot_rx)/tot_core_measurement_duration/1000000.0 # tot_drop is all packets dropped by all tasks. This includes packets dropped at the generator task + packets dropped by the nop task. In steady state, this equals to the number of packets received by this VM pps_tx = tot_tx/tot_core_measurement_duration/1000000.0 # tot_tx is all generated packets actually accepted by the interface pps_rx = tot_rx/tot_core_measurement_duration/1000000.0 # tot_rx is all packets received by the nop task = all packets received in the gen VM @@ -433,4 +438,4 @@ class RapidTest(object): drop_rate = 100.0*tot_dp_drop/dp_tx if ((drop_rate < self.test['drop_rate_threshold']) or (tot_dp_drop == self.test['drop_rate_threshold'] ==0) or (tot_dp_drop > self.test['maxz'])): break - return(pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg,percentile,percentile_max,lat_max,dp_tx,dp_rx,tot_dp_drop,(t4_tx_fail - t1_tx_fail),drop_rate,lat_min,used_avg,r,tot_core_measurement_duration,avg_bg_rate) + return(pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg,percentile,percentile_max,lat_max,dp_tx,dp_rx,tot_dp_drop,(t4_tx_fail - t1_tx_fail),drop_rate,lat_min,used_avg,r,tot_core_measurement_duration,avg_bg_rate,bucket_size,buckets) diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/runrapid.py b/VNFs/DPPD-PROX/helper-scripts/rapid/runrapid.py index 8e879a06..f5b85a3e 100755 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/runrapid.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/runrapid.py @@ -57,12 +57,13 @@ class RapidTestManager(object): background_machines = [] sut_machine = gen_machine = None self.machines = [] + configonly = test_params['configonly'] for machine_params in test_params['machines']: if 'gencores' in machine_params.keys(): machine = RapidGeneratorMachine(test_params['key'], test_params['user'], test_params['vim_type'], test_params['rundir'], machine_params, - test_params['ipv6']) + configonly, test_params['ipv6']) if machine_params['monitor']: if monitor_gen: RapidLog.exception("Can only monitor 1 generator") @@ -75,7 +76,7 @@ class RapidTestManager(object): else: machine = RapidMachine(test_params['key'], test_params['user'], test_params['vim_type'], test_params['rundir'], - machine_params) + machine_params, configonly) if machine_params['monitor']: if monitor_sut: RapidLog.exception("Can only monitor 1 sut") @@ -86,8 +87,8 @@ class RapidTestManager(object): sut_machine = machine self.machines.append(machine) prox_executor = concurrent.futures.ThreadPoolExecutor(max_workers=len(self.machines)) - self.future_to_prox = {prox_executor.submit(machine.start_prox,test_params['configonly']): machine for machine in self.machines} - if test_params['configonly']: + self.future_to_prox = {prox_executor.submit(machine.start_prox): machine for machine in self.machines} + if configonly: concurrent.futures.wait(self.future_to_prox,return_when=ALL_COMPLETED) sys.exit() with concurrent.futures.ThreadPoolExecutor(max_workers=len(self.machines)) as executor: diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/stackdeployment.py b/VNFs/DPPD-PROX/helper-scripts/rapid/stackdeployment.py index 2e9c6cc2..925fd8bd 100755 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/stackdeployment.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/stackdeployment.py @@ -75,7 +75,7 @@ class StackDeployment(object): for name in server_group_output: self.names.append(name) - def print_paramDict(self, user): + def print_paramDict(self, user, dataplane_subnet_mask): if not(len(self.dp_ips) == len(self.dp_macs) == len(self.mngmt_ips)): sys.exit() _ENV_FILE_DIR = os.path.dirname(os.path.realpath(__file__)) @@ -90,9 +90,11 @@ class StackDeployment(object): env_file.write('admin_ip = {}\n'.format(str(self.mngmt_ips[count]))) if type(self.dp_ips[count]) == list: for i, dp_ip in enumerate(self.dp_ips[count], start = 1): - env_file.write('dp_ip{} = {}\n'.format(i, str(dp_ip))) + env_file.write('dp_ip{} = {}/{}\n'.format(i, str(dp_ip), + dataplane_subnet_mask)) else: - env_file.write('dp_ip1 = {}\n'.format(str(self.dp_ips[count]))) + env_file.write('dp_ip1 = {}/{}\n'.format(str(self.dp_ips[count]), + dataplane_subnet_mask)) if type(self.dp_macs[count]) == list: for i, dp_mac in enumerate(self.dp_macs[count], start = 1): env_file.write('dp_mac{} = {}\n'.format(i, str(dp_mac))) @@ -156,6 +158,6 @@ class StackDeployment(object): self.create_key() self.stack = self.create_stack(stack_name, heat_template, heat_param) - def generate_env_file(self, user = 'centos'): + def generate_env_file(self, user = 'centos', dataplane_subnet_mask = '24'): self.generate_paramDict() - self.print_paramDict(user) + self.print_paramDict(user, dataplane_subnet_mask) diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/swap.cfg b/VNFs/DPPD-PROX/helper-scripts/rapid/swap.cfg index 4463f833..0cca80c6 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/swap.cfg +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/swap.cfg @@ -27,7 +27,7 @@ name=if0 mac=hardware vlan=yes vdev=swap_tap -local ipv4=${local_ip1}/24 +local ipv4=${local_ip1} [defaults] mempool size=8K |