netreg.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Martine Lenders <mlenders@inf.fu-berlin.de>
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 
21 #ifndef NET_GNRC_NETREG_H
22 #define NET_GNRC_NETREG_H
23 
24 #include <inttypes.h>
25 
26 #include "sched.h"
27 #include "net/gnrc/nettype.h"
28 #include "net/gnrc/pkt.h"
29 
30 #ifdef MODULE_GNRC_NETAPI_MBOX
31 #include "mbox.h"
32 #endif
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(MODULE_GNRC_NETAPI_CALLBACKS) || \
39  defined(DOXYGEN)
40 
45 typedef enum {
54 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(DOXYGEN)
55 
62 #endif
63 #if defined(MODULE_GNRC_NETAPI_CALLBACKS) || defined(DOXYGEN)
64 
71 #endif
73 #endif
74 
80 #define GNRC_NETREG_DEMUX_CTX_ALL (0xffff0000)
81 
96 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(MODULE_GNRC_NETAPI_CALLBACKS)
97 #define GNRC_NETREG_ENTRY_INIT_PID(demux_ctx, pid) { NULL, demux_ctx, \
98  GNRC_NETREG_TYPE_DEFAULT, \
99  { pid } }
100 #else
101 #define GNRC_NETREG_ENTRY_INIT_PID(demux_ctx, pid) { NULL, demux_ctx, { pid } }
102 #endif
103 
104 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(DOXYGEN)
105 
116 #define GNRC_NETREG_ENTRY_INIT_MBOX(demux_ctx, _mbox) { NULL, demux_ctx, \
117  GNRC_NETREG_TYPE_MBOX, \
118  { .mbox = _mbox } }
119 #endif
120 
121 #if defined(MODULE_GNRC_NETAPI_CALLBACKS) || defined(DOXYGEN)
122 
133 #define GNRC_NETREG_ENTRY_INIT_CB(demux_ctx, _cbd) { NULL, demux_ctx, \
134  GNRC_NETREG_TYPE_CB, \
135  { .cbd = _cbd } }
136 
151 typedef void (*gnrc_netreg_entry_cb_t)(uint16_t cmd, gnrc_pktsnip_t *pkt,
152  void *ctx);
153 
158 typedef struct {
160  void *ctx;
162 #endif
163 
167 typedef struct gnrc_netreg_entry {
174 
182  uint32_t demux_ctx;
183 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(MODULE_GNRC_NETAPI_CALLBACKS) || \
184  defined(DOXYGEN)
185 
192 #endif
193  union {
195 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(DOXYGEN)
196 
202 #endif
203 
204 #if defined(MODULE_GNRC_NETAPI_CALLBACKS) || defined(DOXYGEN)
205 
211 #endif
212  } target;
214 
218 void gnrc_netreg_init(void);
219 
235  uint32_t demux_ctx,
236  kernel_pid_t pid)
237 {
238  entry->next = NULL;
239  entry->demux_ctx = demux_ctx;
240 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(MODULE_GNRC_NETAPI_CALLBACKS)
242 #endif
243  entry->target.pid = pid;
244 }
245 
246 #if defined(MODULE_GNRC_NETAPI_MBOX) || defined(DOXYGEN)
247 
258  uint32_t demux_ctx,
259  mbox_t *mbox)
260 {
261  entry->next = NULL;
262  entry->demux_ctx = demux_ctx;
263  entry->type = GNRC_NETREG_TYPE_MBOX;
264  entry->target.mbox = mbox;
265 }
266 #endif
267 
268 #if defined(MODULE_GNRC_NETAPI_CALLBACKS) || defined(DOXYGEN)
269 
280  uint32_t demux_ctx,
282 {
283  entry->next = NULL;
284  entry->demux_ctx = demux_ctx;
285  entry->type = GNRC_NETREG_TYPE_CB;
286  entry->target.cbd = cbd;
287 }
288 #endif
289 
316 
324 
336 gnrc_netreg_entry_t *gnrc_netreg_lookup(gnrc_nettype_t type, uint32_t demux_ctx);
337 
349 int gnrc_netreg_num(gnrc_nettype_t type, uint32_t demux_ctx);
350 
363 
379 
380 #ifdef __cplusplus
381 }
382 #endif
383 
384 #endif /* NET_GNRC_NETREG_H */
385 
gnrc_netreg_entry_init_cb
static void gnrc_netreg_entry_init_cb(gnrc_netreg_entry_t *entry, uint32_t demux_ctx, gnrc_netreg_entry_cbd_t *cbd)
Initializes a netreg entry dynamically with callback.
Definition: netreg.h:279
gnrc_netreg_entry_cb_t
void(* gnrc_netreg_entry_cb_t)(uint16_t cmd, gnrc_pktsnip_t *pkt, void *ctx)
Packet handler callback for netreg entries with callback.
Definition: netreg.h:151
GNRC_NETREG_TYPE_MBOX
@ GNRC_NETREG_TYPE_MBOX
Use centralized IPC for netapi operations.
Definition: netreg.h:61
kernel_pid_t
int16_t kernel_pid_t
Unique process identifier.
Definition: sched.h:125
gnrc_netreg_entry_init_pid
static void gnrc_netreg_entry_init_pid(gnrc_netreg_entry_t *entry, uint32_t demux_ctx, kernel_pid_t pid)
Initializes a netreg entry dynamically with PID.
Definition: netreg.h:234
gnrc_netreg_entry::cbd
gnrc_netreg_entry_cbd_t * cbd
Target callback for the registry entry.
Definition: netreg.h:210
GNRC_NETREG_TYPE_CB
@ GNRC_NETREG_TYPE_CB
Use function callbacks for netapi operations.
Definition: netreg.h:70
gnrc_netreg_entry::target
union gnrc_netreg_entry::@278 target
Target for the registry entry.
gnrc_netreg_type_t
gnrc_netreg_type_t
The type of the netreg entry.
Definition: netreg.h:45
gnrc_netreg_entry::mbox
mbox_t * mbox
Target mailbox for the registry entry.
Definition: netreg.h:201
sched.h
Scheduler API definition.
gnrc_netreg_entry::type
gnrc_netreg_type_t type
Type of the registry entry.
Definition: netreg.h:191
gnrc_netreg_entry
Entry to the Network protocol registry.
Definition: netreg.h:167
GNRC_NETREG_TYPE_DEFAULT
@ GNRC_NETREG_TYPE_DEFAULT
Use default IPC for netapi operations.
Definition: netreg.h:53
mbox_t
Mailbox struct definition.
Definition: mbox.h:41
mbox.h
Mailbox API.
gnrc_netreg_num
int gnrc_netreg_num(gnrc_nettype_t type, uint32_t demux_ctx)
Returns number of entries with the same gnrc_netreg_entry_t::type and gnrc_netreg_entry_t::demux_ctx.
gnrc_netreg_entry_t
struct gnrc_netreg_entry gnrc_netreg_entry_t
Entry to the Network protocol registry.
pkt.h
General definitions for network packets and their helper functions.
nettype.h
Protocol type definitions.
gnrc_netreg_entry_init_mbox
static void gnrc_netreg_entry_init_mbox(gnrc_netreg_entry_t *entry, uint32_t demux_ctx, mbox_t *mbox)
Initializes a netreg entry dynamically with mbox.
Definition: netreg.h:257
gnrc_netreg_unregister
void gnrc_netreg_unregister(gnrc_nettype_t type, gnrc_netreg_entry_t *entry)
Removes a thread from the registry.
gnrc_nettype_t
gnrc_nettype_t
Definition of protocol types in the network stack.
Definition: nettype.h:50
gnrc_netreg_entry_cbd_t
Callback + Context descriptor.
Definition: netreg.h:158
gnrc_netreg_entry_cbd_t::cb
gnrc_netreg_entry_cb_t cb
the callback
Definition: netreg.h:159
gnrc_netreg_entry::next
struct gnrc_netreg_entry * next
next element in list
Definition: netreg.h:173
gnrc_netreg_getnext
gnrc_netreg_entry_t * gnrc_netreg_getnext(gnrc_netreg_entry_t *entry)
Returns the next entry after entry with the same gnrc_netreg_entry_t::type and gnrc_netreg_entry_t::d...
gnrc_netreg_init
void gnrc_netreg_init(void)
Initializes module.
gnrc_netreg_lookup
gnrc_netreg_entry_t * gnrc_netreg_lookup(gnrc_nettype_t type, uint32_t demux_ctx)
Searches for entries with given parameters in the registry and returns the first found.
gnrc_netreg_calc_csum
int gnrc_netreg_calc_csum(gnrc_pktsnip_t *hdr, gnrc_pktsnip_t *pseudo_hdr)
Calculates the checksum for a header.
gnrc_netreg_entry::pid
kernel_pid_t pid
The PID of the registering thread.
Definition: netreg.h:194
gnrc_netreg_entry_cbd_t::ctx
void * ctx
application context for the callback
Definition: netreg.h:160
gnrc_netreg_register
int gnrc_netreg_register(gnrc_nettype_t type, gnrc_netreg_entry_t *entry)
Registers a thread to the registry.
inttypes.h
Adds include for missing inttype definitions.
gnrc_netreg_entry::demux_ctx
uint32_t demux_ctx
The demultiplexing context for the registering thread.
Definition: netreg.h:182
gnrc_pktsnip
Type to represent parts (either headers or payload) of a packet, called snips.
Definition: pkt.h:108