summaryrefslogtreecommitdiffstats
path: root/src/plugins/vmxnet3
AgeCommit message (Expand)AuthorFilesLines
2020-01-06vmxnet3: add FEATURE.yamlSteven Luong1-0/+9
2019-12-07vmxnet3: use explicit types in apiOle Troan3-9/+12
2019-12-04gso: remove the interface countMohsin Kazmi1-4/+0
2019-10-31vlib: only dump 1st buffer in chain by defaultBenoƮt Ganne1-1/+1
2019-09-30vmxnet3: remove api boilerplateOle Troan6-309/+10
2019-09-24vlib: add flag to explicitelly mark nodes which can init per-node packet traceDamjan Marion1-0/+1
2019-09-02vmxnet3: interface rx counter not increment correctlySteven Luong1-1/+1
2019-08-30vmxnet3: per interface gso supportSteven Luong8-37/+26
2019-08-20vppapigen: remove support for legacy typedefsPaul Vinciguerra1-2/+2
2019-08-02vmxnet3: don't bypass ethernet_inputSteven Luong2-15/+6
2019-07-23api: binary api cleanupDave Barach2-4/+6
2019-07-09vat: unload unused vat pluginsDave Barach1-4/+5
2019-06-26vmxnet3: custom dump and debug cli fixSteven Luong3-27/+84
2019-05-21vmxnet3: gso_l4_hdr_sz is not set correctlySteven Luong1-16/+24
2019-05-03plugins: clean up plugin descriptionsDave Wallace1-1/+1
2019-04-19Doxygen cleanup.Dave Wallace1-1/+1
2019-03-18vmxnet3: auto bind supportSteven Luong7-23/+63
2019-02-26vmxnet3: RSS supportSteven Luong7-81/+229
2019-02-26vmxnet3: lro/tso and rx checksumSteven Luong6-45/+283
2019-02-09buffers: fix typoDamjan Marion1-3/+3
2019-02-06buffers: make buffer data size configurable from startup configDamjan Marion1-2/+3
2019-02-02vmxnet3: multiple TX queues supportSteven Luong9-182/+296
2019-01-15vmxnet3: add numa support and link speedSteven4-13/+23
2018-12-17vmxnet3: support clear hardware interface countersSteven3-20/+60
2018-11-13vlib rename vlib_frame_args(...) to vlib_frame_scalar_args(..)Damjan Marion1-1/+1
2018-11-07vmxnet3: reduce calling vmxnet3_reg_write_inlineSteven3-8/+18
2018-10-27vmxnet3: add logging support to the control plane [VPP-1470]Steven4-17/+87
2018-10-26vmxnet3: enable promiscuous modeSteven1-1/+1
2018-10-23Numa-aware, growable physical memory allocator (pmalloc)Damjan Marion2-51/+28
2018-10-23c11 safe string handling supportDave Barach4-12/+12
2018-10-22vlib: pci improvementsDamjan Marion2-15/+16
2018-10-22vlib: introduce vlib_buffer_get_{pa,va,current_va,current_pa} inlinesDamjan Marion2-7/+5
2018-10-16vmxnet3: show vmxnet3 with filtering capability [VPP-1452]Steven3-12/+234
2018-10-16vmxnet3: vmxnet3_test_plugin.so: undefined symbol: format_vlib_pci_addr [VPP-...Steven1-1/+9
2018-10-10vmxnet3: better error handlingSteven2-20/+42
2018-10-03vmxnet3: coverity woeSteven2-12/+12
2018-10-03vmxnet3: error handlingSteven4-60/+84
2018-09-26vmxnet3: delete interface causes a crashSteven1-9/+4
2018-09-25vmxnet3: guard against array overflowSteven1-2/+3
2018-09-21vmxnet3: Add hardware link status handlingSteven6-8/+66
2018-09-20vmxnet3: invoke vlib_buffer_enqueue_to_next() with the wrong buffers for chai...Steven1-7/+8
2018-09-18vmxnet3: add support for "non-default" next nodeSteven3-2/+76
2018-09-16vmxnet3: fix clang initialization errorFlorin Coras1-1/+2
2018-09-14vmxnet3 device driverSteven Luong14-0/+3173
class="n">bd_id=cls.bd_id) # setup all interfaces for i in cls.interfaces: i.admin_up() # mapping between packet-generator index and lists of test hosts cls.hosts_by_pg_idx = dict() # create test host entries and inject packets to learn MAC entries # in the bridge-domain cls.create_hosts_and_learn(cls.mac_entries_count) cls.logger.info(cls.vapi.ppcli("show l2fib")) except Exception: super(TestL2bd, cls).tearDownClass() raise def setUp(self): """ Clear trace and packet infos before running each test. """ super(TestL2bd, self).setUp() self.reset_packet_infos() def tearDown(self): """ Show various debug prints after each test. """ super(TestL2bd, self).tearDown() if not self.vpp_dead: self.logger.info(self.vapi.ppcli("show l2fib verbose")) self.logger.info(self.vapi.ppcli("show bridge-domain %s detail" % self.bd_id)) @classmethod def create_hosts_and_learn(cls, count): """ Create required number of host MAC addresses and distribute them among interfaces. Create host IPv4 address for every host MAC address. Create L2 MAC packet stream with host MAC addresses per interface to let the bridge domain learn these MAC addresses. :param count: Integer number of hosts to create MAC/IPv4 addresses for. """ n_int = len(cls.pg_interfaces) macs_per_if = count / n_int i = -1 for pg_if in cls.pg_interfaces: i += 1 start_nr = macs_per_if * i end_nr = count if i == (n_int - 1) else macs_per_if * (i + 1) cls.hosts_by_pg_idx[pg_if.sw_if_index] = [] hosts = cls.hosts_by_pg_idx[pg_if.sw_if_index] packets = [] for j in range(start_nr, end_nr): host = Host( "00:00:00:ff:%02x:%02x" % (pg_if.sw_if_index, j), "172.17.1%02x.%u" % (pg_if.sw_if_index, j)) packet = (Ether(dst="ff:ff:ff:ff:ff:ff", src=host.mac)) hosts.append(host) if hasattr(pg_if, 'sub_if'): packet = pg_if.sub_if.add_dot1_layer(packet) packets.append(packet) pg_if.add_stream(packets) cls.logger.info("Sending broadcast eth frames for MAC learning") cls.pg_start() def create_stream(self, src_if, packet_sizes, packets_per_burst): """ Create input packet stream for defined interface. :param object src_if: Interface to create packet stream for. :param list packet_sizes: List of required packet sizes. :param int packets_per_burst: Number of packets in burst. :return: Stream of packets. """ pkts = [] for i in range(0, packets_per_burst): dst_if = self.flows[src_if][i % 2] dst_host = random.choice(self.hosts_by_pg_idx[dst_if.sw_if_index]) src_host = random.choice(self.hosts_by_pg_idx[src_if.sw_if_index]) pkt_info = self.create_packet_info(src_if, dst_if) payload = self.info_to_payload(pkt_info) p = (Ether(dst=dst_host.mac, src=src_host.mac) / IP(src=src_host.ip4, dst=dst_host.ip4) / UDP(sport=1234, dport=1234) / Raw(payload)) pkt_info.data = p.copy() if hasattr(src_if, 'sub_if'): p = src_if.sub_if.add_dot1_layer(p) size = random.choice(packet_sizes) self.extend_packet(p, size) pkts.append(p) return pkts def verify_capture(self, pg_if, capture): """ Verify captured input packet stream for defined interface. :param object pg_if: Interface to verify captured packet stream for. :param list capture: Captured packet stream. """ last_info = dict() for i in self.pg_interfaces: last_info[i.sw_if_index] = None dst_sw_if_index = pg_if.sw_if_index for packet in capture: payload_info = self.payload_to_info(str(packet[Raw])) src_sw_if_index = payload_info.src src_if = None for ifc in self.pg_interfaces: if ifc != pg_if: if ifc.sw_if_index == src_sw_if_index: src_if = ifc break if hasattr(src_if, 'sub_if'): # Check VLAN tags and Ethernet header packet = src_if.sub_if.remove_dot1_layer(packet) self.assertTrue(Dot1Q not in packet) try: ip = packet[IP] udp = packet[UDP] packet_index = payload_info.index self.assertEqual(payload_info.dst, dst_sw_if_index) self.logger.debug("Got packet on port %s: src=%u (id=%u)" % (pg_if.name, payload_info.src, packet_index)) next_info = self.get_next_packet_info_for_interface2( payload_info.src, dst_sw_if_index, last_info[payload_info.src]) last_info[payload_info.src] = next_info self.assertTrue(next_info is not None) self.assertEqual(packet_index, next_info.index) saved_packet = next_info.data # Check standard fields self.assertEqual(ip.src, saved_packet[IP].src) self.assertEqual(ip.dst, saved_packet[IP].dst) self.assertEqual(udp.sport, saved_packet[UDP].sport) self.assertEqual(udp.dport, saved_packet[UDP].dport) except: self.logger.error(ppp("Unexpected or invalid packet:", packet)) raise for i in self.pg_interfaces: remaining_packet = self.get_next_packet_info_for_interface2( i, dst_sw_if_index, last_info[i.sw_if_index]) self.assertTrue( remaining_packet is None, "Port %u: Packet expected from source %u didn't arrive" % (dst_sw_if_index, i.sw_if_index)) def run_l2bd_test(self, pkts_per_burst): """ L2BD MAC learning test """ # Create incoming packet streams for packet-generator interfaces for i in self.pg_interfaces: packet_sizes = self.sub_if_packet_sizes if hasattr(i, 'sub_if') \ else self.pg_if_packet_sizes pkts = self.create_stream(i, packet_sizes, pkts_per_burst) i.add_stream(pkts) # Enable packet capture and start packet sending self.pg_enable_capture(self.pg_interfaces) self.pg_start() # Verify outgoing packet streams per packet-generator interface for i in self.pg_interfaces: capture = i.get_capture() self.logger.info("Verifying capture on interface %s" % i.name) self.verify_capture(i, capture) def test_l2bd_sl(self): """ L2BD MAC learning single-loop test Test scenario: 1.config MAC learning enabled learn 100 MAC enries 3 interfaces: untagged, dot1q, dot1ad (dot1q used instead of dot1ad in the first version) 2.sending l2 eth pkts between 3 interface 64B, 512B, 1518B, 9200B (ether_size) burst of 2 pkts per interface """ self.run_l2bd_test(self.sl_pkts_per_burst) def test_l2bd_dl(self): """ L2BD MAC learning dual-loop test Test scenario: 1.config MAC learning enabled learn 100 MAC enries 3 interfaces: untagged, dot1q, dot1ad (dot1q used instead of dot1ad in the first version) 2.sending l2 eth pkts between 3 interface 64B, 512B, 1518B, 9200B (ether_size) burst of 257 pkts per interface """ self.run_l2bd_test(self.dl_pkts_per_burst) if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)