diff --git a/sys/include/net/gnrc/mac/types.h b/sys/include/net/gnrc/mac/types.h new file mode 100644 index 0000000000000000000000000000000000000000..dffcadb1433864bccb308d88545439661b684763 --- /dev/null +++ b/sys/include/net/gnrc/mac/types.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015 Daniel Krebs + * + * + * 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_mac A common MAC type for providing key MAC parameters and helper functions + * @ingroup net + * @brief A common MAC type for providing key MAC parameters and helper functions. + * @{ + * + * @file + * @brief Internal types used by the GNRC_MAC entities + * + * @author Daniel Krebs <github@daniel-krebs.net> + * @author Shuguo Zhuo <shuguo.zhuo@inria.fr> + */ + +#ifndef GNRC_MAC_TYPES_H_ +#define GNRC_MAC_TYPES_H_ + +#include <stdint.h> +#include <stdbool.h> +#include <kernel_types.h> +#include <xtimer.h> +#include <net/netdev2.h> +#include <net/gnrc/netdev2.h> +#include <net/gnrc.h> + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief definition for device transmission feedback types + */ +typedef enum { + TX_FEEDBACK_UNDEF = 0, /* Transmission just start, no Tx feedback yet */ + TX_FEEDBACK_SUCCESS, /* Transmission succeeded */ + TX_FEEDBACK_NOACK, /* No ACK for the transmitted packet */ + TX_FEEDBACK_BUSY /* found medium busy when doing transmission */ +} gnrc_mac_tx_feedback_t; + +#ifdef __cplusplus +} +#endif + +#endif /* GNRC_MAC_TYPES_H_ */ +/** @} */ diff --git a/sys/include/net/gnrc/netdev2.h b/sys/include/net/gnrc/netdev2.h index 32d02f38447ceb39c1f928e6801c597f39587e4b..98d1fa07c9556de28293db051d9a73f934a2d4d0 100644 --- a/sys/include/net/gnrc/netdev2.h +++ b/sys/include/net/gnrc/netdev2.h @@ -29,9 +29,13 @@ #ifndef GNRC_NETDEV2_H #define GNRC_NETDEV2_H +#include <assert.h> +#include <stdint.h> + #include "kernel_types.h" #include "net/netdev2.h" #include "net/gnrc.h" +#include "net/gnrc/mac/types.h" #ifdef __cplusplus extern "C" { @@ -46,6 +50,17 @@ extern "C" { */ #define NETDEV2_MSG_TYPE_EVENT 0x1234 +/** + * @brief Mask for @ref gnrc_mac_tx_feedback_t + */ +#define GNRC_NETDEV2_MAC_INFO_TX_FEEDBACK_MASK (0x0003U) + +/** + * @brief Flag to track if a transmission might have corrupted a received + * packet + */ +#define GNRC_NETDEV2_MAC_INFO_RX_STARTED (0x0004U) + /** * @brief Structure holding GNRC netdev2 adapter state * @@ -81,8 +96,82 @@ typedef struct gnrc_netdev2 { * @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; +#endif } gnrc_netdev2_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 netdev2 device + * + * @return the rx_started state + */ +static inline bool gnrc_netdev2_get_rx_started(gnrc_netdev2_t *dev) +{ + return (dev->mac_info & GNRC_NETDEV2_MAC_INFO_RX_STARTED); +} + +/** + * @brief set the rx_started state of the device + * + * This function is intended to be called only in netdev2_t::event_callback(). + * + * @param[in] dev ptr to netdev2 device + * + */ +static inline void gnrc_netdev2_set_rx_started(gnrc_netdev2_t *dev, bool rx_started) +{ + if (rx_started) { + dev->mac_info |= GNRC_NETDEV2_MAC_INFO_RX_STARTED; + } + else { + dev->mac_info &= ~GNRC_NETDEV2_MAC_INFO_RX_STARTED; + } +} + +/** + * @brief get the transmission feedback of the device + * + * @param[in] dev ptr to netdev2 device + * + * @return the transmission feedback + */ +static inline gnrc_mac_tx_feedback_t gnrc_netdev2_get_tx_feedback(gnrc_netdev2_t *dev) +{ + return (gnrc_mac_tx_feedback_t)(dev->mac_info & + GNRC_NETDEV2_MAC_INFO_TX_FEEDBACK_MASK); +} + +/** + * @brief set the transmission feedback of the device + * + * This function is intended to be called only in netdev2_t::event_callback(). + * + * @param[in] dev ptr to netdev2 device + * + */ +static inline void gnrc_netdev2_set_tx_feedback(gnrc_netdev2_t *dev, + gnrc_mac_tx_feedback_t txf) +{ + /* check if gnrc_mac_tx_feedback does not collide with + * GNRC_NETDEV2_MAC_INFO_RX_STARTED */ + assert(txf & GNRC_NETDEV2_MAC_INFO_RX_STARTED); + /* unset previous value */ + dev->mac_info &= ~GNRC_NETDEV2_MAC_INFO_TX_FEEDBACK_MASK; + dev->mac_info |= (uint16_t)(txf & GNRC_NETDEV2_MAC_INFO_TX_FEEDBACK_MASK); +} +#endif + /** * @brief Initialize GNRC netdev2 handler thread *