diff --git a/Makefile.dep b/Makefile.dep index 76034c5d60e7180bd455e9f9aac656c57f065a2a..d49825ff2a6ca268a1ef2c9006da2081e59012ca 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -494,10 +494,6 @@ ifneq (,$(filter gnrc_pktbuf_%, $(USEMODULE))) USEMODULE += gnrc_pktbuf # make MODULE_GNRC_PKTBUF macro available for all implementations endif -ifneq (,$(filter gnrc_netdev,$(USEMODULE))) - USEMODULE += netopt -endif - ifneq (,$(filter netstats_%, $(USEMODULE))) USEMODULE += netstats endif diff --git a/sys/Makefile b/sys/Makefile index fbe6762c65e2f7907b3e6f43cf7cec286bc9d64c..e170678a6145106c11dc5f6e49366be126cfea04 100644 --- a/sys/Makefile +++ b/sys/Makefile @@ -61,9 +61,6 @@ endif ifneq (,$(filter nhdp,$(USEMODULE))) DIRS += net/routing/nhdp endif -ifneq (,$(filter gnrc_netdev,$(USEMODULE))) - DIRS += net/gnrc/link_layer/netdev -endif ifneq (,$(filter fib,$(USEMODULE))) DIRS += net/network_layer/fib endif diff --git a/sys/include/net/gnrc.h b/sys/include/net/gnrc.h index 9f6eabd1a69c135e0f3c873e2f29477f79f73d60..c55e4bad3242e080441a3ae6a4a2af4958747b7a 100644 --- a/sys/include/net/gnrc.h +++ b/sys/include/net/gnrc.h @@ -18,7 +18,7 @@ * ===== * * This module is currently the default network stack for RIOT and includes - * many components ranging from a @ref net_gnrc_netdev through a fully-featured + * many components ranging from a @ref net_gnrc_netif through a fully-featured * @ref net_gnrc_ipv6 implementation with @ref net_gnrc_sixlowpan "6LowPAN" * extensions to an @ref net_gnrc_udp "UDP" implementation and * @ref net_gnrc_rpl. @@ -31,7 +31,7 @@ * * From the application layer the @ref net_gnrc can be accessed through the * @ref net_sock, while the interface to the @ref drivers_netdev_api is - * defined by the @ref net_gnrc_netdev. + * defined by the @ref net_gnrc_netif. * * Architecture * ============ diff --git a/sys/include/net/gnrc/netdev.h b/sys/include/net/gnrc/netdev.h deleted file mode 100644 index b49dff0c70b62920b26332f18fc73854364a69a9..0000000000000000000000000000000000000000 --- a/sys/include/net/gnrc/netdev.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de> - * - * 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. - */ - -/** - * @defgroup net_gnrc_netdev Adaption layer for GNRC on top of Netdev - * @ingroup net_gnrc - * @brief Provides the glue code for @ref net_gnrc on top of @ref drivers_netdev_api - * @{ - * - * @file - * @brief netdev-GNRC glue code interface - * - * This interface is supposed to provide common adaption code between the - * low-level network device interface "netdev" and the GNRC network stack. - * - * GNRC sends around "gnrc_pktsnip_t" structures, but netdev can only handle - * "struct iovec" structures when sending, or a flat buffer when receiving. - * - * The purpose of gnrc_netdev is to bring these two interfaces together. - * - * @author Kaspar Schleiser <kaspar@schleiser.de> - */ - -#ifndef NET_GNRC_NETDEV_H -#define NET_GNRC_NETDEV_H - -#include <assert.h> -#include <stdint.h> - -#include "kernel_types.h" -#include "net/netdev.h" -#include "net/gnrc.h" -#include "net/gnrc/mac/types.h" -#include "net/ieee802154.h" -#include "net/gnrc/mac/mac.h" -#ifdef MODULE_GNRC_MAC -#include "net/csma_sender.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Default priority for adaption layer's threads - */ -#ifndef GNRC_NETDEV_MAC_PRIO -#define GNRC_NETDEV_MAC_PRIO (THREAD_PRIORITY_MAIN - 5) -#endif - -/** - * @brief Type for @ref msg_t if device fired an event - */ -#define NETDEV_MSG_TYPE_EVENT 0x1234 - -/** - * @brief Mask for @ref gnrc_mac_tx_feedback_t - */ -#define GNRC_NETDEV_MAC_INFO_TX_FEEDBACK_MASK (0x0003U) - -/** - * @brief Flag to track if a transmission might have corrupted a received - * packet - */ -#define GNRC_NETDEV_MAC_INFO_RX_STARTED (0x0004U) - -/** - * @brief Flag to track if a device has enabled CSMA for transmissions - * - * If `gnrc_mac` is used, the user should be noticed that the `send()` - * function of gnrc_netdev will be affected with the state of this flag, since - * `gnrc_mac` accordingly adapts the `send()` function. If the device doesn't - * support on-chip CSMA and this flag is set for requiring CSMA transmission, - * then, the device will run software CSMA using `csma_sender` APIs. - */ -#define GNRC_NETDEV_MAC_INFO_CSMA_ENABLED (0x0100U) - -/** - * @brief Structure holding GNRC netdev adapter state - * - * This structure is supposed to hold any state parameters needed - * to use a netdev device from GNRC. - * - * It can be extended - */ -typedef struct gnrc_netdev { - /** - * @brief Send a pktsnip using this device - * - * This function should convert the pktsnip into a format - * the underlying device understands and send it. - */ - int (*send)(struct gnrc_netdev *dev, gnrc_pktsnip_t *snip); - - /** - * @brief Receive a pktsnip from this device - * - * This function should receive a raw frame from the underlying - * device and convert it into a pktsnip while adding a netif header - * and possibly marking out higher-layer headers. - */ - gnrc_pktsnip_t * (*recv)(struct gnrc_netdev *dev); - - /** - * @brief netdev handle this adapter is working with - */ - netdev_t *dev; - - /** - * @brief PID of this adapter for netapi messages - */ - kernel_pid_t pid; - -#ifdef MODULE_GNRC_MAC - /** - * @brief general information for the MAC protocol - */ - uint16_t mac_info; - - /** - * @brief device's l2 address - */ - uint8_t l2_addr[IEEE802154_LONG_ADDRESS_LEN]; - - /** - * @brief device's l2 address length - */ - uint8_t l2_addr_len; - - /** - * @brief device's software CSMA configuration - */ - csma_sender_conf_t csma_conf; - -#if ((GNRC_MAC_RX_QUEUE_SIZE != 0) || (GNRC_MAC_DISPATCH_BUFFER_SIZE != 0)) || defined(DOXYGEN) - /** - * @brief MAC internal object which stores reception parameters, queues, and - * state machines. - */ - gnrc_mac_rx_t rx; -#endif /* ((GNRC_MAC_RX_QUEUE_SIZE != 0) || (GNRC_MAC_DISPATCH_BUFFER_SIZE != 0)) || defined(DOXYGEN) */ - -#if ((GNRC_MAC_TX_QUEUE_SIZE != 0) || (GNRC_MAC_NEIGHBOR_COUNT != 0)) || defined(DOXYGEN) - /** - * @brief MAC internal object which stores transmission parameters, queues, and - * state machines. - */ - gnrc_mac_tx_t tx; -#endif /* ((GNRC_MAC_TX_QUEUE_SIZE != 0) || (GNRC_MAC_NEIGHBOR_COUNT == 0)) || defined(DOXYGEN) */ - -#ifdef MODULE_GNRC_LWMAC - /** - * @brief LWMAC specific structure object for storing LWMAC internal states. - */ - gnrc_lwmac_t lwmac; -#endif - -#endif /* MODULE_GNRC_MAC */ -} gnrc_netdev_t; - -#ifdef MODULE_GNRC_MAC - -/** - * @brief get the 'rx_started' state of the device - * - * This function checks whether the device has started receiving a packet. - * - * @param[in] dev ptr to netdev device - * - * @return the rx_started state - */ -static inline bool gnrc_netdev_get_rx_started(gnrc_netdev_t *dev) -{ - return (dev->mac_info & GNRC_NETDEV_MAC_INFO_RX_STARTED); -} - -/** - * @brief set the rx_started state of the device - * - * This function is intended to be called only in netdev_t::event_callback(). - * - * @param[in] dev ptr to netdev device - * - */ -static inline void gnrc_netdev_set_rx_started(gnrc_netdev_t *dev, bool rx_started) -{ - if (rx_started) { - dev->mac_info |= GNRC_NETDEV_MAC_INFO_RX_STARTED; - } - else { - dev->mac_info &= ~GNRC_NETDEV_MAC_INFO_RX_STARTED; - } -} - -/** - * @brief get the transmission feedback of the device - * - * @param[in] dev ptr to netdev device - * - * @return the transmission feedback - */ -static inline gnrc_mac_tx_feedback_t gnrc_netdev_get_tx_feedback(gnrc_netdev_t *dev) -{ - return (gnrc_mac_tx_feedback_t)(dev->mac_info & - GNRC_NETDEV_MAC_INFO_TX_FEEDBACK_MASK); -} - -/** - * @brief set the transmission feedback of the device - * - * This function is intended to be called only in netdev_t::event_callback(). - * - * @param[in] dev ptr to netdev device - * - */ -static inline void gnrc_netdev_set_tx_feedback(gnrc_netdev_t *dev, - gnrc_mac_tx_feedback_t txf) -{ - /* check if gnrc_mac_tx_feedback does not collide with - * GNRC_NETDEV_MAC_INFO_RX_STARTED */ - assert(!(txf & GNRC_NETDEV_MAC_INFO_RX_STARTED)); - /* unset previous value */ - dev->mac_info &= ~GNRC_NETDEV_MAC_INFO_TX_FEEDBACK_MASK; - dev->mac_info |= (uint16_t)(txf & GNRC_NETDEV_MAC_INFO_TX_FEEDBACK_MASK); -} -#endif - -/** - * @brief Initialize GNRC netdev handler thread - * - * @param[in] stack ptr to preallocated stack buffer - * @param[in] stacksize size of stack buffer - * @param[in] priority priority of thread - * @param[in] name name of thread - * @param[in] gnrc_netdev ptr to netdev device to handle in created thread - * - * @return pid of created thread - * @return KERNEL_PID_UNDEF on error - */ -kernel_pid_t gnrc_netdev_init(char *stack, int stacksize, char priority, - const char *name, gnrc_netdev_t *gnrc_netdev); - -#ifdef __cplusplus -} -#endif - -#endif /* NET_GNRC_NETDEV_H */ -/** @} */ diff --git a/sys/include/net/gnrc/netdev/eth.h b/sys/include/net/gnrc/netdev/eth.h deleted file mode 100644 index c9ce1d5fcedff9c2556f639ab84e69ea6924d5bd..0000000000000000000000000000000000000000 --- a/sys/include/net/gnrc/netdev/eth.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de> - * - * 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 net_gnrc_netdev - * @{ - * - * @file - * @brief netdev gnrc ethernet glue code interface - * - * @author Kaspar Schleiser <kaspar@schleiser.de> - */ - -#ifndef NET_GNRC_NETDEV_ETH_H -#define NET_GNRC_NETDEV_ETH_H - -#include "net/gnrc/netdev.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialize gnrc handler thread for netdev ethernet device - * - * @param[in] gnrc_netdev gnrc_netdev struct to initialize - * @param[in] dev netdev device to handle - * - * @return 1 on success - * @return <=0 on error - */ -int gnrc_netdev_eth_init(gnrc_netdev_t *gnrc_netdev, netdev_t *dev); - -#ifdef __cplusplus -} -#endif - -#endif /* NET_GNRC_NETDEV_ETH_H */ -/** @} */ diff --git a/sys/include/net/gnrc/netdev/ieee802154.h b/sys/include/net/gnrc/netdev/ieee802154.h deleted file mode 100644 index 5db4660ce2f0a9629fdeb16de379566c77e10def..0000000000000000000000000000000000000000 --- a/sys/include/net/gnrc/netdev/ieee802154.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 net_gnrc_netdev - * @brief - * @{ - * - * @file - * @brief netdev gnrc IEEE 802.15.4 glue code interface - * - * @author Martine Lenders <mlenders@inf.fu-berlin.de> - */ -#ifndef NET_GNRC_NETDEV_IEEE802154_H -#define NET_GNRC_NETDEV_IEEE802154_H - -#include "net/netdev/ieee802154.h" -#include "net/gnrc/netdev.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialize gnrc handler for netdev IEEE 802.15.4 device - * - * @param[in] gnrc_netdev gnrc_netdev struct to initialize - * @param[in] dev netdev device to handle - * - * @return 1 on success - * @return <=0 on error - */ -int gnrc_netdev_ieee802154_init(gnrc_netdev_t *gnrc_netdev, - netdev_ieee802154_t *dev); - -#ifdef __cplusplus -} -#endif - -#endif /* NET_GNRC_NETDEV_IEEE802154_H */ -/** @} */ diff --git a/sys/include/net/gnrc/netdev/raw.h b/sys/include/net/gnrc/netdev/raw.h deleted file mode 100644 index abb29520f6f8f72bdb1a12e0401c273965bae48f..0000000000000000000000000000000000000000 --- a/sys/include/net/gnrc/netdev/raw.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 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 net_gnrc_netdev - * @{ - * - * @file - * @brief netdev gnrc raw (i.e. pure L3) glue code interface - * - * @author Martine Lenders <mlenders@inf.fu-berlin.de> - */ -#ifndef NET_GNRC_NETDEV_RAW_H -#define NET_GNRC_NETDEV_RAW_H - -#include "net/gnrc/netdev.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialize gnrc handler for netdev raw L3 devices - * - * @param[in] gnrc_netdev gnrc_netdev struct to initialize - * @param[in] dev network device to handle - * - * @return 1 on success - * @return <=0 on error - */ -int gnrc_netdev_raw_init(gnrc_netdev_t *gnrc_netdev, netdev_t *dev); - -#ifdef __cplusplus -} -#endif - -#endif /* NET_GNRC_NETDEV_RAW_H */ -/** @} */ diff --git a/sys/include/net/gnrc/netdev/xbee_adpt.h b/sys/include/net/gnrc/netdev/xbee_adpt.h deleted file mode 100644 index 158f1b17973645498858b64847e074f83877ac29..0000000000000000000000000000000000000000 --- a/sys/include/net/gnrc/netdev/xbee_adpt.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 net_gnrc_netdev - * @{ - * - * @file - * @brief GNRC to XBee netdev glue code interface - * - * Although the XBee devices are IEEE802.15.4 transceivers, use their own - * proprietary format for communicating between the host CPU and the device over - * UART. The XBee device driver expects the data to send to be given in this - * format, hence we need to introduce an XBee specific adaption layer that - * translates between GNRC and the XBee proprietary header format. - * - * For this custom header format, we can not make use of the existing adaption - * layers for other IEEE802.15.4 devices. - * - * @author Hauke Petersen <hauke.petersen@fu-berlin.de> - */ - -#ifndef NET_GNRC_NETDEV_XBEE_ADPT_H -#define NET_GNRC_NETDEV_XBEE_ADPT_H - -#include "xbee.h" -#include "net/gnrc/netdev.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialize GNRC handler for netdev XBee devices - * - * @param[out] gnrc_netdev gnrc_netdev struct to initialize - * @param[in] dev XBee device to handle - */ -void gnrc_netdev_xbee_init(gnrc_netdev_t *gnrc_netdev, xbee_t *dev); - -#ifdef __cplusplus -} -#endif - -#endif /* NET_GNRC_NETDEV_XBEE_ADPT_H */ -/** @} */ diff --git a/sys/include/net/gnrc/nettype.h b/sys/include/net/gnrc/nettype.h index 40d84fa9a536378ac92e74b5618862dceadfad89..ca374c91508ec477a544bbccdfe192d74d4068b5 100644 --- a/sys/include/net/gnrc/nettype.h +++ b/sys/include/net/gnrc/nettype.h @@ -11,7 +11,7 @@ * @ingroup net_gnrc * @brief Protocol type definitions and helper functions * - * The protocol types are used with the @ref net_gnrc_netapi, the @ref net_gnrc_netdev, + * The protocol types are used with the @ref net_gnrc_netapi, the @ref net_gnrc_netif, * the @ref net_gnrc_netreg, and the @ref net_gnrc_pkt to identify network protocols * throughout the network stack. * diff --git a/sys/include/net/netopt.h b/sys/include/net/netopt.h index da5c657196e5da6ec7f0d9b363f6d75b82706f02..3d1f1ec3ec20bce3168b5736362b380d43a75ec8 100644 --- a/sys/include/net/netopt.h +++ b/sys/include/net/netopt.h @@ -11,7 +11,7 @@ * @defgroup net_netopt Configuration options for network APIs * @ingroup net * @brief List of available configuration options for the - * @ref net_gnrc_netdev and the @ref net_gnrc_netapi + * @ref drivers_netdev_api and the @ref net_gnrc_netapi * @{ * * @file diff --git a/sys/net/gnrc/link_layer/netdev/Makefile b/sys/net/gnrc/link_layer/netdev/Makefile deleted file mode 100644 index fdf8c77651731e25e2cc3f90e1cdb2def278073e..0000000000000000000000000000000000000000 --- a/sys/net/gnrc/link_layer/netdev/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -MODULE = gnrc_netdev - -include $(RIOTBASE)/Makefile.base diff --git a/sys/net/gnrc/link_layer/netdev/gnrc_netdev.c b/sys/net/gnrc/link_layer/netdev/gnrc_netdev.c deleted file mode 100644 index 74917add8ce259d4b3e4a3775951e9801af547d1..0000000000000000000000000000000000000000 --- a/sys/net/gnrc/link_layer/netdev/gnrc_netdev.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (C) 2015 Freie Universität Berlin - * 2015 Kaspar Schleiser <kaspar@schleiser.de> - * - * 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 net - * @file - * @brief Glue for netdev devices to netapi - * - * @author Hauke Petersen <hauke.petersen@fu-berlin.de> - * @author Kaspar Schleiser <kaspar@schleiser.de> - * @} - */ - -#include <errno.h> - -#include "msg.h" -#include "thread.h" - -#include "net/gnrc.h" -#include "net/gnrc/nettype.h" -#include "net/netdev.h" - -#include "net/gnrc/netdev.h" -#include "net/ethernet/hdr.h" - -#define ENABLE_DEBUG (0) -#include "debug.h" - -#if defined(MODULE_OD) && ENABLE_DEBUG -#include "od.h" -#endif - -#define NETDEV_NETAPI_MSG_QUEUE_SIZE 8 - -static void _pass_on_packet(gnrc_pktsnip_t *pkt); - -/** - * @brief Function called by the device driver on device events - * - * @param[in] event type of event - */ -static void _event_cb(netdev_t *dev, netdev_event_t event) -{ - gnrc_netdev_t *gnrc_netdev = (gnrc_netdev_t*) dev->context; - - if (event == NETDEV_EVENT_ISR) { - msg_t msg; - - msg.type = NETDEV_MSG_TYPE_EVENT; - msg.content.ptr = gnrc_netdev; - - if (msg_send(&msg, gnrc_netdev->pid) <= 0) { - puts("gnrc_netdev: possibly lost interrupt."); - } - } - else { - DEBUG("gnrc_netdev: event triggered -> %i\n", event); - switch(event) { - case NETDEV_EVENT_RX_COMPLETE: - { - gnrc_pktsnip_t *pkt = gnrc_netdev->recv(gnrc_netdev); - - if (pkt) { - _pass_on_packet(pkt); - } - - break; - } -#ifdef MODULE_NETSTATS_L2 - case NETDEV_EVENT_TX_MEDIUM_BUSY: - dev->stats.tx_failed++; - break; - case NETDEV_EVENT_TX_COMPLETE: - dev->stats.tx_success++; - break; -#endif - default: - DEBUG("gnrc_netdev: warning: unhandled event %u.\n", event); - } - } -} - -static void _pass_on_packet(gnrc_pktsnip_t *pkt) -{ - /* throw away packet if no one is interested */ - if (!gnrc_netapi_dispatch_receive(pkt->type, GNRC_NETREG_DEMUX_CTX_ALL, pkt)) { - DEBUG("gnrc_netdev: unable to forward packet of type %i\n", pkt->type); - gnrc_pktbuf_release(pkt); - return; - } -} - -/** - * @brief Startup code and event loop of the gnrc_netdev layer - * - * @param[in] args expects a pointer to the underlying netdev device - * - * @return never returns - */ -static void *_gnrc_netdev_thread(void *args) -{ - DEBUG("gnrc_netdev: starting thread\n"); - - gnrc_netdev_t *gnrc_netdev = (gnrc_netdev_t*) args; - netdev_t *dev = gnrc_netdev->dev; - - gnrc_netdev->pid = thread_getpid(); - - gnrc_netapi_opt_t *opt; - int res; - msg_t msg, reply, msg_queue[NETDEV_NETAPI_MSG_QUEUE_SIZE]; - - /* setup the MAC layers message queue */ - msg_init_queue(msg_queue, NETDEV_NETAPI_MSG_QUEUE_SIZE); - - /* register the event callback with the device driver */ - dev->event_callback = _event_cb; - dev->context = (void*) gnrc_netdev; - - /* register the device to the network stack*/ - gnrc_netif_add(thread_getpid()); - - /* initialize low-level driver */ - dev->driver->init(dev); - - /* start the event loop */ - while (1) { - DEBUG("gnrc_netdev: waiting for incoming messages\n"); - msg_receive(&msg); - /* dispatch NETDEV and NETAPI messages */ - switch (msg.type) { - case NETDEV_MSG_TYPE_EVENT: - DEBUG("gnrc_netdev: GNRC_NETDEV_MSG_TYPE_EVENT received\n"); - dev->driver->isr(dev); - break; - case GNRC_NETAPI_MSG_TYPE_SND: - DEBUG("gnrc_netdev: GNRC_NETAPI_MSG_TYPE_SND received\n"); - gnrc_pktsnip_t *pkt = msg.content.ptr; - gnrc_netdev->send(gnrc_netdev, pkt); - break; - case GNRC_NETAPI_MSG_TYPE_SET: - /* read incoming options */ - opt = msg.content.ptr; - DEBUG("gnrc_netdev: GNRC_NETAPI_MSG_TYPE_SET received. opt=%s\n", - netopt2str(opt->opt)); - /* set option for device driver */ - res = dev->driver->set(dev, opt->opt, opt->data, opt->data_len); - DEBUG("gnrc_netdev: response of netdev->set: %i\n", res); - /* send reply to calling thread */ - reply.type = GNRC_NETAPI_MSG_TYPE_ACK; - reply.content.value = (uint32_t)res; - msg_reply(&msg, &reply); - break; - case GNRC_NETAPI_MSG_TYPE_GET: - /* read incoming options */ - opt = msg.content.ptr; - DEBUG("gnrc_netdev: GNRC_NETAPI_MSG_TYPE_GET received. opt=%s\n", - netopt2str(opt->opt)); - /* get option from device driver */ - res = dev->driver->get(dev, opt->opt, opt->data, opt->data_len); - DEBUG("gnrc_netdev: response of netdev->get: %i\n", res); - /* send reply to calling thread */ - reply.type = GNRC_NETAPI_MSG_TYPE_ACK; - reply.content.value = (uint32_t)res; - msg_reply(&msg, &reply); - break; - default: - DEBUG("gnrc_netdev: Unknown command %" PRIu16 "\n", msg.type); - break; - } - } - /* never reached */ - return NULL; -} - -kernel_pid_t gnrc_netdev_init(char *stack, int stacksize, char priority, - const char *name, gnrc_netdev_t *gnrc_netdev) -{ - kernel_pid_t res; - - /* check if given netdev device is defined and the driver is set */ - if (gnrc_netdev == NULL || gnrc_netdev->dev == NULL) { - return -ENODEV; - } - - /* create new gnrc_netdev thread */ - res = thread_create(stack, stacksize, priority, THREAD_CREATE_STACKTEST, - _gnrc_netdev_thread, (void *)gnrc_netdev, name); - if (res <= 0) { - return -EINVAL; - } - - return res; -} diff --git a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_eth.c b/sys/net/gnrc/link_layer/netdev/gnrc_netdev_eth.c deleted file mode 100644 index cb532e16b037d0436d26269aa6835bab7f70a093..0000000000000000000000000000000000000000 --- a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_eth.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de> - * - * 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 net - * @file - * @brief gnrc netdev ethernet glue code - * - * @author Kaspar Schleiser <kaspar@schleiser.de> - * @} - */ - -#include "net/gnrc.h" -#include "net/gnrc/netdev.h" -#include "net/ethernet/hdr.h" - -#ifdef MODULE_GNRC_IPV6 -#include "net/ipv6/hdr.h" -#endif - -#include "od.h" - -#define ENABLE_DEBUG (0) -#include "debug.h" - -static gnrc_pktsnip_t *_recv(gnrc_netdev_t *gnrc_netdev) -{ - netdev_t *dev = gnrc_netdev->dev; - int bytes_expected = dev->driver->recv(dev, NULL, 0, NULL); - gnrc_pktsnip_t *pkt = NULL; - - if (bytes_expected > 0) { - pkt = gnrc_pktbuf_add(NULL, NULL, - bytes_expected, - GNRC_NETTYPE_UNDEF); - - if(!pkt) { - DEBUG("_recv_ethernet_packet: cannot allocate pktsnip.\n"); - - /* drop the packet */ - dev->driver->recv(dev, NULL, bytes_expected, NULL); - - goto out; - } - - int nread = dev->driver->recv(dev, pkt->data, bytes_expected, NULL); - if(nread <= 0) { - DEBUG("_recv_ethernet_packet: read error.\n"); - goto safe_out; - } - - if (nread < bytes_expected) { - /* we've got less then the expected packet size, - * so free the unused space.*/ - - DEBUG("_recv_ethernet_packet: reallocating.\n"); - gnrc_pktbuf_realloc_data(pkt, nread); - } - - /* mark ethernet header */ - gnrc_pktsnip_t *eth_hdr = gnrc_pktbuf_mark(pkt, sizeof(ethernet_hdr_t), GNRC_NETTYPE_UNDEF); - if (!eth_hdr) { - DEBUG("gnrc_netdev_eth: no space left in packet buffer\n"); - goto safe_out; - } - - ethernet_hdr_t *hdr = (ethernet_hdr_t *)eth_hdr->data; - -#ifdef MODULE_L2FILTER - if (!l2filter_pass(dev->filter, hdr->src, ETHERNET_ADDR_LEN)) { - DEBUG("gnrc_netdev_eth: incoming packet filtered by l2filter\n"); - goto safe_out; - } -#endif - - /* set payload type from ethertype */ - pkt->type = gnrc_nettype_from_ethertype(byteorder_ntohs(hdr->type)); - - /* create netif header */ - gnrc_pktsnip_t *netif_hdr; - netif_hdr = gnrc_pktbuf_add(NULL, NULL, - sizeof(gnrc_netif_hdr_t) + (2 * ETHERNET_ADDR_LEN), - GNRC_NETTYPE_NETIF); - - if (netif_hdr == NULL) { - DEBUG("gnrc_netdev_eth: no space left in packet buffer\n"); - pkt = eth_hdr; - goto safe_out; - } - - gnrc_netif_hdr_init(netif_hdr->data, ETHERNET_ADDR_LEN, ETHERNET_ADDR_LEN); - gnrc_netif_hdr_set_src_addr(netif_hdr->data, hdr->src, ETHERNET_ADDR_LEN); - gnrc_netif_hdr_set_dst_addr(netif_hdr->data, hdr->dst, ETHERNET_ADDR_LEN); - ((gnrc_netif_hdr_t *)netif_hdr->data)->if_pid = thread_getpid(); - - DEBUG("gnrc_netdev_eth: received packet from %02x:%02x:%02x:%02x:%02x:%02x " - "of length %d\n", - hdr->src[0], hdr->src[1], hdr->src[2], hdr->src[3], hdr->src[4], - hdr->src[5], nread); -#if defined(MODULE_OD) && ENABLE_DEBUG - od_hex_dump(hdr, nread, OD_WIDTH_DEFAULT); -#endif - - gnrc_pktbuf_remove_snip(pkt, eth_hdr); - LL_APPEND(pkt, netif_hdr); - } - -out: - return pkt; - -safe_out: - gnrc_pktbuf_release(pkt); - return NULL; -} - -static inline void _addr_set_broadcast(uint8_t *dst) -{ - memset(dst, 0xff, ETHERNET_ADDR_LEN); -} - -static inline void _addr_set_multicast(uint8_t *dst, gnrc_pktsnip_t *payload) -{ - switch (payload->type) { -#ifdef MODULE_GNRC_IPV6 - case GNRC_NETTYPE_IPV6: - /* https://tools.ietf.org/html/rfc2464#section-7 */ - dst[0] = 0x33; - dst[1] = 0x33; - ipv6_hdr_t *ipv6 = payload->data; - memcpy(dst + 2, ipv6->dst.u8 + 12, 4); - break; -#endif - default: - _addr_set_broadcast(dst); - break; - } -} - -static int _send(gnrc_netdev_t *gnrc_netdev, gnrc_pktsnip_t *pkt) -{ - ethernet_hdr_t hdr; - gnrc_netif_hdr_t *netif_hdr; - gnrc_pktsnip_t *payload; - int res; - - netdev_t *dev = gnrc_netdev->dev; - - if (pkt == NULL) { - DEBUG("gnrc_netdev_eth: pkt was NULL\n"); - return -EINVAL; - } - - payload = pkt->next; - - if (pkt->type != GNRC_NETTYPE_NETIF) { - DEBUG("gnrc_netdev_eth: First header was not generic netif header\n"); - return -EBADMSG; - } - - if (payload) { - hdr.type = byteorder_htons(gnrc_nettype_to_ethertype(payload->type)); - } - else { - hdr.type = byteorder_htons(ETHERTYPE_UNKNOWN); - } - - netif_hdr = pkt->data; - - /* set ethernet header */ - if (netif_hdr->src_l2addr_len == ETHERNET_ADDR_LEN) { - memcpy(hdr.dst, gnrc_netif_hdr_get_src_addr(netif_hdr), - netif_hdr->src_l2addr_len); - } - else { - dev->driver->get(dev, NETOPT_ADDRESS, hdr.src, ETHERNET_ADDR_LEN); - } - - if (netif_hdr->flags & GNRC_NETIF_HDR_FLAGS_BROADCAST) { - _addr_set_broadcast(hdr.dst); - } - else if (netif_hdr->flags & GNRC_NETIF_HDR_FLAGS_MULTICAST) { - if (payload == NULL) { - DEBUG("gnrc_netdev_eth: empty multicast packets over Ethernet "\ - "are not yet supported\n"); - return -ENOTSUP; - } - _addr_set_multicast(hdr.dst, payload); - } - else if (netif_hdr->dst_l2addr_len == ETHERNET_ADDR_LEN) { - memcpy(hdr.dst, gnrc_netif_hdr_get_dst_addr(netif_hdr), - ETHERNET_ADDR_LEN); - } - else { - DEBUG("gnrc_netdev_eth: destination address had unexpected format\n"); - return -EBADMSG; - } - - DEBUG("gnrc_netdev_eth: send to %02x:%02x:%02x:%02x:%02x:%02x\n", - hdr.dst[0], hdr.dst[1], hdr.dst[2], - hdr.dst[3], hdr.dst[4], hdr.dst[5]); - - size_t n; - payload = gnrc_pktbuf_get_iovec(pkt, &n); /* use payload as temporary - * variable */ - res = -ENOBUFS; - if (payload != NULL) { - pkt = payload; /* reassign for later release; vec_snip is prepended to pkt */ - struct iovec *vector = (struct iovec *)pkt->data; - vector[0].iov_base = (char*)&hdr; - vector[0].iov_len = sizeof(ethernet_hdr_t); -#ifdef MODULE_NETSTATS_L2 - if ((netif_hdr->flags & GNRC_NETIF_HDR_FLAGS_BROADCAST) || - (netif_hdr->flags & GNRC_NETIF_HDR_FLAGS_MULTICAST)) { - gnrc_netdev->dev->stats.tx_mcast_count++; - } - else { - gnrc_netdev->dev->stats.tx_unicast_count++; - } -#endif - res = dev->driver->send(dev, vector, n); - } - - gnrc_pktbuf_release(pkt); - - return res; -} - -int gnrc_netdev_eth_init(gnrc_netdev_t *gnrc_netdev, netdev_t *dev) -{ - gnrc_netdev->send = _send; - gnrc_netdev->recv = _recv; - gnrc_netdev->dev = dev; - - return 0; -} diff --git a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_ieee802154.c b/sys/net/gnrc/link_layer/netdev/gnrc_netdev_ieee802154.c deleted file mode 100644 index 8ae60a8f1fdd9004cd7605b8088458e8af9cf568..0000000000000000000000000000000000000000 --- a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_ieee802154.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * 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 <stddef.h> - -#include "od.h" -#include "net/l2filter.h" -#include "net/gnrc.h" -#include "net/ieee802154.h" - -#include "net/gnrc/netdev/ieee802154.h" - -#define ENABLE_DEBUG (0) -#include "debug.h" - -static gnrc_pktsnip_t *_recv(gnrc_netdev_t *gnrc_netdev); -static int _send(gnrc_netdev_t *gnrc_netdev, gnrc_pktsnip_t *pkt); - -int gnrc_netdev_ieee802154_init(gnrc_netdev_t *gnrc_netdev, - netdev_ieee802154_t *dev) -{ - gnrc_netdev->send = _send; - gnrc_netdev->recv = _recv; - gnrc_netdev->dev = (netdev_t *)dev; - - return 0; -} - -static gnrc_pktsnip_t *_make_netif_hdr(uint8_t *mhr) -{ - gnrc_pktsnip_t *snip; - uint8_t src[IEEE802154_LONG_ADDRESS_LEN], dst[IEEE802154_LONG_ADDRESS_LEN]; - int src_len, dst_len; - le_uint16_t _pan_tmp; /* TODO: hand-up PAN IDs to GNRC? */ - - dst_len = ieee802154_get_dst(mhr, dst, &_pan_tmp); - src_len = ieee802154_get_src(mhr, src, &_pan_tmp); - if ((dst_len < 0) || (src_len < 0)) { - DEBUG("_make_netif_hdr: unable to get addresses\n"); - return NULL; - } - /* allocate space for header */ - snip = gnrc_netif_hdr_build(src, (size_t)src_len, dst, (size_t)dst_len); - if (snip == NULL) { - DEBUG("_make_netif_hdr: no space left in packet buffer\n"); - return NULL; - } - /* set broadcast flag for broadcast destination */ - if ((dst_len == 2) && (dst[0] == 0xff) && (dst[1] == 0xff)) { - gnrc_netif_hdr_t *hdr = snip->data; - hdr->flags |= GNRC_NETIF_HDR_FLAGS_BROADCAST; - } - return snip; -} - -static gnrc_pktsnip_t *_recv(gnrc_netdev_t *gnrc_netdev) -{ - netdev_t *netdev = gnrc_netdev->dev; - netdev_ieee802154_rx_info_t rx_info; - netdev_ieee802154_t *state = (netdev_ieee802154_t *)gnrc_netdev->dev; - gnrc_pktsnip_t *pkt = NULL; - int bytes_expected = netdev->driver->recv(netdev, NULL, 0, NULL); - - if (bytes_expected > 0) { - int nread; - - pkt = gnrc_pktbuf_add(NULL, NULL, bytes_expected, GNRC_NETTYPE_UNDEF); - if (pkt == NULL) { - DEBUG("_recv_ieee802154: cannot allocate pktsnip.\n"); - return NULL; - } - nread = netdev->driver->recv(netdev, pkt->data, bytes_expected, &rx_info); - if (nread <= 0) { - gnrc_pktbuf_release(pkt); - return NULL; - } - if (!(state->flags & NETDEV_IEEE802154_RAW)) { - gnrc_pktsnip_t *ieee802154_hdr, *netif_hdr; - gnrc_netif_hdr_t *hdr; -#if ENABLE_DEBUG - char src_str[GNRC_NETIF_HDR_L2ADDR_PRINT_LEN]; -#endif - size_t mhr_len = ieee802154_get_frame_hdr_len(pkt->data); - - if (mhr_len == 0) { - DEBUG("_recv_ieee802154: illegally formatted frame received\n"); - gnrc_pktbuf_release(pkt); - return NULL; - } - nread -= mhr_len; - /* mark IEEE 802.15.4 header */ - ieee802154_hdr = gnrc_pktbuf_mark(pkt, mhr_len, GNRC_NETTYPE_UNDEF); - if (ieee802154_hdr == NULL) { - DEBUG("_recv_ieee802154: no space left in packet buffer\n"); - gnrc_pktbuf_release(pkt); - return NULL; - } - netif_hdr = _make_netif_hdr(ieee802154_hdr->data); - if (netif_hdr == NULL) { - DEBUG("_recv_ieee802154: no space left in packet buffer\n"); - gnrc_pktbuf_release(pkt); - return NULL; - } - - hdr = netif_hdr->data; - -#ifdef MODULE_L2FILTER - if (!l2filter_pass(netdev->filter, gnrc_netif_hdr_get_src_addr(hdr), - hdr->src_l2addr_len)) { - gnrc_pktbuf_release(pkt); - gnrc_pktbuf_release(netif_hdr); - DEBUG("_recv_ieee802154: packet dropped by l2filter\n"); - return NULL; - } -#endif - - hdr->lqi = rx_info.lqi; - hdr->rssi = rx_info.rssi; - hdr->if_pid = thread_getpid(); - pkt->type = state->proto; -#if ENABLE_DEBUG - DEBUG("_recv_ieee802154: received packet from %s of length %u\n", - gnrc_netif_addr_to_str(src_str, sizeof(src_str), - gnrc_netif_hdr_get_src_addr(hdr), - hdr->src_l2addr_len), - nread); -#if defined(MODULE_OD) - od_hex_dump(pkt->data, nread, OD_WIDTH_DEFAULT); -#endif -#endif - gnrc_pktbuf_remove_snip(pkt, ieee802154_hdr); - LL_APPEND(pkt, netif_hdr); - } - - DEBUG("_recv_ieee802154: reallocating.\n"); - gnrc_pktbuf_realloc_data(pkt, nread); - } - - return pkt; -} - -static int _send(gnrc_netdev_t *gnrc_netdev, gnrc_pktsnip_t *pkt) -{ - netdev_t *netdev = gnrc_netdev->dev; - netdev_ieee802154_t *state = (netdev_ieee802154_t *)gnrc_netdev->dev; - gnrc_netif_hdr_t *netif_hdr; - gnrc_pktsnip_t *vec_snip; - const uint8_t *src, *dst = NULL; - int res = 0; - size_t n, src_len, dst_len; - uint8_t mhr[IEEE802154_MAX_HDR_LEN]; - uint8_t flags = (uint8_t)(state->flags & NETDEV_IEEE802154_SEND_MASK); - le_uint16_t dev_pan = byteorder_btols(byteorder_htons(state->pan)); - - flags |= IEEE802154_FCF_TYPE_DATA; - if (pkt == NULL) { - DEBUG("_send_ieee802154: pkt was NULL\n"); - return -EINVAL; - } - if (pkt->type != GNRC_NETTYPE_NETIF) { - DEBUG("_send_ieee802154: first header is not generic netif header\n"); - return -EBADMSG; - } - netif_hdr = pkt->data; - /* prepare destination address */ - if (netif_hdr->flags & /* If any of these flags is set so this is correct */ - (GNRC_NETIF_HDR_FLAGS_BROADCAST | GNRC_NETIF_HDR_FLAGS_MULTICAST)) { - dst = ieee802154_addr_bcast; - dst_len = IEEE802154_ADDR_BCAST_LEN; - } - else { - dst = gnrc_netif_hdr_get_dst_addr(netif_hdr); - dst_len = netif_hdr->dst_l2addr_len; - } - src_len = netif_hdr->src_l2addr_len; - if (src_len > 0) { - src = gnrc_netif_hdr_get_src_addr(netif_hdr); - } - else if (state->flags & NETDEV_IEEE802154_SRC_MODE_LONG) { - src_len = IEEE802154_LONG_ADDRESS_LEN; - src = state->long_addr; - } - else { - src_len = IEEE802154_SHORT_ADDRESS_LEN; - src = state->short_addr; - } - /* fill MAC header, seq should be set by device */ - if ((res = ieee802154_set_frame_hdr(mhr, src, src_len, - dst, dst_len, dev_pan, - dev_pan, flags, state->seq++)) == 0) { - DEBUG("_send_ieee802154: Error preperaring frame\n"); - return -EINVAL; - } - /* prepare packet for sending */ - vec_snip = gnrc_pktbuf_get_iovec(pkt, &n); - if (vec_snip != NULL) { - struct iovec *vector; - - pkt = vec_snip; /* reassign for later release; vec_snip is prepended to pkt */ - vector = (struct iovec *)pkt->data; - vector[0].iov_base = mhr; - vector[0].iov_len = (size_t)res; -#ifdef MODULE_NETSTATS_L2 - if (netif_hdr->flags & - (GNRC_NETIF_HDR_FLAGS_BROADCAST | GNRC_NETIF_HDR_FLAGS_MULTICAST)) { - gnrc_netdev->dev->stats.tx_mcast_count++; - } - else { - gnrc_netdev->dev->stats.tx_unicast_count++; - } -#endif -#ifdef MODULE_GNRC_MAC - if (gnrc_netdev->mac_info & GNRC_NETDEV_MAC_INFO_CSMA_ENABLED) { - res = csma_sender_csma_ca_send(netdev, vector, n, &gnrc_netdev->csma_conf); - } - else { - res = netdev->driver->send(netdev, vector, n); - } -#else - res = netdev->driver->send(netdev, vector, n); -#endif - } - else { - return -ENOBUFS; - } - /* release old data */ - gnrc_pktbuf_release(pkt); - return res; -} - -/** @} */ diff --git a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_raw.c b/sys/net/gnrc/link_layer/netdev/gnrc_netdev_raw.c deleted file mode 100644 index cecfdd089efe1b1b578628223725418afc2f7bef..0000000000000000000000000000000000000000 --- a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_raw.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2017 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 "net/gnrc/netdev/raw.h" - -#define ENABLE_DEBUG (0) -#include "debug.h" - -#define IP_VERSION_MASK (0xf0) -#define IP_VERSION4 (0x40) -#define IP_VERSION6 (0x60) - -static gnrc_pktsnip_t *_recv(gnrc_netdev_t *gnrc_netdev) -{ - netdev_t *dev = gnrc_netdev->dev; - int bytes_expected = dev->driver->recv(dev, NULL, 0, NULL); - gnrc_pktsnip_t *pkt = NULL; - - if (bytes_expected > 0) { - int nread; - - pkt = gnrc_pktbuf_add(NULL, NULL, bytes_expected, GNRC_NETTYPE_UNDEF); - - if (!pkt) { - DEBUG("gnrc_netdev_raw: cannot allocate pktsnip.\n"); - /* drop packet */ - dev->driver->recv(dev, NULL, bytes_expected, NULL); - return pkt; - } - nread = dev->driver->recv(dev, pkt->data, bytes_expected, NULL); - if (nread <= 0) { - DEBUG("gnrc_netdev_raw: read error.\n"); - gnrc_pktbuf_release(pkt); - return NULL; - } - if (nread < bytes_expected) { - /* we've got less then the expected packet size, - * so free the unused space.*/ - DEBUG("gnrc_netdev_raw: reallocating.\n"); - gnrc_pktbuf_realloc_data(pkt, nread); - } - switch (((uint8_t *)pkt->data)[0] & IP_VERSION_MASK) { -#ifdef MODULE_GNRC_IPV6 - case IP_VERSION6: - pkt->type = GNRC_NETTYPE_IPV6; - break; -#endif - default: - /* leave UNDEF */ - break; - } - } - return pkt; -} - -static int _send(gnrc_netdev_t *gnrc_netdev, gnrc_pktsnip_t *pkt) -{ - gnrc_pktsnip_t *vector; - int res = -ENOBUFS; - size_t n; - - if (pkt->type == GNRC_NETTYPE_NETIF) { - /* we don't need the netif snip: remove it */ - pkt = gnrc_pktbuf_remove_snip(pkt, pkt); - } - vector = gnrc_pktbuf_get_iovec(pkt, &n); - if (vector != NULL) { - struct iovec *v = (struct iovec *)vector->data; - netdev_t *dev = gnrc_netdev->dev; - -#ifdef MODULE_NETSTATS_L2 - gnrc_netdev->dev->stats.tx_unicast_count++; -#endif - res = dev->driver->send(dev, v, n); - } - return res; -} - -int gnrc_netdev_raw_init(gnrc_netdev_t *gnrc_netdev, netdev_t *dev) -{ - gnrc_netdev->send = _send; - gnrc_netdev->recv = _recv; - gnrc_netdev->dev = dev; - - return 0; -} -/** @} */ diff --git a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_xbee.c b/sys/net/gnrc/link_layer/netdev/gnrc_netdev_xbee.c deleted file mode 100644 index 3f06d32becee845831cb8636aad1be7c56281286..0000000000000000000000000000000000000000 --- a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_xbee.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * 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 net_gnrc - * @{ - * - * @file - * @brief GNRC to netdev adapter for XBee devices - * - * @author Hauke Petersen <hauke.petersen@fu-berlin.de> - * - * @} - */ - -#include "assert.h" -#include "xbee.h" -#include "net/gnrc.h" -#include "net/gnrc/netdev/xbee_adpt.h" - -#define ENABLE_DEBUG (0) -#include "debug.h" - -#define BCAST (GNRC_NETIF_HDR_FLAGS_BROADCAST | GNRC_NETIF_HDR_FLAGS_MULTICAST) - -static gnrc_pktsnip_t *xbee_adpt_recv(gnrc_netdev_t *gnrc_netdev) -{ - netdev_t *dev = gnrc_netdev->dev; - int pktlen; - int xhdr_len; - gnrc_pktsnip_t *payload; - gnrc_pktsnip_t *netif_snip; - gnrc_pktsnip_t *xhdr_snip; - gnrc_netif_hdr_t *netif; - xbee_l2hdr_t l2hdr; - - assert(dev); - - /* see how much data there is to process */ - pktlen = dev->driver->recv(dev, NULL, 0, NULL); - if (pktlen <= 0) { - DEBUG("[xbee-gnrc] recv: no data available to process\n"); - return NULL; - } - - /* allocate space for the packet in the pktbuf */ - payload = gnrc_pktbuf_add(NULL, NULL, pktlen, XBEE_DEFAULT_PROTOCOL); - if (payload == NULL) { - DEBUG("[xbee-gnrc] recv: unable to allocate space in the pktbuf\n"); - /* tell the driver to drop the packet */ - dev->driver->recv(dev, NULL, 1, NULL); - return NULL; - } - - /* copy the complete including the XBee header into the packet buffer */ - dev->driver->recv(dev, payload->data, pktlen, NULL); - - /* try to parse the L2 header data from the XBee header */ - xhdr_len = xbee_parse_hdr((xbee_t *)dev, (uint8_t *)payload->data, &l2hdr); - if (xhdr_len < 0) { - DEBUG("[xbee-gnrc] recv: unable to parse XBee header\n"); - gnrc_pktbuf_release(payload); - return NULL; - } - - /* crop the XBee header from the payload */ - xhdr_snip = gnrc_pktbuf_mark(payload, xhdr_len, GNRC_NETTYPE_UNDEF); - if (xhdr_snip == NULL) { - DEBUG("[xbee-gnrc] recv: unable to mark XBee header snip\n"); - gnrc_pktbuf_release(payload); - return NULL; - } - gnrc_pktbuf_remove_snip(payload, xhdr_snip); - - /* create a netif hdr from the obtained data */ - netif_snip = gnrc_netif_hdr_build(l2hdr.src_addr, l2hdr.addr_len, - l2hdr.dst_addr, l2hdr.addr_len); - if (netif_snip == NULL) { - DEBUG("[xbee-gnrc] recv: unable to allocate netif header\n"); - gnrc_pktbuf_release(payload); - return NULL; - } - netif = (gnrc_netif_hdr_t *)netif_snip->data; - netif->if_pid = gnrc_netdev->pid; - netif->rssi = l2hdr.rssi; - if (l2hdr.bcast) { - netif->flags = GNRC_NETIF_HDR_FLAGS_BROADCAST; - } - - DEBUG("[xbee-gnrc] recv: successfully parsed packet\n"); - - /* and append the netif header */ - LL_APPEND(payload, netif_snip); - - return payload; -} - -static int xbee_adpt_send(gnrc_netdev_t *dev, gnrc_pktsnip_t *pkt) -{ - int res; - size_t size; - size_t count; - gnrc_pktsnip_t *vec; - gnrc_netif_hdr_t *hdr; - uint8_t xhdr[XBEE_MAX_TXHDR_LENGTH]; - - /* check device descriptor and packet */ - assert(dev && pkt); - - /* get the payload size and the dst address details */ - size = gnrc_pkt_len(pkt->next); - DEBUG("[xbee-gnrc] send: payload of packet is %i\n", (int)size); - hdr = (gnrc_netif_hdr_t *)pkt->data; - if (hdr->flags & BCAST) { - uint16_t addr = 0xffff; - res = xbee_build_hdr((xbee_t *)dev, xhdr, size, &addr, 2); - DEBUG("[xbee-gnrc] send: preparing to send broadcast\n"); - } - else { - uint8_t *addr = gnrc_netif_hdr_get_dst_addr(hdr); - res = xbee_build_hdr((xbee_t *)dev, xhdr, size, addr, hdr->dst_l2addr_len); - if (res < 0) { - if (res == -EOVERFLOW) { - DEBUG("[xbee-gnrc] send: payload length exceeds max limit\n"); - } - else if (res == -ENOMSG) { - DEBUG("[xbee-gnrc] send: invalid destination l2 address\n"); - } - return res; - } - if (hdr->dst_l2addr_len == IEEE802154_SHORT_ADDRESS_LEN) { - DEBUG("[xbee-gnrc] send: preparing to send unicast to %02x:%02x\n", - (int)addr[0], (int)addr[1]); - } - else { - DEBUG("[xbee-gnrc] send: preparing to send unicast to " - "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - (int)addr[0], (int)addr[1], (int)addr[2], (int)addr[3], - (int)addr[4], (int)addr[5], (int)addr[6], (int)addr[7]); - } - } - - /* now let's extract the iovector and send out the stuff */ - vec = gnrc_pktbuf_get_iovec(pkt, &count); - if (vec != NULL) { - pkt = vec; - struct iovec *vector = (struct iovec *)pkt->data; - vector[0].iov_base = xhdr; - vector[0].iov_len = res; -#ifdef MODULE_NETSTATS_L2 - if (hdr->flags & BCAST) { - dev->dev->stats.tx_mcast_count++; - } - else { - dev->dev->stats.tx_unicast_count++; - } -#endif - DEBUG("[xbee-gnrc] send: triggering the drivers send function\n"); - res = dev->dev->driver->send(dev->dev, vector, count); - } - else { - DEBUG("[xbee-gnrc] send: unable to create iovec\n"); - } - - gnrc_pktbuf_release(pkt); - - return res; -} - -void gnrc_netdev_xbee_init(gnrc_netdev_t *gnrc_netdev, xbee_t *dev) -{ - assert(gnrc_netdev && dev); - - gnrc_netdev->send = xbee_adpt_send; - gnrc_netdev->recv = xbee_adpt_recv; - gnrc_netdev->dev = (netdev_t *)dev; -} diff --git a/tests/driver_sx127x/main.c b/tests/driver_sx127x/main.c index 180647a422239bda6f46a3849a8c191ddf33cfbc..79d1ab1792548a195dfc8066865abe4e49993f85 100644 --- a/tests/driver_sx127x/main.c +++ b/tests/driver_sx127x/main.c @@ -20,6 +20,7 @@ * @} */ +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -29,7 +30,6 @@ #include "shell.h" #include "shell_commands.h" -#include "net/gnrc/netdev.h" #include "net/netdev.h" #include "net/lora.h"