Zephyr API Documentation 4.4.0-rc1
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
net_linkaddr.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Intel Corporation.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
11
12#ifndef ZEPHYR_INCLUDE_NET_NET_LINKADDR_H_
13#define ZEPHYR_INCLUDE_NET_NET_LINKADDR_H_
14
15#include <zephyr/types.h>
16#include <stdbool.h>
17#include <errno.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
31
33#if CONFIG_NET_LINK_ADDR_CUSTOM_LENGTH > 0
34#define NET_LINK_ADDR_MAX_LENGTH CONFIG_NET_LINK_ADDR_CUSTOM_LENGTH
35
36#if defined(CONFIG_NET_L2_PHY_IEEE802154) || defined(CONFIG_NET_L2_PPP)
37BUILD_ASSERT(CONFIG_NET_LINK_ADDR_CUSTOM_LENGTH >= 8,
38 "CONFIG_NET_LINK_ADDR_CUSTOM_LENGTH too low, required at least 8");
39#endif
40
41#if defined(CONFIG_NET_L2_ETHERNET)
42BUILD_ASSERT(CONFIG_NET_LINK_ADDR_CUSTOM_LENGTH >= 6,
43 "CONFIG_NET_LINK_ADDR_CUSTOM_LENGTH too low, required at least 6");
44#endif
45
46#elif defined(CONFIG_NET_L2_PHY_IEEE802154) || defined(CONFIG_NET_L2_PPP)
47#define NET_LINK_ADDR_MAX_LENGTH 8
48#else
49#define NET_LINK_ADDR_MAX_LENGTH 6
50#endif
51
72
93
102static inline bool net_linkaddr_cmp(struct net_linkaddr *lladdr1,
103 struct net_linkaddr *lladdr2)
104{
105 if (!lladdr1 || !lladdr2) {
106 return false;
107 }
108
109 if (lladdr1->len != lladdr2->len) {
110 return false;
111 }
112
113 return !memcmp(lladdr1->addr, lladdr2->addr, lladdr1->len);
114}
115
126static inline int net_linkaddr_set(struct net_linkaddr *lladdr,
127 const uint8_t *new_addr,
128 uint8_t new_len)
129{
130 if (lladdr == NULL || new_addr == NULL) {
131 return -EINVAL;
132 }
133
134 if (new_len > NET_LINK_ADDR_MAX_LENGTH) {
135 return -EMSGSIZE;
136 }
137
138 lladdr->len = new_len;
139 memcpy(lladdr->addr, new_addr, new_len);
140
141 return 0;
142}
143
151static inline int net_linkaddr_copy(struct net_linkaddr *dst,
152 const struct net_linkaddr *src)
153{
154 if (dst == NULL || src == NULL) {
155 return -EINVAL;
156 }
157
158 if (src->len > NET_LINK_ADDR_MAX_LENGTH) {
159 return -EMSGSIZE;
160 }
161
162 dst->type = src->type;
163 dst->len = src->len;
164 memcpy(dst->addr, src->addr, src->len);
165
166 return 0;
167}
168
179static inline int net_linkaddr_create(struct net_linkaddr *lladdr,
180 const uint8_t *addr, uint8_t len,
181 enum net_link_type type)
182{
183 if (lladdr == NULL) {
184 return -EINVAL;
185 }
186
187 if (len > NET_LINK_ADDR_MAX_LENGTH) {
188 return -EMSGSIZE;
189 }
190
191 if (addr == NULL) {
193 } else {
194 memcpy(lladdr->addr, addr, len);
195 }
196
197 lladdr->type = type;
198 lladdr->len = len;
199
200 return 0;
201}
202
209static inline int net_linkaddr_clear(struct net_linkaddr *lladdr)
210{
211 return net_linkaddr_create(lladdr, NULL, 0, NET_LINK_UNKNOWN);
212}
213
217
218#ifdef __cplusplus
219}
220#endif
221
222#endif /* ZEPHYR_INCLUDE_NET_NET_LINKADDR_H_ */
System error numbers.
static int net_linkaddr_copy(struct net_linkaddr *dst, const struct net_linkaddr *src)
Copy link address from one variable to another.
Definition net_linkaddr.h:151
net_link_type
Type of the link address.
Definition net_linkaddr.h:58
static bool net_linkaddr_cmp(struct net_linkaddr *lladdr1, struct net_linkaddr *lladdr2)
Compare two link layer addresses.
Definition net_linkaddr.h:102
static int net_linkaddr_clear(struct net_linkaddr *lladdr)
Clear link address.
Definition net_linkaddr.h:209
#define NET_LINK_ADDR_MAX_LENGTH
Maximum length of the link address.
Definition net_linkaddr.h:49
static int net_linkaddr_set(struct net_linkaddr *lladdr, const uint8_t *new_addr, uint8_t new_len)
Set the member data of a link layer address storage structure.
Definition net_linkaddr.h:126
static int net_linkaddr_create(struct net_linkaddr *lladdr, const uint8_t *addr, uint8_t len, enum net_link_type type)
Create a link address structure.
Definition net_linkaddr.h:179
@ NET_LINK_UNKNOWN
Unknown link address type.
Definition net_linkaddr.h:60
@ NET_LINK_IEEE802154
IEEE 802.15.4 link address.
Definition net_linkaddr.h:62
@ NET_LINK_DUMMY
Dummy link address.
Definition net_linkaddr.h:68
@ NET_LINK_ETHERNET
Ethernet link address.
Definition net_linkaddr.h:66
@ NET_LINK_CANBUS_RAW
CANBUS link address.
Definition net_linkaddr.h:70
@ NET_LINK_BLUETOOTH
Bluetooth IPSP link address.
Definition net_linkaddr.h:64
#define EINVAL
Invalid argument.
Definition errno.h:60
#define EMSGSIZE
Message size.
Definition errno.h:106
#define NULL
Definition iar_missing_defs.h:20
#define BUILD_ASSERT(EXPR, MSG...)
Definition llvm.h:51
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
void * memset(void *buf, int c, size_t n)
int memcmp(const void *m1, const void *m2, size_t n)
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
Hardware link address structure.
Definition net_linkaddr.h:83
uint8_t addr[6]
The array of bytes representing the address.
Definition net_linkaddr.h:91
uint8_t type
What kind of address is this for.
Definition net_linkaddr.h:85
uint8_t len
The real length of the ll address.
Definition net_linkaddr.h:88