Example #1
0
    def check_ip_mtu(self):
        """Check unicast IP forwarding in DUT works for MAX MTU."""

        ip_src = self.src_host_ip
        ip_dst = self.dst_host_ip
        src_mac = self.dataplane.get_mac(0, self.src_ptf_port_list[0])

        if self.version == 4:
            pkt = simple_ip_packet(pktlen=self.pktlen,
                                   eth_dst=self.router_mac,
                                   eth_src=src_mac,
                                   ip_src=ip_src,
                                   ip_dst=ip_dst,
                                   ip_ttl=64)

            exp_pkt = simple_ip_packet(pktlen=self.pktlen,
                                       eth_src=self.router_mac_dst,
                                       ip_src=ip_src,
                                       ip_dst=ip_dst,
                                       ip_ttl=63)

            masked_exp_pkt = Mask(exp_pkt)
            masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "dst")
            if self.ignore_ttl:
                masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "ttl")
                masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "chksum")

        else:
            pkt = simple_ipv6ip_packet(pktlen=self.pktlen,
                                       eth_dst=self.router_mac,
                                       eth_src=src_mac,
                                       ipv6_src=ip_src,
                                       ipv6_dst=ip_dst,
                                       ipv6_hlim=64)

            exp_pkt = simple_ipv6ip_packet(pktlen=self.pktlen,
                                           eth_src=self.router_mac_dst,
                                           ipv6_src=ip_src,
                                           ipv6_dst=ip_dst,
                                           ipv6_hlim=63)

            masked_exp_pkt = Mask(exp_pkt)
            masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "dst")
            if self.ignore_ttl:
                masked_exp_pkt.set_do_not_care_scapy(scapy.IPv6, "hlim")
                masked_exp_pkt.set_do_not_care_scapy(scapy.IPv6, "chksum")

        src_port = self.src_ptf_port_list[0]
        send_packet(self, src_port, pkt)

        dst_port_list = self.dst_ptf_port_list
        logging.info("Sending packet from port " + str(src_port) + " to " + ip_dst + " expected ports " + str(dst_port_list))
        (matched_index, received) = verify_packet_any_port(self, masked_exp_pkt, dst_port_list)

        assert received

        matched_port = dst_port_list[matched_index]
        logging.info("Received packet at " + str(matched_port))

        return
Example #2
0
    def test_mask__check_masking_conditional_field(self,
                                                   scapy_simple_vxlan_packet):
        simple_vxlan = scapy_simple_vxlan_packet
        simple_vxlan[VXLAN].flags = "G"

        masked_simple_vxlan = Mask(simple_vxlan)
        masked_simple_vxlan.set_do_not_care_packet(VXLAN,
                                                   "gpid")  # gpflags, gpid

        second_masked_packet = Mask(simple_vxlan)
        second_masked_packet.set_do_not_care_packet(VXLAN, "gpflags")

        assert (masked_simple_vxlan.mask !=
                second_masked_packet.mask), "Masks should not be equal"
Example #3
0
def verify_icmp_packets(ptfadapter, vlan_ports_list, vlan_port, vlan_id):
    untagged_pkt = build_icmp_packet(0)
    tagged_pkt = build_icmp_packet(vlan_id)
    untagged_dst_ports = []
    tagged_dst_ports = []
    untagged_dst_pc_ports = []
    tagged_dst_pc_ports = []
    # vlan priority attached to packets is determined by the port, so we ignore it here
    masked_tagged_pkt = Mask(tagged_pkt)
    masked_tagged_pkt.set_do_not_care_scapy(scapy.Dot1Q, "prio")

    logger.info("Verify untagged packets from ports " + str(vlan_port["port_index"][0]))
    for port in vlan_ports_list:
        if vlan_port["port_index"] == port["port_index"]:
            # Skip src port
            continue
        if port["pvid"] == vlan_id:
            if len(port["port_index"]) > 1:
                untagged_dst_pc_ports.append(port["port_index"])
            else:
                untagged_dst_ports += port["port_index"]
        elif vlan_id in map(int, port["permit_vlanid"].keys()):
            if len(port["port_index"]) > 1:
                tagged_dst_pc_ports.append(port["port_index"])
            else:
                tagged_dst_ports += port["port_index"]

    verify_packets_with_portchannel(test=ptfadapter,
                                    pkt=untagged_pkt,
                                    ports=untagged_dst_ports,
                                    portchannel_ports=untagged_dst_pc_ports)
    verify_packets_with_portchannel(test=ptfadapter,
                                    pkt=masked_tagged_pkt,
                                    ports=tagged_dst_ports,
                                    portchannel_ports=tagged_dst_pc_ports)
    def check_ip_dir_bcast(self, dst_bcast_ip, dst_port_list):
        '''
        @summary: Check directed broadcast IP forwarding and receiving on all member ports.
        '''
        ip_src = self.TEST_SRC_IP
        ip_dst = dst_bcast_ip
        src_mac = self.dataplane.get_mac(0, 0)
        bcast_mac = self.BROADCAST_MAC

        pkt = simple_ip_packet(eth_dst=self.router_mac,
                               eth_src=src_mac,
                               ip_src=ip_src,
                               ip_dst=ip_dst)

        exp_pkt = simple_ip_packet(eth_dst=bcast_mac,
                               eth_src=self.router_mac,
                               ip_src=ip_src,
                               ip_dst=ip_dst)

        masked_exp_pkt = Mask(exp_pkt)
        masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "chksum")
        masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "ttl")

        src_port = random.choice([port for port in self.src_ports if port not in dst_port_list])
        send_packet(self, src_port, pkt)
        logging.info("Sending packet from port " + str(src_port) + " to " + ip_dst)

        pkt_count = count_matched_packets_all_ports(self, masked_exp_pkt, dst_port_list)
        '''
        Check if broadcast packet is received on all member ports of vlan
        '''
        logging.info("Received " + str(pkt_count) + " broadcast packets, expecting " + str(len(dst_port_list)))
        assert (pkt_count == len(dst_port_list))

        return
    def generate_expected_packet(self, inner_pkt):
        """
        Generate ip_in_ip packet for verifying.
        """
        inner_pkt = inner_pkt.copy()
        inner_pkt.ttl = inner_pkt.ttl - 1
        pkt = scapy.Ether(dst=self.active_tor_mac, src=self.standby_tor_mac) / \
            scapy.IP(src=self.standby_tor_ip, dst=self.active_tor_ip) / inner_pkt['IP']
        exp_pkt = Mask(pkt)
        exp_pkt.set_do_not_care_scapy(scapy.Ether, 'dst')

        exp_pkt.set_do_not_care_scapy(scapy.IP, "ihl")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "tos")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "len")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "id")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "flags")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "frag")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "ttl")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "proto")
        exp_pkt.set_do_not_care_scapy(scapy.IP, "chksum")

        exp_pkt.set_do_not_care_scapy(scapy.TCP, "sport")
        exp_pkt.set_do_not_care_scapy(scapy.TCP, "seq")
        exp_pkt.set_do_not_care_scapy(scapy.TCP, "ack")
        exp_pkt.set_do_not_care_scapy(scapy.TCP, "reserved")
        exp_pkt.set_do_not_care_scapy(scapy.TCP, "dataofs")
        exp_pkt.set_do_not_care_scapy(scapy.TCP, "window")
        exp_pkt.set_do_not_care_scapy(scapy.TCP, "chksum")
        exp_pkt.set_do_not_care_scapy(scapy.TCP, "urgptr")
        exp_pkt.set_ignore_extra_bytes()

        return exp_pkt
Example #6
0
File: test.py Project: tatry/p4c
 def runTest(self):
     self.table_add(table="MyIC_tbl_fwd", keys=[4], action=1, data=[5])
     pkt = Ether() / self.RandomHeader()
     mask = Mask(pkt)
     mask.set_do_not_care_scapy(self.RandomHeader, "f1")
     mask.set_do_not_care_scapy(self.RandomHeader, "f2")
     mask.set_do_not_care_scapy(self.RandomHeader, "f3")
     sequence = [[], [], []]
     for _ in range(10):
         testutils.send_packet(self, PORT0, pkt)
         (_, recv_pkt) = testutils.verify_packet_any_port(
             self, mask, ALL_PORTS)
         recv_pkt = Ether(recv_pkt)
         self.verify_range(value=recv_pkt[self.RandomHeader].f1,
                           min_value=0x80_00_00_01,
                           max_value=0x80_00_00_05)
         sequence[0].append(recv_pkt[self.RandomHeader].f1)
         self.verify_range(value=recv_pkt[self.RandomHeader].f2,
                           min_value=0,
                           max_value=127)
         sequence[1].append(recv_pkt[self.RandomHeader].f2)
         self.verify_range(value=recv_pkt[self.RandomHeader].f3,
                           min_value=256,
                           max_value=259)
         sequence[2].append(recv_pkt[self.RandomHeader].f3)
     logger.info("f1 sequence: {}".format(sequence[0]))
     logger.info("f2 sequence: {}".format(sequence[1]))
     logger.info("f3 sequence: {}".format(sequence[2]))
Example #7
0
    def pingFromServers(self):
        packet = simple_tcp_packet(
                      eth_dst=self.dut_mac,
                      ip_src=self.from_server_src_addr,
                      ip_dst=self.from_server_dst_addr,
                      tcp_dport=5000
                 )
        exp_packet = simple_tcp_packet(
                      ip_src=self.from_server_src_addr,
                      ip_dst=self.from_server_dst_addr,
                      ip_ttl=63,
                      tcp_dport=5000,
                     )

        exp_packet = Mask(exp_packet)
        exp_packet.set_do_not_care_scapy(scapy.Ether,"src")
        exp_packet.set_do_not_care_scapy(scapy.Ether,"dst")

        raw_packet = str(packet)

        for i in xrange(self.nr_pc_pkts):
            testutils.send_packet(self, self.from_server_src_port, raw_packet)

        total_rcv_pkt_cnt = testutils.count_matched_packets_all_ports(self, exp_packet, self.from_server_dst_ports, timeout=self.TIMEOUT)

        self.log("Send %5d Received %5d servers->t1" % (self.nr_pc_pkts, total_rcv_pkt_cnt), True)

        return total_rcv_pkt_cnt
Example #8
0
def send_recv_ping_packet(ptfadapter, ptf_send_port, ptf_recv_ports, dst_mac,
                          src_ip, dst_ip):
    pkt = testutils.simple_icmp_packet(eth_dst=dst_mac,
                                       ip_src=src_ip,
                                       ip_dst=dst_ip,
                                       icmp_type=8,
                                       icmp_data="")

    ext_pkt = pkt.copy()
    ext_pkt['Ether'].src = dst_mac

    masked_exp_pkt = Mask(ext_pkt)
    masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "dst")
    masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "tos")
    masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "len")
    masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "id")
    masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "flags")
    masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "frag")
    masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "ttl")
    masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "chksum")

    masked_exp_pkt.set_do_not_care_scapy(scapy.ICMP, "code")
    masked_exp_pkt.set_do_not_care_scapy(scapy.ICMP, "chksum")
    masked_exp_pkt.set_do_not_care_scapy(scapy.ICMP, "id")
    masked_exp_pkt.set_do_not_care_scapy(scapy.ICMP, "seq")

    logger.info(
        'send ping request packet send port {}, recv port {}, dmac: {}, dip: {}'
        .format(ptf_send_port, ptf_recv_ports, dst_mac, dst_ip))
    testutils.send(ptfadapter, ptf_send_port, pkt)
    testutils.verify_packet_any_port(ptfadapter,
                                     masked_exp_pkt,
                                     ptf_recv_ports,
                                     timeout=WAIT_EXPECTED_PACKET_TIMEOUT)
Example #9
0
    def ping0(self, eth_dst, ip_src, ip_dst, from_port, to_ports, msg):
        packet = simple_tcp_packet(eth_dst=eth_dst,
                                   ip_src=ip_src,
                                   ip_dst=ip_dst,
                                   tcp_dport=5000)
        exp_packet = simple_tcp_packet(
            ip_src=ip_src,
            ip_dst=ip_dst,
            ip_ttl=63,
            tcp_dport=5000,
        )

        exp_packet = Mask(exp_packet)
        exp_packet.set_do_not_care_scapy(scapy.Ether, "src")
        exp_packet.set_do_not_care_scapy(scapy.Ether, "dst")

        for i in xrange(self.nr_pkts):
            testutils.send_packet(self, from_port, str(packet))

        total_rcv_pkt_cnt = testutils.count_matched_packets_all_ports(
            self, exp_packet, to_ports)

        self.log(
            "Send %5d Received %5d %s" %
            (self.nr_pkts, total_rcv_pkt_cnt, msg), True)

        return total_rcv_pkt_cnt
Example #10
0
    def create_ipv6_packets(self, ip_src, sport, dport, dest_ip_addr,
                            destination_port_list, src_mac):
        '''
        @summary: Check IPv4 route works.
        @param ip_src: source IP to build packet with.
        @sport: source tcp port
        @dport: destination tcp port
        @param dest_ip_addr: destination IP to build packet with.
        @param destination_port_list: list of ports on which to expect packet to come back from the switch        
        @return Boolean
        '''

        pkt = simple_tcpv6_packet(eth_dst=self.router_mac,
                                  eth_src=src_mac,
                                  ipv6_dst=dest_ip_addr,
                                  ipv6_src=ip_src,
                                  tcp_sport=sport,
                                  tcp_dport=dport,
                                  ipv6_hlim=64)
        exp_pkt = simple_tcpv6_packet(eth_dst=self.dataplane.get_mac(0, 0),
                                      eth_src=src_mac,
                                      ipv6_dst=dest_ip_addr,
                                      ipv6_src=ip_src,
                                      tcp_sport=sport,
                                      tcp_dport=dport,
                                      ipv6_hlim=63)
        masked_exp_pkt = Mask(exp_pkt)
        masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "dst")
        masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "src")

        return (pkt, masked_exp_pkt)
Example #11
0
    def runIntTransitTest(self, pkt, tagged1, tagged2,
                          ignore_csum=False, switch_id=1, mpls=False):
        if IP not in pkt:
            self.fail("Packet is not IP")
        if UDP not in pkt and TCP not in pkt:
            self.fail("Packet must be UDP or TCP for INT tests")
        if INT_META_HDR not in pkt:
            self.fail("Packet must have INT_META_HDR")
        if INT_L45_HEAD not in pkt:
            self.fail("Packet must have INT_L45_HEAD")

        proto = UDP if UDP in pkt else TCP

        # will use runIPv4UnicastTest
        dst_mac = HOST2_MAC
        ig_port = self.port1
        eg_port = self.port2

        self.setup_transit(switch_id)

        instructions = self.get_ins_from_mask(pkt[INT_META_HDR].inst_mask)
        ins_cnt = len(instructions)
        assert ins_cnt == pkt[INT_META_HDR].ins_cnt

        # Forge expected packet based on pkt's ins_mask
        new_metadata, masked_ins_cnt = self.get_int_metadata(
            instructions=instructions, switch_id=switch_id,
            ig_port=ig_port, eg_port=eg_port)
        exp_pkt = pkt.copy()
        exp_pkt[INT_L45_HEAD].length += pkt[INT_META_HDR].ins_cnt
        exp_pkt[INT_META_HDR].total_hop_cnt += 1
        exp_pkt[INT_META_HDR].payload = new_metadata + str(exp_pkt[INT_META_HDR].payload)

        exp_pkt[Ether].src = exp_pkt[Ether].dst
        exp_pkt[Ether].dst = dst_mac
        if not mpls:
            exp_pkt[IP].ttl = exp_pkt[IP].ttl - 1
        else:
            exp_pkt = pkt_add_mpls(exp_pkt, MPLS_LABEL_2, DEFAULT_MPLS_TTL)

        if tagged2:
            # VLAN if tagged1 will be added by runIPv4UnicastTest
            exp_pkt = pkt_add_vlan(exp_pkt, VLAN_ID_2)

        if ignore_csum or masked_ins_cnt > 0:
            mask_pkt = Mask(exp_pkt)
            if ignore_csum:
                csum_offset = len(exp_pkt) - len(exp_pkt[IP].payload) \
                              + (6 if proto is UDP else 16)
                mask_pkt.set_do_not_care(csum_offset * 8, 2 * 8)
            if masked_ins_cnt > 0:
                offset_metadata = len(exp_pkt) - len(exp_pkt[proto].payload) \
                                  + len(INT_L45_HEAD()) + len(INT_META_HDR()) \
                                  + (ins_cnt - masked_ins_cnt) * 4
                mask_pkt.set_do_not_care(offset_metadata * 8, masked_ins_cnt * 4 * 8)
            exp_pkt = mask_pkt

        self.runIPv4UnicastTest(pkt=pkt, next_hop_mac=HOST2_MAC,
                                tagged1=tagged1, tagged2=tagged2, mpls=mpls,
                                prefix_len=32, exp_pkt=exp_pkt)