net/virtio: fix incorrect cast of void *
[dpdk.git] / librte_net / rte_ether.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4
5 #include <rte_ether.h>
6 #include <rte_errno.h>
7
8 void
9 rte_eth_random_addr(uint8_t *addr)
10 {
11         uint64_t rand = rte_rand();
12         uint8_t *p = (uint8_t *)&rand;
13
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 */
17 }
18
19 void
20 rte_ether_format_addr(char *buf, uint16_t size,
21                       const struct rte_ether_addr *eth_addr)
22 {
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]);
30 }
31
32 /*
33  * Like ether_aton_r but can handle either
34  * XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX
35  */
36 int
37 rte_ether_unformat_addr(const char *s, struct rte_ether_addr *ea)
38 {
39         unsigned int o0, o1, o2, o3, o4, o5;
40         int n;
41
42         n = sscanf(s, "%x:%x:%x:%x:%x:%x",
43                     &o0, &o1, &o2, &o3, &o4, &o5);
44
45         if (n == 6) {
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) {
49                         rte_errno = ERANGE;
50                         return -1;
51                 }
52
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;
59         } else if (n == 3) {
60                 /* Support the format XXXX:XXXX:XXXX */
61                 if (o0 > UINT16_MAX || o1 > UINT16_MAX || o2 > UINT16_MAX) {
62                         rte_errno = ERANGE;
63                         return -1;
64                 }
65
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;
72         } else {
73                 /* unknown format */
74                 rte_errno = EINVAL;
75                 return -1;
76         }
77         return 0;
78 }