| /* |
| * 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_ */ |