zephyr/subsys/net/l2/ieee802154/ieee802154_radio_aloha.c

67 lines
1.5 KiB
C

/*
* Copyright (c) 2016 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <logging/log.h>
LOG_MODULE_REGISTER(net_ieee802154_aloha, CONFIG_NET_L2_IEEE802154_LOG_LEVEL);
#include <net/net_core.h>
#include <net/net_if.h>
#include <errno.h>
#include "ieee802154_frame.h"
#include "ieee802154_utils.h"
#include "ieee802154_radio_utils.h"
static inline int aloha_radio_send(struct net_if *iface,
struct net_pkt *pkt,
struct net_buf *frag)
{
uint8_t retries = CONFIG_NET_L2_IEEE802154_RADIO_TX_RETRIES;
struct ieee802154_context *ctx = net_if_l2_data(iface);
bool ack_required = prepare_for_ack(ctx, pkt, frag);
int ret = -EIO;
NET_DBG("frag %p", frag);
while (retries) {
retries--;
ret = ieee802154_tx(iface, IEEE802154_TX_MODE_DIRECT,
pkt, frag);
if (ret) {
continue;
}
ret = wait_for_ack(iface, ack_required);
if (!ret) {
break;
}
}
return ret;
}
static enum net_verdict aloha_radio_handle_ack(struct net_if *iface,
struct net_pkt *pkt)
{
struct ieee802154_context *ctx = net_if_l2_data(iface);
if (IS_ENABLED(CONFIG_NET_L2_IEEE802154_RADIO_CSMA_CA) &&
ieee802154_get_hw_capabilities(iface) & IEEE802154_HW_CSMA) {
return NET_OK;
}
return handle_ack(ctx, pkt);
}
/* Declare the public Radio driver function used by the HW drivers */
FUNC_ALIAS(aloha_radio_send,
ieee802154_radio_send, int);
FUNC_ALIAS(aloha_radio_handle_ack,
ieee802154_radio_handle_ack, enum net_verdict);