BD ARP entry use common API types
Change-Id: I29f20dbaf2c2d735faff297cee552ed648f6f61b Signed-off-by: Neale Ranns <nranns@cisco.com>
This commit is contained in:
committed by
Damjan Marion
parent
65ed2d0503
commit
4d5b917b1a
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
#include "vom/bridge_domain_arp_entry_cmds.hpp"
|
||||
#include "vom/api_types.hpp"
|
||||
|
||||
namespace VOM {
|
||||
namespace bridge_domain_arp_entry_cmds {
|
||||
@@ -44,8 +45,8 @@ create_cmd::issue(connection& con)
|
||||
auto& payload = req.get_request().get_payload();
|
||||
payload.bd_id = m_bd;
|
||||
payload.is_add = 1;
|
||||
m_mac.to_bytes(payload.mac_address, 6);
|
||||
to_bytes(m_ip_addr, &payload.is_ipv6, payload.ip_address);
|
||||
payload.mac = to_api(m_mac);
|
||||
payload.ip = to_api(m_ip_addr);
|
||||
|
||||
VAPI_CALL(req.execute());
|
||||
|
||||
@@ -89,8 +90,8 @@ delete_cmd::issue(connection& con)
|
||||
auto& payload = req.get_request().get_payload();
|
||||
payload.bd_id = m_bd;
|
||||
payload.is_add = 0;
|
||||
m_mac.to_bytes(payload.mac_address, 6);
|
||||
to_bytes(m_ip_addr, &payload.is_ipv6, payload.ip_address);
|
||||
payload.mac = to_api(m_mac);
|
||||
payload.ip = to_api(m_ip_addr);
|
||||
|
||||
VAPI_CALL(req.execute());
|
||||
|
||||
|
||||
+9
-15
@@ -7826,16 +7826,17 @@ api_bridge_flags (vat_main_t * vam)
|
||||
static int
|
||||
api_bd_ip_mac_add_del (vat_main_t * vam)
|
||||
{
|
||||
vl_api_address_t ip = VL_API_ZERO_ADDRESS;
|
||||
vl_api_mac_address_t mac = VL_API_ZERO_MAC_ADDRESS;
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_bd_ip_mac_add_del_t *mp;
|
||||
ip46_type_t type;
|
||||
u32 bd_id;
|
||||
u8 is_ipv6 = 0;
|
||||
u8 is_add = 1;
|
||||
u8 bd_id_set = 0;
|
||||
u8 ip_set = 0;
|
||||
u8 mac_set = 0;
|
||||
ip4_address_t v4addr;
|
||||
ip6_address_t v6addr;
|
||||
u8 macaddr[6];
|
||||
int ret;
|
||||
|
||||
@@ -7847,16 +7848,11 @@ api_bd_ip_mac_add_del (vat_main_t * vam)
|
||||
{
|
||||
bd_id_set++;
|
||||
}
|
||||
else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
|
||||
else if (unformat (i, "%U", unformat_vl_api_address, &ip))
|
||||
{
|
||||
ip_set++;
|
||||
}
|
||||
else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
|
||||
{
|
||||
ip_set++;
|
||||
is_ipv6++;
|
||||
}
|
||||
else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
|
||||
else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
|
||||
{
|
||||
mac_set++;
|
||||
}
|
||||
@@ -7885,13 +7881,11 @@ api_bd_ip_mac_add_del (vat_main_t * vam)
|
||||
M (BD_IP_MAC_ADD_DEL, mp);
|
||||
|
||||
mp->bd_id = ntohl (bd_id);
|
||||
mp->is_ipv6 = is_ipv6;
|
||||
mp->is_add = is_add;
|
||||
if (is_ipv6)
|
||||
clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
|
||||
else
|
||||
clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
|
||||
clib_memcpy (mp->mac_address, macaddr, 6);
|
||||
|
||||
clib_memcpy (&mp->ip, &ip, sizeof (ip));
|
||||
clib_memcpy (&mp->mac, &mac, sizeof (mac));
|
||||
|
||||
S (mp);
|
||||
W (ret);
|
||||
return ret;
|
||||
|
||||
@@ -20,7 +20,11 @@
|
||||
|
||||
typedef struct mac_address_t_
|
||||
{
|
||||
u8 bytes[6];
|
||||
union
|
||||
{
|
||||
u8 bytes[6];
|
||||
u64 as_u64;
|
||||
};
|
||||
} mac_address_t;
|
||||
|
||||
extern const mac_address_t ZERO_MAC_ADDRESS;
|
||||
@@ -28,25 +32,29 @@ extern const mac_address_t ZERO_MAC_ADDRESS;
|
||||
static_always_inline void
|
||||
mac_address_from_bytes (mac_address_t * mac, const u8 * bytes)
|
||||
{
|
||||
clib_memcpy (mac->bytes, bytes, sizeof (*mac));
|
||||
/* zero out the last 2 bytes, then copy over only 6 */
|
||||
mac->as_u64 = 0;
|
||||
clib_memcpy (mac->bytes, bytes, 6);
|
||||
}
|
||||
|
||||
static_always_inline int
|
||||
mac_address_is_zero (const mac_address_t * mac)
|
||||
{
|
||||
return (ethernet_mac_address_is_zero (mac->bytes));
|
||||
return (0 == mac->as_u64);
|
||||
}
|
||||
|
||||
static_always_inline u64
|
||||
mac_address_as_u64 (const mac_address_t * mac)
|
||||
{
|
||||
return (ethernet_mac_address_u64 (mac->bytes));
|
||||
return (mac->as_u64);
|
||||
}
|
||||
|
||||
static_always_inline void
|
||||
mac_address_from_u64 (u64 u, mac_address_t * mac)
|
||||
{
|
||||
ethernet_mac_address_from_u64 (u, mac->bytes);
|
||||
mac->as_u64 = u;
|
||||
mac->bytes[4] = 0;
|
||||
mac->bytes[5] = 0;
|
||||
}
|
||||
|
||||
extern uword unformat_mac_address_t (unformat_input_t * input,
|
||||
|
||||
+6
-3
@@ -14,7 +14,10 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
option version = "2.0.1";
|
||||
option version = "2.1.1";
|
||||
|
||||
import "vnet/ip/ip_types.api";
|
||||
import "vnet/ethernet/ethernet_types.api";
|
||||
|
||||
/** \brief Reply to l2_xconnect_dump
|
||||
@param context - sender context which was passed in the request
|
||||
@@ -481,8 +484,8 @@ autoreply define bd_ip_mac_add_del
|
||||
u32 bd_id;
|
||||
u8 is_add;
|
||||
u8 is_ipv6;
|
||||
u8 ip_address[16];
|
||||
u8 mac_address[6];
|
||||
vl_api_address_t ip;
|
||||
vl_api_mac_address_t mac;
|
||||
};
|
||||
|
||||
/** \brief bridge domain IP to MAC entry details structure
|
||||
|
||||
+14
-6
@@ -27,6 +27,8 @@
|
||||
#include <vnet/l2/l2_vtr.h>
|
||||
#include <vnet/l2/l2_learn.h>
|
||||
#include <vnet/l2/l2_bd.h>
|
||||
#include <vnet/ip/ip_types_api.h>
|
||||
#include <vnet/ethernet/ethernet_types_api.h>
|
||||
|
||||
#include <vnet/vnet_msg_enum.h>
|
||||
|
||||
@@ -855,13 +857,17 @@ vl_api_bd_ip_mac_dump_t_handler (vl_api_bd_ip_mac_dump_t * mp)
|
||||
static void
|
||||
vl_api_bd_ip_mac_add_del_t_handler (vl_api_bd_ip_mac_add_del_t * mp)
|
||||
{
|
||||
bd_main_t *bdm = &bd_main;
|
||||
ip46_address_t ip_addr = ip46_address_initializer;
|
||||
vl_api_bd_ip_mac_add_del_reply_t *rmp;
|
||||
bd_main_t *bdm = &bd_main;
|
||||
u32 bd_index, bd_id;
|
||||
mac_address_t mac;
|
||||
ip46_type_t type;
|
||||
int rv = 0;
|
||||
u32 bd_id = ntohl (mp->bd_id);
|
||||
u32 bd_index;
|
||||
uword *p;
|
||||
|
||||
bd_id = ntohl (mp->bd_id);
|
||||
|
||||
if (bd_id == 0)
|
||||
{
|
||||
rv = VNET_API_ERROR_BD_NOT_MODIFIABLE;
|
||||
@@ -874,10 +880,12 @@ vl_api_bd_ip_mac_add_del_t_handler (vl_api_bd_ip_mac_add_del_t * mp)
|
||||
rv = VNET_API_ERROR_NO_SUCH_ENTRY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
bd_index = p[0];
|
||||
if (bd_add_del_ip_mac (bd_index, mp->ip_address,
|
||||
mp->mac_address, mp->is_ipv6, mp->is_add))
|
||||
|
||||
type = ip_address_decode (&mp->ip, &ip_addr);
|
||||
mac_address_decode (&mp->mac, &mac);
|
||||
|
||||
if (bd_add_del_ip_mac (bd_index, type, &ip_addr, &mac, mp->is_add))
|
||||
rv = VNET_API_ERROR_UNSPECIFIED;
|
||||
|
||||
out:
|
||||
|
||||
+35
-32
@@ -733,36 +733,40 @@ VLIB_CLI_COMMAND (bd_arp_term_cli, static) = {
|
||||
*/
|
||||
u32
|
||||
bd_add_del_ip_mac (u32 bd_index,
|
||||
u8 * ip_addr, u8 * mac_addr, u8 is_ip6, u8 is_add)
|
||||
ip46_type_t type,
|
||||
const ip46_address_t * ip,
|
||||
const mac_address_t * mac, u8 is_add)
|
||||
{
|
||||
l2_bridge_domain_t *bd_cfg = l2input_bd_config (bd_index);
|
||||
u64 new_mac = *(u64 *) mac_addr;
|
||||
u64 new_mac = mac_address_as_u64 (mac);
|
||||
u64 *old_mac;
|
||||
u16 *mac16 = (u16 *) & new_mac;
|
||||
|
||||
ASSERT (sizeof (uword) == sizeof (u64)); /* make sure uword is 8 bytes */
|
||||
/* make sure uword is 8 bytes */
|
||||
ASSERT (sizeof (uword) == sizeof (u64));
|
||||
ASSERT (bd_is_valid (bd_cfg));
|
||||
|
||||
mac16[3] = 0; /* Clear last 2 unused bytes of the 8-byte MAC address */
|
||||
if (is_ip6)
|
||||
if (IP46_TYPE_IP6 == type)
|
||||
{
|
||||
ip6_address_t *ip6_addr_key;
|
||||
hash_pair_t *hp;
|
||||
old_mac = (u64 *) hash_get_mem (bd_cfg->mac_by_ip6, ip_addr);
|
||||
old_mac = (u64 *) hash_get_mem (bd_cfg->mac_by_ip6, &ip->ip6);
|
||||
if (is_add)
|
||||
{
|
||||
if (old_mac == 0)
|
||||
{ /* new entry - allocate and create ip6 address key */
|
||||
if (old_mac == NULL)
|
||||
{
|
||||
/* new entry - allocate and create ip6 address key */
|
||||
ip6_addr_key = clib_mem_alloc (sizeof (ip6_address_t));
|
||||
clib_memcpy (ip6_addr_key, ip_addr, sizeof (ip6_address_t));
|
||||
clib_memcpy (ip6_addr_key, &ip->ip6, sizeof (ip6_address_t));
|
||||
}
|
||||
else if (*old_mac == new_mac)
|
||||
{ /* same mac entry already exist for ip6 address */
|
||||
{
|
||||
/* same mac entry already exist for ip6 address */
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{ /* update mac for ip6 address */
|
||||
hp = hash_get_pair (bd_cfg->mac_by_ip6, ip_addr);
|
||||
{
|
||||
/* update mac for ip6 address */
|
||||
hp = hash_get_pair (bd_cfg->mac_by_ip6, &ip->ip6);
|
||||
ip6_addr_key = (ip6_address_t *) hp->key;
|
||||
}
|
||||
hash_set_mem (bd_cfg->mac_by_ip6, ip6_addr_key, new_mac);
|
||||
@@ -771,9 +775,9 @@ bd_add_del_ip_mac (u32 bd_index,
|
||||
{
|
||||
if (old_mac && (*old_mac == new_mac))
|
||||
{
|
||||
hp = hash_get_pair (bd_cfg->mac_by_ip6, ip_addr);
|
||||
hp = hash_get_pair (bd_cfg->mac_by_ip6, &ip->ip6);
|
||||
ip6_addr_key = (ip6_address_t *) hp->key;
|
||||
hash_unset_mem (bd_cfg->mac_by_ip6, ip_addr);
|
||||
hash_unset_mem (bd_cfg->mac_by_ip6, &ip->ip6);
|
||||
clib_mem_free (ip6_addr_key);
|
||||
}
|
||||
else
|
||||
@@ -782,18 +786,18 @@ bd_add_del_ip_mac (u32 bd_index,
|
||||
}
|
||||
else
|
||||
{
|
||||
ip4_address_t ip4_addr = *(ip4_address_t *) ip_addr;
|
||||
old_mac = (u64 *) hash_get (bd_cfg->mac_by_ip4, ip4_addr.as_u32);
|
||||
old_mac = (u64 *) hash_get (bd_cfg->mac_by_ip4, ip->ip4.as_u32);
|
||||
if (is_add)
|
||||
{
|
||||
if (old_mac && (*old_mac == new_mac))
|
||||
return 0; /* mac entry already exist */
|
||||
hash_set (bd_cfg->mac_by_ip4, ip4_addr.as_u32, new_mac);
|
||||
/* mac entry already exist */
|
||||
return 0;
|
||||
hash_set (bd_cfg->mac_by_ip4, ip->ip4.as_u32, new_mac);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (old_mac && (*old_mac == new_mac))
|
||||
hash_unset (bd_cfg->mac_by_ip4, ip4_addr.as_u32);
|
||||
hash_unset (bd_cfg->mac_by_ip4, ip->ip4.as_u32);
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
@@ -810,13 +814,13 @@ static clib_error_t *
|
||||
bd_arp_entry (vlib_main_t * vm,
|
||||
unformat_input_t * input, vlib_cli_command_t * cmd)
|
||||
{
|
||||
ip46_address_t ip_addr = ip46_address_initializer;
|
||||
ip46_type_t type = IP46_TYPE_IP4;
|
||||
bd_main_t *bdm = &bd_main;
|
||||
clib_error_t *error = 0;
|
||||
u32 bd_index, bd_id;
|
||||
mac_address_t mac;
|
||||
u8 is_add = 1;
|
||||
u8 is_ip6 = 0;
|
||||
u8 ip_addr[16];
|
||||
u8 mac_addr[6];
|
||||
uword *p;
|
||||
|
||||
if (!unformat (input, "%d", &bd_id))
|
||||
@@ -837,13 +841,13 @@ bd_arp_entry (vlib_main_t * vm,
|
||||
else
|
||||
return clib_error_return (0, "No such bridge domain %d", bd_id);
|
||||
|
||||
if (unformat (input, "%U", unformat_ip4_address, ip_addr))
|
||||
if (unformat (input, "%U", unformat_ip4_address, &ip_addr.ip4))
|
||||
{
|
||||
is_ip6 = 0;
|
||||
type = IP46_TYPE_IP4;
|
||||
}
|
||||
else if (unformat (input, "%U", unformat_ip6_address, ip_addr))
|
||||
else if (unformat (input, "%U", unformat_ip6_address, &ip_addr.ip6))
|
||||
{
|
||||
is_ip6 = 1;
|
||||
type = IP46_TYPE_IP6;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -852,7 +856,7 @@ bd_arp_entry (vlib_main_t * vm,
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!unformat (input, "%U", unformat_ethernet_address, mac_addr))
|
||||
if (!unformat (input, "%U", unformat_mac_address_t, &mac))
|
||||
{
|
||||
error = clib_error_return (0, "expecting MAC address but got `%U'",
|
||||
format_unformat_error, input);
|
||||
@@ -865,13 +869,12 @@ bd_arp_entry (vlib_main_t * vm,
|
||||
}
|
||||
|
||||
/* set the bridge domain flagAdd IP-MAC entry into bridge domain */
|
||||
if (bd_add_del_ip_mac (bd_index, ip_addr, mac_addr, is_ip6, is_add))
|
||||
if (bd_add_del_ip_mac (bd_index, type, &ip_addr, &mac, is_add))
|
||||
{
|
||||
error = clib_error_return (0, "MAC %s for IP %U and MAC %U failed",
|
||||
is_add ? "add" : "del",
|
||||
is_ip6 ?
|
||||
format_ip4_address : format_ip6_address,
|
||||
ip_addr, format_ethernet_address, mac_addr);
|
||||
format_ip46_address, &ip_addr, IP46_TYPE_ANY,
|
||||
format_mac_address_t, &mac);
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
+5
-1
@@ -20,6 +20,8 @@
|
||||
|
||||
#include <vlib/vlib.h>
|
||||
#include <vnet/vnet.h>
|
||||
#include <vnet/ip/ip6_packet.h>
|
||||
#include <vnet/ethernet/mac_address.h>
|
||||
|
||||
typedef enum l2_bd_port_type_t_
|
||||
{
|
||||
@@ -198,7 +200,9 @@ bd_find_or_add_bd_index (bd_main_t * bdm, u32 bd_id)
|
||||
}
|
||||
|
||||
u32 bd_add_del_ip_mac (u32 bd_index,
|
||||
u8 * ip_addr, u8 * mac_addr, u8 is_ip6, u8 is_add);
|
||||
ip46_type_t type,
|
||||
const ip46_address_t * ip_addr,
|
||||
const mac_address_t * mac, u8 is_add);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include <vnet/l2/l2_vtr.h>
|
||||
|
||||
#include <vpp/api/vpe_msg_enum.h>
|
||||
#include <vpp/api/types.h>
|
||||
|
||||
#include <vnet/bonding/node.h>
|
||||
|
||||
@@ -506,14 +507,8 @@ static void *vl_api_bd_ip_mac_add_del_t_print
|
||||
s = format (0, "SCRIPT: bd_ip_mac_add_del ");
|
||||
s = format (s, "bd_id %d ", ntohl (mp->bd_id));
|
||||
|
||||
if (mp->is_ipv6)
|
||||
s = format (s, "%U ", format_ip6_address,
|
||||
(ip6_address_t *) mp->ip_address);
|
||||
else
|
||||
s = format (s, "%U ", format_ip4_address,
|
||||
(ip4_address_t *) mp->ip_address);
|
||||
|
||||
s = format (s, "%U ", format_ethernet_address, mp->mac_address);
|
||||
s = format (s, "%U ", format_vl_api_address, &mp->ip);
|
||||
s = format (s, "%U ", format_vl_api_mac_address, &mp->mac);
|
||||
if (mp->is_add == 0)
|
||||
s = format (s, "del ");
|
||||
|
||||
|
||||
+33
-35
@@ -210,10 +210,8 @@ class VppGbpEndpointGroup(VppObject):
|
||||
self._test = test
|
||||
self.uplink = uplink
|
||||
self.bvi = bvi
|
||||
self.bvi_ip4 = bvi_ip4
|
||||
self.bvi_ip4_n = inet_pton(AF_INET, bvi_ip4)
|
||||
self.bvi_ip6 = bvi_ip6
|
||||
self.bvi_ip6_n = inet_pton(AF_INET6, bvi_ip6)
|
||||
self.bvi_ip4 = VppIpAddress(bvi_ip4)
|
||||
self.bvi_ip6 = VppIpAddress(bvi_ip6)
|
||||
self.epg = epg
|
||||
self.bd = bd
|
||||
self.rd = rd
|
||||
@@ -358,7 +356,7 @@ class TestGBP(VppTestCase):
|
||||
self.create_pg_interfaces(range(9))
|
||||
self.create_loopback_interfaces(9)
|
||||
|
||||
self.router_mac = "00:11:22:33:44:55"
|
||||
self.router_mac = VppMacAddress("00:11:22:33:44:55")
|
||||
|
||||
for i in self.pg_interfaces:
|
||||
i.admin_up()
|
||||
@@ -366,7 +364,7 @@ class TestGBP(VppTestCase):
|
||||
i.admin_up()
|
||||
self.vapi.sw_interface_set_mac_address(
|
||||
i.sw_if_index,
|
||||
mactobinary(self.router_mac))
|
||||
self.router_mac.bytes)
|
||||
|
||||
def tearDown(self):
|
||||
for i in self.pg_interfaces:
|
||||
@@ -448,7 +446,7 @@ class TestGBP(VppTestCase):
|
||||
rx = self.send_and_expect(src, tx, dst)
|
||||
|
||||
for r in rx:
|
||||
self.assertEqual(r[Ether].src, self.router_mac)
|
||||
self.assertEqual(r[Ether].src, self.router_mac.address)
|
||||
self.assertEqual(r[Ether].dst, dst.remote_mac)
|
||||
self.assertEqual(r[IP].dst, dst_ip)
|
||||
self.assertEqual(r[IP].src, src_ip)
|
||||
@@ -458,7 +456,7 @@ class TestGBP(VppTestCase):
|
||||
rx = self.send_and_expect(src, tx, dst)
|
||||
|
||||
for r in rx:
|
||||
self.assertEqual(r[Ether].src, self.router_mac)
|
||||
self.assertEqual(r[Ether].src, self.router_mac.address)
|
||||
self.assertEqual(r[Ether].dst, dst.remote_mac)
|
||||
self.assertEqual(r[IPv6].dst, dst_ip)
|
||||
self.assertEqual(r[IPv6].src, src_ip)
|
||||
@@ -558,10 +556,10 @@ class TestGBP(VppTestCase):
|
||||
is_add=1)
|
||||
|
||||
self.vapi.sw_interface_add_del_address(epg.bvi.sw_if_index,
|
||||
epg.bvi_ip4_n,
|
||||
epg.bvi_ip4.bytes,
|
||||
32)
|
||||
self.vapi.sw_interface_add_del_address(epg.bvi.sw_if_index,
|
||||
epg.bvi_ip6_n,
|
||||
epg.bvi_ip6.bytes,
|
||||
128,
|
||||
is_ipv6=True)
|
||||
|
||||
@@ -573,13 +571,13 @@ class TestGBP(VppTestCase):
|
||||
|
||||
# add the BD ARP termination entry for BVI IP
|
||||
self.vapi.bd_ip_mac_add_del(bd_id=epg.bd,
|
||||
mac=mactobinary(self.router_mac),
|
||||
ip=epg.bvi_ip4_n,
|
||||
mac=self.router_mac.encode(),
|
||||
ip=epg.bvi_ip4.encode(),
|
||||
is_ipv6=0,
|
||||
is_add=1)
|
||||
self.vapi.bd_ip_mac_add_del(bd_id=epg.bd,
|
||||
mac=mactobinary(self.router_mac),
|
||||
ip=epg.bvi_ip6_n,
|
||||
mac=self.router_mac.encode(),
|
||||
ip=epg.bvi_ip6.encode(),
|
||||
is_ipv6=1,
|
||||
is_add=1)
|
||||
|
||||
@@ -592,7 +590,7 @@ class TestGBP(VppTestCase):
|
||||
port_type=L2_PORT_TYPE.BVI)
|
||||
|
||||
# BVI L2 FIB entry
|
||||
self.vapi.l2fib_add_del(self.router_mac,
|
||||
self.vapi.l2fib_add_del(self.router_mac.address,
|
||||
epg.bd,
|
||||
epg.bvi.sw_if_index,
|
||||
is_add=1, bvi_mac=1)
|
||||
@@ -654,8 +652,8 @@ class TestGBP(VppTestCase):
|
||||
|
||||
# add the BD ARP termination entry
|
||||
self.vapi.bd_ip_mac_add_del(bd_id=ep.epg.bd,
|
||||
mac=ep.bin_mac,
|
||||
ip=ip.bytes,
|
||||
mac=ep.vmac.encode(),
|
||||
ip=ip.encode(),
|
||||
is_ipv6=ip.is_ip6,
|
||||
is_add=1)
|
||||
|
||||
@@ -702,8 +700,8 @@ class TestGBP(VppTestCase):
|
||||
# add the BD ARP termination entry for floating IP
|
||||
for fip in ep.fips:
|
||||
self.vapi.bd_ip_mac_add_del(bd_id=epg_nat.bd,
|
||||
mac=ep.bin_mac,
|
||||
ip=fip.bytes,
|
||||
mac=ep.vmac.encode(),
|
||||
ip=fip.encode(),
|
||||
is_ipv6=fip.is_ip6,
|
||||
is_add=1)
|
||||
|
||||
@@ -733,7 +731,7 @@ class TestGBP(VppTestCase):
|
||||
ARP(op="who-has",
|
||||
hwdst="ff:ff:ff:ff:ff:ff",
|
||||
hwsrc=self.pg0.remote_mac,
|
||||
pdst=epgs[0].bvi_ip4,
|
||||
pdst=epgs[0].bvi_ip4.address,
|
||||
psrc="10.0.0.88"))
|
||||
|
||||
self.send_and_expect(self.pg0, [pkt_arp], self.pg0)
|
||||
@@ -746,7 +744,7 @@ class TestGBP(VppTestCase):
|
||||
ARP(op="who-has",
|
||||
hwdst="ff:ff:ff:ff:ff:ff",
|
||||
hwsrc=self.pg0.remote_mac,
|
||||
pdst=epgs[0].bvi_ip4,
|
||||
pdst=epgs[0].bvi_ip4.address,
|
||||
psrc=eps[0].ip4.address))
|
||||
|
||||
self.send_and_expect(self.pg0, [pkt_arp], self.pg0)
|
||||
@@ -755,7 +753,7 @@ class TestGBP(VppTestCase):
|
||||
d = inet_ntop(AF_INET6, nsma)
|
||||
pkt_nd = (Ether(dst=in6_getnsmac(nsma)) /
|
||||
IPv6(dst=d, src=eps[0].ip6.address) /
|
||||
ICMPv6ND_NS(tgt=epgs[0].bvi_ip6) /
|
||||
ICMPv6ND_NS(tgt=epgs[0].bvi_ip6.address) /
|
||||
ICMPv6NDOptSrcLLAddr(lladdr=self.pg0.remote_mac))
|
||||
self.send_and_expect(self.pg0, [pkt_nd], self.pg0)
|
||||
|
||||
@@ -783,13 +781,13 @@ class TestGBP(VppTestCase):
|
||||
# packets to non-local L3 destinations dropped
|
||||
#
|
||||
pkt_intra_epg_220_ip4 = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IP(src=eps[0].ip4.address,
|
||||
dst="10.0.0.99") /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
Raw('\xa5' * 100))
|
||||
pkt_inter_epg_222_ip4 = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IP(src=eps[0].ip4.address,
|
||||
dst="10.0.1.99") /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
@@ -798,7 +796,7 @@ class TestGBP(VppTestCase):
|
||||
self.send_and_assert_no_replies(self.pg0, pkt_intra_epg_220_ip4 * 65)
|
||||
|
||||
pkt_inter_epg_222_ip6 = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IPv6(src=eps[0].ip6.address,
|
||||
dst="2001:10::99") /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
@@ -913,7 +911,7 @@ class TestGBP(VppTestCase):
|
||||
UDP(sport=1234, dport=1234) /
|
||||
Raw('\xa5' * 100))
|
||||
pkt_inter_epg_220_to_222 = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IP(src=eps[0].ip4.address,
|
||||
dst=eps[3].ip4.address) /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
@@ -971,7 +969,7 @@ class TestGBP(VppTestCase):
|
||||
self.send_and_expect_routed(self.pg0,
|
||||
pkt_inter_epg_220_to_222 * 65,
|
||||
self.pg3,
|
||||
self.router_mac)
|
||||
self.router_mac.address)
|
||||
|
||||
#
|
||||
# remove both contracts, traffic stops in both directions
|
||||
@@ -1034,7 +1032,7 @@ class TestGBP(VppTestCase):
|
||||
# From an EP to an outside addess: IN2OUT
|
||||
#
|
||||
pkt_inter_epg_220_to_global = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IP(src=eps[0].ip4.address,
|
||||
dst="1.1.1.1") /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
@@ -1061,7 +1059,7 @@ class TestGBP(VppTestCase):
|
||||
eps[0].fip4.address)
|
||||
|
||||
pkt_inter_epg_220_to_global = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IPv6(src=eps[0].ip6.address,
|
||||
dst="6001::1") /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
@@ -1075,7 +1073,7 @@ class TestGBP(VppTestCase):
|
||||
#
|
||||
# From a global address to an EP: OUT2IN
|
||||
#
|
||||
pkt_inter_epg_220_from_global = (Ether(src=self.router_mac,
|
||||
pkt_inter_epg_220_from_global = (Ether(src=self.router_mac.address,
|
||||
dst=self.pg0.remote_mac) /
|
||||
IP(dst=eps[0].fip4.address,
|
||||
src="1.1.1.1") /
|
||||
@@ -1093,7 +1091,7 @@ class TestGBP(VppTestCase):
|
||||
eps[0].itf,
|
||||
eps[0].ip4.address)
|
||||
|
||||
pkt_inter_epg_220_from_global = (Ether(src=self.router_mac,
|
||||
pkt_inter_epg_220_from_global = (Ether(src=self.router_mac.address,
|
||||
dst=self.pg0.remote_mac) /
|
||||
IPv6(dst=eps[0].fip6.address,
|
||||
src="6001::1") /
|
||||
@@ -1110,7 +1108,7 @@ class TestGBP(VppTestCase):
|
||||
# IN2OUT2IN
|
||||
#
|
||||
pkt_intra_epg_220_global = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IP(src=eps[0].ip4.address,
|
||||
dst=eps[1].fip4.address) /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
@@ -1123,7 +1121,7 @@ class TestGBP(VppTestCase):
|
||||
eps[1].ip4.address)
|
||||
|
||||
pkt_intra_epg_220_global = (Ether(src=self.pg0.remote_mac,
|
||||
dst=self.router_mac) /
|
||||
dst=self.router_mac.address) /
|
||||
IPv6(src=eps[0].ip6.address,
|
||||
dst=eps[1].fip6.address) /
|
||||
UDP(sport=1234, dport=1234) /
|
||||
@@ -1153,11 +1151,11 @@ class TestGBP(VppTestCase):
|
||||
for epg in epgs:
|
||||
# IP config on the BVI interfaces
|
||||
self.vapi.sw_interface_add_del_address(epg.bvi.sw_if_index,
|
||||
epg.bvi_ip4_n,
|
||||
epg.bvi_ip4.bytes,
|
||||
32,
|
||||
is_add=0)
|
||||
self.vapi.sw_interface_add_del_address(epg.bvi.sw_if_index,
|
||||
epg.bvi_ip6_n,
|
||||
epg.bvi_ip6.bytes,
|
||||
128,
|
||||
is_add=0,
|
||||
is_ipv6=True)
|
||||
|
||||
@@ -20,6 +20,8 @@ from scapy.layers.inet6 import IPv6, UDP, ICMPv6ND_NS, ICMPv6ND_RS, \
|
||||
|
||||
from framework import VppTestCase, VppTestRunner
|
||||
from util import Host, ppp, mactobinary
|
||||
from vpp_mac import VppMacAddress
|
||||
from vpp_ip import VppIpAddress
|
||||
|
||||
|
||||
class TestL2bdArpTerm(VppTestCase):
|
||||
@@ -69,10 +71,10 @@ class TestL2bdArpTerm(VppTestCase):
|
||||
|
||||
def add_del_arp_term_hosts(self, entries, bd_id=1, is_add=1, is_ipv6=0):
|
||||
for e in entries:
|
||||
ip = e.ip4n if is_ipv6 == 0 else e.ip6n
|
||||
ip = e.ip4 if is_ipv6 == 0 else e.ip6
|
||||
self.vapi.bd_ip_mac_add_del(bd_id=bd_id,
|
||||
mac=e.bin_mac,
|
||||
ip=ip,
|
||||
mac=VppMacAddress(e.mac).encode(),
|
||||
ip=VppIpAddress(ip).encode(),
|
||||
is_ipv6=is_ipv6,
|
||||
is_add=is_add)
|
||||
|
||||
@@ -271,6 +273,7 @@ class TestL2bdArpTerm(VppTestCase):
|
||||
macs = self.mac_list(range(1, 5))
|
||||
hosts = self.ip4_hosts(4, 1, macs)
|
||||
self.add_del_arp_term_hosts(hosts, is_add=1)
|
||||
|
||||
self.verify_arp(src_host, hosts, hosts)
|
||||
type(self).hosts = hosts
|
||||
|
||||
|
||||
@@ -478,8 +478,8 @@ class VppPapiProvider(object):
|
||||
{'bd_id': bd_id,
|
||||
'is_add': is_add,
|
||||
'is_ipv6': is_ipv6,
|
||||
'ip_address': ip,
|
||||
'mac_address': mac})
|
||||
'ip': ip,
|
||||
'mac': mac})
|
||||
|
||||
def want_ip4_arp_events(self, enable_disable=1, address=0):
|
||||
return self.api(self.papi.want_ip4_arp_events,
|
||||
|
||||
Reference in New Issue
Block a user