summaryrefslogtreecommitdiffstats
path: root/extras/libmemif
AgeCommit message (Expand)AuthorFilesLines
2019-04-08fixing typosJim Thompson1-1/+1
2019-03-04libmemif: Connection request APIsJakub Grajciar4-84/+147
2019-01-04libmemif: fix incorrect write leading to memory corruptionKoichiro Den1-3/+3
2018-12-18Remove autotools files from extras/libmemifMauro Sardara3-117/+0
2018-12-17libmemif: fix possible segfault on memif_get_detailsKoichiro Den1-31/+28
2018-12-17Added CMake building system for libmemifmsardara12-69/+367
2018-09-27libmemif: external region bugfixJakub Grajciar2-2/+5
2018-09-07libmemif: slave connecting bugfixJakub Grajciar3-48/+70
2018-08-30libmemif: external region supportJakub Grajciar9-123/+1460
2018-07-11memif: fix max number of ringsDamjan Marion1-1/+1
2018-06-28libmemif: fixing head/tail arithmetics & queue reallocationMilan Lenco2-11/+6
2018-04-26libmemif: fix build on ununtu 18.04 (VPP-1244)Damjan Marion1-0/+1
2018-04-24libmemif: fix implicit declaration of memfd_createJakub Grajciar1-0/+1
2018-04-12libmemif: fix clang compilation errors/warningsJakub Grajciar3-16/+15
2018-03-30libmemif: zero-copy-slave mode + header spaceJakub Grajciar10-72/+1696
2018-03-28Build libmemif as part of verify jobDamjan Marion4-7/+11
2018-03-28libmemif: add private header size fieldJakub Grajciar4-2/+10
2018-03-26libmemif: version 2Jakub Grajciar16-918/+620
2018-03-13libmemif: ubuntu 18.04 build fixJakub Grajciar4-15/+23
2018-02-07libmemif: cleanup queue info while memif connectingChun Li2-1/+5
2018-01-24docs: Clean up TOCDave Wallace1-2/+8
2017-11-21libmemif: unit test update, continue configure if check module missingJakub Grajciar3-8/+10
2017-11-16libmemif: unmask head/tail pointers fix, additional ring info in memif_queue_...Jakub Grajciar3-75/+109
2017-11-08memif: do not mask head and tail pointersDamjan Marion3-59/+61
2017-11-07libmmeif: Makefile fixJakub Grajciar1-1/+1
2017-11-07libmemif: add dep to MakefileJakub Grajciar1-2/+2
2017-11-05libmemif: example app can generate ICMP, dev perf tests (using icmpr-epoll)Jakub Grajciar6-46/+774
2017-10-30libmemif: perf optimizationJakub Grajciar1-65/+34
2017-10-12libmemif: Add memif_cancel_poll_event() + bug fixing.Milan Lenco3-30/+78
2017-10-04libmemif: memif_rx_burst fixJakub Grajciar1-2/+2
2017-09-28General documentation updatesChris Luke6-31/+41
2017-09-23libmemif: Jumbo frames data/buffer length fixJakub Grajciar2-83/+195
2017-09-15libmemif: Jumbo frames supportJakub Grajciar9-103/+285
2017-09-13Shared memory packet interface (memif) libraryJakub Grajciar28-0/+11034
izes cls.bd_id = 10 cls.remote_hosts_count = 250 # create 3 pg interfaces, 1 BVI interface cls.create_pg_interfaces(range(3)) cls.create_bvi_interfaces(1) cls.interfaces = list(cls.pg_interfaces) cls.interfaces.extend(cls.bvi_interfaces) for i in cls.interfaces: i.admin_up() # Create BD with MAC learning enabled and put interfaces to this BD cls.vapi.sw_interface_set_l2_bridge( rx_sw_if_index=cls.bvi0.sw_if_index, bd_id=cls.bd_id, port_type=L2_PORT_TYPE.BVI) cls.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=cls.pg0.sw_if_index, bd_id=cls.bd_id) cls.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=cls.pg1.sw_if_index, bd_id=cls.bd_id) # Configure IPv4 addresses on BVI interface and routed interface cls.bvi0.config_ip4() cls.pg2.config_ip4() # Configure MAC address binding to IPv4 neighbors on bvi0 cls.bvi0.generate_remote_hosts(cls.remote_hosts_count) cls.bvi0.configure_ipv4_neighbors() # configure MAC address on pg2 cls.pg2.resolve_arp() # BVI interface has remote hosts, one half of hosts are behind # pg0 second behind pg1 half = cls.remote_hosts_count // 2 cls.pg0.remote_hosts = cls.bvi0.remote_hosts[:half] cls.pg1.remote_hosts = cls.bvi0.remote_hosts[half:] @classmethod def tearDownClass(cls): super(TestIpIrb, cls).tearDownClass() def tearDown(self): """Run standard test teardown and log ``show l2patch``, ``show l2fib verbose``,``show bridge-domain <bd_id> detail``, ``show ip neighbors``. """ super(TestIpIrb, self).tearDown() def show_commands_at_teardown(self): self.logger.info(self.vapi.cli("show l2patch")) self.logger.info(self.vapi.cli("show l2fib verbose")) self.logger.info(self.vapi.cli("show bridge-domain %s detail" % self.bd_id)) self.logger.info(self.vapi.cli("show ip neighbors")) def create_stream(self, src_ip_if, dst_ip_if, packet_sizes): pkts = [] for i in range(0, 257): remote_dst_host = choice(dst_ip_if.remote_hosts) info = self.create_packet_info(src_ip_if, dst_ip_if) payload = self.info_to_payload(info) p = (Ether(dst=src_ip_if.local_mac, src=src_ip_if.remote_mac) / IP(src=src_ip_if.remote_ip4, dst=remote_dst_host.ip4) / UDP(sport=1234, dport=1234) / Raw(payload)) info.data = p.copy() size = packet_sizes[(i // 2) % len(packet_sizes)] self.extend_packet(p, size) pkts.append(p) return pkts def create_stream_l2_to_ip(self, src_l2_if, src_ip_if, dst_ip_if, packet_sizes): pkts = [] for i in range(0, 257): info = self.create_packet_info(src_ip_if, dst_ip_if) payload = self.info_to_payload(info) host = choice(src_l2_if.remote_hosts) p = (Ether(src=host.mac, dst=src_ip_if.local_mac) / IP(src=host.ip4, dst=dst_ip_if.remote_ip4) / UDP(sport=1234, dport=1234) / Raw(payload)) info.data = p.copy() size = packet_sizes[(i // 2) % len(packet_sizes)] self.extend_packet(p, size) pkts.append(p) return pkts def verify_capture_l2_to_ip(self, dst_ip_if, src_ip_if, capture): last_info = dict() for i in self.interfaces: last_info[i.sw_if_index] = None dst_ip_sw_if_index = dst_ip_if.sw_if_index for packet in capture: ip = packet[IP] udp = packet[IP][UDP] payload_info = self.payload_to_info(packet[IP][UDP][Raw]) self.assertEqual(payload_info.dst, dst_ip_sw_if_index) next_info = self.get_next_packet_info_for_interface2( payload_info.src, dst_ip_sw_if_index, last_info[payload_info.src]) last_info[payload_info.src] = next_info self.assertTrue(next_info is not None) saved_packet = next_info.data self.assertTrue(next_info is not None) # MAC: src, dst self.assertEqual(packet.src, dst_ip_if.local_mac) self.assertEqual(packet.dst, dst_ip_if.remote_mac) # IP: src, dst host = src_ip_if.host_by_ip4(ip.src) self.assertIsNotNone(host) self.assertEqual(ip.dst, saved_packet[IP].dst) self.assertEqual(ip.dst, dst_ip_if.remote_ip4) # UDP: self.assertEqual(udp.sport, saved_packet[UDP].sport) self.assertEqual(udp.dport, saved_packet[UDP].dport) def verify_capture(self, dst_ip_if, src_ip_if, capture): last_info = dict() for i in self.interfaces: last_info[i.sw_if_index] = None dst_ip_sw_if_index = dst_ip_if.sw_if_index for packet in capture: ip = packet[IP] udp = packet[IP][UDP] payload_info = self.payload_to_info(packet[IP][UDP][Raw]) packet_index = payload_info.index self.assertEqual(payload_info.dst, dst_ip_sw_if_index) next_info = self.get_next_packet_info_for_interface2( payload_info.src, dst_ip_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 self.assertTrue(next_info is not None) # MAC: src, dst self.assertEqual(packet.src, dst_ip_if.local_mac) host = dst_ip_if.host_by_mac(packet.dst) # IP: src, dst self.assertEqual(ip.src, src_ip_if.remote_ip4) self.assertEqual(ip.dst, saved_packet[IP].dst) self.assertEqual(ip.dst, host.ip4) # UDP: self.assertEqual(udp.sport, saved_packet[UDP].sport) self.assertEqual(udp.dport, saved_packet[UDP].dport) def test_ip4_irb_1(self): """ IPv4 IRB test 1 Test scenario: - ip traffic from pg2 interface must ends in both pg0 and pg1 - arp entry present in bvi0 interface for destination IP - no l2 entry configured, pg0 and pg1 are same """ stream = self.create_stream( self.pg2, self.bvi0, self.pg_if_packet_sizes) self.pg2.add_stream(stream) self.pg_enable_capture(self.pg_interfaces) self.pg_start() packet_count = self.get_packet_count_for_if_idx(self.bvi0.sw_if_index) rcvd1 = self.pg0.get_capture(packet_count) rcvd2 = self.pg1.get_capture(packet_count) self.verify_capture(self.bvi0, self.pg2, rcvd1) self.verify_capture(self.bvi0, self.pg2, rcvd2) self.assertListEqual(rcvd1.res, rcvd2.res) def send_and_verify_l2_to_ip(self): stream1 = self.create_stream_l2_to_ip( self.pg0, self.bvi0, self.pg2, self.pg_if_packet_sizes) stream2 = self.create_stream_l2_to_ip( self.pg1, self.bvi0, self.pg2, self.pg_if_packet_sizes) self.vapi.cli("clear trace") self.pg0.add_stream(stream1) self.pg1.add_stream(stream2) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rcvd = self.pg2.get_capture(514) self.verify_capture_l2_to_ip(self.pg2, self.bvi0, rcvd) def test_ip4_irb_2(self): """ IPv4 IRB test 2 Test scenario: - ip traffic from pg0 and pg1 ends on pg2 """ self.send_and_verify_l2_to_ip() # change the BVI's mac and resed traffic self.bvi0.set_mac(MACAddress("00:00:00:11:11:33")) self.send_and_verify_l2_to_ip() # check it wasn't flooded self.pg1.assert_nothing_captured(remark="UU Flood") if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)