1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

gnrc_mac: use software csma when needed.

This commit is contained in:
zhuoshuguo 2017-06-08 11:49:40 +02:00
parent 1934ae15ad
commit 7565cd1d10
3 changed files with 33 additions and 0 deletions

View File

@ -13,6 +13,11 @@ ifneq (,$(filter csma_sender,$(USEMODULE)))
USEMODULE += xtimer
endif
ifneq (,$(filter gnrc_mac,$(USEMODULE)))
USEMODULE += gnrc_priority_pktqueue
USEMODULE += csma_sender
endif
ifneq (,$(filter nhdp,$(USEMODULE)))
USEMODULE += sock_udp
USEMODULE += xtimer

View File

@ -38,6 +38,9 @@
#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" {
@ -66,6 +69,17 @@ extern "C" {
*/
#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
*
@ -118,6 +132,11 @@ typedef struct gnrc_netdev {
*/
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

View File

@ -221,7 +221,16 @@ static int _send(gnrc_netdev_t *gnrc_netdev, gnrc_pktsnip_t *pkt)
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;