ethernet: add sanity checks to p2p_ethernet_add/del
[vpp.git] / src / vnet / ethernet / mac_address.h
index 87a66a2..0631ec3 100644 (file)
@@ -70,6 +70,17 @@ ethernet_mac_address_is_zero (const u8 * mac)
   return ((*((u32 *) mac) == 0) && (*((u16 *) (mac + 4)) == 0));
 }
 
+static inline void
+ethernet_mac_address_generate (u8 * mac)
+{
+  u32 rnd = clib_cpu_time_now ();
+  rnd = random_u32 (&rnd);
+
+  memcpy (mac + 2, &rnd, sizeof (rnd));
+  mac[0] = 2;
+  mac[1] = 0xfe;
+}
+
 static inline int
 ethernet_mac_address_equal (const u8 * a, const u8 * b)
 {
@@ -100,11 +111,11 @@ mac_address_is_zero (const mac_address_t * mac)
 static_always_inline u64
 mac_address_as_u64 (const mac_address_t * mac)
 {
-  u64 *as_u64;
+  volatile u64 as_u64 = 0;
 
-  as_u64 = (u64 *) mac->bytes;
+  clib_memcpy ((void *) &as_u64, mac->bytes, 6);
 
-  return (*as_u64);
+  return as_u64;
 }
 
 static_always_inline void
@@ -138,6 +149,13 @@ mac_address_set_zero (mac_address_t * mac)
   mac->u.last_2 = 0;
 }
 
+static_always_inline int
+mac_address_n_bits_set (const mac_address_t * a)
+{
+  return (count_set_bits (mac_address_as_u64 (a)));
+}
+
+extern void mac_address_increment (mac_address_t * mac);
 extern uword unformat_mac_address_t (unformat_input_t * input,
                                     va_list * args);
 extern u8 *format_mac_address_t (u8 * s, va_list * args);