netif.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2017-20 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_NETIF_H
30 #define NET_GNRC_NETIF_H
31 
32 #include <stddef.h>
33 #include <stdint.h>
34 #include <stdbool.h>
35 
36 #include "sched.h"
37 #include "msg.h"
38 #ifdef MODULE_GNRC_NETIF_BUS
39 #include "msg_bus.h"
40 #endif
41 #include "event.h"
42 #include "net/ipv6/addr.h"
43 #include "net/gnrc/netapi.h"
44 #include "net/gnrc/pkt.h"
45 #include "net/gnrc/netif/conf.h"
46 #if IS_USED(MODULE_GNRC_NETIF_LORAWAN)
47 #include "net/gnrc/netif/lorawan.h"
48 #endif
49 #if IS_USED(MODULE_GNRC_NETIF_6LO)
50 #include "net/gnrc/netif/6lo.h"
51 #endif
52 #if defined(MODULE_GNRC_NETIF_DEDUP) && (GNRC_NETIF_L2ADDR_MAXLEN > 0)
53 #include "net/gnrc/netif/dedup.h"
54 #endif
55 #include "net/gnrc/netif/flags.h"
56 #if IS_USED(MODULE_GNRC_NETIF_IPV6)
57 #include "net/gnrc/netif/ipv6.h"
58 #endif
59 #if IS_USED(MODULE_GNRC_NETIF_MAC)
60 #include "net/gnrc/netif/mac.h"
61 #endif
62 #if IS_USED(MODULE_GNRC_NETIF_PKTQ)
64 #endif
65 #include "net/l2util.h"
66 #include "net/ndp.h"
67 #include "net/netdev.h"
68 #include "net/netopt.h"
69 #ifdef MODULE_NETSTATS_L2
70 #include "net/netstats.h"
71 #endif
72 #include "rmutex.h"
73 #include "net/netif.h"
74 
75 #ifdef __cplusplus
76 extern "C" {
77 #endif
78 
82 typedef enum {
83 #ifdef MODULE_GNRC_IPV6
86 #endif
87  GNRC_NETIF_BUS_NUMOF
89 
93 typedef enum {
107 
111 typedef struct gnrc_netif_ops gnrc_netif_ops_t;
112 
116 typedef struct {
121 #ifdef MODULE_NETSTATS_L2
122  netstats_t stats;
123 #endif
124 #if IS_USED(MODULE_GNRC_NETIF_LORAWAN) || defined(DOXYGEN)
126 #endif
127 #if IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN)
129 #endif
130 #if IS_USED(MODULE_GNRC_NETIF_MAC) || defined(DOXYGEN)
132 #endif /* IS_USED(MODULE_GNRC_NETIF_MAC) || defined(DOXYGEN) */
133 #if IS_USED(MODULE_GNRC_NETIF_BUS) || DOXYGEN
134  msg_bus_t bus[GNRC_NETIF_BUS_NUMOF];
135 #endif
141  uint32_t flags;
142 #if IS_USED(MODULE_GNRC_NETIF_EVENTS) || defined(DOXYGEN)
151 #endif /* MODULE_GNRC_NETIF_EVENTS */
152 #if (GNRC_NETIF_L2ADDR_MAXLEN > 0) || DOXYGEN
159  uint8_t l2addr[GNRC_NETIF_L2ADDR_MAXLEN];
160 
166  uint8_t l2addr_len;
167 #if defined(MODULE_GNRC_NETIF_DEDUP) || DOXYGEN
174 #endif
175 #endif
176 #if IS_USED(MODULE_GNRC_NETIF_6LO) || defined(DOXYGEN)
178 #endif
179 #if IS_USED(MODULE_GNRC_NETIF_PKTQ) || defined(DOXYGEN)
186 #endif
187  uint8_t cur_hl;
188  uint8_t device_type;
190 } gnrc_netif_t;
191 
211  void (*init)(gnrc_netif_t *netif);
212 
233  int (*send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt);
234 
251  gnrc_pktsnip_t *(*recv)(gnrc_netif_t *netif);
252 
267  int (*get)(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt);
268 
284  int (*set)(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt);
285 
296  void (*msg_handler)(gnrc_netif_t *netif, msg_t *msg);
297 };
298 
308 
326 int gnrc_netif_create(gnrc_netif_t *netif, char *stack, int stacksize,
327  char priority, const char *name, netdev_t *dev,
328  const gnrc_netif_ops_t *ops);
329 
335 unsigned gnrc_netif_numof(void);
336 
348 static inline bool gnrc_netif_highlander(void)
349 {
350  return IS_USED(MODULE_GNRC_NETIF_SINGLE);
351 }
352 
362 
372 
393 static inline int gnrc_netif_ipv6_addrs_get(const gnrc_netif_t *netif,
394  ipv6_addr_t *addrs,
395  size_t max_len)
396 {
397  assert(netif != NULL);
398  assert(addrs != NULL);
399  assert(max_len >= sizeof(ipv6_addr_t));
400  return gnrc_netapi_get(netif->pid, NETOPT_IPV6_ADDR, 0, addrs, max_len);
401 }
402 
424 static inline int gnrc_netif_ipv6_addr_add(const gnrc_netif_t *netif,
425  const ipv6_addr_t *addr, unsigned pfx_len,
426  uint8_t flags)
427 {
428  assert(netif != NULL);
429  assert(addr != NULL);
430  assert((pfx_len > 0) && (pfx_len <= 128));
431  return gnrc_netapi_set(netif->pid, NETOPT_IPV6_ADDR,
432  ((pfx_len << 8U) | flags), addr,
433  sizeof(ipv6_addr_t));
434 }
435 
449 static inline int gnrc_netif_ipv6_addr_remove(const gnrc_netif_t *netif,
450  const ipv6_addr_t *addr)
451 {
452  assert(netif != NULL);
453  assert(addr != NULL);
455  0, addr, sizeof(ipv6_addr_t));
456 }
457 
478 static inline int gnrc_netif_ipv6_groups_get(const gnrc_netif_t *netif,
479  ipv6_addr_t *groups,
480  size_t max_len)
481 {
482  assert(netif != NULL);
483  assert(groups != NULL);
484  assert(max_len >= sizeof(ipv6_addr_t));
485  return gnrc_netapi_get(netif->pid, NETOPT_IPV6_GROUP, 0, groups, max_len);
486 }
487 
502 static inline int gnrc_netif_ipv6_group_join(const gnrc_netif_t *netif,
503  ipv6_addr_t *group)
504 {
505  assert(netif != NULL);
506  assert(group != NULL);
507  return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP, 0, group,
508  sizeof(ipv6_addr_t));
509 }
510 
524 static inline int gnrc_netif_ipv6_group_leave(const gnrc_netif_t *netif,
525  ipv6_addr_t *group)
526 {
527  assert(netif != NULL);
528  assert(group != NULL);
529  return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP_LEAVE, 0, group,
530  sizeof(ipv6_addr_t));
531 }
532 
541 
554 
567  const gnrc_netapi_opt_t *opt);
568 
581 
600 static inline char *gnrc_netif_addr_to_str(const uint8_t *addr, size_t addr_len, char *out)
601 {
602  return l2util_addr_to_str(addr, addr_len, out);
603 }
604 
625 static inline size_t gnrc_netif_addr_from_str(const char *str, uint8_t *out)
626 {
627  return l2util_addr_from_str(str, out);
628 }
629 
639 static inline int gnrc_netif_send(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
640 {
641  return gnrc_netapi_send(netif->pid, pkt);
642 }
643 
644 #if defined(MODULE_GNRC_NETIF_BUS) || DOXYGEN
654  gnrc_netif_bus_t type)
655 {
656  assert(type < GNRC_NETIF_BUS_NUMOF);
657  return &netif->bus[type];
658 }
659 
675  uint32_t timeout_ms);
676 #endif /* MODULE_GNRC_NETIF_BUS */
677 
678 #ifdef __cplusplus
679 }
680 #endif
681 
682 #endif /* NET_GNRC_NETIF_H */
6LoWPAN definitions for Network interface API
#define assert(cond)
abort the program if assertion is false
Definition: assert.h:104
Definitions low-level network driver interface.
Flag definitions for Network interface API.
IPv6 definitions for Network interface API.
int16_t kernel_pid_t
Unique process identifier.
Definition: sched.h:134
netdev_type_t
Driver types for netdev.
Definition: netdev.h:304
static int gnrc_netapi_set(kernel_pid_t pid, netopt_t opt, uint16_t context, const void *data, size_t data_len)
Shortcut function for sending GNRC_NETAPI_MSG_TYPE_SET messages and parsing the returned GNRC_NETAPI_...
Definition: netapi.h:254
static int gnrc_netapi_get(kernel_pid_t pid, netopt_t opt, uint16_t context, void *data, size_t max_len)
Shortcut function for sending GNRC_NETAPI_MSG_TYPE_GET messages and parsing the returned GNRC_NETAPI_...
Definition: netapi.h:232
static int gnrc_netapi_send(kernel_pid_t pid, gnrc_pktsnip_t *pkt)
Shortcut function for sending GNRC_NETAPI_MSG_TYPE_SND messages.
Definition: netapi.h:153
#define GNRC_NETIF_L2ADDR_MAXLEN
Maximum length of the link-layer address.
Definition: conf.h:158
static int gnrc_netif_ipv6_addrs_get(const gnrc_netif_t *netif, ipv6_addr_t *addrs, size_t max_len)
Gets the (unicast on anycast) IPv6 address of an interface (if IPv6 is supported)
Definition: netif.h:393
static size_t gnrc_netif_addr_from_str(const char *str, uint8_t *out)
Parses a string of colon-separated hexadecimals to a hardware address.
Definition: netif.h:625
gnrc_netif_t * gnrc_netif_get_by_type(netdev_type_t type, uint8_t index)
Gets an interface by the netdev type (and index)
void gnrc_netif_default_init(gnrc_netif_t *netif)
Default operation for gnrc_netif_ops_t::init()
gnrc_ipv6_event_t
Event types for GNRC_NETIF_BUS_IPV6 per-interface message bus.
Definition: netif.h:93
int gnrc_netif_set_from_netdev(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt)
Default operation for gnrc_netif_ops_t::set()
static int gnrc_netif_send(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
Send a GNRC packet via a given gnrc_netif_t interface.
Definition: netif.h:639
static int gnrc_netif_ipv6_addr_add(const gnrc_netif_t *netif, const ipv6_addr_t *addr, unsigned pfx_len, uint8_t flags)
Adds an (unicast or anycast) IPv6 address to an interface (if IPv6 is supported)
Definition: netif.h:424
unsigned gnrc_netif_numof(void)
Get number of network interfaces actually allocated.
static msg_bus_t * gnrc_netif_get_bus(gnrc_netif_t *netif, gnrc_netif_bus_t type)
Get a message bus of a given gnrc_netif_t interface.
Definition: netif.h:653
bool gnrc_netif_ipv6_wait_for_global_address(gnrc_netif_t *netif, uint32_t timeout_ms)
Wait for a global address to become available.
int gnrc_netif_create(gnrc_netif_t *netif, char *stack, int stacksize, char priority, const char *name, netdev_t *dev, const gnrc_netif_ops_t *ops)
Creates a network interface.
gnrc_netif_bus_t
Per-Interface Event Message Buses.
Definition: netif.h:82
gnrc_netif_t * gnrc_netif_iter(const gnrc_netif_t *prev)
Iterate over all network interfaces.
static char * gnrc_netif_addr_to_str(const uint8_t *addr, size_t addr_len, char *out)
Converts a hardware address to a human readable string.
Definition: netif.h:600
static int gnrc_netif_ipv6_group_leave(const gnrc_netif_t *netif, ipv6_addr_t *group)
Leaves an IPv6 multicast group on an interface (if IPv6 is supported)
Definition: netif.h:524
int gnrc_netif_get_from_netdev(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt)
Default operation for gnrc_netif_ops_t::get()
static int gnrc_netif_ipv6_groups_get(const gnrc_netif_t *netif, ipv6_addr_t *groups, size_t max_len)
Gets the IPv6 multicast groups an interface is joined to (if IPv6 is supported)
Definition: netif.h:478
static int gnrc_netif_ipv6_addr_remove(const gnrc_netif_t *netif, const ipv6_addr_t *addr)
Removes a (unicast or anycast) IPv6 address from an interface (if IPv6 is supported)
Definition: netif.h:449
gnrc_netif_t * gnrc_netif_get_by_pid(kernel_pid_t pid)
Get network interface by PID.
static bool gnrc_netif_highlander(void)
Check if there can only be one gnrc_netif_t interface.
Definition: netif.h:348
void gnrc_netif_init_devs(void)
Initialize all available network interfaces.
static int gnrc_netif_ipv6_group_join(const gnrc_netif_t *netif, ipv6_addr_t *group)
Joins an IPv6 multicast group on an interface (if IPv6 is supported)
Definition: netif.h:502
@ GNRC_IPV6_EVENT_ADDR_VALID
Address becomes valid.
Definition: netif.h:105
@ GNRC_NETIF_BUS_IPV6
provides gnrc_ipv6_event_t messages to subscribers
Definition: netif.h:84
char * l2util_addr_to_str(const uint8_t *addr, size_t addr_len, char *out)
Converts a hardware address to a human readable string.
size_t l2util_addr_from_str(const char *str, uint8_t *out)
Parses a string of colon-separated hexadecimals to a hardware address.
@ NETOPT_IPV6_GROUP
(ipv6_addr_t) get IPv6 multicast groups of an interface as array of ipv6_addr_t or join an IPv6 multi...
Definition: netopt.h:161
@ NETOPT_IPV6_GROUP_LEAVE
(ipv6_addr_t) Leave an IPv6 multicast group on an interface
Definition: netopt.h:165
@ NETOPT_IPV6_ADDR
(ipv6_addr_t[]) get IPv6 addresses of an interface as array of ipv6_addr_t or add an IPv6 address as ...
Definition: netopt.h:133
@ NETOPT_IPV6_ADDR_REMOVE
(ipv6_addr_t) Removes an IPv6 address from an interface
Definition: netopt.h:137
Definition of net statistics.
Definitions for IPv6 addresses.
#define IS_USED(module)
Checks whether a module is being used or not.
Link-layer helper function definitions.
Messaging Bus API for inter process message broadcast.
IPv6 neighbor discovery message type definitions.
General definitions for network packets and their helper functions.
Generic interface to communicate with GNRC modules.
Configuration macros for Network interface API.
LoRaWAN adaption for Network interface API.
Common MAC module definitions for Network interface API
Common network interface API definitions.
Definition of global configuration options.
Recursive Mutex for thread synchronization.
Scheduler API definition.
event queue structure
Definition: event.h:155
event structure
Definition: event.h:147
Data structure to be send for setting (GNRC_NETAPI_MSG_TYPE_SET) and getting (GNRC_NETAPI_MSG_TYPE_GE...
Definition: netapi.h:100
6Lo component of gnrc_netif_t
Definition: 6lo.h:52
Structure to store information on the last broadcast packet received.
Definition: dedup.h:41
IPv6 component for gnrc_netif_t.
Definition: ipv6.h:78
GNRC LoRaWAN interface descriptor.
Definition: lorawan.h:52
Common MAC module component of gnrc_netif_mac_t
Definition: mac.h:72
int(* set)(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt)
Sets an option from the network interface.
Definition: netif.h:284
int(* send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
Send a packet over the network interface.
Definition: netif.h:233
void(* init)(gnrc_netif_t *netif)
Initializes network interface beyond the default settings.
Definition: netif.h:211
void(* msg_handler)(gnrc_netif_t *netif, msg_t *msg)
Message handler for network interface.
Definition: netif.h:296
int(* get)(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt)
Gets an option from the network interface.
Definition: netif.h:267
A packet queue for Network interface API with a de-queue timer.
Definition: type.h:36
Representation of a network interface.
Definition: netif.h:116
gnrc_netif_lorawan_t lorawan
LoRaWAN component.
Definition: netif.h:125
event_queue_t evq
Event queue for asynchronous events.
Definition: netif.h:146
msg_bus_t bus[GNRC_NETIF_BUS_NUMOF]
Event Message Bus.
Definition: netif.h:134
rmutex_t mutex
Mutex of the interface.
Definition: netif.h:120
uint32_t flags
Flags for the interface.
Definition: netif.h:141
const gnrc_netif_ops_t * ops
Operations of the network interface.
Definition: netif.h:118
uint8_t device_type
Device type.
Definition: netif.h:188
gnrc_netif_6lo_t sixlo
6Lo component
Definition: netif.h:177
uint8_t cur_hl
Current hop-limit for out-going packets.
Definition: netif.h:187
netif_t netif
network interface descriptor
Definition: netif.h:117
uint8_t l2addr_len
Length in bytes of gnrc_netif_t::l2addr.
Definition: netif.h:166
kernel_pid_t pid
PID of the network interface's thread.
Definition: netif.h:189
event_t event_isr
ISR event for the network device.
Definition: netif.h:150
gnrc_netif_mac_t mac
Common MAC module component
Definition: netif.h:131
gnrc_netif_dedup_t last_pkt
Last received packet information.
Definition: netif.h:173
gnrc_netif_ipv6_t ipv6
IPv6 component.
Definition: netif.h:128
netdev_t * dev
Network device of the network interface.
Definition: netif.h:119
gnrc_netif_pktq_t send_queue
Packet queue for sending.
Definition: netif.h:185
Type to represent parts (either headers or payload) of a packet, called snips.
Definition: pkt.h:108
A message bus is just a list of subscribers.
Definition: msg_bus.h:54
Describes a message object which can be sent between threads.
Definition: msg.h:185
Structure to hold driver state.
Definition: netdev.h:351
Network interface descriptor.
Definition: netif.h:69
Global statistics struct.
Definition: netstats.h:60
Mutex structure.
Definition: rmutex.h:43
Send queue for Network interface API type definitions
Data type to represent an IPv6 address.
Definition: addr.h:72