ethdev: random MAC address
authorIntel <intel.com>
Wed, 18 Sep 2013 10:00:00 +0000 (12:00 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 9 Oct 2013 14:16:14 +0000 (16:16 +0200)
Factorize code by moving random_addr() function in only place.
It will be reused for virtio.

Signed-off-by: Intel
lib/librte_ether/rte_ether.h
lib/librte_pmd_e1000/igb_pf.c
lib/librte_pmd_ixgbe/ixgbe_pf.c

index e038592..c6782b8 100644 (file)
@@ -46,6 +46,9 @@ extern "C" {
 
 #include <stdint.h>
 
+#include <rte_memcpy.h>
+#include <rte_random.h>
+
 #define ETHER_ADDR_LEN  6 /**< Length of Ethernet address. */
 #define ETHER_TYPE_LEN  2 /**< Length of Ethernet type field. */
 #define ETHER_CRC_LEN   4 /**< Length of Ethernet CRC. */
@@ -195,6 +198,22 @@ static inline int is_valid_assigned_ether_addr(const struct ether_addr *ea)
        return (is_unicast_ether_addr(ea) && (! is_zero_ether_addr(ea)));
 }
 
+/**
+ * Generate a random Ethernet address that is locally administered
+ * and not multicast.
+ * @param addr
+ *   A pointer to Ethernet address.
+ */
+static inline void eth_random_addr(uint8_t *addr)
+{
+       uint64_t rand = rte_rand();
+       uint8_t *p = (uint8_t*)&rand;
+
+       rte_memcpy(addr, p, ETHER_ADDR_LEN);
+       addr[0] &= ~ETHER_GROUP_ADDR;       /* clear multicast bit */
+       addr[0] |= ETHER_LOCAL_ADMIN_ADDR;  /* set local assignment bit */
+}
+
 /**
  * Fast copy an Ethernet address.
  *
index 68f7c69..9c1c9dc 100644 (file)
 #include "e1000/e1000_hw.h"
 #include "e1000_ethdev.h"
 
-static inline 
-void eth_random_addr(uint8_t *addr)
-{
-       uint64_t rand = rte_rand();
-       uint8_t *p = (uint8_t*)&rand;
-
-       rte_memcpy(addr, p, ETHER_ADDR_LEN);
-       addr[0] &= 0xfe;        /* clear multicast bit */
-       addr[0] |= 0x02;        /* set local assignment bit (IEEE802) */
-}
-
 static inline uint16_t
 dev_num_vf(struct rte_eth_dev *eth_dev)
 {
index c61b714..f1207c0 100644 (file)
 
 #define IXGBE_MAX_VFTA     (128)
 
-static inline 
-void eth_random_addr(uint8_t *addr)
-{
-       uint64_t rand = rte_rand();
-       uint8_t *p = (uint8_t*)&rand;
-
-       rte_memcpy(addr, p, ETHER_ADDR_LEN);
-       addr[0] &= 0xfe;        /* clear multicast bit */
-       addr[0] |= 0x02;        /* set local assignment bit (IEEE802) */
-}
-
 static inline uint16_t
 dev_num_vf(struct rte_eth_dev *eth_dev)
 {