summaryrefslogtreecommitdiffstats
path: root/src/tools
AgeCommit message (Expand)AuthorFilesLines
2021-03-05vppapigen: expose the values of per-message "options" in the api.json filesAndrew Yourtchenko1-0/+1
2021-03-05api: crchcecker ignore version < 1.0.0 and outside of src directoryOle Troan1-0/+3
2021-02-17vat2: add sanity checking - coverity errorsOle Troan1-0/+9
2021-02-17vppapigen: resource leakage in fromjson array - coverityOle Troan1-1/+1
2021-02-17vppapigen: more _fromjson autogeneration coverity fixesOle Troan1-6/+10
2021-02-15vppapigen: py2 cleanup - remove subclassing of objectPaul Vinciguerra1-3/+3
2021-02-12vppapigen: coverity issues in autogenerated code pass 3.Ole Troan1-14/+15
2021-02-11vppapigen: fix fromjson coverity errors in generationOle Troan1-27/+30
2021-02-09nat: fix coverity errorsOle Troan1-1/+1
2021-02-05nat: 1:1 policy NATOle Troan2-5/+12
2021-02-03vppapigen: Support an 'autoendian' keyword for message definitions inNeale Ranns2-4/+11
2021-02-03vppapigen: fix enum typesPaul Vinciguerra1-2/+11
2021-01-06api: fromjson/tojson generated code memory leakOle Troan1-1/+1
2020-12-15api: crchcecker ignore version < 1.0.0 and outside of src directoryOle Tr�an1-3/+0
2020-12-15api: crchcecker ignore version < 1.0.0 and outside of src directoryOle Troan1-0/+3
2020-12-11api: fromjson/tojson enum flag supportOle Troan1-2/+36
2020-12-10api: remove unused singular optionOle Troan1-7/+1
2020-12-04vppapigen: add parser support for enumflagsPaul Vinciguerra4-57/+221
2020-11-25api: vat2 and json autogeneration for api messagesOle Troan2-443/+1345
2020-11-21vppapigen: move import processing logic to individual pluginsPaul Vinciguerra4-37/+50
2020-10-13stats: counters data modelOle Troan3-12/+162
2020-10-06feature: Add packet trace APIJon Loeliger1-4/+10
2020-09-18vat: add infrastructure to align vnet test code and plugin test codeOle Troan1-10/+11
2020-09-11build: fix build for Debian 9 and Debian 10Benoît Ganne1-4/+5
2020-09-01vppapigen: supports backwards compatible marking of enumsOle Troan1-18/+38
2020-08-25api: register endian handlers for reply messagesOle Troan1-0/+13
2020-08-21vppapigen: Fix missing api dirNathan Skrzypczak1-0/+1
2020-08-19vppinfra: minor tweaks for cgo interoperationDave Barach2-11/+11
2020-08-17vppapigen: generate define for module_semverOle Troan1-0/+7
2020-08-13vppapigen: remove unreachable codeOle Troan1-1/+0
2020-08-11vppapigen: add support for empty optionsOle Troan2-3/+17
2020-08-06misc: harmonize namesDave Barach2-10/+10
2020-07-23vppapigen: missing crcs in user-defined typesOle Troan2-3/+403
2020-06-17docs: add more FEATURE.yaml documentationDave Barach1-0/+12
2020-05-27api: make vpp api handlers endian independentOle Troan1-4/+15
2020-05-25api: add new stream message conventionOle Troan2-1/+8
2020-05-19vppapigen: handle new api file for crcchekcerOle Troan1-2/+9
2020-05-16vppapigen: add assert for python versionOle Troan1-2/+4
2020-05-15g2: fix the g2 build for Ubuntu 20.04Dave Barach1-2/+1
2020-05-09vppapigen: api crc checkerOle Troan2-23/+67
2020-05-08build: various improvementsDamjan Marion1-1/+1
2020-05-07misc: deprecate elftoolDamjan Marion3-500/+0
2020-04-06misc: fix python sonarcloud BLOCKER level issuesPaul Vinciguerra1-1/+1
2020-04-04misc: strcpy be goneDave Barach2-22/+20
2020-04-04misc: sprintf be goneDave Barach7-164/+163
2020-03-04vppapigen: crc is a negative value for some messages when using python 2.7Mark Nelson1-2/+2
2020-02-26vppapigen: list imports in JSONOndrej Fabry1-0/+7
2020-02-26api: improve api string safetyJakub Grajciar1-3/+2
2020-02-04vppapigen: fix options representationOle Troan1-1/+1
2020-01-30vppapigen: update markdown documentationPaul Vinciguerra1-7/+10
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)