GBP Endpoint Learning

Learning GBP endpoints over vxlan-gbp tunnels

Change-Id: I1db9fda5a16802d9ad8b4efd4e475614f3b21502
Signed-off-by: Neale Ranns <neale.ranns@cisco.com>
This commit is contained in:
Neale Ranns
2018-10-10 07:22:51 -07:00
committed by Damjan Marion
parent c3df1e9a0a
commit 93cc3ee3b3
74 changed files with 9904 additions and 1068 deletions

View File

@ -35,6 +35,13 @@ class MplsLspMode:
UNIFORM = 1
def ip_to_dpo_proto(addr):
if addr.version is 6:
return DpoProto.DPO_PROTO_IP6
else:
return DpoProto.DPO_PROTO_IP4
def find_route(test, ip_addr, len, table_id=0, inet=AF_INET):
if inet == AF_INET:
s = 4
@ -71,6 +78,23 @@ def find_mroute(test, grp_addr, src_addr, grp_addr_len,
return False
def fib_interface_ip_prefix(test, address, length, sw_if_index):
vp = VppIpPrefix(address, length)
addrs = test.vapi.ip_address_dump(sw_if_index, is_ipv6=vp.is_ip6)
if vp.is_ip6:
n = 16
else:
n = 4
for a in addrs:
if a.prefix_length == length and \
a.sw_if_index == sw_if_index and \
a.ip[:n] == vp.bytes:
return True
return False
class VppIpTable(VppObject):
def __init__(self,
@ -95,6 +119,9 @@ class VppIpTable(VppObject):
is_add=0)
def query_vpp_config(self):
if self.table_id == 0:
# the default table always exists
return False
# find the default route
return find_route(self._test,
"::" if self.is_ip6 else "0.0.0.0",
@ -111,6 +138,79 @@ class VppIpTable(VppObject):
self.table_id))
class VppIpInterfaceAddress(VppObject):
def __init__(self, test, intf, addr, len):
self._test = test
self.intf = intf
self.prefix = VppIpPrefix(addr, len)
def add_vpp_config(self):
self._test.vapi.sw_interface_add_del_address(
self.intf.sw_if_index,
self.prefix.bytes,
self.prefix.length,
is_add=1,
is_ipv6=self.prefix.is_ip6)
self._test.registry.register(self, self._test.logger)
def remove_vpp_config(self):
self._test.vapi.sw_interface_add_del_address(
self.intf.sw_if_index,
self.prefix.bytes,
self.prefix.length,
is_add=0,
is_ipv6=self.prefix.is_ip6)
def query_vpp_config(self):
return fib_interface_ip_prefix(self._test,
self.prefix.address,
self.prefix.length,
self.intf.sw_if_index)
def __str__(self):
return self.object_id()
def object_id(self):
return "interface-ip-%s-%s" % (self.intf, self.prefix)
class VppIpInterfaceBind(VppObject):
def __init__(self, test, intf, table):
self._test = test
self.intf = intf
self.table = table
def add_vpp_config(self):
if self.table.is_ip6:
self.intf.set_table_ip6(self.table.table_id)
else:
self.intf.set_table_ip4(self.table.table_id)
self._test.registry.register(self, self._test.logger)
def remove_vpp_config(self):
if 0 == self.table.table_id:
return
if self.table.is_ip6:
self.intf.set_table_ip6(0)
else:
self.intf.set_table_ip4(0)
def query_vpp_config(self):
if 0 == self.table.table_id:
return False
return self._test.vapi.sw_interface_get_table(
self.intf.sw_if_index,
self.table.is_ip6).vrf_id == self.table.table_id
def __str__(self):
return self.object_id()
def object_id(self):
return "interface-bind-%s-%s" % (self.intf, self.table)
class VppMplsLabel(object):
def __init__(self, value, mode=MplsLspMode.PIPE, ttl=64, exp=0):
self.value = value