Skip to content
Snippets Groups Projects
Commit 7565cd1d authored by zhuoshuguo's avatar zhuoshuguo
Browse files

gnrc_mac: use software csma when needed.

parent 1934ae15
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment