aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ip
AgeCommit message (Expand)AuthorFilesLines
2018-05-23VPP-1283: IPv6 PMTU missing MTU value in ICMP6 message.Ole Troan2-18/+30
2018-05-23VPP-1283: IPv4 PMTU missing MTU value in ICMP4 message.Ole Troan2-32/+43
2018-05-23VPPAPIGEN: Add union and enum support and IP4/IP6 address type.Ole Troan1-0/+37
2018-05-20vector functions cleanup and improvementsDamjan Marion1-3/+2
2018-05-18IP unnumbered dumpNeale Ranns2-1/+92
2018-05-18IP address dump - don't send subnets for unnumbered interfacesNeale Ranns1-4/+6
2018-05-17Fixes in IPv6 RD control planeJuraj Sloboda2-30/+59
2018-05-15No overlapping sub-nets on any interface in the same table/VRF (VPP-943)Neale Ranns2-25/+82
2018-05-14Rework CP and DP communication in IPv6 RD (VPP-1256)Juraj Sloboda4-359/+163
2018-05-11Periodic scan and probe of IP neighbors to maintain neighbor poolsJohn Lo6-5/+516
2018-05-10vnet: device flow offload infraDamjan Marion5-0/+94
2018-05-04Harmonize vec/pool_get_aligned object sizes and alignment requestsDave Barach2-0/+8
2018-04-27IPv6 NS/RS; do not vec_validate global structs in the DPNeale Ranns1-12/+16
2018-04-27IPv6 NS: use the mcast rewrite node to fill in the destination MACNeale Ranns2-263/+275
2018-04-27A bit of buffer metadata reshuffling to accommodate flow_idDamjan Marion3-8/+7
2018-04-18Mcast rewrite optimisationsNeale Ranns3-8/+48
2018-04-17IP mcast: allow unicast address as a next-hopNeale Ranns3-1/+25
2018-04-17VPP-1243: fix reassembly CLIKlement Sekera1-5/+6
2018-04-16Implement ip_probe_neighbor APIJohn Lo2-9/+63
2018-04-13Revert "MTU: Setting of MTU on software interface (instead of hardware interf...Damjan Marion5-128/+94
2018-04-13MTU: Setting of MTU on software interface (instead of hardware interface)Ole Troan5-94/+128
2018-04-13GBP V2Neale Ranns2-2/+17
2018-04-12Fixes for 'make UNATTENDED=yes CC=clang CXX=clang verify'Neale Ranns3-13/+13
2018-04-03reassembly: bug fixesKlement Sekera2-15/+16
2018-04-03session: use fib index in ip local testFlorin Coras1-1/+1
2018-03-29Coverity fixes (VPP-1204)Chris Luke3-0/+5
2018-03-29ip6: fix ip6-local urpf checkingFlorin Coras1-4/+7
2018-03-26VCL: add IPv6 to socket_test.sh and make testDave Wallace1-2/+4
2018-03-21reassembly: feature/concurrencyKlement Sekera11-345/+778
2018-03-19IGMP pluginJakub Grajciar1-0/+18
2018-03-18Remove unnumbered configuration on interface deleteNeale Ranns2-2/+4
2018-03-16QoS recording and markingNeale Ranns3-1/+5
2018-03-16IPv6 ND Router discovery control plane (VPP-1095)Juraj Sloboda2-0/+971
2018-03-16IPv6 ND Router discovery data plane (VPP-1095)Juraj Sloboda4-5/+613
2018-03-14IPIP: Add IP{v4,v6} over IP{v4,v6} configured tunnel support.Ole Troan1-0/+1
2018-03-13Common form of fib-path reproting in dumpsNeale Ranns1-101/+8
2018-03-12Remove md5.[ch] from vppinfraDave Barach1-13/+2
2018-03-09MPLS Unifom modeNeale Ranns3-39/+41
2018-03-06API: Add service definitions for events and singleton messages (second attempt)Marek Gradzki1-0/+10
2018-03-05Revert "API: Add service definitions for events and singleton messages."Ole Trøan1-10/+0
2018-03-05IP6 link-local tableNeale Ranns10-146/+717
2018-03-05API: Add service definitions for events and singleton messages.Ole Troan1-0/+10
2018-03-016RD: Rewritten 6RD RFC5969 support.Ole Troan2-2/+4
2018-03-01session: zero out ips in local endpoint lookup only if localFlorin Coras2-0/+14
2018-02-26IPv6 MLD; pointer address used as hash keyNeale Ranns1-3/+3
2018-02-16Allow providers to override glean behaviourNeale Ranns2-42/+9
2018-02-15Revert "Allow interface types to override glean adjacency behaivour"Ole Trøan2-5/+42
2018-02-15Allow interface types to override glean adjacency behaivourNeale Ranns2-42/+5
2018-02-12Improve MTU handlingNeale Ranns1-13/+30
2018-02-09ip4_forward: set pkt error in case potential memory corruptChun Li1-0/+2
None and not self.vpp_dead: if self.af == AF_INET: self.logger.info(self.vapi.ppcli("show inacl type ip4")) self.logger.info(self.vapi.ppcli("show outacl type ip4")) elif self.af == AF_INET6: self.logger.info(self.vapi.ppcli("show inacl type ip6")) self.logger.info(self.vapi.ppcli("show outacl type ip6")) self.logger.info(self.vapi.cli("show classify table verbose")) self.logger.info(self.vapi.cli("show ip fib")) acl_active_table = 'ip_out' if self.af == AF_INET6: acl_active_table = 'ip6_out' if self.acl_active_table == acl_active_table: self.output_acl_set_interface( self.pg0, self.acl_tbl_idx.get(self.acl_active_table), 0) self.acl_active_table = '' elif self.acl_active_table != '': self.input_acl_set_interface( self.pg0, self.acl_tbl_idx.get(self.acl_active_table), 0) self.acl_active_table = '' for intf in self.interfaces: if self.af == AF_INET: intf.unconfig_ip4() elif self.af == AF_INET6: intf.unconfig_ip6() intf.admin_down() super(TestClassifier, self).tearDown() @staticmethod def build_mac_match(dst_mac='', src_mac='', ether_type=''): """Build MAC ACL match data with hexstring format. :param str dst_mac: source MAC address <x:x:x:x:x:x> :param str src_mac: destination MAC address <x:x:x:x:x:x> :param str ether_type: ethernet type <0-ffff> """ if dst_mac: dst_mac = dst_mac.replace(':', '') if src_mac: src_mac = src_mac.replace(':', '') return ('{!s:0>12}{!s:0>12}{!s:0>4}'.format( dst_mac, src_mac, ether_type)).rstrip('0') @staticmethod def build_mac_mask(dst_mac='', src_mac='', ether_type=''): """Build MAC ACL mask data with hexstring format. :param str dst_mac: source MAC address <0-ffffffffffff> :param str src_mac: destination MAC address <0-ffffffffffff> :param str ether_type: ethernet type <0-ffff> """ return ('{!s:0>12}{!s:0>12}{!s:0>4}'.format( dst_mac, src_mac, ether_type)).rstrip('0') @staticmethod def build_ip_mask(proto='', src_ip='', dst_ip='', src_port='', dst_port=''): """Build IP ACL mask data with hexstring format. :param str proto: protocol number <0-ff> :param str src_ip: source ip address <0-ffffffff> :param str dst_ip: destination ip address <0-ffffffff> :param str src_port: source port number <0-ffff> :param str dst_port: destination port number <0-ffff> """ return ('{!s:0>20}{!s:0>12}{!s:0>8}{!s:0>4}{!s:0>4}'.format( proto, src_ip, dst_ip, src_port, dst_port)).rstrip('0') @staticmethod def build_ip6_mask(nh='', src_ip='', dst_ip='', src_port='', dst_port=''): """Build IPv6 ACL mask data with hexstring format. :param str nh: next header number <0-ff> :param str src_ip: source ip address <0-ffffffff> :param str dst_ip: destination ip address <0-ffffffff> :param str src_port: source port number <0-ffff> :param str dst_port: destination port number <0-ffff> """ return ('{!s:0>14}{!s:0>34}{!s:0>32}{!s:0>4}{!s:0>4}'.format( nh, src_ip, dst_ip, src_port, dst_port)).rstrip('0') @staticmethod def build_ip_match(proto=0, src_ip='', dst_ip='', src_port=0, dst_port=0): """Build IP ACL match data with hexstring format. :param int proto: protocol number with valid option "x" :param str src_ip: source ip address with format of "x.x.x.x" :param str dst_ip: destination ip address with format of "x.x.x.x" :param int src_port: source port number "x" :param int dst_port: destination port number "x" """ if src_ip: src_ip = binascii.hexlify(socket.inet_aton(src_ip)).decode('ascii') if dst_ip: dst_ip = binascii.hexlify(socket.inet_aton(dst_ip)).decode('ascii') return ('{!s:0>20}{!s:0>12}{!s:0>8}{!s:0>4}{!s:0>4}'.format( hex(proto)[2:], src_ip, dst_ip, hex(src_port)[2:], hex(dst_port)[2:])).rstrip('0') @staticmethod def build_ip6_match(nh=0, src_ip='', dst_ip='', src_port=0, dst_port=0): """Build IPv6 ACL match data with hexstring format. :param int nh: next header number with valid option "x" :param str src_ip: source ip6 address with format of "xxx:xxxx::xxxx" :param str dst_ip: destination ip6 address with format of "xxx:xxxx::xxxx" :param int src_port: source port number "x" :param int dst_port: destination port number "x" """ if src_ip: if sys.version_info[0] == 2: src_ip = binascii.hexlify(socket.inet_pton( socket.AF_INET6, src_ip)) else: src_ip = socket.inet_pton(socket.AF_INET6, src_ip).hex() if dst_ip: if sys.version_info[0] == 2: dst_ip = binascii.hexlify(socket.inet_pton( socket.AF_INET6, dst_ip)) else: dst_ip = socket.inet_pton(socket.AF_INET6, dst_ip).hex() return ('{!s:0>14}{!s:0>34}{!s:0>32}{!s:0>4}{!s:0>4}'.format( hex(nh)[2:], src_ip, dst_ip, hex(src_port)[2:], hex(dst_port)[2:])).rstrip('0') def create_stream(self, src_if, dst_if, packet_sizes, proto_l=UDP(sport=1234, dport=5678)): """Create input packet stream for defined interfaces. :param VppInterface src_if: Source Interface for packet stream. :param VppInterface dst_if: Destination Interface for packet stream. :param list packet_sizes: packet size to test. :param Scapy proto_l: Required IP protocol. Default protocol is UDP. """ pkts = [] for size in packet_sizes: info = self.create_packet_info(src_if, dst_if) payload = self.info_to_payload(info) if self.af == AF_INET: p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / IP(src=src_if.remote_ip4, dst=dst_if.remote_ip4) / proto_l / Raw(payload)) elif self.af == AF_INET6: p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / IPv6(src=src_if.remote_ip6, dst=dst_if.remote_ip6) / proto_l / Raw(payload)) info.data = p.copy() self.extend_packet(p, size) pkts.append(p) return pkts def verify_capture(self, dst_if, capture, proto_l=UDP): """Verify captured input packet stream for defined interface. :param VppInterface dst_if: Interface to verify captured packet stream. :param list capture: Captured packet stream. :param Scapy proto_l: Required IP protocol. Default protocol is UDP. """ ip_proto = IP if self.af == AF_INET6: ip_proto = IPv6 self.logger.info("Verifying capture on interface %s" % dst_if.name) last_info = dict() for i in self.interfaces: last_info[i.sw_if_index] = None dst_sw_if_index = dst_if.sw_if_index for packet in capture: try: ip_received = packet[ip_proto] proto_received = packet[proto_l] payload_info = self.payload_to_info(packet[Raw]) 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)" % (dst_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 ip_saved = saved_packet[ip_proto] proto_saved = saved_packet[proto_l] # Check standard fields self.assertEqual(ip_received.src, ip_saved.src) self.assertEqual(ip_received.dst, ip_saved.dst) self.assertEqual(proto_received.sport, proto_saved.sport) self.assertEqual(proto_received.dport, proto_saved.dport) except BaseException: self.logger.error(ppp("Unexpected or invalid packet:", packet)) raise for i in self.interfaces: remaining_packet = self.get_next_packet_info_for_interface2( i.sw_if_index, dst_sw_if_index, last_info[i.sw_if_index]) self.assertTrue(remaining_packet is None, "Interface %s: Packet expected from interface %s " "didn't arrive" % (dst_if.name, i.name)) def create_classify_table(self, key, mask, data_offset=0): """Create Classify Table :param str key: key for classify table (ex, ACL name). :param str mask: mask value for interested traffic. :param int data_offset: """ mask_match, mask_match_len = self._resolve_mask_match(mask) r = self.vapi.classify_add_del_table( is_add=1, mask=mask_match, mask_len=mask_match_len, match_n_vectors=(len(mask) - 1) // 32 + 1, miss_next_index=0, current_data_flag=1, current_data_offset=data_offset) self.assertIsNotNone(r, 'No response msg for add_del_table') self.acl_tbl_idx[key] = r.new_table_index def create_classify_session(self, table_index, match, pbr_option=0, vrfid=0, is_add=1): """Create Classify Session :param int table_index: table index to identify classify table. :param str match: matched value for interested traffic. :param int pbr_option: enable/disable PBR feature. :param int vrfid: VRF id. :param int is_add: option to configure classify session. - create(1) or delete(0) """ mask_match, mask_match_len = self._resolve_mask_match(match) r = self.vapi.classify_add_del_session( is_add=is_add, table_index=table_index, match=mask_match, match_len=mask_match_len, opaque_index=0, action=pbr_option, metadata=vrfid) self.assertIsNotNone(r, 'No response msg for add_del_session') def input_acl_set_interface(self, intf, table_index, is_add=1): """Configure Input ACL interface :param VppInterface intf: Interface to apply Input ACL feature. :param int table_index: table index to identify classify table. :param int is_add: option to configure classify session. - enable(1) or disable(0) """ r = None if self.af == AF_INET: r = self.vapi.input_acl_set_interface( is_add, intf.sw_if_index, ip4_table_index=table_index) elif self.af == AF_INET6: r = self.vapi.input_acl_set_interface( is_add, intf.sw_if_index, ip6_table_index=table_index) else: r = self.vapi.input_acl_set_interface( is_add, intf.sw_if_index, l2_table_index=table_index) self.assertIsNotNone(r, 'No response msg for acl_set_interface') def output_acl_set_interface(self, intf, table_index, is_add=1): """Configure Output ACL interface :param VppInterface intf: Interface to apply Output ACL feature. :param int table_index: table index to identify classify table. :param int is_add: option to configure classify session. - enable(1) or disable(0) """ r = None if self.af == AF_INET: r = self.vapi.output_acl_set_interface( is_add, intf.sw_if_index, ip4_table_index=table_index) elif self.af == AF_INET6: r = self.vapi.output_acl_set_interface( is_add, intf.sw_if_index, ip6_table_index=table_index) else: r = self.vapi.output_acl_set_interface( is_add, intf.sw_if_index, l2_table_index=table_index) self.assertIsNotNone(r, 'No response msg for acl_set_interface') def config_pbr_fib_entry(self, intf, is_add=1): """Configure fib entry to route traffic toward PBR VRF table :param VppInterface intf: destination interface to be routed for PBR. """ addr_len = 24 self.vapi.ip_add_del_route(dst_address=intf.local_ip4n, dst_address_length=addr_len, next_hop_address=intf.remote_ip4n, table_id=self.pbr_vrfid, is_add=is_add) def verify_vrf(self, vrf_id): """ Check if the FIB table / VRF ID is configured. :param int vrf_id: The FIB table / VRF ID to be verified. :return: 1 if the FIB table / VRF ID is configured, otherwise return 0. """ ip_fib_dump = self.vapi.ip_route_dump(vrf_id, False) vrf_count = len(ip_fib_dump) if vrf_count == 0: self.logger.info("IPv4 VRF ID %d is not configured" % vrf_id) return 0 else: self.logger.info("IPv4 VRF ID %d is configured" % vrf_id) return 1