diff --git a/Makefile.dep b/Makefile.dep index 31fbbaea22..45958925f6 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -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 diff --git a/sys/include/net/gnrc/netdev.h b/sys/include/net/gnrc/netdev.h index 4313aa7c92..c6882b53d3 100644 --- a/sys/include/net/gnrc/netdev.h +++ b/sys/include/net/gnrc/netdev.h @@ -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 diff --git a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_ieee802154.c b/sys/net/gnrc/link_layer/netdev/gnrc_netdev_ieee802154.c index 4c1c8ddf5a..8ae60a8f1f 100644 --- a/sys/net/gnrc/link_layer/netdev/gnrc_netdev_ieee802154.c +++ b/sys/net/gnrc/link_layer/netdev/gnrc_netdev_ieee802154.c @@ -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;