mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 05:12:57 +01:00
netdev2_ieee802154: import of common IEEE802.15.4 netdev2 module
This commit is contained in:
parent
32e0c7ae66
commit
b1a9dfe384
@ -12,6 +12,10 @@ ifneq (,$(filter nhdp,$(USEMODULE)))
|
||||
USEMODULE += oonf_rfc5444
|
||||
endif
|
||||
|
||||
ifneq (,$(filter netdev2_ieee802154,$(USEMODULE)))
|
||||
USEMODULE += ieee802154
|
||||
endif
|
||||
|
||||
ifneq (,$(filter gnrc_%,$(filter-out gnrc_netapi gnrc_netreg gnrc_netif% gnrc_pktbuf,$(USEMODULE))))
|
||||
USEMODULE += gnrc
|
||||
endif
|
||||
|
@ -52,7 +52,7 @@ enum {
|
||||
NETDEV2_TYPE_UNKNOWN,
|
||||
NETDEV2_TYPE_RAW,
|
||||
NETDEV2_TYPE_ETHERNET,
|
||||
NETDEV2_TYPE_802154,
|
||||
NETDEV2_TYPE_IEEE802154,
|
||||
NETDEV2_TYPE_CC110X,
|
||||
};
|
||||
|
||||
@ -61,13 +61,15 @@ enum {
|
||||
* upper layer
|
||||
*/
|
||||
typedef enum {
|
||||
NETDEV2_EVENT_ISR, /**< driver needs it's ISR handled */
|
||||
NETDEV2_EVENT_RX_STARTED, /**< started to receive a packet */
|
||||
NETDEV2_EVENT_RX_COMPLETE, /**< finished receiving a packet */
|
||||
NETDEV2_EVENT_TX_STARTED, /**< started to transfer a packet */
|
||||
NETDEV2_EVENT_TX_COMPLETE, /**< finished transferring packet */
|
||||
NETDEV2_EVENT_LINK_UP, /**< link established */
|
||||
NETDEV2_EVENT_LINK_DOWN, /**< link gone */
|
||||
NETDEV2_EVENT_ISR, /**< driver needs it's ISR handled */
|
||||
NETDEV2_EVENT_RX_STARTED, /**< started to receive a packet */
|
||||
NETDEV2_EVENT_RX_COMPLETE, /**< finished receiving a packet */
|
||||
NETDEV2_EVENT_TX_STARTED, /**< started to transfer a packet */
|
||||
NETDEV2_EVENT_TX_COMPLETE, /**< finished transferring packet */
|
||||
NETDEV2_EVENT_TX_NOACK, /**< ACK requested but not received */
|
||||
NETDEV2_EVENT_TX_MEDIUM_BUSY, /**< couldn't transfer packet */
|
||||
NETDEV2_EVENT_LINK_UP, /**< link established */
|
||||
NETDEV2_EVENT_LINK_DOWN, /**< link gone */
|
||||
/* expand this list if needed */
|
||||
} netdev2_event_t;
|
||||
|
||||
@ -92,7 +94,7 @@ typedef struct netdev2 netdev2_t;
|
||||
* @param[in] type type of the event
|
||||
* @param[in] arg event argument
|
||||
*/
|
||||
typedef void (*netdev2_event_cb_t)(netdev2_t *dev, netdev2_event_t event, void* arg);
|
||||
typedef void (*netdev2_event_cb_t)(netdev2_t *dev, netdev2_event_t event, void *arg);
|
||||
|
||||
/**
|
||||
* @brief Structure to hold driver state
|
||||
@ -103,7 +105,7 @@ typedef void (*netdev2_event_cb_t)(netdev2_t *dev, netdev2_event_t event, void*
|
||||
struct netdev2 {
|
||||
const struct netdev2_driver *driver; /**< ptr to that driver's interface. */
|
||||
netdev2_event_cb_t event_callback; /**< callback for device events */
|
||||
void* isr_arg; /**< argument to pass on isr event */
|
||||
void *isr_arg; /**< argument to pass on isr event */
|
||||
};
|
||||
|
||||
/**
|
||||
|
145
drivers/include/net/netdev2/ieee802154.h
Normal file
145
drivers/include/net/netdev2/ieee802154.h
Normal file
@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup drivers_netdev_netdev2
|
||||
* @brief
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Definitions for netdev2 common IEEE 802.15.4 code
|
||||
*
|
||||
* @author Martine Lenders <mlenders@inf.fu-berlin.de>
|
||||
*/
|
||||
#ifndef NETDEV2_IEEE802154_H_
|
||||
#define NETDEV2_IEEE802154_H_
|
||||
|
||||
#include "net/ieee802154.h"
|
||||
#include "net/netopt.h"
|
||||
#include "net/netdev2.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @name IEEE 802.15.4 netdev2 flags
|
||||
* @brief Flags for netdev_ieee802154_t::flags
|
||||
*
|
||||
* The flag-space `0xff00` is available for device-specific flags.
|
||||
* The flag-space `0x00ff` was chosen for global flags to be in accordance to
|
||||
* the IEEE 802.15.4 MAC header flags.
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define NETDEV2_IEEE802154_SEND_MASK (0x0068) /**< flags to take for send packets */
|
||||
#define NETDEV2_IEEE802154_RESV1 (0x0001) /**< reserved flag */
|
||||
#define NETDEV2_IEEE802154_RAW (0x0002) /**< pass raw frame to upper layer */
|
||||
/**
|
||||
* @brief use long source addres (set) or short source address (unset)
|
||||
*/
|
||||
#define NETDEV2_IEEE802154_SRC_MODE_LONG (0x0004)
|
||||
#define NETDEV2_IEEE802154_SECURITY_EN (0x0008) /**< enable security */
|
||||
#define NETDEV2_IEEE802154_RESV2 (0x0010) /**< reserved flag */
|
||||
|
||||
/**
|
||||
* @brief request ACK from receiver
|
||||
*/
|
||||
#define NETDEV2_IEEE802154_ACK_REQ (0x0020)
|
||||
#define NETDEV2_IEEE802154_PAN_COMP (0x0040) /**< compress source PAN ID */
|
||||
#define NETDEV2_IEEE802154_RESV3 (0x0080) /**< reserved flag */
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Extended structure to hold IEEE 802.15.4 driver state
|
||||
*
|
||||
* @extends netdev2_t
|
||||
*
|
||||
* Supposed to be extended by driver implementations.
|
||||
* The extended structure should contain all variable driver state.
|
||||
*/
|
||||
typedef struct {
|
||||
netdev2_t netdev; /**< @ref netdev2_t base class */
|
||||
|
||||
/**
|
||||
* @brief PAN ID in network byte order
|
||||
*/
|
||||
uint16_t pan;
|
||||
|
||||
/**
|
||||
* @brief Short address in network byte order
|
||||
*/
|
||||
uint8_t short_addr[IEEE802154_SHORT_ADDRESS_LEN];
|
||||
|
||||
/**
|
||||
* @brief Long address in network byte order
|
||||
*/
|
||||
uint8_t long_addr[IEEE802154_LONG_ADDRESS_LEN];
|
||||
uint8_t seq; /**< sequence number */
|
||||
uint8_t chan; /**< channel */
|
||||
uint16_t flags; /**< flags as defined above */
|
||||
} netdev2_ieee802154_t;
|
||||
|
||||
/**
|
||||
* @brief Received packet status information for IEEE 802.15.4 radios
|
||||
*/
|
||||
typedef struct netdev2_radio_rx_info netdev2_ieee802154_rx_info_t;
|
||||
|
||||
/**
|
||||
* @brief Fallback function for netdev2 IEEE 802.15.4 devices' _get function
|
||||
*
|
||||
* Supposed to be used by netdev2 drivers as default case.
|
||||
*
|
||||
* @param[in] dev network device descriptor
|
||||
* @param[in] opt option type
|
||||
* @param[out] value pointer to store the option's value in
|
||||
* @param[in] max_len maximal amount of byte that fit into @p value
|
||||
*
|
||||
* @return number of bytes written to @p value
|
||||
* @return <0 on error
|
||||
*/
|
||||
int netdev2_ieee802154_get(netdev2_ieee802154_t *dev, netopt_t opt, void *value,
|
||||
size_t max_len);
|
||||
|
||||
/**
|
||||
* @brief Fallback function for netdev2 IEEE 802.15.4 devices' _set function
|
||||
*
|
||||
* Sets netdev2_ieee802154_t::pan, netdev2_ieee802154_t::short_addr, and
|
||||
* netdev2_ieee802154_t::long_addr in device struct.
|
||||
* Additionally @ref NETDEV2_IEEE802154_SRC_MODE_LONG,
|
||||
* @ref NETDEV2_IEEE802154_RAW and, @ref NETDEV2_IEEE802154_ACK_REQ in
|
||||
* netdev2_ieee802154_t::flags can be set or unset.
|
||||
*
|
||||
* The setting of netdev2_ieee802154_t::chan is omitted since the legality of
|
||||
* its value can be very device specific and can't be checked in this function.
|
||||
* Please set it in the netdev2_driver_t::set function of your driver.
|
||||
*
|
||||
* Be aware that this only manipulates the netdev2_ieee802154_t struct.
|
||||
* Configuration to the device needs to be done in the netdev2_driver_t::set
|
||||
* function of the device driver (which should call this function as a fallback
|
||||
* afterwards).
|
||||
*
|
||||
* @param[in] dev network device descriptor
|
||||
* @param[in] opt option type
|
||||
* @param[in] value value to set
|
||||
* @param[in] value_len the length of @p value
|
||||
*
|
||||
* @return number of bytes used from @p value
|
||||
* @return <0 on error
|
||||
*/
|
||||
int netdev2_ieee802154_set(netdev2_ieee802154_t *dev, netopt_t opt, void *value,
|
||||
size_t value_len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* NETDEV2_IEEE802154_H_ */
|
||||
/** @} */
|
1
drivers/netdev2_ieee802154/Makefile
Normal file
1
drivers/netdev2_ieee802154/Makefile
Normal file
@ -0,0 +1 @@
|
||||
include $(RIOTBASE)/Makefile.base
|
223
drivers/netdev2_ieee802154/netdev2_ieee802154.c
Normal file
223
drivers/netdev2_ieee802154/netdev2_ieee802154.c
Normal file
@ -0,0 +1,223 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @author Martine Lenders <mlenders@inf.fu-berlin.de>
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "net/eui64.h"
|
||||
#include "net/ieee802154.h"
|
||||
#include "net/netdev2.h"
|
||||
|
||||
#include "net/netdev2/ieee802154.h"
|
||||
|
||||
#define ENABLE_DEBUG (0)
|
||||
#include "debug.h"
|
||||
|
||||
static int _get_iid(netdev2_ieee802154_t *dev, eui64_t *value, size_t max_len)
|
||||
{
|
||||
uint8_t *addr;
|
||||
uint16_t addr_len;
|
||||
|
||||
if (max_len < sizeof(eui64_t)) {
|
||||
return -EOVERFLOW;
|
||||
}
|
||||
|
||||
if (dev->flags & NETDEV2_IEEE802154_SRC_MODE_LONG) {
|
||||
addr_len = IEEE802154_LONG_ADDRESS_LEN;
|
||||
addr = dev->long_addr;
|
||||
}
|
||||
else {
|
||||
addr_len = IEEE802154_SHORT_ADDRESS_LEN;
|
||||
addr = dev->short_addr;
|
||||
}
|
||||
ieee802154_get_iid(value, addr, addr_len);
|
||||
|
||||
return sizeof(eui64_t);
|
||||
}
|
||||
|
||||
int netdev2_ieee802154_get(netdev2_ieee802154_t *dev, netopt_t opt, void *value,
|
||||
size_t max_len)
|
||||
{
|
||||
int res = -ENOTSUP;
|
||||
|
||||
switch (opt) {
|
||||
case NETOPT_ADDRESS:
|
||||
if (max_len < sizeof(dev->short_addr)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
memcpy(value, dev->short_addr, sizeof(dev->short_addr));
|
||||
res = sizeof(dev->short_addr);
|
||||
break;
|
||||
case NETOPT_ADDRESS_LONG:
|
||||
if (max_len < sizeof(dev->long_addr)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
memcpy(value, dev->long_addr, sizeof(dev->long_addr));
|
||||
res = sizeof(dev->long_addr);
|
||||
break;
|
||||
case NETOPT_ADDR_LEN:
|
||||
case NETOPT_SRC_LEN:
|
||||
if (max_len < sizeof(uint16_t)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
if (dev->flags & NETDEV2_IEEE802154_SRC_MODE_LONG) {
|
||||
*((uint16_t *)value) = IEEE802154_LONG_ADDRESS_LEN;
|
||||
}
|
||||
else {
|
||||
*((uint16_t *)value) = IEEE802154_SHORT_ADDRESS_LEN;
|
||||
}
|
||||
res = sizeof(uint16_t);
|
||||
break;
|
||||
case NETOPT_NID:
|
||||
if (max_len < sizeof(dev->pan)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
*((uint16_t *)value) = dev->pan;
|
||||
res = sizeof(dev->pan);
|
||||
break;
|
||||
case NETOPT_CHANNEL:
|
||||
if (max_len < sizeof(uint16_t)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
*((uint16_t *)value) = (uint16_t)dev->chan;
|
||||
res = sizeof(dev->chan);
|
||||
break;
|
||||
case NETOPT_RAWMODE:
|
||||
if (max_len < sizeof(netopt_enable_t)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
if (dev->flags & NETDEV2_IEEE802154_RAW) {
|
||||
*((netopt_enable_t *)value) = NETOPT_ENABLE;
|
||||
}
|
||||
else {
|
||||
*((netopt_enable_t *)value) = NETOPT_DISABLE;
|
||||
}
|
||||
res = sizeof(netopt_enable_t);
|
||||
break;
|
||||
case NETOPT_AUTOACK:
|
||||
if (max_len < sizeof(netopt_enable_t)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
if (dev->flags & NETDEV2_IEEE802154_ACK_REQ) {
|
||||
*((netopt_enable_t *)value) = NETOPT_ENABLE;
|
||||
}
|
||||
else {
|
||||
*((netopt_enable_t *)value) = NETOPT_DISABLE;
|
||||
}
|
||||
res = sizeof(netopt_enable_t);
|
||||
break;
|
||||
case NETOPT_DEVICE_TYPE:
|
||||
if (max_len < sizeof(uint16_t)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
*((uint16_t *)value) = NETDEV2_TYPE_IEEE802154;
|
||||
res = sizeof(uint16_t);
|
||||
break;
|
||||
case NETOPT_IPV6_IID:
|
||||
res = _get_iid(dev, value, max_len);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int netdev2_ieee802154_set(netdev2_ieee802154_t *dev, netopt_t opt, void *value,
|
||||
size_t len)
|
||||
{
|
||||
int res = -ENOTSUP;
|
||||
|
||||
switch (opt) {
|
||||
case NETOPT_ADDRESS:
|
||||
if (len > sizeof(dev->short_addr)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
memset(dev->short_addr, 0, sizeof(dev->short_addr));
|
||||
memcpy(dev->short_addr, value, len);
|
||||
res = sizeof(dev->short_addr);
|
||||
break;
|
||||
case NETOPT_ADDRESS_LONG:
|
||||
if (len > sizeof(dev->long_addr)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
memset(dev->long_addr, 0, sizeof(dev->long_addr));
|
||||
memcpy(dev->long_addr, value, len);
|
||||
res = sizeof(dev->long_addr);
|
||||
break;
|
||||
case NETOPT_ADDR_LEN:
|
||||
case NETOPT_SRC_LEN:
|
||||
if (len > sizeof(uint16_t)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
switch ((*(uint16_t *)value)) {
|
||||
case IEEE802154_SHORT_ADDRESS_LEN:
|
||||
dev->flags &= ~NETDEV2_IEEE802154_SRC_MODE_LONG;
|
||||
break;
|
||||
case IEEE802154_LONG_ADDRESS_LEN:
|
||||
dev->flags |= NETDEV2_IEEE802154_SRC_MODE_LONG;
|
||||
break;
|
||||
default:
|
||||
res = -EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
res = sizeof(uint16_t);
|
||||
break;
|
||||
case NETOPT_NID:
|
||||
if (len > sizeof(dev->pan)) {
|
||||
res = -EOVERFLOW;
|
||||
break;
|
||||
}
|
||||
dev->pan = *((uint16_t *)value);
|
||||
res = sizeof(dev->pan);
|
||||
break;
|
||||
/* channel can be very device specific */
|
||||
case NETOPT_AUTOACK:
|
||||
if ((*(bool *)value)) {
|
||||
dev->flags |= NETDEV2_IEEE802154_ACK_REQ;
|
||||
}
|
||||
else {
|
||||
dev->flags &= ~NETDEV2_IEEE802154_ACK_REQ;
|
||||
}
|
||||
res = sizeof(uint16_t);
|
||||
break;
|
||||
case NETOPT_RAWMODE:
|
||||
if ((*(bool *)value)) {
|
||||
dev->flags |= NETDEV2_IEEE802154_RAW;
|
||||
}
|
||||
else {
|
||||
dev->flags &= ~NETDEV2_IEEE802154_RAW;
|
||||
}
|
||||
res = sizeof(uint16_t);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/** @} */
|
Loading…
Reference in New Issue
Block a user