zephyr/drivers/ethernet/eth.h
Flavio Ceolin c4f7faea10 random: Include header where it is used
Unit tests were failing to build because random header was included by
kernel_includes.h. The problem is that rand32.h includes a generated
file that is either not generated or not included when building unit
tests. Also, it is better to limit the scope of this file to where it is
used.

Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
2020-07-08 21:05:36 -04:00

52 lines
1.4 KiB
C

/*
* Copyright (c) 2020 Linaro Ltd
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_H_
#define ZEPHYR_DRIVERS_ETHERNET_ETH_H_
#include <zephyr/types.h>
#include <random/rand32.h>
/* helper macro to return mac address octet from local_mac_address prop */
#define NODE_MAC_ADDR_OCTET(node, n) DT_PROP_BY_IDX(node, local_mac_address, n)
/* Determine if a mac address is all 0's */
#define NODE_MAC_ADDR_NULL(node) \
((NODE_MAC_ADDR_OCTET(node, 0) == 0) && \
(NODE_MAC_ADDR_OCTET(node, 1) == 0) && \
(NODE_MAC_ADDR_OCTET(node, 2) == 0) && \
(NODE_MAC_ADDR_OCTET(node, 3) == 0) && \
(NODE_MAC_ADDR_OCTET(node, 4) == 0) && \
(NODE_MAC_ADDR_OCTET(node, 5) == 0))
/* Given a device tree node for an ethernet controller will
* returns false if there is no local-mac-address property or
* the property is all zero's. Otherwise will return True
*/
#define NODE_HAS_VALID_MAC_ADDR(node) \
UTIL_AND(DT_NODE_HAS_PROP(node, local_mac_address),\
(!NODE_MAC_ADDR_NULL(node)))
static inline void gen_random_mac(uint8_t *mac_addr, uint8_t b0, uint8_t b1, uint8_t b2)
{
uint32_t entropy;
entropy = sys_rand32_get();
mac_addr[0] = b0;
mac_addr[1] = b1;
mac_addr[2] = b2;
/* Set MAC address locally administered, unicast (LAA) */
mac_addr[0] |= 0x02;
mac_addr[3] = (entropy >> 16) & 0xff;
mac_addr[4] = (entropy >> 8) & 0xff;
mac_addr[5] = (entropy >> 0) & 0xff;
}
#endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_H_ */