diff options
-rwxr-xr-x | nfvbench/cfg.default.yaml | 5 | ||||
-rw-r--r-- | nfvbench/nfvbench.py | 2 | ||||
-rwxr-xr-x | nfvbench/traffic_client.py | 9 | ||||
-rw-r--r-- | nfvbench/traffic_gen/trex.py | 9 | ||||
-rw-r--r-- | test/test_nfvbench.py | 1 |
5 files changed, 22 insertions, 4 deletions
diff --git a/nfvbench/cfg.default.yaml b/nfvbench/cfg.default.yaml index d7e85c8..da68571 100755 --- a/nfvbench/cfg.default.yaml +++ b/nfvbench/cfg.default.yaml @@ -131,6 +131,11 @@ sriov: false # Can be overriden by --no-int-config no_int_config: false +# Perform port to port loopback (direct or through switch) +# Should be used with EXT service chain and no ARP (no_arp: true) +# Can be overriden by --l2-loopback +l2_loopback: false + # Resources created by NFVbench will not be removed # Can be overriden by --no-cleanup no_cleanup: false diff --git a/nfvbench/nfvbench.py b/nfvbench/nfvbench.py index c5c1244..1f80390 100644 --- a/nfvbench/nfvbench.py +++ b/nfvbench/nfvbench.py @@ -574,7 +574,9 @@ def main(): if opts.no_int_config: config.no_int_config = opts.no_int_config + # port to port loopback (direct or through switch) if opts.l2_loopback: + config.l2_loopback = True if config.service_chain != ChainType.EXT: LOG.info('Changing service chain type to EXT') config.service_chain = ChainType.EXT diff --git a/nfvbench/traffic_client.py b/nfvbench/traffic_client.py index 5305da9..188e076 100755 --- a/nfvbench/traffic_client.py +++ b/nfvbench/traffic_client.py @@ -486,6 +486,10 @@ class TrafficClient(object): self.config.generic_poll_sec - 1) / self.config.generic_poll_sec mac_addresses = set() ln = 0 + # in case of l2-loopback, we will only have 2 unique src MAC regardless of the + # number of chains configured because there are no VM involved + # otherwise, we expect to see packets coming from 2 unique MAC per chain + unique_src_mac_count = 2 if self.config.l2_loopback else self.config.service_chain_count * 2 for it in xrange(retry_count): self.gen.clear_stats() self.gen.start_traffic() @@ -501,9 +505,8 @@ class TrafficClient(object): mac_addresses.add(packet['binary'][6:12]) if ln != len(mac_addresses): ln = len(mac_addresses) - LOG.info('Flows passing traffic %d / %d', ln, - self.config.service_chain_count * 2) - if len(mac_addresses) == self.config.service_chain_count * 2: + LOG.info('Received unique source MAC %d / %d', ln, unique_src_mac_count) + if len(mac_addresses) == unique_src_mac_count: LOG.info('End-to-end connectivity ensured') return diff --git a/nfvbench/traffic_gen/trex.py b/nfvbench/traffic_gen/trex.py index 22ca4d9..cabf1cb 100644 --- a/nfvbench/traffic_gen/trex.py +++ b/nfvbench/traffic_gen/trex.py @@ -455,10 +455,17 @@ class TRex(AbstractTrafficGenerator): self.client.stop(ports=self.port_handle) def start_capture(self): + """Capture all packets on both ports that are unicast to us.""" if self.capture_id: self.stop_capture() + # Need to filter out unwanted packets so we do not end up counting + # src MACs of frames that are not unicast to us + src_mac_list = self.get_macs() + bpf_filter = "ether dst %s or ether dst %s" % (src_mac_list[0], src_mac_list[1]) + # ports must be set in service in order to enable capture self.client.set_service_mode(ports=self.port_handle) - self.capture_id = self.client.start_capture(rx_ports=self.port_handle) + self.capture_id = self.client.start_capture(rx_ports=self.port_handle, + bpf_filter=bpf_filter) def fetch_capture_packets(self): if self.capture_id: diff --git a/test/test_nfvbench.py b/test/test_nfvbench.py index 16784d8..c45ccb3 100644 --- a/test/test_nfvbench.py +++ b/test/test_nfvbench.py @@ -627,6 +627,7 @@ def get_dummy_tg_config(chain_type, rate): 'check_traffic_time_sec': 200, 'generic_poll_sec': 2, 'measurement': {'NDR': 0.001, 'PDR': 0.1, 'load_epsilon': 0.1}, + 'l2_loopback': False }) def get_traffic_client(): |