Loading...
Searching...
No Matches
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
9#pragma once
10
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)
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)
54#endif
56#if IS_USED(MODULE_GNRC_NETIF_IPV6)
57#include "net/gnrc/netif/ipv6.h"
58#endif
59#if IS_USED(MODULE_GNRC_NETIF_PKTQ)
61#endif
62#include "net/l2util.h"
63#include "net/ndp.h"
64#include "net/netdev.h"
65#include "net/netopt.h"
66#ifdef MODULE_NETSTATS_L2
67#include "net/netstats.h"
68#endif
69#include "rmutex.h"
70#include "net/netif.h"
71
72#ifdef __cplusplus
73extern "C" {
74#endif
75
79#define GNRC_NETIF_EVQ_INDEX_PRIO_HIGH (0)
80
84#if IS_USED(MODULE_BHP_EVENT)
85#define GNRC_NETIF_EVQ_INDEX_PRIO_LOW (GNRC_NETIF_EVQ_INDEX_PRIO_HIGH + 1)
86#else
87#define GNRC_NETIF_EVQ_INDEX_PRIO_LOW GNRC_NETIF_EVQ_INDEX_PRIO_HIGH
88#endif
89
93#define GNRC_NETIF_EVQ_NUMOF (GNRC_NETIF_EVQ_INDEX_PRIO_LOW + 1)
94
98typedef enum {
99#ifdef MODULE_GNRC_IPV6
102#endif
103 GNRC_NETIF_BUS_NUMOF
105
123
128
132typedef struct {
137#if IS_USED(MODULE_NETSTATS_L2) || defined(DOXYGEN)
139#endif
140#if IS_USED(MODULE_GNRC_NETIF_LORAWAN) || defined(DOXYGEN)
142#endif
143#if IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN)
145#endif
146#if IS_USED(MODULE_GNRC_NETIF_BUS) || DOXYGEN
147 msg_bus_t bus[GNRC_NETIF_BUS_NUMOF];
148#endif
154 uint32_t flags;
163#if IS_USED(MODULE_NETDEV_NEW_API) || defined(DOXYGEN)
178#endif
179#if (GNRC_NETIF_L2ADDR_MAXLEN > 0) || DOXYGEN
187
193 uint8_t l2addr_len;
194#if defined(MODULE_GNRC_NETIF_DEDUP) || DOXYGEN
201#endif
202#endif
203#if IS_USED(MODULE_GNRC_NETIF_6LO) || defined(DOXYGEN)
205#endif
206#if IS_USED(MODULE_GNRC_NETIF_PKTQ) || defined(DOXYGEN)
213#endif
218 uint8_t cur_hl;
219 uint8_t device_type;
222
239{
240 if (!IS_USED(MODULE_NETDEV_NEW_API) && !IS_USED(MODULE_NETDEV_LEGACY_API)) {
241 /* this should only happen for external netdevs or when no netdev is
242 * used (e.g. examples/networking/coap/gcoap can be used without any netdev, as still
243 * CoAP requests to ::1 can be send */
244 return true;
245 }
246
247 if (!IS_USED(MODULE_NETDEV_NEW_API)) {
248 return true;
249 }
250
251 if (!IS_USED(MODULE_NETDEV_LEGACY_API)) {
252 return false;
253 }
254
255 /* both legacy and new API netdevs in use, fall back to runtime test: */
256 return (netif->dev->driver->confirm_send == NULL);
257}
258
267static inline bool gnrc_netif_netdev_new_api(gnrc_netif_t *netif)
268{
269 return !gnrc_netif_netdev_legacy_api(netif);
270}
271
297 int (*init)(gnrc_netif_t *netif);
298
319 int (*send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt);
320
337 gnrc_pktsnip_t *(*recv)(gnrc_netif_t *netif);
338
353 int (*get)(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt);
354
370 int (*set)(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt);
371
382 void (*msg_handler)(gnrc_netif_t *netif, msg_t *msg);
383};
384
394
412int gnrc_netif_create(gnrc_netif_t *netif, char *stack, int stacksize,
413 char priority, const char *name, netdev_t *dev,
414 const gnrc_netif_ops_t *ops);
415
421unsigned gnrc_netif_numof(void);
422
434static inline bool gnrc_netif_highlander(void)
435{
436 return IS_USED(MODULE_GNRC_NETIF_SINGLE);
437}
438
448
458
480static inline int gnrc_netif_ipv6_addrs_get(const gnrc_netif_t *netif,
481 ipv6_addr_t *addrs,
482 size_t max_len)
483{
484 assert(netif != NULL);
485 assert(addrs != NULL);
486 assert(max_len >= sizeof(ipv6_addr_t));
487 return gnrc_netapi_get(netif->pid, NETOPT_IPV6_ADDR, 0, addrs, max_len);
488}
489
511static inline int gnrc_netif_ipv6_addr_add(const gnrc_netif_t *netif,
512 const ipv6_addr_t *addr, unsigned pfx_len,
513 uint8_t flags)
514{
515 assert(netif != NULL);
516 assert(addr != NULL);
517 assert((pfx_len > 0) && (pfx_len <= 128));
518 return gnrc_netapi_set(netif->pid, NETOPT_IPV6_ADDR,
519 ((pfx_len << 8U) | flags), addr,
520 sizeof(ipv6_addr_t));
521}
522
536static inline int gnrc_netif_ipv6_addr_remove(const gnrc_netif_t *netif,
537 const ipv6_addr_t *addr)
538{
539 assert(netif != NULL);
540 assert(addr != NULL);
542 0, addr, sizeof(ipv6_addr_t));
543}
544
565static inline int gnrc_netif_ipv6_groups_get(const gnrc_netif_t *netif,
566 ipv6_addr_t *groups,
567 size_t max_len)
568{
569 assert(netif != NULL);
570 assert(groups != NULL);
571 assert(max_len >= sizeof(ipv6_addr_t));
572 return gnrc_netapi_get(netif->pid, NETOPT_IPV6_GROUP, 0, groups, max_len);
573}
574
589static inline int gnrc_netif_ipv6_group_join(const gnrc_netif_t *netif,
590 const ipv6_addr_t *group)
591{
592 assert(netif != NULL);
593 assert(group != NULL);
594 return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP, 0, group,
595 sizeof(ipv6_addr_t));
596}
597
611static inline int gnrc_netif_ipv6_group_leave(const gnrc_netif_t *netif,
612 const ipv6_addr_t *group)
613{
614 assert(netif != NULL);
615 assert(group != NULL);
616 return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP_LEAVE, 0, group,
617 sizeof(ipv6_addr_t));
618}
619
629
642
655 const gnrc_netapi_opt_t *opt);
656
669
688static inline char *gnrc_netif_addr_to_str(const uint8_t *addr, size_t addr_len, char *out)
689{
690 return l2util_addr_to_str(addr, addr_len, out);
691}
692
713static inline size_t gnrc_netif_addr_from_str(const char *str, uint8_t *out)
714{
715 return l2util_addr_from_str(str, out);
716}
717
727static inline int gnrc_netif_send(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
728{
729 return gnrc_netapi_send(netif->pid, pkt);
730}
731
732#if defined(MODULE_GNRC_NETIF_BUS) || DOXYGEN
742 gnrc_netif_bus_t type)
743{
744 assert(type < GNRC_NETIF_BUS_NUMOF);
745 return &netif->bus[type];
746}
747
764 uint32_t timeout_ms);
765#endif /* MODULE_GNRC_NETIF_BUS */
766
767#ifdef __cplusplus
768}
769#endif
770
6LoWPAN definitions for Network interface API
#define assert(cond)
abort the program if assertion is false
Definition assert.h:146
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:138
struct netdev netdev_t
Forward declaration for netdev struct.
Definition netdev.h:288
netdev_type_t
Driver types for netdev.
Definition netdev.h:306
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:253
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:231
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:152
#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:480
static bool gnrc_netif_netdev_new_api(gnrc_netif_t *netif)
Check if the device belonging to the given netif uses the new netdev API.
Definition netif.h:267
static int gnrc_netif_ipv6_group_leave(const gnrc_netif_t *netif, const ipv6_addr_t *group)
Leaves an IPv6 multicast group on an interface (if IPv6 is supported)
Definition netif.h:611
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:713
static int gnrc_netif_ipv6_group_join(const gnrc_netif_t *netif, const ipv6_addr_t *group)
Joins an IPv6 multicast group on an interface (if IPv6 is supported)
Definition netif.h:589
gnrc_netif_t * gnrc_netif_get_by_type(netdev_type_t type, uint8_t index)
Gets an interface by the netdev type (and index)
gnrc_ipv6_event_t
Event types for GNRC_NETIF_BUS_IPV6 per-interface message bus.
Definition netif.h:109
#define GNRC_NETIF_EVQ_NUMOF
Number of event queues.
Definition netif.h:93
static bool gnrc_netif_netdev_legacy_api(gnrc_netif_t *netif)
Check if the device belonging to the given netif uses the legacy netdev API.
Definition netif.h:238
gnrc_netif_t * gnrc_netif_iter(const gnrc_netif_t *prev)
Iterate over all network interfaces.
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 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:688
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:727
int gnrc_netif_default_init(gnrc_netif_t *netif)
Default operation for gnrc_netif_ops_t::init()
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:511
unsigned gnrc_netif_numof(void)
Get number of network interfaces actually allocated.
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:98
gnrc_netif_t * gnrc_netif_get_by_pid(kernel_pid_t pid)
Get network interface by PID.
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:741
struct gnrc_netif_ops gnrc_netif_ops_t
Operations to an interface.
Definition netif.h:127
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:565
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:536
static bool gnrc_netif_highlander(void)
Check if there can only be one gnrc_netif_t interface.
Definition netif.h:434
void gnrc_netif_init_devs(void)
Initialize all available network interfaces.
@ GNRC_IPV6_EVENT_ADDR_VALID
Address becomes valid.
Definition netif.h:121
@ GNRC_NETIF_BUS_IPV6
provides gnrc_ipv6_event_t messages to subscribers
Definition netif.h:100
struct gnrc_pktsnip gnrc_pktsnip_t
Type to represent parts (either headers or payload) of a packet, called snips.
size_t l2util_addr_from_str(const char *str, uint8_t *out)
Parses a string of colon-separated hexadecimals to a hardware address.
char * l2util_addr_to_str(const uint8_t *addr, size_t addr_len, char *out)
Converts a hardware address to a human readable string.
@ 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:163
@ NETOPT_IPV6_GROUP_LEAVE
(ipv6_addr_t) Leave an IPv6 multicast group on an interface
Definition netopt.h:167
@ 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:135
@ NETOPT_IPV6_ADDR_REMOVE
(ipv6_addr_t) Removes an IPv6 address from an interface
Definition netopt.h:139
struct PTRTAG event_queue_t
event queue structure
struct event event_t
event structure forward declaration
Definition event.h:135
Definition of net statistics.
Definitions for IPv6 addresses.
Link-layer helper function definitions.
#define IS_USED(module)
Checks whether a module is being used or not.
Definition modules.h:70
Messaging Bus API for inter process message broadcast.
IPv6 neighbor discovery message type definitions.
Send queue for type definitions
General definitions for network packets and their helper functions.
Generic interface to communicate with GNRC modules.
Configuration macros for Network interface API.
#define GNRC_NETIF_MSG_QUEUE_SIZE
Message queue size for network interface threads.
Definition conf.h:182
LoRaWAN adaption for Network interface API.
Common network interface API definitions.
Definition of global configuration options.
Recursive Mutex for thread synchronization.
Scheduler API definition.
Data structure to be send for setting (GNRC_NETAPI_MSG_TYPE_SET) and getting (GNRC_NETAPI_MSG_TYPE_GE...
Definition netapi.h:99
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:37
int(* init)(gnrc_netif_t *netif)
Initializes and registers network interface.
Definition netif.h:297
int(* set)(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt)
Sets an option from the network interface.
Definition netif.h:370
int(* send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
Send a packet over the network interface.
Definition netif.h:319
void(* msg_handler)(gnrc_netif_t *netif, msg_t *msg)
Message handler for network interface.
Definition netif.h:382
int(* get)(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt)
Gets an option from the network interface.
Definition netif.h:353
A packet queue for Network interface API with a de-queue timer.
Definition type.h:36
Representation of a network interface.
Definition netif.h:132
gnrc_netif_lorawan_t lorawan
LoRaWAN component.
Definition netif.h:141
msg_bus_t bus[GNRC_NETIF_BUS_NUMOF]
Event Message Bus.
Definition netif.h:147
event_queue_t evq[GNRC_NETIF_EVQ_NUMOF]
Event queue for asynchronous events.
Definition netif.h:158
rmutex_t mutex
Mutex of the interface.
Definition netif.h:136
netstats_t stats
transceiver's statistics
Definition netif.h:138
uint32_t flags
Flags for the interface.
Definition netif.h:154
const gnrc_netif_ops_t * ops
Operations of the network interface.
Definition netif.h:134
uint8_t device_type
Device type.
Definition netif.h:219
gnrc_netif_6lo_t sixlo
6Lo component
Definition netif.h:204
uint8_t cur_hl
Current hop-limit for out-going packets.
Definition netif.h:218
netif_t netif
network interface descriptor
Definition netif.h:133
uint8_t l2addr_len
Length in bytes of gnrc_netif_t::l2addr.
Definition netif.h:193
kernel_pid_t pid
PID of the network interface's thread.
Definition netif.h:220
event_t event_isr
ISR event for the network device.
Definition netif.h:162
uint8_t l2addr[GNRC_NETIF_L2ADDR_MAXLEN]
The link-layer address currently used as the source address on this interface.
Definition netif.h:186
gnrc_netif_dedup_t last_pkt
Last received packet information.
Definition netif.h:200
gnrc_netif_ipv6_t ipv6
IPv6 component.
Definition netif.h:144
msg_t msg_queue[GNRC_NETIF_MSG_QUEUE_SIZE]
Message queue for the netif thread.
Definition netif.h:217
netdev_t * dev
Network device of the network interface.
Definition netif.h:135
gnrc_pktsnip_t * tx_pkt
Outgoing frame that is currently transmitted.
Definition netif.h:177
event_t event_tx_done
TX done event for the network device.
Definition netif.h:169
gnrc_netif_pktq_t send_queue
Packet queue for sending.
Definition netif.h:212
A message bus is just a list of subscribers.
Definition msg_bus.h:53
Describes a message object which can be sent between threads.
Definition msg.h:195
const struct netdev_driver * driver
ptr to that driver's interface.
Definition netdev.h:366
Network interface descriptor.
Definition netif.h:71
Global statistics struct.
Definition netstats.h:59
Mutex structure.
Definition rmutex.h:37
Data type to represent an IPv6 address.
Definition addr.h:67