mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-02 01:54:29 +00:00
The net_linkaddr_storage structure contains an array of bytes used to store the link address. This array can be different sizes depending on the CONFIG options used when building. To facilitate consistency and error checking let's introduce a new helper function to copy the addr and len values to this structure. Also move all uses of memcpy related to net_link_storage structures to the new helper function. Change-Id: Ic547d86b07e62e5ac3bc330d4eaeb4508a143200 Signed-off-by: Michael Scott <michael.scott@linaro.org>
113 lines
2.4 KiB
C
113 lines
2.4 KiB
C
/*
|
|
* Copyright (c) 2016 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Public API for network link address
|
|
*/
|
|
|
|
#ifndef __NET_LINKADDR_H__
|
|
#define __NET_LINKADDR_H__
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <errno.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifdef CONFIG_NET_L2_IEEE802154
|
|
#define NET_LINK_ADDR_MAX_LENGTH 8
|
|
#else
|
|
#define NET_LINK_ADDR_MAX_LENGTH 6
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware link address structure
|
|
*
|
|
* Used to hold the link address information
|
|
*/
|
|
struct net_linkaddr {
|
|
/** The array of byte representing the address */
|
|
uint8_t *addr;
|
|
|
|
/** Length of that address array */
|
|
uint8_t len;
|
|
};
|
|
|
|
/**
|
|
* @brief Hardware link address structure
|
|
*
|
|
* Used to hold the link address information. This variant is needed
|
|
* when we have to store the link layer address.
|
|
*
|
|
* Note that you cannot cast this to net_linkaddr as uint8_t * is
|
|
* handled differently than uint8_t addr[] and the fields are purposely
|
|
* in a different order.
|
|
*/
|
|
struct net_linkaddr_storage {
|
|
/** The real length of the ll address. */
|
|
uint8_t len;
|
|
|
|
/** The array of bytes representing the address */
|
|
uint8_t addr[NET_LINK_ADDR_MAX_LENGTH];
|
|
};
|
|
|
|
/**
|
|
* @brief Compare two link layer addresses.
|
|
*
|
|
* @param lladdr1 Pointer to a link layer address
|
|
* @param lladdr2 Pointer to a link layer address
|
|
*
|
|
* @return True if the addresses are the same, false otherwise.
|
|
*/
|
|
static inline bool net_linkaddr_cmp(struct net_linkaddr *lladdr1,
|
|
struct net_linkaddr *lladdr2)
|
|
{
|
|
if (!lladdr1 || !lladdr2) {
|
|
return false;
|
|
}
|
|
|
|
if (lladdr1->len != lladdr2->len) {
|
|
return false;
|
|
}
|
|
|
|
return !memcmp(lladdr1->addr, lladdr2->addr, lladdr1->len);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @brief Set the member data of a link layer address storage structure.
|
|
*
|
|
* @param lladdr_store The link address storage structure to change.
|
|
* @param new_addr Array of bytes containing the link address.
|
|
* @param new_len Length of the link address array.
|
|
* This value should always be <= NET_LINK_ADDR_MAX_LENGTH.
|
|
*/
|
|
static inline int net_linkaddr_set(struct net_linkaddr_storage *lladdr_store,
|
|
uint8_t *new_addr, uint8_t new_len)
|
|
{
|
|
if (!lladdr_store || !new_addr) {
|
|
return -EINVAL;
|
|
}
|
|
|
|
if (new_len > NET_LINK_ADDR_MAX_LENGTH) {
|
|
return -EMSGSIZE;
|
|
}
|
|
|
|
lladdr_store->len = new_len;
|
|
memcpy(lladdr_store->addr, new_addr, new_len);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __NET_LINKADDR_H__ */
|