summaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp/tcp.h
AgeCommit message (Expand)AuthorFilesLines
2020-07-23tcp: track pending timersFlorin Coras1-1/+0
2020-05-24tcp: track buffer alloc failuresFlorin Coras1-0/+1
2020-04-04session tls: support tls deschedulingFlorin Coras1-1/+1
2020-04-02tcp: explicit use of timer wheel in timer apisFlorin Coras1-112/+2
2020-04-02tcp: move features to separate filesFlorin Coras1-939/+24
2020-03-30tcp: reuse session infra for syns and resetsFlorin Coras1-5/+8
2020-03-23tcp: add lost and in flight to byte trackerFlorin Coras1-1/+7
2020-03-19tcp: move accept init to separate reusable functionFlorin Coras1-0/+8
2020-03-19tcp: force deschedule if no send space availableFlorin Coras1-2/+7
2020-03-19session tcp udp: consolidate transport snd apisFlorin Coras1-0/+2
2020-02-25tcp: handle cleanups without timersFlorin Coras1-2/+12
2020-02-24tcp: dynamic max timers per loopFlorin Coras1-0/+3
2020-02-18tcp: pace timer handlingFlorin Coras1-8/+11
2020-02-14tcp: reset fin-wait-2 timeout connectionsFlorin Coras1-0/+1
2020-02-14tcp: minimal set of worker statsFlorin Coras1-0/+27
2020-02-12tcp: move connections to wrk ctxFlorin Coras1-22/+26
2020-02-12tcp: postpone rst handlingFlorin Coras1-6/+10
2020-02-10tcp: add option to avoid endpoint cleanupFlorin Coras1-0/+1
2020-01-28session tcp: fix packet tracingFlorin Coras1-0/+1
2019-12-27tcp: Enable TCP timewait port useYu Ping1-1/+4
2019-11-25tcp: invalidate expired timer handles before dispatchingFlorin Coras1-1/+1
2019-11-21tcp: add no csum offload config optionFlorin Coras1-0/+3
2019-11-20session tcp: support pacer idle timeoutsFlorin Coras1-1/+0
2019-11-11tcp: improve lost rxt heuristicFlorin Coras1-2/+8
2019-11-07tcp: fix retransmit with no sacksFlorin Coras1-1/+2
2019-11-06tcp: IPv6 flow label supportTarun Gupta1-0/+1
2019-10-31tcp: track lost rxt segments in byte trackerFlorin Coras1-0/+1
2019-10-23tcp: improve rate samples for retansmitted segmentsFlorin Coras1-2/+3
2019-10-17session tcp: infra for transports to send buffersFlorin Coras1-4/+0
2019-10-17tcp: avoid sending acks when data availableFlorin Coras1-0/+1
2019-10-11tcp: refactor flags into cfg and conn flagsFlorin Coras1-7/+33
2019-10-10tcp: improve pacing after idle send periodsFlorin Coras1-0/+1
2019-10-10tcp: retry lost retransmitsFlorin Coras1-4/+5
2019-10-10tcp: custom checksum calculations for Ipv4/Ipv6Srikanth A1-0/+3
2019-09-25tcp: use sacks for timer based recoveryFlorin Coras1-27/+25
2019-09-18tcp: compute snd time for rate sampleFlorin Coras1-2/+2
2019-09-11tcp: handle sack renegingFlorin Coras1-1/+1
2019-09-10tcp: enable gso in tcp hoststackSimon Zhang1-0/+2
2019-09-03tcp: send rwnd update only if wnd is large enoughFlorin Coras1-0/+4
2019-08-30tcp: improve mss computationFlorin Coras1-1/+0
2019-08-21tcp: add option for always on event loggingFlorin Coras1-1/+1
2019-08-19tcp: set cc_algo on connection allocFlorin Coras1-0/+2
2019-08-19tcp: allow cc algos to set pacing rateFlorin Coras1-0/+13
2019-08-14tcp: extend protocol configurationFlorin Coras1-55/+82
2019-08-08tcp: cleanup timersFlorin Coras1-4/+1
2019-08-08tcp: fix zero rwnd sent checkFlorin Coras1-1/+1
2019-08-02tcp: add more connection statsFlorin Coras1-3/+31
2019-07-26tcp: count resets sentFlorin Coras1-0/+3
2019-07-26session tcp: handle rxt and acks as custom eventsFlorin Coras1-19/+5
2019-07-10tcp: improve rate estimateFlorin Coras1-4/+10
an>False) dst6.add_vpp_config() cls.vapi.lb_conf(ip4_src_address="39.40.41.42", ip6_src_address="2004::1") except Exception: super(TestLB, cls).tearDownClass() raise @classmethod def tearDownClass(cls): super(TestLB, cls).tearDownClass() def tearDown(self): super(TestLB, self).tearDown() def show_commands_at_teardown(self): self.logger.info(self.vapi.cli("show lb vip verbose")) def getIPv4Flow(self, id): return (IP(dst="90.0.%u.%u" % (id / 255, id % 255), src="40.0.%u.%u" % (id / 255, id % 255)) / UDP(sport=10000 + id, dport=20000)) def getIPv6Flow(self, id): return (IPv6(dst="2001::%u" % (id), src="fd00:f00d:ffff::%u" % (id)) / UDP(sport=10000 + id, dport=20000)) def generatePackets(self, src_if, isv4): self.reset_packet_infos() pkts = [] for pktid in self.packets: info = self.create_packet_info(src_if, self.pg1) payload = self.info_to_payload(info) ip = self.getIPv4Flow(pktid) if isv4 else self.getIPv6Flow(pktid) packet = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / ip / Raw(payload)) self.extend_packet(packet, 128) info.data = packet.copy() pkts.append(packet) return pkts def checkInner(self, gre, isv4): IPver = IP if isv4 else IPv6 self.assertEqual(gre.proto, 0x0800 if isv4 else 0x86DD) self.assertEqual(gre.flags, 0) self.assertEqual(gre.version, 0) inner = IPver(scapy.compat.raw(gre.payload)) payload_info = self.payload_to_info(inner[Raw]) self.info = self.packet_infos[payload_info.index] self.assertEqual(payload_info.src, self.pg0.sw_if_index) self.assertEqual(scapy.compat.raw(inner), scapy.compat.raw(self.info.data[IPver])) def checkCapture(self, encap, isv4): self.pg0.assert_nothing_captured() out = self.pg1.get_capture(len(self.packets)) load = [0] * len(self.ass) self.info = None for p in out: try: asid = 0 gre = None if (encap == 'gre4'): ip = p[IP] asid = int(ip.dst.split(".")[3]) self.assertEqual(ip.version, 4) self.assertEqual(ip.flags, 0) self.assertEqual(ip.src, "39.40.41.42") self.assertEqual(ip.dst, "10.0.0.%u" % asid) self.assertEqual(ip.proto, 47) self.assertEqual(len(ip.options), 0) gre = p[GRE] self.checkInner(gre, isv4) elif (encap == 'gre6'): ip = p[IPv6] asid = ip.dst.split(":") asid = asid[len(asid) - 1] asid = 0 if asid == "" else int(asid) self.assertEqual(ip.version, 6) self.assertEqual(ip.tc, 0) self.assertEqual(ip.fl, 0) self.assertEqual(ip.src, "2004::1") self.assertEqual( socket.inet_pton(socket.AF_INET6, ip.dst), socket.inet_pton(socket.AF_INET6, "2002::%u" % asid) ) self.assertEqual(ip.nh, 47) # self.assertEqual(len(ip.options), 0) gre = GRE(scapy.compat.raw(p[IPv6].payload)) self.checkInner(gre, isv4) elif (encap == 'l3dsr'): ip = p[IP] asid = int(ip.dst.split(".")[3]) self.assertEqual(ip.version, 4) self.assertEqual(ip.flags, 0) self.assertEqual(ip.dst, "10.0.0.%u" % asid) self.assertEqual(ip.tos, 0x1c) self.assertEqual(len(ip.options), 0) self.assert_ip_checksum_valid(p) if ip.proto == IP_PROTOS.tcp: self.assert_tcp_checksum_valid(p) elif ip.proto == IP_PROTOS.udp: self.assert_udp_checksum_valid(p) elif (encap == 'nat4'): ip = p[IP] asid = int(ip.dst.split(".")[3]) self.assertEqual(ip.version, 4) self.assertEqual(ip.flags, 0) self.assertEqual(ip.dst, "10.0.0.%u" % asid) self.assertEqual(ip.proto, 17) self.assertEqual(len(ip.options), 0) udp = p[UDP] self.assertEqual(udp.dport, 3307) elif (encap == 'nat6'): ip = p[IPv6] asid = ip.dst.split(":") asid = asid[len(asid) - 1] asid = 0 if asid == "" else int(asid) self.assertEqual(ip.version, 6) self.assertEqual(ip.tc, 0) self.assertEqual(ip.fl, 0) self.assertEqual( socket.inet_pton(socket.AF_INET6, ip.dst), socket.inet_pton(socket.AF_INET6, "2002::%u" % asid) ) self.assertEqual(ip.nh, 17) self.assertGreaterEqual(ip.hlim, 63) udp = UDP(scapy.compat.raw(p[IPv6].payload)) self.assertEqual(udp.dport, 3307) load[asid] += 1 except: self.logger.error(ppp("Unexpected or invalid packet:", p)) raise # This is just to roughly check that the balancing algorithm # is not completely biased. for asid in self.ass: if load[asid] < int(len(self.packets) / (len(self.ass) * 2)): self.logger.error( "ASS is not balanced: load[%d] = %d" % (asid, load[asid])) raise Exception("Load Balancer algorithm is biased") def test_lb_ip4_gre4(self): """ Load Balancer IP4 GRE4 on vip case """ try: self.vapi.cli( "lb vip 90.0.0.0/8 encap gre4") for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 10.0.0.%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=True)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre4', isv4=True) finally: for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 10.0.0.%u del" % (asid)) self.vapi.cli( "lb vip 90.0.0.0/8 encap gre4 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip6_gre4(self): """ Load Balancer IP6 GRE4 on vip case """ try: self.vapi.cli( "lb vip 2001::/16 encap gre4") for asid in self.ass: self.vapi.cli( "lb as 2001::/16 10.0.0.%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=False)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre4', isv4=False) finally: for asid in self.ass: self.vapi.cli( "lb as 2001::/16 10.0.0.%u del" % (asid)) self.vapi.cli( "lb vip 2001::/16 encap gre4 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip4_gre6(self): """ Load Balancer IP4 GRE6 on vip case """ try: self.vapi.cli( "lb vip 90.0.0.0/8 encap gre6") for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 2002::%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=True)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre6', isv4=True) finally: for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 2002::%u del" % (asid)) self.vapi.cli( "lb vip 90.0.0.0/8 encap gre6 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip6_gre6(self): """ Load Balancer IP6 GRE6 on vip case """ try: self.vapi.cli( "lb vip 2001::/16 encap gre6") for asid in self.ass: self.vapi.cli( "lb as 2001::/16 2002::%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=False)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre6', isv4=False) finally: for asid in self.ass: self.vapi.cli( "lb as 2001::/16 2002::%u del" % (asid)) self.vapi.cli( "lb vip 2001::/16 encap gre6 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip4_gre4_port(self): """ Load Balancer IP4 GRE4 on per-port-vip case """ try: self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap gre4") for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 10.0.0.%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=True)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre4', isv4=True) finally: for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 10.0.0.%u del" % (asid)) self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap gre4 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip6_gre4_port(self): """ Load Balancer IP6 GRE4 on per-port-vip case """ try: self.vapi.cli( "lb vip 2001::/16 protocol udp port 20000 encap gre4") for asid in self.ass: self.vapi.cli( "lb as 2001::/16 protocol udp port 20000 10.0.0.%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=False)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre4', isv4=False) finally: for asid in self.ass: self.vapi.cli( "lb as 2001::/16 protocol udp port 20000 10.0.0.%u del" % (asid)) self.vapi.cli( "lb vip 2001::/16 protocol udp port 20000 encap gre4 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip4_gre6_port(self): """ Load Balancer IP4 GRE6 on per-port-vip case """ try: self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap gre6") for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 2002::%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=True)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre6', isv4=True) finally: for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 2002::%u del" % (asid)) self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap gre6 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip6_gre6_port(self): """ Load Balancer IP6 GRE6 on per-port-vip case """ try: self.vapi.cli( "lb vip 2001::/16 protocol udp port 20000 encap gre6") for asid in self.ass: self.vapi.cli( "lb as 2001::/16 protocol udp port 20000 2002::%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=False)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='gre6', isv4=False) finally: for asid in self.ass: self.vapi.cli( "lb as 2001::/16 protocol udp port 20000 2002::%u del" % (asid)) self.vapi.cli( "lb vip 2001::/16 protocol udp port 20000 encap gre6 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip4_l3dsr(self): """ Load Balancer IP4 L3DSR on vip case """ try: self.vapi.cli( "lb vip 90.0.0.0/8 encap l3dsr dscp 7") for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 10.0.0.%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=True)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='l3dsr', isv4=True) finally: for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 10.0.0.%u del" % (asid)) self.vapi.cli( "lb vip 90.0.0.0/8 encap l3dsr" " dscp 7 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip4_l3dsr_port(self): """ Load Balancer IP4 L3DSR on per-port-vip case """ try: self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap l3dsr dscp 7") for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 10.0.0.%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=True)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='l3dsr', isv4=True) finally: for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 10.0.0.%u del" % (asid)) self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap l3dsr" " dscp 7 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip4_nat4_port(self): """ Load Balancer IP4 NAT4 on per-port-vip case """ try: self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap nat4" " type clusterip target_port 3307") for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 10.0.0.%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=True)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='nat4', isv4=True) finally: for asid in self.ass: self.vapi.cli( "lb as 90.0.0.0/8 protocol udp port 20000 10.0.0.%u del" % (asid)) self.vapi.cli( "lb vip 90.0.0.0/8 protocol udp port 20000 encap nat4" " type clusterip target_port 3307 del") self.vapi.cli("test lb flowtable flush") def test_lb_ip6_nat6_port(self): """ Load Balancer IP6 NAT6 on per-port-vip case """ try: self.vapi.cli( "lb vip 2001::/16 protocol udp port 20000 encap nat6" " type clusterip target_port 3307") for asid in self.ass: self.vapi.cli( "lb as 2001::/16 protocol udp port 20000 2002::%u" % (asid)) self.pg0.add_stream(self.generatePackets(self.pg0, isv4=False)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() self.checkCapture(encap='nat6', isv4=False) finally: for asid in self.ass: self.vapi.cli( "lb as 2001::/16 protocol udp port 20000 2002::%u del" % (asid)) self.vapi.cli( "lb vip 2001::/16 protocol udp port 20000 encap nat6" " type clusterip target_port 3307 del") self.vapi.cli("test lb flowtable flush")