summaryrefslogtreecommitdiffstats
path: root/src/vnet/buffer.h
AgeCommit message (Expand)AuthorFilesLines
2019-11-26fib: reduce save_rewrite_length to u8Klement Sekera1-2/+12
2019-10-22ip: reassembly: avoid corruption in vnet bufferKlement Sekera1-17/+18
2019-10-09mpls: support fragmentation of mpls output packetRajesh Goel1-0/+4
2019-09-26ip: add shallow virtual reassembly functionalityKlement Sekera1-7/+32
2019-07-22gso: Fix the l3 packet gso segment sizeMohsin Kazmi1-1/+4
2019-07-05sctp: move to plugins, disabled by defaultFlorin Coras1-14/+0
2019-06-21tcp: add option to pass opaque to next nodeFlorin Coras1-1/+5
2019-06-18ipsec: ipsec-tun protectNeale Ranns1-0/+1
2019-06-18ip: reassembly-separate feature and custom codeKlement Sekera1-2/+2
2019-06-06DVR: Control the reinject as L2 or L3 based on the output interface typeNeale Ranns1-1/+1
2019-06-06reassembly: support more custom options for appsKlement Sekera1-0/+1
2019-03-29IPSEC-GRE: fixes and API update to common types.Neale Ranns1-1/+0
2019-03-06GBP: use sclass in the DP for policyNeale Ranns1-5/+1
2019-03-04Hash and handoff reassembly fragmentsVijayabhaskar Katamreddy1-0/+2
2019-02-19tap gso: experimental supportAndrew Yourtchenko1-9/+26
2019-01-22GBP: Sclass to src-epg conversionsNeale Ranns1-1/+5
2019-01-02Revert "add ipsecmb plugin"Florin Coras1-4/+0
2019-01-02add ipsecmb pluginKlement Sekera1-0/+4
2018-12-04Add VNET_BUFFER_F_AVAIL definitionsDave Barach1-1/+25
2018-11-30Metadata / opaque formatting belongs in vppDave Barach1-22/+22
2018-09-27IPIP and IPv6 fragmentationOle Troan1-1/+0
2018-09-24Trivial: Clean up some typos.Paul Vinciguerra1-4/+4
2018-09-10vxlan-gbp: Add support for vxlan gbpMohsin Kazmi1-1/+3
2018-08-03loop counter to prevent infiinte number of look ups per-packetNeale Ranns1-1/+3
2018-07-19Cleanup of handoff codeDamjan Marion1-15/+0
2018-07-02Fixing ip4-reassembly ip6-reassembly non feature node, next_node_index settingVijayabhaskar Katamreddy1-1/+0
2018-06-25MAP: Move MAP-E/T to a plugin.Ole Troan1-8/+0
2018-06-08Adding pad for reasm vnet_buffer reasm struct sothat adj_index is retainedVijayabhaskar Katamreddy1-0/+1
2018-06-04Remove unused GRE buffer meta-dataNeale Ranns1-6/+0
2018-05-17Packet generator: preserve pcap file timestampsDave Barach1-0/+5
2018-04-27A bit of buffer metadata reshuffling to accommodate flow_idDamjan Marion1-1/+2
2018-04-13GBP V2Neale Ranns1-1/+7
2018-03-21reassembly: feature/concurrencyKlement Sekera1-8/+17
2018-03-16QoS recording and markingNeale Ranns1-5/+21
2018-03-09MPLS Unifom modeNeale Ranns1-0/+2
2018-02-21SCTP: minor refactorMarco Varlese1-1/+1
2018-02-17SCTP: 'multi-home' supportMarco Varlese1-0/+1
2018-02-07Refactor vlib_buffer flagsDamjan Marion1-26/+7
2018-02-01IPv4/6 reassemblyKlement Sekera1-0/+12
2018-01-31Fix VNET_BUFFER_F_SPAN_CLONE flagDamjan Marion1-1/+1
2018-01-29DRAFT ip4/6_frag to support DPO Style based Next NodeVijayabhaskar Katamreddy1-0/+1
2018-01-24SCTP stack (RFC4960)Marco Varlese1-0/+13
2018-01-09DVR: run L3 output featuresNeale Ranns1-0/+24
2017-12-09BIER in non-MPLS netowrksNeale Ranns1-11/+9
2017-11-21dpdk: add l2_hdr_offset and l3_hdr_offset in vlib_buffer_tDamjan Marion1-15/+19
2017-11-09BIERNeale Ranns1-0/+12
2017-10-19VPP-1024: rewrite buffer trajectory tracerDave Barach1-0/+17
2017-10-10session: add support for application namespacingFlorin Coras1-2/+8
2017-10-09NAT: hairpinning rework (VPP-1003)Matus Fabian1-1/+2
2017-10-03Update L2FIB entry timestamp only if BD aging enabled (VPP-1002)John Lo1-0/+1
us 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(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 entries 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 entries 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)