X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fethernet%2Fmac_address.h;h=e89fb6516a079602ac98a59170c713eee01794bf;hb=faf22cb303b65e2a6bf8dad959d7f5ee6d031c4f;hp=8e1559b865460a0856d22b900f58a1f9870afc6f;hpb=86327be9751ad54cb24d16c161cacb001dc20772;p=vpp.git diff --git a/src/vnet/ethernet/mac_address.h b/src/vnet/ethernet/mac_address.h index 8e1559b8654..e89fb6516a0 100644 --- a/src/vnet/ethernet/mac_address.h +++ b/src/vnet/ethernet/mac_address.h @@ -20,33 +20,62 @@ typedef struct mac_address_t_ { - u8 bytes[6]; + union + { + u8 bytes[6]; + struct + { + u32 first_4; + u16 last_2; + } __clib_packed u; + }; } mac_address_t; +STATIC_ASSERT ((sizeof (mac_address_t) == 6), + "MAC address must represent the on wire format"); + 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 */ + clib_memcpy (mac->bytes, bytes, 6); +} + +static_always_inline void +mac_address_to_bytes (const mac_address_t * mac, u8 * bytes) +{ + /* zero out the last 2 bytes, then copy over only 6 */ + clib_memcpy (bytes, mac->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->u.first_4 && 0 == mac->u.last_2); } static_always_inline u64 mac_address_as_u64 (const mac_address_t * mac) { - return (ethernet_mac_address_u64 (mac->bytes)); + u64 *as_u64; + + as_u64 = (u64 *) mac->bytes; + + return (*as_u64); } static_always_inline void mac_address_from_u64 (u64 u, mac_address_t * mac) { - ethernet_mac_address_from_u64 (u, mac->bytes); + clib_memcpy (mac->bytes, &u, 6); +} + +static_always_inline void +mac_address_copy (mac_address_t * dst, const mac_address_t * src) +{ + mac_address_from_bytes (dst, src->bytes); } extern uword unformat_mac_address_t (unformat_input_t * input,