-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #11263 from miri64/gnrc_netif/new/pktq
gnrc_netif: add packet to queue when device is busy
- Loading branch information
Showing
15 changed files
with
636 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
/* | ||
* Copyright (C) 2019-20 Freie Universität Berlin | ||
* | ||
* This file is subject to the terms and conditions of the GNU Lesser | ||
* General Public License v2.1. See the file LICENSE in the top level | ||
* directory for more details. | ||
*/ | ||
|
||
/** | ||
* @defgroup net_gnrc_netif_pktq Send queue for @ref net_gnrc_netif | ||
* @ingroup net_gnrc_netif | ||
* @brief | ||
* @{ | ||
* | ||
* @file | ||
* @brief @ref net_gnrc_netif_pktq definitions | ||
* | ||
* @author Martine S. Lenders <[email protected]> | ||
*/ | ||
#ifndef NET_GNRC_NETIF_PKTQ_H | ||
#define NET_GNRC_NETIF_PKTQ_H | ||
|
||
#include <assert.h> | ||
#include <stdbool.h> | ||
|
||
#include "net/gnrc/netif.h" | ||
#include "net/gnrc/netif/pktq/type.h" | ||
#include "net/gnrc/pkt.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** | ||
* @brief Puts a packet into the packet send queue of a network interface | ||
* | ||
* @pre `netif != NULL` | ||
* @pre `pkt != NULL` | ||
* | ||
* @param[in] netif A network interface. May not be NULL. | ||
* @param[in] pkt A packet. May not be NULL. | ||
* | ||
* @return 0 on success | ||
* @return -1 when the pool of available gnrc_pktqueue_t entries (of size | ||
* @ref CONFIG_GNRC_NETIF_PKTQ_POOL_SIZE) is depleted | ||
*/ | ||
int gnrc_netif_pktq_put(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt); | ||
|
||
/** | ||
* @brief Gets a packet from the packet send queue of a network interface | ||
* | ||
* @pre `netif != NULL` | ||
* | ||
* @param[in] netif A network interface. May not be NULL. | ||
* | ||
* @return A packet on success | ||
* @return NULL when the queue is empty | ||
*/ | ||
static inline gnrc_pktsnip_t *gnrc_netif_pktq_get(gnrc_netif_t *netif) | ||
{ | ||
#if IS_USED(MODULE_GNRC_NETIF_PKTQ) | ||
assert(netif != NULL); | ||
|
||
gnrc_pktsnip_t *pkt = NULL; | ||
gnrc_pktqueue_t *entry = gnrc_pktqueue_remove_head( | ||
&netif->send_queue.queue | ||
); | ||
|
||
if (entry != NULL) { | ||
pkt = entry->pkt; | ||
entry->pkt = NULL; | ||
} | ||
return pkt; | ||
#else /* IS_USED(MODULE_GNRC_NETIF_PKTQ) */ | ||
(void)netif; | ||
return NULL; | ||
#endif /* IS_USED(MODULE_GNRC_NETIF_PKTQ) */ | ||
} | ||
|
||
/** | ||
* @brief Schedule a dequeue notification to network interface | ||
* | ||
* The notification will be scheduled in @ref CONFIG_GNRC_NETIF_PKTQ_TIMER_US | ||
* microseconds. | ||
* | ||
* @pre `netif != NULL` | ||
* | ||
* The signaling message can be used to send the next message in | ||
* gnrc_netif_pktq_t::queue. | ||
* | ||
* @param[in] netif A network interface. May not be NULL. | ||
*/ | ||
void gnrc_netif_pktq_sched_get(gnrc_netif_t *netif); | ||
|
||
/** | ||
* @brief Pushes a packet back to the head of the packet send queue of a | ||
* network interface | ||
* | ||
* @pre `netif != NULL` | ||
* @pre `pkt != NULL` | ||
* | ||
* @param[in] netif A network interface. May not be NULL. | ||
* @param[in] pkt A packet. May not be NULL. | ||
* | ||
* @return 0 on success | ||
* @return -1 when the pool of available gnrc_pktqueue_t entries (of size | ||
* @ref CONFIG_GNRC_NETIF_PKTQ_POOL_SIZE) is depleted | ||
*/ | ||
int gnrc_netif_pktq_push_back(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt); | ||
|
||
/** | ||
* @brief Check if a network interface's packet send queue is empty | ||
* | ||
* @pre `netif != NULL` | ||
* | ||
* @param[in] netif A network interface. May not be NULL. | ||
* | ||
* @return true, when the packet send queue of @p netif is empty | ||
* @return false, otherwise | ||
*/ | ||
static inline bool gnrc_netif_pktq_empty(gnrc_netif_t *netif) | ||
{ | ||
#if IS_USED(MODULE_GNRC_NETIF_PKTQ) | ||
assert(netif != NULL); | ||
|
||
return (netif->send_queue.queue == NULL); | ||
#else /* IS_USED(MODULE_GNRC_NETIF_PKTQ) */ | ||
(void)netif; | ||
return false; | ||
#endif /* IS_USED(MODULE_GNRC_NETIF_PKTQ) */ | ||
} | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* NET_GNRC_NETIF_PKTQ_H */ | ||
/** @} */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/* | ||
* Copyright (C) 2019-20 Freie Universität Berlin | ||
* | ||
* This file is subject to the terms and conditions of the GNU Lesser | ||
* General Public License v2.1. See the file LICENSE in the top level | ||
* directory for more details. | ||
*/ | ||
|
||
/** | ||
* @addtogroup net_gnrc_netif_pktq | ||
* @brief | ||
* @{ | ||
* | ||
* @file | ||
* @brief @ref net_gnrc_netif_pktq type definitions | ||
* | ||
* Contained in its own file, so the type can be included in | ||
* @ref gnrc_netif_t while the functions in net/gnrc/netif/pktq.h can use | ||
* @ref gnrc_netif_t as operating type. | ||
* | ||
* @author Martine S. Lenders <[email protected]> | ||
*/ | ||
#ifndef NET_GNRC_NETIF_PKTQ_TYPE_H | ||
#define NET_GNRC_NETIF_PKTQ_TYPE_H | ||
|
||
#include "net/gnrc/pktqueue.h" | ||
#include "xtimer.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** | ||
* @brief A packet queue for @ref net_gnrc_netif with a de-queue timer | ||
*/ | ||
typedef struct { | ||
gnrc_pktqueue_t *queue; /**< the actual packet queue class */ | ||
#if CONFIG_GNRC_NETIF_PKTQ_TIMER_US >= 0 | ||
msg_t dequeue_msg; /**< message for gnrc_netif_pktq_t::dequeue_timer to send */ | ||
xtimer_t dequeue_timer; /**< timer to schedule next sending of | ||
* queued packets */ | ||
#endif | ||
} gnrc_netif_pktq_t; | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* NET_GNRC_NETIF_PKTQ_TYPE_H */ | ||
/** @} */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.