Loading...
Searching...
No Matches
netif.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017-2020 Freie Universität Berlin
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
28
29#include <stddef.h>
30#include <stdint.h>
31#include <stdbool.h>
32
33#include "compiler_hints.h"
34#include "event.h"
35#include "msg.h"
36#include "net/gnrc/netapi.h"
37#include "net/gnrc/netif/conf.h"
39#include "net/gnrc/pkt.h"
40#include "net/ipv6/addr.h"
41#include "net/l2util.h"
42#include "net/ndp.h"
43#include "net/netdev.h"
44#include "net/netif.h"
45#include "net/netopt.h"
46#include "rmutex.h"
47#include "sched.h"
48
49#ifdef MODULE_GNRC_NETIF_BUS
50# include "msg_bus.h"
51#endif
52
53#if IS_USED(MODULE_GNRC_NETIF_LORAWAN)
55#endif
56
57#if IS_USED(MODULE_GNRC_NETIF_6LO)
58# include "net/gnrc/netif/6lo.h"
59#endif
60
61#if defined(MODULE_GNRC_NETIF_DEDUP) && (GNRC_NETIF_L2ADDR_MAXLEN > 0)
62# include "net/gnrc/netif/dedup.h"
63#endif
64
65#if IS_USED(MODULE_GNRC_NETIF_IPV6)
66# include "net/gnrc/netif/ipv6.h"
67#endif
68
69#if IS_USED(MODULE_GNRC_NETIF_PKTQ)
71#endif
72
73#ifdef MODULE_NETSTATS_L2
74# include "net/netstats.h"
75#endif
76
77#ifdef __cplusplus
78extern "C" {
79#endif
80
84#define GNRC_NETIF_EVQ_INDEX_PRIO_HIGH (0)
85
89#if IS_USED(MODULE_BHP_EVENT)
90#define GNRC_NETIF_EVQ_INDEX_PRIO_LOW (GNRC_NETIF_EVQ_INDEX_PRIO_HIGH + 1)
91#else
92#define GNRC_NETIF_EVQ_INDEX_PRIO_LOW GNRC_NETIF_EVQ_INDEX_PRIO_HIGH
93#endif
94
98#define GNRC_NETIF_EVQ_NUMOF (GNRC_NETIF_EVQ_INDEX_PRIO_LOW + 1)
99
103typedef enum {
104#ifdef MODULE_GNRC_IPV6
107#endif
108 GNRC_NETIF_BUS_NUMOF
110
128
133
137typedef struct {
142#if IS_USED(MODULE_NETSTATS_L2) || defined(DOXYGEN)
144#endif
145#if IS_USED(MODULE_GNRC_NETIF_LORAWAN) || defined(DOXYGEN)
147#endif
148#if IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN)
150#endif
151#if IS_USED(MODULE_GNRC_NETIF_BUS) || DOXYGEN
152 msg_bus_t bus[GNRC_NETIF_BUS_NUMOF];
153#endif
159 uint32_t flags;
168#if IS_USED(MODULE_NETDEV_NEW_API) || defined(DOXYGEN)
183#endif
184#if (GNRC_NETIF_L2ADDR_MAXLEN > 0) || DOXYGEN
192
198 uint8_t l2addr_len;
199#if defined(MODULE_GNRC_NETIF_DEDUP) || DOXYGEN
206#endif
207#endif
208#if IS_USED(MODULE_GNRC_NETIF_6LO) || defined(DOXYGEN)
210#endif
211#if IS_USED(MODULE_GNRC_NETIF_PKTQ) || defined(DOXYGEN)
218#endif
223 uint8_t cur_hl;
224 uint8_t device_type;
227
244{
245 if (!IS_USED(MODULE_NETDEV_NEW_API) && !IS_USED(MODULE_NETDEV_LEGACY_API)) {
246 /* this should only happen for external netdevs or when no netdev is
247 * used (e.g. examples/networking/coap/gcoap can be used without any netdev, as still
248 * CoAP requests to ::1 can be send */
249 return true;
250 }
251
252 if (!IS_USED(MODULE_NETDEV_NEW_API)) {
253 return true;
254 }
255
256 if (!IS_USED(MODULE_NETDEV_LEGACY_API)) {
257 return false;
258 }
259
260 /* both legacy and new API netdevs in use, fall back to runtime test: */
261 return (netif->dev->driver->confirm_send == NULL);
262}
263
272static inline bool gnrc_netif_netdev_new_api(gnrc_netif_t *netif)
273{
274 return !gnrc_netif_netdev_legacy_api(netif);
275}
276
302 int (*init)(gnrc_netif_t *netif);
303
324 int (*send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt);
325
342 gnrc_pktsnip_t *(*recv)(gnrc_netif_t *netif);
343
358 int (*get)(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt);
359
375 int (*set)(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt);
376
387 void (*msg_handler)(gnrc_netif_t *netif, msg_t *msg);
388};
389
399
417ACCESS(write_only, 2, 3)
418int gnrc_netif_create(gnrc_netif_t *netif, char *stack, int stacksize,
419 char priority, const char *name, netdev_t *dev,
420 const gnrc_netif_ops_t *ops);
421
427unsigned gnrc_netif_numof(void);
428
440static inline bool gnrc_netif_highlander(void)
441{
442 return IS_USED(MODULE_GNRC_NETIF_SINGLE);
443}
444
454
464
486static inline int gnrc_netif_ipv6_addrs_get(const gnrc_netif_t *netif,
487 ipv6_addr_t *addrs,
488 size_t max_len)
489{
490 assert(netif != NULL);
491 assert(addrs != NULL);
492 assert(max_len >= sizeof(ipv6_addr_t));
493 return gnrc_netapi_get(netif->pid, NETOPT_IPV6_ADDR, 0, addrs, max_len);
494}
495
517static inline int gnrc_netif_ipv6_addr_add(const gnrc_netif_t *netif,
518 const ipv6_addr_t *addr, unsigned pfx_len,
519 uint8_t flags)
520{
521 assert(netif != NULL);
522 assert(addr != NULL);
523 assert((pfx_len > 0) && (pfx_len <= 128));
524 return gnrc_netapi_set(netif->pid, NETOPT_IPV6_ADDR,
525 ((pfx_len << 8U) | flags), addr,
526 sizeof(ipv6_addr_t));
527}
528
542static inline int gnrc_netif_ipv6_addr_remove(const gnrc_netif_t *netif,
543 const ipv6_addr_t *addr)
544{
545 assert(netif != NULL);
546 assert(addr != NULL);
548 0, addr, sizeof(ipv6_addr_t));
549}
550
571static inline int gnrc_netif_ipv6_groups_get(const gnrc_netif_t *netif,
572 ipv6_addr_t *groups,
573 size_t max_len)
574{
575 assert(netif != NULL);
576 assert(groups != NULL);
577 assert(max_len >= sizeof(ipv6_addr_t));
578 return gnrc_netapi_get(netif->pid, NETOPT_IPV6_GROUP, 0, groups, max_len);
579}
580
595static inline int gnrc_netif_ipv6_group_join(const gnrc_netif_t *netif,
596 const ipv6_addr_t *group)
597{
598 assert(netif != NULL);
599 assert(group != NULL);
600 return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP, 0, group,
601 sizeof(ipv6_addr_t));
602}
603
617static inline int gnrc_netif_ipv6_group_leave(const gnrc_netif_t *netif,
618 const ipv6_addr_t *group)
619{
620 assert(netif != NULL);
621 assert(group != NULL);
622 return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP_LEAVE, 0, group,
623 sizeof(ipv6_addr_t));
624}
625
635
648
661 const gnrc_netapi_opt_t *opt);
662
675
694static inline char *gnrc_netif_addr_to_str(const uint8_t *addr, size_t addr_len, char *out)
695{
696 return l2util_addr_to_str(addr, addr_len, out);
697}
698
719static inline size_t gnrc_netif_addr_from_str(const char *str,
720 uint8_t out[GNRC_NETIF_L2ADDR_MAXLEN])
721{
723}
724
734static inline int gnrc_netif_send(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
735{
736 return gnrc_netapi_send(netif->pid, pkt);
737}
738
739#if defined(MODULE_GNRC_NETIF_BUS) || DOXYGEN
749 gnrc_netif_bus_t type)
750{
751 assert(type < GNRC_NETIF_BUS_NUMOF);
752 return &netif->bus[type];
753}
754
771 uint32_t timeout_ms);
772#endif /* MODULE_GNRC_NETIF_BUS */
773
774#ifdef __cplusplus
775}
776#endif
777
6LoWPAN definitions for Network interface API
#define assert(cond)
abort the program if assertion is false
Definition assert.h:143
Common macros and compiler attributes/pragmas configuration.
#define ACCESS(mode, ptr_idx, size_idx)
Emit an attribute (if supported by the compiler) that declares how a function will access its paramet...
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
struct netdev netdev_t
Forward declaration for netdev struct.
Definition netdev.h:285
netdev_type_t
Driver types for netdev.
Definition netdev.h:303
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:280
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:257
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:158
#define GNRC_NETIF_L2ADDR_MAXLEN
Maximum length of the link-layer address.
Definition conf.h:155
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:486
static size_t gnrc_netif_addr_from_str(const char *str, uint8_t out[GNRC_NETIF_L2ADDR_MAXLEN])
Parses a string of colon-separated hexadecimals to a hardware address.
Definition netif.h:719
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:272
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:617
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:595
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:114
#define GNRC_NETIF_EVQ_NUMOF
Number of event queues.
Definition netif.h:98
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:243
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:694
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:734
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:517
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:103
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:748
struct gnrc_netif_ops gnrc_netif_ops_t
Operations to an interface.
Definition netif.h:132
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:571
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:542
static bool gnrc_netif_highlander(void)
Check if there can only be one gnrc_netif_t interface.
Definition netif.h:440
void gnrc_netif_init_devs(void)
Initialize all available network interfaces.
@ GNRC_IPV6_EVENT_ADDR_VALID
Address becomes valid.
Definition netif.h:126
@ GNRC_NETIF_BUS_IPV6
provides gnrc_ipv6_event_t messages to subscribers
Definition netif.h:105
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_sized(const char *str, void *addr, size_t addr_size)
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:160
@ NETOPT_IPV6_GROUP_LEAVE
(ipv6_addr_t) Leave an IPv6 multicast group on an interface
Definition netopt.h:164
@ 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:132
@ NETOPT_IPV6_ADDR_REMOVE
(ipv6_addr_t) Removes an IPv6 address from an interface
Definition netopt.h:136
struct PTRTAG event_queue_t
event queue structure
struct event event_t
event structure forward declaration
Definition event.h:132
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:67
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:179
LoRaWAN adaption for Network interface API.
Common network interface API definitions.
Definition of global configuration options.
Recursive Mutex for thread synchronization.
Data structure to be send for setting (GNRC_NETAPI_MSG_TYPE_SET) and getting (GNRC_NETAPI_MSG_TYPE_GE...
Definition netapi.h:105
6Lo component of gnrc_netif_t
Definition 6lo.h:49
Structure to store information on the last broadcast packet received.
Definition dedup.h:38
IPv6 component for gnrc_netif_t.
Definition ipv6.h:75
GNRC LoRaWAN interface descriptor.
Definition lorawan.h:34
int(* init)(gnrc_netif_t *netif)
Initializes and registers network interface.
Definition netif.h:302
int(* set)(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt)
Sets an option from the network interface.
Definition netif.h:375
int(* send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
Send a packet over the network interface.
Definition netif.h:324
void(* msg_handler)(gnrc_netif_t *netif, msg_t *msg)
Message handler for network interface.
Definition netif.h:387
int(* get)(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt)
Gets an option from the network interface.
Definition netif.h:358
A packet queue for Network interface API with a de-queue timer.
Definition type.h:33
Representation of a network interface.
Definition netif.h:137
gnrc_netif_lorawan_t lorawan
LoRaWAN component.
Definition netif.h:146
msg_bus_t bus[GNRC_NETIF_BUS_NUMOF]
Event Message Bus.
Definition netif.h:152
event_queue_t evq[GNRC_NETIF_EVQ_NUMOF]
Event queue for asynchronous events.
Definition netif.h:163
rmutex_t mutex
Mutex of the interface.
Definition netif.h:141
netstats_t stats
transceiver's statistics
Definition netif.h:143
uint32_t flags
Flags for the interface.
Definition netif.h:159
const gnrc_netif_ops_t * ops
Operations of the network interface.
Definition netif.h:139
uint8_t device_type
Device type.
Definition netif.h:224
gnrc_netif_6lo_t sixlo
6Lo component
Definition netif.h:209
uint8_t cur_hl
Current hop-limit for out-going packets.
Definition netif.h:223
netif_t netif
network interface descriptor
Definition netif.h:138
uint8_t l2addr_len
Length in bytes of gnrc_netif_t::l2addr.
Definition netif.h:198
kernel_pid_t pid
PID of the network interface's thread.
Definition netif.h:225
event_t event_isr
ISR event for the network device.
Definition netif.h:167
uint8_t l2addr[GNRC_NETIF_L2ADDR_MAXLEN]
The link-layer address currently used as the source address on this interface.
Definition netif.h:191
gnrc_netif_dedup_t last_pkt
Last received packet information.
Definition netif.h:205
gnrc_netif_ipv6_t ipv6
IPv6 component.
Definition netif.h:149
msg_t msg_queue[GNRC_NETIF_MSG_QUEUE_SIZE]
Message queue for the netif thread.
Definition netif.h:222
netdev_t * dev
Network device of the network interface.
Definition netif.h:140
gnrc_pktsnip_t * tx_pkt
Outgoing frame that is currently transmitted.
Definition netif.h:182
event_t event_tx_done
TX done event for the network device.
Definition netif.h:174
gnrc_netif_pktq_t send_queue
Packet queue for sending.
Definition netif.h:217
A message bus is just a list of subscribers.
Definition msg_bus.h:50
Describes a message object which can be sent between threads.
Definition msg.h:193
const struct netdev_driver * driver
ptr to that driver's interface.
Definition netdev.h:364
Network interface descriptor.
Definition netif.h:68
Global statistics struct.
Definition netstats.h:56
Mutex structure.
Definition rmutex.h:34
Data type to represent an IPv6 address.
Definition addr.h:64