blob: 9099c3381db8fcf92ed6836aa3bb098b8e304243 [file] [log] [blame]
/*
* Copyright (c) 2016 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#if defined(CONFIG_NET_DEBUG_L2_IEEE802154)
#define SYS_LOG_DOMAIN "net/ieee802154"
#define NET_LOG_ENABLED 1
#endif
#include <net/net_core.h>
#include <net/net_if.h>
#include <errno.h>
#include <net/ieee802154_radio.h>
#include "ieee802154_frame.h"
#include "ieee802154_radio_utils.h"
static inline int aloha_tx_fragment(struct net_if *iface,
struct net_pkt *pkt,
struct net_buf *frag)
{
u8_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);
const struct ieee802154_radio_api *radio = iface->dev->driver_api;
int ret = -EIO;
NET_DBG("frag %p", frag);
while (retries) {
retries--;
ret = radio->tx(iface->dev, pkt, frag);
if (ret) {
continue;
}
ret = wait_for_ack(ctx, ack_required);
if (!ret) {
break;
}
}
return ret;
}
static int aloha_radio_send(struct net_if *iface, struct net_pkt *pkt)
{
NET_DBG("pkt %p (frags %p)", pkt, pkt->frags);
return tx_packet_fragments(iface, pkt, aloha_tx_fragment);
}
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);
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);