summaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-10-24 02:57:49 -0700
committerDamjan Marion <dmarion@me.com>2018-11-06 21:23:18 +0000
commit4d5b917b1a74461abaa30182d4bf5c7761572323 (patch)
treea92e08d4de07934dcb49c63661e0ddd74ad0c5a6 /src/vnet
parent65ed2d0503bc8d9a6a66ca1ece87e3e876ff95cc (diff)
BD ARP entry use common API types
Change-Id: I29f20dbaf2c2d735faff297cee552ed648f6f61b Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet')
-rw-r--r--src/vnet/ethernet/mac_address.h18
-rw-r--r--src/vnet/l2/l2.api9
-rw-r--r--src/vnet/l2/l2_api.c20
-rw-r--r--src/vnet/l2/l2_bd.c67
-rw-r--r--src/vnet/l2/l2_bd.h6
5 files changed, 73 insertions, 47 deletions
diff --git a/src/vnet/ethernet/mac_address.h b/src/vnet/ethernet/mac_address.h
index 8e1559b8654..7b4390dfb48 100644
--- a/src/vnet/ethernet/mac_address.h
+++ b/src/vnet/ethernet/mac_address.h
@@ -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,
diff --git a/src/vnet/l2/l2.api b/src/vnet/l2/l2.api
index 7a1fb49341b..8b65bc36afc 100644
--- a/src/vnet/l2/l2.api
+++ b/src/vnet/l2/l2.api
@@ -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
diff --git a/src/vnet/l2/l2_api.c b/src/vnet/l2/l2_api.c
index 377880c3e64..2fa238eadb3 100644
--- a/src/vnet/l2/l2_api.c
+++ b/src/vnet/l2/l2_api.c
@@ -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:
diff --git a/src/vnet/l2/l2_bd.c b/src/vnet/l2/l2_bd.c
index 59149093b21..943385ccb7c 100644
--- a/src/vnet/l2/l2_bd.c
+++ b/src/vnet/l2/l2_bd.c
@@ -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:
diff --git a/src/vnet/l2/l2_bd.h b/src/vnet/l2/l2_bd.h
index 226e30ecfd4..987569aad9e 100644
--- a/src/vnet/l2/l2_bd.h
+++ b/src/vnet/l2/l2_bd.h
@@ -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