congure.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Freie Universität Berlin
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
29 #ifndef NET_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE_H
30 #define NET_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE_H
31 
32 #include <stdbool.h>
33 #include <stdlib.h>
34 
35 #include "congure.h"
36 #include "modules.h"
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
46 #define GNRC_SIXLOWPAN_FRAG_SFR_CONGURE_UNIT (1U)
47 
48 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE) || DOXYGEN
68 #else
70 {
71  return NULL;
72 }
73 #endif
74 
90 {
91 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
92  c->driver = NULL;
93 #else
94  (void)c;
95 #endif
96 }
97 
108 {
109 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
111  fb->sfr.congure = NULL;
112 #else
113  (void)fb;
114 #endif
115 }
116 
126 {
127 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
128  fb->sfr.congure->driver->init(fb->sfr.congure, fb);
129 #else
130  (void)fb;
131 #endif
132 }
133 
144 {
145 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
146  if (fb->sfr.congure == NULL) {
147  fb->sfr.congure = gnrc_sixlowpan_frag_sfr_congure_snd_get();
148  assert(fb->sfr.congure);
150  if (fb->sfr.congure->cwnd > CONFIG_GNRC_SIXLOWPAN_SFR_MAX_WIN_SIZE) {
151  fb->sfr.congure->cwnd = CONFIG_GNRC_SIXLOWPAN_SFR_MAX_WIN_SIZE;
152  }
153  }
154 #else
155  (void)fb;
156 #endif
157 }
158 
176 {
177 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
178  return fb->sfr.frags_sent < fb->sfr.congure->cwnd;
179 #else
180  return fb->sfr.frags_sent < CONFIG_GNRC_SIXLOWPAN_SFR_OPT_WIN_SIZE;
181 #endif
182 }
183 
201 {
202 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
203  return (fb->sfr.frags_sent + GNRC_SIXLOWPAN_FRAG_SFR_CONGURE_UNIT)
204  < fb->sfr.congure->cwnd;
205 #else
206  return (fb->sfr.frags_sent + GNRC_SIXLOWPAN_FRAG_SFR_CONGURE_UNIT)
208 #endif
209 }
210 
221 {
223  IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE);
224 }
225 
247  )
248 {
249 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
250  if (fb != NULL) {
251  congure_snd_t *c = fb->sfr.congure;
252  int32_t res = c->driver->inter_msg_interval(
254  );
255 
256  if ((res >= 0) &&
258  return (uint32_t)res;
259  }
260  }
261 #else
262  (void)fb;
263 #endif
265 }
266 
280  )
281 {
282 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
283  congure_snd_t *c = fb->sfr.congure;
284 
286 #else
287  (void)fb;
288 #endif
289 }
290 
304  )
305 {
306 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
307  congure_snd_t *c = fb->sfr.congure;
308 
310 #else
311  (void)fb;
312 #endif
313 }
314 
328  )
329 {
330 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
331  congure_snd_t *c = fb->sfr.congure;
332 
333  c->driver->report_msgs_timeout(c, (congure_snd_msg_t *)(&fb->sfr.window));
334 #else
335  (void)fb;
336 #endif
337 }
338 
354  )
355 {
356 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
357  congure_snd_t *c = fb->sfr.congure;
358 
359  c->driver->report_msgs_lost(c, frags);
360 #else
361  (void)fb;
362  (void)frags;
363 #endif
364 }
365 
381  congure_snd_msg_t *frag,
382  congure_snd_ack_t *ack
383  )
384 {
385 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
386  congure_snd_t *c = fb->sfr.congure;
387 
388  c->driver->report_msg_acked(c, frag, ack);
391  }
392 #else
393  (void)fb;
394  (void)frag;
395  (void)ack;
396 #endif
397 }
398 
413  gnrc_sixlowpan_frag_fb_t *fb, uint32_t time
414  )
415 {
416 #if IS_USED(MODULE_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE)
417  congure_snd_t *c = fb->sfr.congure;
418 
419  c->driver->report_ecn_ce(c, (ztimer_now_t)time);
420 #else
421  (void)fb;
422  (void)time;
423 #endif
424 }
425 
426 #ifdef __cplusplus
427 }
428 #endif
429 
430 #endif /* NET_GNRC_SIXLOWPAN_FRAG_SFR_CONGURE_H */
#define assert(cond)
abort the program if assertion is false
Definition: assert.h:136
6LoWPAN selective fragment recovery definitions for GNRC
#define CONFIG_GNRC_SIXLOWPAN_SFR_OPT_WIN_SIZE
Default value of window size that the sender should start with (OptWindowSize)
Definition: config.h:251
#define CONFIG_GNRC_SIXLOWPAN_SFR_INTER_FRAME_GAP_US
Default minimum amount of time between transmissions in microseconds (InterFrameGap)
Definition: config.h:267
#define CONFIG_GNRC_SIXLOWPAN_SFR_MAX_WIN_SIZE
Default maximum value of window size that the sender can use (MaxWindowSize)
Definition: config.h:239
static void gnrc_sixlowpan_frag_sfr_congure_snd_report_frags_timeout(gnrc_sixlowpan_frag_fb_t *fb)
Report to CongURE that the ACK for a fragment timed out.
Definition: congure.h:326
static bool gnrc_sixlowpan_frag_sfr_congure_snd_next_in_cwnd(gnrc_sixlowpan_frag_fb_t *fb)
Checks if given fragmentation buffer entry would still be within congestion window after next send.
Definition: congure.h:200
static void gnrc_sixlowpan_frag_sfr_congure_snd_setup(gnrc_sixlowpan_frag_fb_t *fb)
Retrieve CongURE state object when not retrieved and initialize it for a fragmentation buffer entry.
Definition: congure.h:143
static void gnrc_sixlowpan_frag_sfr_congure_snd_report_frags_lost(gnrc_sixlowpan_frag_fb_t *fb, congure_snd_msg_t *frags)
Report to CongURE that a number of fragments are known to be lost.
Definition: congure.h:352
static void gnrc_sixlowpan_frag_sfr_congure_snd_free(congure_snd_t *c)
Frees the CongURE state object.
Definition: congure.h:89
static bool gnrc_sixlowpan_frag_sfr_congure_snd_has_inter_frame_gap(void)
Checks if inter-frame gap is provided.
Definition: congure.h:220
static void gnrc_sixlowpan_frag_sfr_congure_snd_report_frag_sent(gnrc_sixlowpan_frag_fb_t *fb)
Report to CongURE that a fragment was sent.
Definition: congure.h:278
static void gnrc_sixlowpan_frag_sfr_congure_snd_destroy(gnrc_sixlowpan_frag_fb_t *fb)
Frees the CongURE state object of a fragmentation buffer and set's it to NULL
Definition: congure.h:107
static void gnrc_sixlowpan_frag_sfr_congure_snd_report_frag_discard(gnrc_sixlowpan_frag_fb_t *fb)
Report to CongURE that a fragment as discarded.
Definition: congure.h:302
congure_snd_t * gnrc_sixlowpan_frag_sfr_congure_snd_get(void)
Retrieve CongURE state object from a pool of free objects.
static void gnrc_sixlowpan_frag_sfr_congure_snd_init(gnrc_sixlowpan_frag_fb_t *fb)
Initializes a CongURE state object in a fragmentation buffer entry.
Definition: congure.h:125
static uint32_t gnrc_sixlowpan_frag_sfr_congure_snd_inter_frame_gap(gnrc_sixlowpan_frag_fb_t *fb)
Returns inter-frame gap if provided by CongURE implementation.
Definition: congure.h:245
static void gnrc_sixlowpan_frag_sfr_congure_snd_report_ecn(gnrc_sixlowpan_frag_fb_t *fb, uint32_t time)
Report to CongURE that ECN bit was set in an ACK.
Definition: congure.h:412
static bool gnrc_sixlowpan_frag_sfr_congure_snd_in_cwnd(gnrc_sixlowpan_frag_fb_t *fb)
Checks if given fragmentation buffer entry is within congestion window.
Definition: congure.h:175
static void gnrc_sixlowpan_frag_sfr_congure_snd_report_frag_acked(gnrc_sixlowpan_frag_fb_t *fb, congure_snd_msg_t *frag, congure_snd_ack_t *ack)
Report to CongURE that a number of fragments are known to be lost.
Definition: congure.h:379
#define GNRC_SIXLOWPAN_FRAG_SFR_CONGURE_UNIT
The user-defined window unit for congure is one fragment with SFR.
Definition: congure.h:46
uint32_t ztimer_now_t
type for ztimer_now() result
Definition: ztimer.h:311
Common macros and compiler attributes/pragmas configuration.
#define IS_USED(module)
Checks whether a module is being used or not.
Definition: modules.h:71
Congure definitions for 6LoWPAN selective fragment recovery.
Object to represent an ACK to a message.
Definition: congure.h:86
void(* report_msg_sent)(congure_snd_t *c, unsigned msg_size)
Report that a message was sent.
Definition: congure.h:150
void(* report_msgs_lost)(congure_snd_t *c, congure_snd_msg_t *msgs)
Report that a collection of messages that is known to be lost.
Definition: congure.h:196
void(* report_ecn_ce)(congure_snd_t *c, ztimer_now_t time)
Report that "congestion encountered" CE signals were received for a message by means of explicit cong...
Definition: congure.h:217
void(* report_msgs_timeout)(congure_snd_t *c, congure_snd_msg_t *msgs)
Report that the ACKs for a collection of messages timed out.
Definition: congure.h:177
int32_t(* inter_msg_interval)(congure_snd_t *c, unsigned msg_size)
Get current interval between messages for pacing.
Definition: congure.h:142
void(* report_msg_discarded)(congure_snd_t *c, unsigned msg_size)
Report message as discarded.
Definition: congure.h:162
void(* report_msg_acked)(congure_snd_t *c, congure_snd_msg_t *msg, congure_snd_ack_t *ack)
Report that the ACK for a message was received.
Definition: congure.h:205
Object to represent a collection of sent messages.
Definition: congure.h:68
Base state object for CongURE implementations.
Definition: congure.h:51
const congure_snd_driver_t * driver
Driver for the state object.
Definition: congure.h:55
congure_wnd_size_t cwnd
Congestion window size.
Definition: congure.h:62
6LoWPAN fragmentation buffer entry.
Definition: fb.h:47