vpp/test/vpp_neighbor.py
Neale Ranns 0b6a857d85 ip: Fragmentation fixes
Type: fix

if the packet is about to be fragmented, then don't call any of the
actions that expect the rewrite to have been written.
1) don't double count packets thru the adjacency (original & fragments)
2) don't double decrement the TTL for fragments
3) return to ip4-midchain post ip-frag if that's where we started.
4) only run midchain/mcast fixups if not fragmenting (if no errors)

Change-Id: Ib2866787a42713ee5871b87b597d8f74b901044b
Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-11-05 15:34:00 +00:00

87 lines
2.4 KiB
Python

"""
Neighbour Entries
object abstractions for ARP and ND
"""
from ipaddress import ip_address
from vpp_object import VppObject
from vpp_papi import mac_pton, VppEnum
try:
text_type = unicode
except NameError:
text_type = str
def find_nbr(test, sw_if_index, nbr_addr, is_static=0, mac=None):
ip_addr = ip_address(text_type(nbr_addr))
e = VppEnum.vl_api_ip_neighbor_flags_t
nbrs = test.vapi.ip_neighbor_dump(sw_if_index,
is_ipv6=(6 == ip_addr.version))
for n in nbrs:
if ip_addr == n.neighbor.ip_address and \
is_static == (n.neighbor.flags & e.IP_API_NEIGHBOR_FLAG_STATIC):
if mac:
if mac == str(n.neighbor.mac_address):
return True
else:
return True
return False
class VppNeighbor(VppObject):
"""
ARP Entry
"""
def __init__(self, test, sw_if_index, mac_addr, nbr_addr,
is_static=False, is_no_fib_entry=False):
self._test = test
self.sw_if_index = sw_if_index
self.mac_addr = mac_addr
self.nbr_addr = nbr_addr
e = VppEnum.vl_api_ip_neighbor_flags_t
self.flags = e.IP_API_NEIGHBOR_FLAG_NONE
if is_static:
self.flags |= e.IP_API_NEIGHBOR_FLAG_STATIC
if is_no_fib_entry:
self.flags |= e.IP_API_NEIGHBOR_FLAG_NO_FIB_ENTRY
def add_vpp_config(self):
r = self._test.vapi.ip_neighbor_add_del(
self.sw_if_index,
self.mac_addr,
self.nbr_addr,
is_add=1,
flags=self.flags)
self.stats_index = r.stats_index
self._test.registry.register(self, self._test.logger)
return self
def remove_vpp_config(self):
self._test.vapi.ip_neighbor_add_del(
self.sw_if_index,
self.mac_addr,
self.nbr_addr,
is_add=0,
flags=self.flags)
def is_static(self):
e = VppEnum.vl_api_ip_neighbor_flags_t
return (self.flags & e.IP_API_NEIGHBOR_FLAG_STATIC)
def query_vpp_config(self):
return find_nbr(self._test,
self.sw_if_index,
self.nbr_addr,
self.is_static())
def object_id(self):
return ("%d:%s" % (self.sw_if_index, self.nbr_addr))
def get_stats(self):
c = self._test.statistics.get_counter("/net/adjacency")
return c[0][self.stats_index]