def runTest()

in ptf/saihostif.py [0:0]


    def runTest(self):
        print("\niPv4NeighborTrapTest()")
        udts = []
        hostif_table_entries = []
        neighs = []
        nhops = []
        routes = []

        # Setup L3 forwarding to send packet within dest ip prefix
        # 172.16.1.0/24 to self.port10_rif
        neigh1_ip = '10.10.1.2'
        neigh1_mac = '00:00:00:00:01:02'
        route1_prefix = '172.16.1.0/24'
        test1_route = '172.16.1.1'
        nhop1 = sai_thrift_create_next_hop(self.client,
                                           ip=sai_ipaddress(neigh1_ip),
                                           router_interface_id=self.port10_rif,
                                           type=SAI_NEXT_HOP_TYPE_IP)
        nhops.append(nhop1)
        neigh1 = {"rif_id": self.port10_rif,
                  "ip_address": sai_ipaddress(neigh1_ip)}
        neighbor1_entry = sai_thrift_neighbor_entry_t(**neigh1)
        sai_thrift_create_neighbor_entry(self.client,
                                         neighbor1_entry,
                                         dst_mac_address=neigh1_mac)
        neighs.append(neighbor1_entry)
        route1_entry = sai_thrift_route_entry_t(
            vr_id=self.default_vrf, destination=sai_ipprefix(route1_prefix))
        sai_thrift_create_route_entry(self.client, route1_entry,
                                      next_hop_id=nhop1)
        routes.append(route1_entry)

        # Setup L3 forwarding to send packet within dest ip prefix
        # 172.16.1.0/24 to self.port11_rif
        neigh2_ip = '10.10.2.2'
        neigh2_mac = '00:00:00:00:02:02'
        route2_prefix = '172.16.2.0/24'
        test2_route = '172.16.2.1'

        nhop2 = sai_thrift_create_next_hop(self.client,
                                           ip=sai_ipaddress(neigh2_ip),
                                           router_interface_id=self.port11_rif,
                                           type=SAI_NEXT_HOP_TYPE_IP)
        nhops.append(nhop2)
        neigh2 = {"rif_id": self.port11_rif,
                  "ip_address": sai_ipaddress(neigh2_ip)}
        neighbor2_entry = sai_thrift_neighbor_entry_t(**neigh2)
        sai_thrift_create_neighbor_entry(self.client,
                                         neighbor2_entry,
                                         dst_mac_address=neigh2_mac)
        neighs.append(neighbor2_entry)
        route2_entry = sai_thrift_route_entry_t(
            vr_id=self.default_vrf, destination=sai_ipprefix(route2_prefix))
        sai_thrift_create_route_entry(self.client, route2_entry,
                                      next_hop_id=nhop2)
        routes.append(route2_entry)

        # create packet to be trapped by user defined trap 1
        test_pkt1 = simple_ip_packet(eth_dst=ROUTER_MAC,
                                     ip_dst=test1_route,
                                     ip_ttl=64)
        exp_test_pkt1 = simple_ip_packet(eth_src=ROUTER_MAC,
                                         eth_dst=neigh1_mac,
                                         ip_dst=test1_route,
                                         ip_ttl=63)

        # create packet to be trapped by user defined trap 2
        test_pkt2 = simple_ip_packet(eth_dst=ROUTER_MAC,
                                     ip_dst=test2_route,
                                     ip_ttl=64)
        exp_test_pkt2 = simple_ip_packet(eth_src=ROUTER_MAC,
                                         eth_dst=neigh2_mac,
                                         ip_dst=test2_route,
                                         ip_ttl=63)

        try:
            # Verify Regular L3 forwarding
            print("Sending IP packet from port {} to port {}".format(
                self.dev_port12, self.dev_port10))
            send_packet(self, self.dev_port12, test_pkt1)
            verify_packet(self, exp_test_pkt1, self.dev_port10)
            print("Sending IP packet from port {} to port {}".format(
                self.dev_port12, self.dev_port11))
            send_packet(self, self.dev_port12, test_pkt2)
            verify_packet(self, exp_test_pkt2, self.dev_port11)

            # create user defined traps
            udt1 = sai_thrift_create_hostif_user_defined_trap(
                self.client,
                type=SAI_HOSTIF_USER_DEFINED_TRAP_TYPE_NEIGHBOR)
            self.assertTrue(udt1 != 0)
            udts.append(udt1)

            udt2 = sai_thrift_create_hostif_user_defined_trap(
                self.client,
                type=SAI_HOSTIF_USER_DEFINED_TRAP_TYPE_NEIGHBOR)
            self.assertTrue(udt2 != 0)
            udts.append(udt2)

            # associate user defined trap 1 with hostif 1
            channel = SAI_HOSTIF_TABLE_ENTRY_CHANNEL_TYPE_NETDEV_PHYSICAL_PORT
            hostif_table_entry_udt1_hif1 = \
                sai_thrift_create_hostif_table_entry(
                    self.client,
                    channel_type=channel,
                    host_if=self.hostif1,
                    trap_id=udt1,
                    type=SAI_HOSTIF_TABLE_ENTRY_TYPE_TRAP_ID)
            self.assertTrue(hostif_table_entry_udt1_hif1 != 0)
            hostif_table_entries.append(hostif_table_entry_udt1_hif1)

            # associate user defined trap 2 with hostif 2
            channel = SAI_HOSTIF_TABLE_ENTRY_CHANNEL_TYPE_NETDEV_PHYSICAL_PORT
            hostif_table_entry_udt2_hif2 = \
                sai_thrift_create_hostif_table_entry(
                    self.client,
                    channel_type=channel,
                    host_if=self.hostif2,
                    trap_id=udt2,
                    type=SAI_HOSTIF_TABLE_ENTRY_TYPE_TRAP_ID)
            self.assertTrue(hostif_table_entry_udt2_hif2 != 0)
            hostif_table_entries.append(hostif_table_entry_udt2_hif2)

            # Remove Forward Neighbor entries
            while nhops:
                sai_thrift_remove_next_hop(self.client, nhops.pop())
            while neighs:
                sai_thrift_remove_neighbor_entry(self.client, neighs.pop())

            # Create Neighbor Trap Entries
            nhop1 = sai_thrift_create_next_hop(
                self.client,
                ip=sai_ipaddress(neigh1_ip),
                router_interface_id=self.port10_rif,
                type=SAI_NEXT_HOP_TYPE_IP)
            nhops.append(nhop1)
            sai_thrift_create_neighbor_entry(
                self.client,
                neighbor1_entry,
                packet_action=SAI_PACKET_ACTION_TRAP,
                user_trap_id=udt1)
            neighs.append(neighbor1_entry)

            nhop2 = sai_thrift_create_next_hop(
                self.client,
                ip=sai_ipaddress(neigh2_ip),
                router_interface_id=self.port11_rif,
                type=SAI_NEXT_HOP_TYPE_IP)
            nhops.append(nhop2)
            sai_thrift_create_neighbor_entry(
                self.client,
                neighbor2_entry,
                packet_action=SAI_PACKET_ACTION_TRAP,
                user_trap_id=udt2)
            neighs.append(neighbor2_entry)
            sai_thrift_set_route_entry_attribute(self.client, route1_entry,
                                                 next_hop_id=nhop1)
            sai_thrift_set_route_entry_attribute(self.client, route2_entry,
                                                 next_hop_id=nhop2)

            pre_stats = query_counter(
                    self, sai_thrift_get_queue_stats, self.cpu_queue0)
            cpu_queue_pkt_count = 0
            print("Sending IP packet from port {} to {}".format(
                self.dev_port12, self.hostif1_name))
            send_packet(self, self.dev_port12, test_pkt1)
            self.assertTrue(
                socket_verify_packet(
                    test_pkt1,
                    self.hostif1_socket),
                "Expected packet not received on {}" .format(
                    self.hostif1_name))
            cpu_queue_pkt_count += 1

            print("Sending IP packet from port {} to {}".format(
                self.dev_port12, self.hostif2_name))
            send_packet(self, self.dev_port12, test_pkt2)
            self.assertTrue(
                socket_verify_packet(
                    test_pkt2,
                    self.hostif2_socket))
            cpu_queue_pkt_count += 1

            print("Verifying CPU port queue stats")
            time.sleep(4)
            post_stats = query_counter(
                    self, sai_thrift_get_queue_stats, self.cpu_queue0)
            self.assertEqual(
                post_stats["SAI_QUEUE_STAT_PACKETS"],
                pre_stats["SAI_QUEUE_STAT_PACKETS"] + cpu_queue_pkt_count)
            print("\tOK")

            # Update Neighbor Trap entries with Null Object ID
            # SAI spec expects for neighbor packet action trap and trap id=0
            # packets are not trapped to the CPU
            print("Updating Neighbor Entry Trap IDs to Null Object ID")
            sai_thrift_set_neighbor_entry_attribute(self.client,
                                                    neighbor1_entry,
                                                    user_trap_id=0)
            sai_thrift_set_neighbor_entry_attribute(self.client,
                                                    neighbor2_entry,
                                                    user_trap_id=0)
            pre_stats = post_stats
            print("Sending IP packet from port {}.Packet must be dropped"
                  .format(self.dev_port11))
            send_packet(self, self.dev_port12, test_pkt1)
            print("Sending IP packet from port {}.Packet must be dropped"
                  .format(self.dev_port12))
            send_packet(self, self.dev_port12, test_pkt2)
            verify_no_other_packets(self)
            print("Verifying CPU port queue stats")
            time.sleep(4)
            post_stats = query_counter(
                    self, sai_thrift_get_queue_stats, self.cpu_queue0)
            self.assertEqual(
                post_stats["SAI_QUEUE_STAT_PACKETS"],
                pre_stats["SAI_QUEUE_STAT_PACKETS"])

        finally:
            while routes:
                sai_thrift_remove_route_entry(self.client, routes.pop())
            while nhops:
                sai_thrift_remove_next_hop(self.client, nhops.pop())
            while neighs:
                sai_thrift_remove_neighbor_entry(self.client, neighs.pop())
            while hostif_table_entries:
                sai_thrift_remove_hostif_table_entry(
                    self.client, hostif_table_entries.pop())
            while udts:
                sai_thrift_remove_hostif_user_defined_trap(
                    self.client, udts.pop())