Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /*
* Copyright (c) 2016 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Public API for network link address
*/
#ifndef ZEPHYR_INCLUDE_NET_NET_LINKADDR_H_
#define ZEPHYR_INCLUDE_NET_NET_LINKADDR_H_
#include <zephyr/types.h>
#include <stdbool.h>
#include <errno.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Network link address library
* @defgroup net_linkaddr Network Link Address Library
* @ingroup networking
* @{
*/
/** Maximum length of the link address */
#ifdef CONFIG_NET_L2_IEEE802154
#define NET_LINK_ADDR_MAX_LENGTH 8
#else
#define NET_LINK_ADDR_MAX_LENGTH 6
#endif
/**
* Type of the link address. This indicates the network technology that this
* address is used in. Note that in order to save space we store the value
* into a u8_t variable, so please do not introduce any values > 255 in
* this enum.
*/
enum net_link_type {
/** Unknown link address type. */
NET_LINK_UNKNOWN = 0,
/** IEEE 802.15.4 link address. */
NET_LINK_IEEE802154,
/** Bluetooth IPSP link address. */
NET_LINK_BLUETOOTH,
/** Ethernet link address. */
NET_LINK_ETHERNET,
/** Dummy link address. Used in testing apps and loopback support. */
NET_LINK_DUMMY,
/** CANBUS link address. */
NET_LINK_CANBUS,
} __packed;
/**
* @brief Hardware link address structure
*
* Used to hold the link address information
*/
struct net_linkaddr {
/** The array of byte representing the address */
u8_t *addr;
/** Length of that address array */
u8_t len;
/** What kind of address is this for */
u8_t type;
};
/**
* @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 u8_t * is
* handled differently than u8_t addr[] and the fields are purposely
* in different order.
*/
struct net_linkaddr_storage {
/** What kind of address is this for */
u8_t type;
/** The real length of the ll address. */
u8_t len;
/** The array of bytes representing the address */
u8_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,
u8_t *new_addr, u8_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 /* ZEPHYR_INCLUDE_NET_NET_LINKADDR_H_ */
|