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())