Loading...
Searching...
No Matches
internal.h
1/*
2 * SPDX-FileCopyrightText: 2017 Freie Universität Berlin
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
20
21#include "compiler_hints.h"
22#include "modules.h"
23#include "net/gnrc/netif.h"
24#include "net/l2util.h"
25#include "net/netopt.h"
26
27#ifdef MODULE_GNRC_IPV6_NIB
29#endif
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
38#define GNRC_NETIF_PKTQ_DEQUEUE_MSG (0x1233)
39
47void gnrc_netif_acquire(gnrc_netif_t *netif);
48
56void gnrc_netif_release(gnrc_netif_t *netif);
57
58#if IS_USED(MODULE_GNRC_NETIF_IPV6) || DOXYGEN
94int gnrc_netif_ipv6_addr_add_internal(gnrc_netif_t *netif,
95 const ipv6_addr_t *addr,
96 unsigned pfx_len, uint8_t flags);
97
108void gnrc_netif_ipv6_addr_remove_internal(gnrc_netif_t *netif,
109 const ipv6_addr_t *addr);
110
127int gnrc_netif_ipv6_addr_idx(gnrc_netif_t *netif,
128 const ipv6_addr_t *addr);
129
138static inline uint8_t gnrc_netif_ipv6_addr_get_state(const gnrc_netif_t *netif,
139 int idx)
140{
142}
143
154static inline uint8_t gnrc_netif_ipv6_addr_dad_trans(const gnrc_netif_t *netif,
155 int idx)
156{
158}
159
178int gnrc_netif_ipv6_addr_match(gnrc_netif_t *netif,
179 const ipv6_addr_t *addr);
180
207ipv6_addr_t *gnrc_netif_ipv6_addr_best_src(gnrc_netif_t *netif,
208 const ipv6_addr_t *dst,
209 bool ll_only);
210
222gnrc_netif_t *gnrc_netif_get_by_ipv6_addr(const ipv6_addr_t *addr);
223
233gnrc_netif_t *gnrc_netif_get_by_prefix(const ipv6_addr_t *prefix);
234
249int gnrc_netif_ipv6_group_join_internal(gnrc_netif_t *netif,
250 const ipv6_addr_t *addr);
251
262void gnrc_netif_ipv6_group_leave_internal(gnrc_netif_t *netif,
263 const ipv6_addr_t *addr);
264
281int gnrc_netif_ipv6_group_idx(gnrc_netif_t *netif,
282 const ipv6_addr_t *addr);
283
291static inline void gnrc_netif_ipv6_bus_post(gnrc_netif_t *netif, int type,
292 const void *ctx)
293{
294#ifdef MODULE_GNRC_NETIF_BUS
295 msg_bus_post(&netif->bus[GNRC_NETIF_BUS_IPV6], type, ctx);
296#else
297 (void) netif;
298 (void) type;
299 (void) ctx;
300#endif
301}
302#endif /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
303
318static inline bool gnrc_netif_is_rtr(const gnrc_netif_t *netif)
319{
320 if (IS_USED(MODULE_GNRC_IPV6_ROUTER)) {
321 return (netif->flags & GNRC_NETIF_FLAGS_IPV6_FORWARDING);
322 }
323 else {
324 return false;
325 }
326}
327
341static inline bool gnrc_netif_is_rtr_adv(const gnrc_netif_t *netif)
342{
343 if (IS_USED(MODULE_GNRC_IPV6_ROUTER)) {
344 return (netif->flags & GNRC_NETIF_FLAGS_IPV6_RTR_ADV);
345 }
346 else {
347 return false;
348 }
349}
350
360bool gnrc_netif_dev_is_6lo(const gnrc_netif_t *netif);
361
379static inline bool gnrc_netif_is_6lo(const gnrc_netif_t *netif)
380{
381 if ((!gnrc_netif_highlander() &&
382 IS_USED(MODULE_GNRC_SIXLOWPAN)) || \
383 IS_USED(MODULE_GNRC_SIXLOENC)) {
384 return gnrc_netif_dev_is_6lo(netif);
385 }
386 else if (gnrc_netif_highlander() && IS_USED(MODULE_GNRC_SIXLOWPAN)) {
387 return true;
388 }
389 else {
390 return false;
391 }
392}
393
408static inline bool gnrc_netif_is_6ln(const gnrc_netif_t *netif)
409{
411 return (netif->flags & GNRC_NETIF_FLAGS_6LN);
412 }
413 else {
414 return false;
415 }
416}
417
432static inline bool gnrc_netif_is_6lr(const gnrc_netif_t *netif)
433{
434 /* if flag checkers even evaluate, otherwise just assume their result */
436 (IS_USED(MODULE_GNRC_IPV6_ROUTER) ||
438 !IS_USED(MODULE_GNRC_SIXLOWPAN))) {
439 return gnrc_netif_is_rtr(netif) && gnrc_netif_is_6ln(netif);
440 }
441 else {
442 return false;
443 }
444}
445
460static inline bool gnrc_netif_is_6lbr(const gnrc_netif_t *netif)
461{
463 return (netif->flags & GNRC_NETIF_FLAGS_6LO_ABR) &&
464 gnrc_netif_is_6lr(netif);
465 }
466 else {
467 return false;
468 }
469}
470
491netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif);
492
513ACCESS(read_only, 2, 3)
514int gnrc_netif_eui64_from_addr(const gnrc_netif_t *netif,
515 const uint8_t *addr, size_t addr_len,
516 eui64_t *eui64);
517
533static inline int gnrc_netif_get_eui64(gnrc_netif_t *netif, eui64_t *eui64)
534{
535#if GNRC_NETIF_L2ADDR_MAXLEN > 0
536 if (netif->flags & GNRC_NETIF_FLAGS_HAS_L2ADDR) {
537 return gnrc_netif_eui64_from_addr(netif,
538 netif->l2addr, netif->l2addr_len,
539 eui64);
540 }
541#endif /* GNRC_NETIF_L2ADDR_MAXLEN > 0 */
542 (void)netif;
543 (void)eui64;
544 return -ENOTSUP;
545}
546
553void gnrc_netif_init_6ln(gnrc_netif_t *netif);
554
555#if IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN)
562void gnrc_netif_ipv6_init_mtu(gnrc_netif_t *netif);
563
587ACCESS(read_only, 2, 3)
588int gnrc_netif_ipv6_iid_from_addr(const gnrc_netif_t *netif,
589 const uint8_t *addr, size_t addr_len,
590 eui64_t *iid);
591
616static inline int gnrc_netif_ipv6_iid_to_addr(const gnrc_netif_t *netif,
617 const eui64_t *iid, uint8_t *addr)
618{
619 assert(netif->flags & GNRC_NETIF_FLAGS_HAS_L2ADDR);
620 return l2util_ipv6_iid_to_addr(netif->device_type, iid, addr);
621}
622
642static inline int gnrc_netif_ipv6_get_iid(gnrc_netif_t *netif, eui64_t *iid)
643{
644#if GNRC_NETIF_L2ADDR_MAXLEN > 0
645 if (netif->flags & GNRC_NETIF_FLAGS_HAS_L2ADDR) {
646 return gnrc_netif_ipv6_iid_from_addr(netif,
647 netif->l2addr, netif->l2addr_len,
648 iid);
649 }
650#endif /* GNRC_NETIF_L2ADDR_MAXLEN > 0 */
651 (void)netif;
652 (void)iid;
653 return -ENOTSUP;
654}
655
683static inline int gnrc_netif_ndp_addr_len_from_l2ao(gnrc_netif_t *netif,
684 const ndp_opt_t *opt)
685{
687 return l2util_ndp_addr_len_from_l2ao(netif->device_type, opt);
688}
689
705static inline int gnrc_netif_ipv6_group_to_l2_group(gnrc_netif_t *netif,
706 const ipv6_addr_t *ipv6_group,
707 uint8_t *l2_group)
708{
709 return l2util_ipv6_group_to_l2_group(netif->device_type, ipv6_group,
710 l2_group);
711}
712
732int gnrc_netif_ipv6_add_prefix(gnrc_netif_t *netif,
733 const ipv6_addr_t *pfx, uint8_t pfx_len,
734 uint32_t valid, uint32_t pref);
735#else /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
736#define gnrc_netif_ipv6_init_mtu(netif) (void)netif
737#define gnrc_netif_ipv6_iid_from_addr(netif, addr, addr_len, iid) (-ENOTSUP)
738#define gnrc_netif_ipv6_iid_to_addr(netif, iid, addr) (-ENOTSUP)
739#define gnrc_netif_ndp_addr_len_from_l2ao(netif, opt) (-ENOTSUP)
740#define gnrc_netif_ipv6_get_iid(netif, iid) (-ENOTSUP)
741#define gnrc_netif_ipv6_group_to_l2_group(netif, ipv6_group, l2_group) (-ENOTSUP)
742#endif /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
744
745#ifdef __cplusplus
746}
747#endif
748
#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...
#define GNRC_NETIF_FLAGS_IPV6_RTR_ADV
Network interface advertises itself as an IPv6 router (implies GNRC_NETIF_FLAGS_IPV6_FORWARDING to be...
Definition flags.h:55
#define GNRC_NETIF_FLAGS_HAS_L2ADDR
Network interface has link-layer address.
Definition flags.h:44
#define GNRC_NETIF_FLAGS_6LO_ABR
This interface acts as a 6Lo border router to the LLN.
Definition flags.h:100
#define GNRC_NETIF_FLAGS_IPV6_FORWARDING
Network interface is enabled for IPv6 forwarding.
Definition flags.h:49
#define GNRC_NETIF_FLAGS_6LN
This interface represents a 6Lo node (6LN) according to RFC 6775.
Definition flags.h:123
#define GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_TENTATIVE
Tentative states (with encoded DAD retransmissions)
Definition ipv6.h:52
#define GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_MASK
Mask for the address' state.
Definition ipv6.h:43
Definition for GNRC's network interfaces.
#define ENOTSUP
Not supported (may be the same value as [EOPNOTSUPP]).
Definition errno.h:129
#define CONFIG_GNRC_IPV6_NIB_6LBR
enable features for 6Lo border router
Definition conf.h:87
#define CONFIG_GNRC_IPV6_NIB_6LR
enable features for 6Lo router
Definition conf.h:97
#define CONFIG_GNRC_IPV6_NIB_6LN
enable features for 6Lo node
Definition conf.h:108
static bool gnrc_netif_highlander(void)
Check if there can only be one gnrc_netif_t interface.
Definition netif.h:440
@ GNRC_NETIF_BUS_IPV6
provides gnrc_ipv6_event_t messages to subscribers
Definition netif.h:105
int l2util_ndp_addr_len_from_l2ao(int dev_type, const ndp_opt_t *opt)
Derives the length of the link-layer address in an NDP link-layer address option from that option's l...
int l2util_ipv6_iid_to_addr(int dev_type, const eui64_t *iid, uint8_t *addr)
Converts an IPv6 IID to a hardware address.
int l2util_ipv6_group_to_l2_group(int dev_type, const ipv6_addr_t *ipv6_group, uint8_t *l2_group)
Converts an IPv6 multicast address to a multicast address of the respective link layer.
netopt_t
Global list of configuration options available throughout the network stack, e.g.
Definition netopt.h:41
Configuration macro definitions for neighbor information base.
Link-layer helper function definitions.
Common macros and compiler attributes/pragmas configuration.
#define IS_USED(module)
Checks whether a module is being used or not.
Definition modules.h:67
#define IS_ACTIVE(macro)
Allows to verify a macro definition outside the preprocessor.
Definition modules.h:56
static int msg_bus_post(msg_bus_t *bus, uint8_t type, const void *arg)
Post a message to a bus.
Definition msg_bus.h:247
Definition of global configuration options.
uint8_t addrs_flags[CONFIG_GNRC_NETIF_IPV6_ADDRS_NUMOF]
Flags for gnrc_netif_t::ipv6_addrs.
Definition ipv6.h:83
Representation of a network interface.
Definition netif.h:137
msg_bus_t bus[GNRC_NETIF_BUS_NUMOF]
Event Message Bus.
Definition netif.h:152
uint32_t flags
Flags for the interface.
Definition netif.h:159
uint8_t device_type
Device type.
Definition netif.h:224
uint8_t l2addr_len
Length in bytes of gnrc_netif_t::l2addr.
Definition netif.h:198
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_ipv6_t ipv6
IPv6 component.
Definition netif.h:149
General NDP option format.
Definition ndp.h:295
Data type to represent an EUI-64.
Definition eui64.h:52
Data type to represent an IPv6 address.
Definition addr.h:64