1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2014 Intel Corporation
9 rte_eth_random_addr(uint8_t *addr)
11 uint64_t rand = rte_rand();
12 uint8_t *p = (uint8_t *)&rand;
14 rte_memcpy(addr, p, RTE_ETHER_ADDR_LEN);
15 addr[0] &= (uint8_t)~RTE_ETHER_GROUP_ADDR; /* clear multicast bit */
16 addr[0] |= RTE_ETHER_LOCAL_ADMIN_ADDR; /* set local assignment bit */
20 rte_ether_format_addr(char *buf, uint16_t size,
21 const struct rte_ether_addr *eth_addr)
23 snprintf(buf, size, "%02X:%02X:%02X:%02X:%02X:%02X",
24 eth_addr->addr_bytes[0],
25 eth_addr->addr_bytes[1],
26 eth_addr->addr_bytes[2],
27 eth_addr->addr_bytes[3],
28 eth_addr->addr_bytes[4],
29 eth_addr->addr_bytes[5]);
33 * Like ether_aton_r but can handle either
34 * XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
37 rte_ether_unformat_addr(const char *s, struct rte_ether_addr *ea)
39 unsigned int o0, o1, o2, o3, o4, o5;
42 n = sscanf(s, "%x:%x:%x:%x:%x:%x",
43 &o0, &o1, &o2, &o3, &o4, &o5);
46 /* Standard format XX:XX:XX:XX:XX:XX */
47 if (o0 > UINT8_MAX || o1 > UINT8_MAX || o2 > UINT8_MAX ||
48 o3 > UINT8_MAX || o4 > UINT8_MAX || o5 > UINT8_MAX) {
53 ea->addr_bytes[0] = o0;
54 ea->addr_bytes[1] = o1;
55 ea->addr_bytes[2] = o2;
56 ea->addr_bytes[3] = o3;
57 ea->addr_bytes[4] = o4;
58 ea->addr_bytes[5] = o5;
60 /* Support the format XXXX:XXXX:XXXX */
61 if (o0 > UINT16_MAX || o1 > UINT16_MAX || o2 > UINT16_MAX) {
66 ea->addr_bytes[0] = o0 >> 8;
67 ea->addr_bytes[1] = o0 & 0xff;
68 ea->addr_bytes[2] = o1 >> 8;
69 ea->addr_bytes[3] = o1 & 0xff;
70 ea->addr_bytes[4] = o2 >> 8;
71 ea->addr_bytes[5] = o2 & 0xff;