def test_map_t_packet_too_big_ip6_to_ip4(self): """ MAP-T packet too big IPv6 -> IPv4 """ eth = Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) ip = IPv6(src=self.ipv6_cpe_address, dst=self.ipv6_map_address) icmp = ICMPv6PacketTooBig(mtu=1280) ip_inner = IPv6(src=self.ipv6_map_address, dst=self.ipv6_cpe_address) udp_inner = UDP(sport=self.ipv6_udp_or_tcp_internet_port, dport=self.ipv6_udp_or_tcp_map_port) payload = "H" * 10 tx_pkt = eth / ip / icmp / ip_inner / udp_inner / payload self.pg_send(self.pg1, tx_pkt * 1) rx_pkts = self.pg0.get_capture(1) rx_pkt = rx_pkts[0] self.v4_address_check(rx_pkt) self.assertEqual(rx_pkt[IP].proto, IP(proto="icmp").proto) self.assertEqual(rx_pkt[ICMP].type, ICMP(type="dest-unreach").type) self.assertEqual(rx_pkt[ICMP].code, ICMP(code="fragmentation-needed").code) self.assertEqual(rx_pkt[ICMP].nexthopmtu, tx_pkt[ICMPv6PacketTooBig].mtu - 20) self.assertTrue(rx_pkt.haslayer(IPerror)) self.assertTrue(rx_pkt.haslayer(UDPerror)) self.assertEqual(rx_pkt[IP].src, rx_pkt[IPerror].dst) self.assertEqual(rx_pkt[IP].dst, rx_pkt[IPerror].src) self.assertEqual(rx_pkt[UDPerror].sport, self.ipv4_udp_or_tcp_internet_port) self.assertEqual(rx_pkt[UDPerror].dport, self.ipv4_udp_or_tcp_map_port)
def test_ip6_mtu(self): """ IP6 MTU test """ # # TODO: Link MTU is 216 bytes 'off'. Fix when L3 MTU patches committed # mtu_offset = 216 current_mtu = self.get_mtu(self.pg1.sw_if_index) current_mtu -= mtu_offset p_ether = Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) p_ip6 = IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6) p_payload = UDP(sport=1234, dport=1234) / self.payload( current_mtu - 40 - 8) p6 = p_ether / p_ip6 / p_payload p6_reply = p_ip6 / p_payload p6_reply.hlim -= 1 rx = self.send_and_expect(self.pg0, p6*9, self.pg1) for p in rx: self.validate(p[1], p6_reply) # MTU (only checked on encap) self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, 1280 + mtu_offset) self.assertEqual(1280, self.get_mtu(self.pg1.sw_if_index) - mtu_offset) # Should fail. Too large MTU p_icmp6 = ICMPv6PacketTooBig(mtu=1280, cksum=0x4c7a) icmp6_reply = (IPv6(src=self.pg0.local_ip6, dst=self.pg0.remote_ip6, hlim=254, plen=1240) / p_icmp6 / p_ip6 / p_payload) icmp6_reply[2].hlim -= 1 n = icmp6_reply.__class__(str(icmp6_reply)) s = str(icmp6_reply) icmp6_reply = s[0:1280] rx = self.send_and_expect(self.pg0, p6*9, self.pg0) for p in rx: self.validate_bytes(str(p[1]), icmp6_reply) # Reset MTU self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, current_mtu)
def test_ip6_mtu(self): """ IP6 MTU test """ current_mtu = self.get_mtu(self.pg1.sw_if_index) p_ether = Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) p_ip6 = IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6) p_payload = UDP(sport=1234, dport=1234) / self.payload(current_mtu - 40 - 8) p6 = p_ether / p_ip6 / p_payload p6_reply = p_ip6 / p_payload p6_reply.hlim -= 1 rx = self.send_and_expect(self.pg0, p6 * 9, self.pg1) for p in rx: self.validate(p[1], p6_reply) # MTU (only checked on encap) self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [1280, 0, 0, 0]) self.assertEqual(1280, self.get_mtu(self.pg1.sw_if_index)) # Should fail. Too large MTU p_icmp6 = ICMPv6PacketTooBig(mtu=1280, cksum=0x4c7a) icmp6_reply = (IPv6(src=self.pg0.local_ip6, dst=self.pg0.remote_ip6, hlim=255, plen=1240) / p_icmp6 / p_ip6 / p_payload) icmp6_reply[2].hlim -= 1 n = icmp6_reply.__class__(str(icmp6_reply)) s = str(icmp6_reply) icmp6_reply_str = s[0:1280] rx = self.send_and_expect(self.pg0, p6 * 9, self.pg0) for p in rx: self.validate_bytes(str(p[1]), icmp6_reply_str) # Reset MTU self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [current_mtu, 0, 0, 0])
def send_too_big_multiprocess(addr, data, index, str_f, mtu=1280): """Send too big packet ICMPv6 packet. Arguments: addr {str} -- target address data {str} -- payload index {int} -- number of current handling IP prefix str_f {list(str)} -- a list of strings that store the log Keyword Arguments: mtu {int} -- mtu value in the packet too big ICMPv6 Packet (default: {1280}) """ str_f.append('==> Sending TBT to IP #%d, MTU = %d' % (index, mtu)) src = IPv6(dst=addr).src base = IPv6(src=addr, dst=src, plen=len(data) + 8) too_big_extension = ICMPv6PacketTooBig(mtu=mtu) / \ (base / ICMPv6EchoRequest(data=data[:mtu - 96], seq=0)) base = IPv6(dst=addr) too_big_packet = base / too_big_extension send(too_big_packet, verbose=False)