/* * Copyright (c) 2016 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Private IEEE 802.15.4 low level L2 helper utilities * * These utilities are internal to the native IEEE 802.15.4 L2 * stack and must not be included and used elsewhere. * * All references to the spec refer to IEEE 802.15.4-2020. */ #ifndef __IEEE802154_PRIV_H__ #define __IEEE802154_PRIV_H__ #include #include #include /** * @brief Sends the given fragment respecting the configured IEEE 802.15.4 access arbitration * algorithm (CSMA/CA, ALOHA, etc.) and re-transmission protocol. See sections 6.2.5 (random * access methods) and 6.7.4.4 (retransmissions). * * This function checks for and supports both, software and hardware access arbitration and * acknowledgment depending on driver capabilities. * * @param iface A valid pointer on a network interface to send from * @param pkt A valid pointer on a packet to send * @param frag The fragment to be sent * * @return 0 on success, negative value otherwise */ int ieee802154_radio_send(struct net_if *iface, struct net_pkt *pkt, struct net_buf *frag); /** * @brief This function implements the configured channel access algorithm (CSMA/CA, ALOHA, * etc.). Currently only one implementation of this function may be compiled into the * source code. The implementation will be selected via Kconfig variables (see * @ref NET_L2_IEEE802154_RADIO_CSMA_CA and @ref NET_L2_IEEE802154_RADIO_ALOHA). * * This method will be called by ieee802154_radio_send() to determine if and when the * radio channel is clear to send. It blocks the thread during backoff if the selected * algorithm implements a backoff strategy. * * See sections 6.2.5 and 10.2.8. * * @param iface A valid pointer on a network interface to assesss * * @return 0 if the channel is clear to send, -EBUSY if a timeout was reached while waiting for * a clear channel, other negative values to signal internal error conditions. */ int ieee802154_wait_for_clear_channel(struct net_if *iface); /** * @brief Checks whether the given packet requires acknowledgment, and if so, prepares ACK * reception on the TX path, i.e. sets up the necessary internal state before a transmission. * * This function has side effects and must be called before each individual transmission * attempt. * * This function checks for and supports both, software and hardware acknowledgement, * depending on driver capabilities. * * See sections 6.7.4.1 through 6.7.4.3. * * @param iface A valid pointer on the network the packet will be transmitted to * @param pkt A valid pointer on a packet to send * @param frag The fragment that needs to be acknowledged * * @return true if the given packet requires acknowledgement, false otherwise. */ bool ieee802154_prepare_for_ack(struct net_if *iface, struct net_pkt *pkt, struct net_buf *frag); /** * @brief Waits for ACK reception on the TX path with standard compliant timeout settings, i.e. * listens for incoming packages with the correct attributes and sequence number, see * section 6.7.4.4 (retransmissions). * * This function has side effects and must be called after each transmission attempt if (and only * if) @ref ieee802154_prepare_for_ack() had been called before. * * This function checks for and supports both, software and hardware acknowledgement, depending on * driver capabilities. * * @param iface A valid pointer on the network the packet was transmitted to * @param ack_required The return value from the corresponding call to * @ref ieee802154_prepare_for_ack() * * @return 0 if no ACK was required or the expected ACK was received in time, -EIO if the expected * ACK was not received within the standard compliant timeout. */ int ieee802154_wait_for_ack(struct net_if *iface, bool ack_required); #endif /* __IEEE802154_PRIV_H__ */