X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fethernet%2Fmac_address.h;h=e89fb6516a079602ac98a59170c713eee01794bf;hb=2af0e3a74c40e5df946813324574ccc18feb4761;hp=7b4390dfb48ed453c66c2928d7769494e16711ba;hpb=4d5b917b1a74461abaa30182d4bf5c7761572323;p=vpp.git diff --git a/src/vnet/ethernet/mac_address.h b/src/vnet/ethernet/mac_address.h index 7b4390dfb48..e89fb6516a0 100644 --- a/src/vnet/ethernet/mac_address.h +++ b/src/vnet/ethernet/mac_address.h @@ -23,38 +23,59 @@ typedef struct mac_address_t_ union { u8 bytes[6]; - u64 as_u64; + 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) { /* zero out the last 2 bytes, then copy over only 6 */ - mac->as_u64 = 0; 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 (0 == mac->as_u64); + 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 (mac->as_u64); + 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) { - mac->as_u64 = u; - mac->bytes[4] = 0; - mac->bytes[5] = 0; + 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,