Loading...
Searching...
No Matches
lwmac_internal.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015 Daniel Krebs
3 * 2016 INRIA
4 *
5 * This file is subject to the terms and conditions of the GNU Lesser
6 * General Public License v2.1. See the file LICENSE in the top level
7 * directory for more details.
8 */
9
21#ifndef LWMAC_INTERNAL_H
22#define LWMAC_INTERNAL_H
23
24#include <stdint.h>
25
26#include "periph/rtt.h"
27#include "net/gnrc/netif.h"
28#include "net/gnrc/mac/types.h"
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
44#define GNRC_LWMAC_TX_CONTINUE (0x0008U)
45
56#define GNRC_LWMAC_QUIT_TX (0x0010U)
57
68#define GNRC_LWMAC_PHASE_BACKOFF (0x0020U)
69
81#define GNRC_LWMAC_QUIT_RX (0x0040U)
82
91
98#define GNRC_LWMAC_RTT_EVENT_MARGIN_TICKS (RTT_MS_TO_TICKS(2))
99
107static inline void gnrc_lwmac_set_tx_continue(gnrc_netif_t *netif, bool tx_continue)
108{
109 if (tx_continue) {
111 }
112 else {
113 netif->mac.mac_info &= ~GNRC_LWMAC_TX_CONTINUE;
114 }
115}
116
125static inline bool gnrc_lwmac_get_tx_continue(gnrc_netif_t *netif)
126{
127 return (netif->mac.mac_info & GNRC_LWMAC_TX_CONTINUE);
128}
129
137static inline void gnrc_lwmac_set_quit_tx(gnrc_netif_t *netif, bool quit_tx)
138{
139 if (quit_tx) {
141 }
142 else {
143 netif->mac.mac_info &= ~GNRC_LWMAC_QUIT_TX;
144 }
145}
146
155static inline bool gnrc_lwmac_get_quit_tx(gnrc_netif_t *netif)
156{
157 return (netif->mac.mac_info & GNRC_LWMAC_QUIT_TX);
158}
159
167static inline void gnrc_lwmac_set_phase_backoff(gnrc_netif_t *netif, bool backoff)
168{
169 if (backoff) {
171 }
172 else {
173 netif->mac.mac_info &= ~GNRC_LWMAC_PHASE_BACKOFF;
174 }
175}
176
186{
187 return (netif->mac.mac_info & GNRC_LWMAC_PHASE_BACKOFF);
188}
189
197static inline void gnrc_lwmac_set_quit_rx(gnrc_netif_t *netif, bool quit_rx)
198{
199 if (quit_rx) {
201 }
202 else {
203 netif->mac.mac_info &= ~GNRC_LWMAC_QUIT_RX;
204 }
205}
206
215static inline bool gnrc_lwmac_get_quit_rx(gnrc_netif_t *netif)
216{
217 return (netif->mac.mac_info & GNRC_LWMAC_QUIT_RX);
218}
219
227static inline void gnrc_lwmac_set_dutycycle_active(gnrc_netif_t *netif, bool active)
228{
229 if (active) {
230 netif->mac.prot.lwmac.lwmac_info |= GNRC_LWMAC_DUTYCYCLE_ACTIVE;
231 }
232 else {
233 netif->mac.prot.lwmac.lwmac_info &= ~GNRC_LWMAC_DUTYCYCLE_ACTIVE;
234 }
235}
236
246{
247 return (netif->mac.prot.lwmac.lwmac_info & GNRC_LWMAC_DUTYCYCLE_ACTIVE);
248}
249
257static inline void gnrc_lwmac_set_reschedule(gnrc_netif_t *netif, bool reschedule)
258{
259 if (reschedule) {
260 netif->mac.prot.lwmac.lwmac_info |= GNRC_LWMAC_NEEDS_RESCHEDULE;
261 }
262 else {
263 netif->mac.prot.lwmac.lwmac_info &= ~GNRC_LWMAC_NEEDS_RESCHEDULE;
264 }
265}
266
275static inline bool gnrc_lwmac_get_reschedule(gnrc_netif_t *netif)
276{
277 return (netif->mac.prot.lwmac.lwmac_info & GNRC_LWMAC_NEEDS_RESCHEDULE);
278}
279
303
316
325
333
341static inline uint32_t _gnrc_lwmac_ticks_to_phase(uint32_t ticks)
342{
344
346}
347
353static inline uint32_t _gnrc_lwmac_phase_now(void)
354{
356}
357
365static inline uint32_t _gnrc_lwmac_ticks_until_phase(uint32_t phase)
366{
367 long int tmp = phase - _gnrc_lwmac_phase_now();
368
369 if (tmp < 0) {
370 /* Phase in next interval */
372 }
373
374 return (uint32_t)tmp;
375}
376
388
389#ifdef __cplusplus
390}
391#endif
392
393#endif /* LWMAC_INTERNAL_H */
#define assert(cond)
abort the program if assertion is false
Definition assert.h:137
Definition for GNRC's network interfaces.
uint32_t rtt_get_counter(void)
Get the current RTT counter.
#define RTT_US_TO_TICKS(us)
Convert microseconds to rtt ticks.
Definition rtt.h:113
#define CONFIG_GNRC_LWMAC_WAKEUP_INTERVAL_US
Time between consecutive wake-ups.
Definition lwmac.h:105
netopt_state_t
Option parameter to be used with NETOPT_STATE to set or get the state of a network device or protocol...
Definition netopt.h:892
#define GNRC_LWMAC_QUIT_RX
Flag to track if the device needs to quit the wake-up (listening) procedure.
#define GNRC_LWMAC_TX_CONTINUE
Flag to track if the sender can continue to transmit packet to the receiver in its TX procedure.
static void gnrc_lwmac_set_quit_tx(gnrc_netif_t *netif, bool quit_tx)
set the GNRC_LWMAC_QUIT_TX flag of the device
static void gnrc_lwmac_set_reschedule(gnrc_netif_t *netif, bool reschedule)
set the GNRC_LWMAC_NEEDS_RESCHEDULE flag of LWMAC
#define GNRC_LWMAC_PHASE_BACKOFF
Flag to track if the device need to reselect a new wake-up phase.
static bool gnrc_lwmac_get_quit_rx(gnrc_netif_t *netif)
get the GNRC_LWMAC_QUIT_RX flag of the device
static bool gnrc_lwmac_get_quit_tx(gnrc_netif_t *netif)
get the GNRC_LWMAC_QUIT_TX flag of the device
void _gnrc_lwmac_set_netdev_state(gnrc_netif_t *netif, netopt_state_t devstate)
Shortcut to set the state of netdev.
static bool gnrc_lwmac_get_reschedule(gnrc_netif_t *netif)
get the GNRC_LWMAC_NEEDS_RESCHEDULE flag of LWMAC
static bool gnrc_lwmac_get_phase_backoff(gnrc_netif_t *netif)
get the GNRC_LWMAC_PHASE_BACKOFF flag of the device
static void gnrc_lwmac_set_quit_rx(gnrc_netif_t *netif, bool quit_rx)
set the GNRC_LWMAC_QUIT_RX flag of the device
static void gnrc_lwmac_set_phase_backoff(gnrc_netif_t *netif, bool backoff)
set the GNRC_LWMAC_PHASE_BACKOFF flag of the device
int _gnrc_lwmac_transmit(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
send a packet over the network interface in LWMAC
netopt_state_t _gnrc_lwmac_get_netdev_state(gnrc_netif_t *netif)
Shortcut to get the state of netdev.
int _gnrc_lwmac_parse_packet(gnrc_pktsnip_t *pkt, gnrc_lwmac_packet_info_t *info)
Parse an incoming packet and extract important information.
static uint32_t _gnrc_lwmac_phase_now(void)
Get device's current phase.
#define GNRC_LWMAC_QUIT_TX
Flag to track if the sender should quit Tx in current cycle.
static bool gnrc_lwmac_get_tx_continue(gnrc_netif_t *netif)
get the GNRC_LWMAC_TX_CONTINUE flag of the device
static uint32_t _gnrc_lwmac_ticks_to_phase(uint32_t ticks)
Convert RTT ticks to device phase.
static uint32_t _gnrc_lwmac_ticks_until_phase(uint32_t phase)
Calculate how many ticks remaining to the targeted phase in the future.
static void gnrc_lwmac_set_dutycycle_active(gnrc_netif_t *netif, bool active)
set the GNRC_LWMAC_DUTYCYCLE_ACTIVE flag of LWMAC
static bool gnrc_lwmac_get_dutycycle_active(gnrc_netif_t *netif)
get the GNRC_LWMAC_DUTYCYCLE_ACTIVE flag of LWMAC
static void gnrc_lwmac_set_tx_continue(gnrc_netif_t *netif, bool tx_continue)
set the GNRC_LWMAC_TX_CONTINUE flag of the device
int _gnrc_lwmac_dispatch_defer(gnrc_pktsnip_t *buffer[], gnrc_pktsnip_t *pkt)
Store the received packet to the dispatch buffer and remove possible duplicate packets.
Low-level RTT (Real Time Timer) peripheral driver interface definitions.
LWMAC header.
Definition hdr.h:74
LWMAC internal L2 address structure.
Definition hdr.h:61
Type to pass information about parsing.
gnrc_lwmac_l2_addr_t dst_addr
copied destination address of packet
gnrc_lwmac_l2_addr_t src_addr
copied source address of packet
gnrc_lwmac_hdr_t * header
LWMAC header of packet.
uint16_t mac_info
general information for the MAC protocol
Definition mac.h:76
Representation of a network interface.
Definition netif.h:135
gnrc_netif_mac_t mac
Common MAC module component
Definition netif.h:150
Type to represent parts (either headers or payload) of a packet, called snips.
Definition pkt.h:108
Definition of internal types used by LWMAC.
#define GNRC_LWMAC_DUTYCYCLE_ACTIVE
LWMAC duty-cycle active flag.
Definition types.h:78
#define GNRC_LWMAC_NEEDS_RESCHEDULE
LWMAC needs reschedule flag.
Definition types.h:86
Internal data types used by GNRC_MAC.