summaryrefslogtreecommitdiffstats
path: root/src/vnet/tls
AgeCommit message (Expand)AuthorFilesLines
2020-09-24session tcp udp tls quic: improve cli formattingFlorin Coras1-4/+5
2020-09-23tls: fix session format assert crash in connected callbackjiangxiaoming1-9/+8
2020-04-25tls: improve cli state reportingFlorin Coras1-3/+12
2020-04-25session vcl: propagate transport cleanup notificationsFlorin Coras1-1/+6
2020-04-04session tls: support tls deschedulingFlorin Coras2-9/+21
2020-04-04session tls: improve app transports tx schedulingFlorin Coras2-14/+10
2020-04-03session: improve error reportingFlorin Coras2-9/+10
2020-03-25session: api to add new transport typesFlorin Coras1-0/+2
2020-02-26tls session: fix unlistenFlorin Coras1-0/+15
2020-02-19tls: handle disconect and reset in async modeYu Ping1-3/+10
2020-02-14tls: remove session lookup operation in TLSYu Ping1-2/+0
2020-02-03tls: refactor for tls async event handlingYu Ping2-2/+1
2020-01-10docs: Edit FEATURE.yaml files so they can be publishedJohn DeNisco1-5/+5
2020-01-08tls: improve connection formatingFlorin Coras1-13/+43
2020-01-03tls: add features.yamlFlorin Coras1-0/+14
2020-01-02session: fix listener global endpoint lookupFlorin Coras1-1/+1
2019-11-18session: extra checks in session validationSrikanth Akula1-2/+2
2019-10-30tls: fifo size is u32Dave Wallace1-3/+10
2019-10-30tls: fix on tcp connection resetZeyu Zhang1-2/+10
2019-10-12tls: allow disconnects from main threadFlorin Coras1-1/+4
2019-10-09hsa: use crypto_engine_type_t for TLSNathan Skrzypczak2-12/+12
2019-10-09session: Add certificate storeNathan Skrzypczak2-0/+3
2019-08-09tls: mark as no lookup transportFlorin Coras1-0/+2
2019-08-09tls: handle transport resetFlorin Coras1-1/+6
2019-08-08tls: fix close with dataFlorin Coras2-1/+20
2019-07-27session: define connection id lengthFlorin Coras1-4/+5
2019-07-26session tcp: handle rxt and acks as custom eventsFlorin Coras1-1/+1
2019-07-24tls: handle engine listen failureFlorin Coras1-1/+12
2019-07-12tls quic: reduce default segment sizesAloys Augustin1-1/+1
2019-07-12session: add thread index to all formattersAloys Augustin1-0/+2
2019-06-27session: Add transport vft protocol optionsNathan Skrzypczak1-3/+5
2019-06-17session: use listener_handle instead of listener_indexNathan Skrzypczak1-2/+3
2019-05-07add TLS endpoint functionYu Ping1-0/+26
2019-04-18tls: allow engines to customize closeFlorin Coras2-18/+26
2019-04-02session: use app cb function wrappersFlorin Coras1-7/+3
2019-03-25tls: make first segment and fifo size configurableFlorin Coras2-5/+14
2019-03-11tls: fixes and improvementsFlorin Coras1-27/+32
2019-03-07session/tls: remove unused t_app_index fieldFlorin Coras1-2/+0
2019-03-07session: use transport custom tx for app transportsFlorin Coras1-12/+13
2019-03-07session: cleanup instances of deprecated io evtsFlorin Coras1-5/+5
2019-02-20tls: add vcl testFlorin Coras1-0/+5
2019-02-18tls: fix openssl/mbedtls use of app_wrk indexFlorin Coras2-15/+15
2019-02-18session: move fifo allocation logic to app workerFlorin Coras1-31/+16
2019-02-11session: cleanup application interfaceFlorin Coras2-6/+8
2019-02-09tls: move test certificates to separate header fileFlorin Coras2-9/+88
2019-02-09session: refactor listen logicFlorin Coras2-5/+6
2019-02-06transport: cleanupFlorin Coras1-3/+3
2019-02-04session: cleanup part 1Florin Coras2-38/+38
2019-01-17tls: preallocate app sessions on connect/acceptFlorin Coras2-10/+22
2019-01-03Fix an issue in tls.cPing Yu1-1/+3
_commands_at_teardown(self): self.logger.info(self.vapi.ppcli("show l2patch")) @classmethod def create_hosts(cls, count): """ Create required number of host MAC addresses and distribute them among interfaces. Create host IPv4 address for every host MAC address. :param int count: 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) hosts = cls.hosts_by_pg_idx[pg_if.sw_if_index] 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%02u.%u" % (pg_if.sw_if_index, j)) hosts.append(host) def create_xconnects(self, count, start=0): """ Create required number of cross-connects (always two cross-connects per pair of packet-generator interfaces). :param int count: Number of cross-connects to be created. :param int start: Starting index of packet-generator interfaces. \ (Default value = 0) """ for i in range(count): rx_if = self.pg_interfaces[i + start] delta = 1 if i % 2 == 0 else -1 tx_if = self.pg_interfaces[i + start + delta] self.vapi.sw_interface_set_l2_xconnect(rx_if.sw_if_index, tx_if.sw_if_index, 1) self.logger.info("Cross-connect from %s to %s created" % (tx_if.name, rx_if.name)) if self.pg_in_xc.count(rx_if) == 0: self.pg_in_xc.append(rx_if) if self.pg_not_in_xc.count(rx_if) == 1: self.pg_not_in_xc.remove(rx_if) def delete_xconnects(self, count, start=0): """ Delete required number of cross-connects (always two cross-connects per pair of packet-generator interfaces). :param int count: Number of cross-connects to be deleted. :param int start: Starting index of packet-generator interfaces. \ (Default value = 0) """ for i in range(count): rx_if = self.pg_interfaces[i + start] delta = 1 if i % 2 == 0 else -1 tx_if = self.pg_interfaces[i + start + delta] self.vapi.sw_interface_set_l2_xconnect(rx_if.sw_if_index, tx_if.sw_if_index, 0) self.logger.info("Cross-connect from %s to %s deleted" % (tx_if.name, rx_if.name)) if self.pg_not_in_xc.count(rx_if) == 0: self.pg_not_in_xc.append(rx_if) if self.pg_in_xc.count(rx_if) == 1: self.pg_in_xc.remove(rx_if) def create_stream(self, src_if, packet_sizes): """ Create input packet stream for defined interface using hosts list. :param object src_if: Interface to create packet stream for. :param list packet_sizes: List of required packet sizes. :return: Stream of packets. """ pkts = [] src_hosts = self.hosts_by_pg_idx[src_if.sw_if_index] for dst_if in self.flows[src_if]: dst_hosts = self.hosts_by_pg_idx[dst_if.sw_if_index] n_int = len(dst_hosts) for i in range(0, n_int): dst_host = dst_hosts[i] src_host = random.choice(src_hosts) 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() size = random.choice(packet_sizes) self.extend_packet(p, size) pkts.append(p) self.logger.debug("Input stream created for port %s. Length: %u pkt(s)" % (src_if.name, len(pkts))) 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(packet[Raw]) 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_verify_test(self): """ Create packet streams for all configured l2-pg interfaces, send all \ prepared packet streams and verify that: - all packets received correctly on all pg-l2 interfaces assigned to cross-connects - no packet received on all pg-l2 interfaces not assigned to cross-connects :raise RuntimeError: if no packet captured on l2-pg interface assigned to the cross-connect or if any packet is captured on l2-pg interface not assigned to the cross-connect. """ # Test # Create incoming packet streams for packet-generator interfaces for pg_if in self.pg_interfaces: pkts = self.create_stream(pg_if, self.pg_if_packet_sizes) pg_if.add_stream(pkts) # Enable packet capture and start packet sending self.pg_enable_capture(self.pg_interfaces) self.pg_start() # Verify # Verify outgoing packet streams per packet-generator interface for pg_if in self.pg_interfaces: if pg_if in self.pg_in_xc: capture = pg_if.get_capture( remark="interface is a cross-connect sink") self.verify_capture(pg_if, capture) elif pg_if in self.pg_not_in_xc: pg_if.assert_nothing_captured( remark="interface is not a cross-connect sink") else: raise Exception("Unexpected interface: %s" % pg_if.name) def test_l2xc_inst_01(self): """ L2XC Multi-instance test 1 - create 10 cross-connects """ # Config 1 # Create 10 cross-connects self.create_xconnects(10) # Test 1 self.run_verify_test() def test_l2xc_inst_02(self): """ L2XC Multi-instance test 2 - delete 4 cross-connects """ # Config 2 # Delete 4 cross-connects self.delete_xconnects(4) # Test 2 self.run_verify_test() def test_l2xc_inst_03(self): """ L2BD Multi-instance 3 - add new 4 cross-connects """ # Config 3 # Add new 4 cross-connects self.create_xconnects(4, start=10) # Test 3 self.run_verify_test() def test_l2xc_inst_04(self): """ L2XC Multi-instance test 4 - delete 10 cross-connects """ # Config 4 # Delete 10 cross-connects self.delete_xconnects(10, start=4) # Test 4 self.run_verify_test() if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)