Loading...
Searching...
No Matches
internal.h
1/*
2 * Copyright (C) 2017 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
21#ifndef NET_GNRC_NETIF_INTERNAL_H
22#define NET_GNRC_NETIF_INTERNAL_H
23
24#include "modules.h"
25
26#include "net/gnrc/netif.h"
27#include "net/l2util.h"
28#include "net/netopt.h"
29
30#ifdef MODULE_GNRC_IPV6_NIB
32#endif
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
41#define GNRC_NETIF_PKTQ_DEQUEUE_MSG (0x1233)
42
50void gnrc_netif_acquire(gnrc_netif_t *netif);
51
59void gnrc_netif_release(gnrc_netif_t *netif);
60
61#if IS_USED(MODULE_GNRC_NETIF_IPV6) || DOXYGEN
97int gnrc_netif_ipv6_addr_add_internal(gnrc_netif_t *netif,
98 const ipv6_addr_t *addr,
99 unsigned pfx_len, uint8_t flags);
100
111void gnrc_netif_ipv6_addr_remove_internal(gnrc_netif_t *netif,
112 const ipv6_addr_t *addr);
113
130int gnrc_netif_ipv6_addr_idx(gnrc_netif_t *netif,
131 const ipv6_addr_t *addr);
132
141static inline uint8_t gnrc_netif_ipv6_addr_get_state(const gnrc_netif_t *netif,
142 int idx)
143{
145}
146
157static inline uint8_t gnrc_netif_ipv6_addr_dad_trans(const gnrc_netif_t *netif,
158 int idx)
159{
161}
162
181int gnrc_netif_ipv6_addr_match(gnrc_netif_t *netif,
182 const ipv6_addr_t *addr);
183
210ipv6_addr_t *gnrc_netif_ipv6_addr_best_src(gnrc_netif_t *netif,
211 const ipv6_addr_t *dst,
212 bool ll_only);
213
225gnrc_netif_t *gnrc_netif_get_by_ipv6_addr(const ipv6_addr_t *addr);
226
236gnrc_netif_t *gnrc_netif_get_by_prefix(const ipv6_addr_t *prefix);
237
252int gnrc_netif_ipv6_group_join_internal(gnrc_netif_t *netif,
253 const ipv6_addr_t *addr);
254
265void gnrc_netif_ipv6_group_leave_internal(gnrc_netif_t *netif,
266 const ipv6_addr_t *addr);
267
284int gnrc_netif_ipv6_group_idx(gnrc_netif_t *netif,
285 const ipv6_addr_t *addr);
286
294static inline void gnrc_netif_ipv6_bus_post(gnrc_netif_t *netif, int type,
295 const void *ctx)
296{
297#ifdef MODULE_GNRC_NETIF_BUS
298 msg_bus_post(&netif->bus[GNRC_NETIF_BUS_IPV6], type, ctx);
299#else
300 (void) netif;
301 (void) type;
302 (void) ctx;
303#endif
304}
305#endif /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
306
321static inline bool gnrc_netif_is_rtr(const gnrc_netif_t *netif)
322{
323 if (IS_USED(MODULE_GNRC_IPV6_ROUTER)) {
324 return (netif->flags & GNRC_NETIF_FLAGS_IPV6_FORWARDING);
325 }
326 else {
327 return false;
328 }
329}
330
344static inline bool gnrc_netif_is_rtr_adv(const gnrc_netif_t *netif)
345{
346 if (IS_USED(MODULE_GNRC_IPV6_ROUTER)) {
347 return (netif->flags & GNRC_NETIF_FLAGS_IPV6_RTR_ADV);
348 }
349 else {
350 return false;
351 }
352}
353
363bool gnrc_netif_dev_is_6lo(const gnrc_netif_t *netif);
364
382static inline bool gnrc_netif_is_6lo(const gnrc_netif_t *netif)
383{
384 if ((!gnrc_netif_highlander() &&
385 IS_USED(MODULE_GNRC_SIXLOWPAN)) || \
386 IS_USED(MODULE_GNRC_SIXLOENC)) {
387 return gnrc_netif_dev_is_6lo(netif);
388 }
389 else if (gnrc_netif_highlander() && IS_USED(MODULE_GNRC_SIXLOWPAN)) {
390 return true;
391 }
392 else {
393 return false;
394 }
395}
396
411static inline bool gnrc_netif_is_6ln(const gnrc_netif_t *netif)
412{
414 return (netif->flags & GNRC_NETIF_FLAGS_6LN);
415 }
416 else {
417 return false;
418 }
419}
420
435static inline bool gnrc_netif_is_6lr(const gnrc_netif_t *netif)
436{
437 /* if flag checkers even evaluate, otherwise just assume their result */
439 (IS_USED(MODULE_GNRC_IPV6_ROUTER) ||
441 !IS_USED(MODULE_GNRC_SIXLOWPAN))) {
442 return gnrc_netif_is_rtr(netif) && gnrc_netif_is_6ln(netif);
443 }
444 else {
445 return false;
446 }
447}
448
463static inline bool gnrc_netif_is_6lbr(const gnrc_netif_t *netif)
464{
466 return (netif->flags & GNRC_NETIF_FLAGS_6LO_ABR) &&
467 gnrc_netif_is_6lr(netif);
468 }
469 else {
470 return false;
471 }
472}
473
494netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif);
495
516int gnrc_netif_eui64_from_addr(const gnrc_netif_t *netif,
517 const uint8_t *addr, size_t addr_len,
518 eui64_t *eui64);
519
535static inline int gnrc_netif_get_eui64(gnrc_netif_t *netif, eui64_t *eui64)
536{
537#if GNRC_NETIF_L2ADDR_MAXLEN > 0
538 if (netif->flags & GNRC_NETIF_FLAGS_HAS_L2ADDR) {
539 return gnrc_netif_eui64_from_addr(netif,
540 netif->l2addr, netif->l2addr_len,
541 eui64);
542 }
543#endif /* GNRC_NETIF_L2ADDR_MAXLEN > 0 */
544 (void)netif;
545 (void)eui64;
546 return -ENOTSUP;
547}
548
555void gnrc_netif_init_6ln(gnrc_netif_t *netif);
556
557#if IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN)
564void gnrc_netif_ipv6_init_mtu(gnrc_netif_t *netif);
565
589int gnrc_netif_ipv6_iid_from_addr(const gnrc_netif_t *netif,
590 const uint8_t *addr, size_t addr_len,
591 eui64_t *iid);
592
617static inline int gnrc_netif_ipv6_iid_to_addr(const gnrc_netif_t *netif,
618 const eui64_t *iid, uint8_t *addr)
619{
621 return l2util_ipv6_iid_to_addr(netif->device_type, iid, addr);
622}
623
643static inline int gnrc_netif_ipv6_get_iid(gnrc_netif_t *netif, eui64_t *iid)
644{
645#if GNRC_NETIF_L2ADDR_MAXLEN > 0
646 if (netif->flags & GNRC_NETIF_FLAGS_HAS_L2ADDR) {
647 return gnrc_netif_ipv6_iid_from_addr(netif,
648 netif->l2addr, netif->l2addr_len,
649 iid);
650 }
651#endif /* GNRC_NETIF_L2ADDR_MAXLEN > 0 */
652 (void)netif;
653 (void)iid;
654 return -ENOTSUP;
655}
656
684static inline int gnrc_netif_ndp_addr_len_from_l2ao(gnrc_netif_t *netif,
685 const ndp_opt_t *opt)
686{
688 return l2util_ndp_addr_len_from_l2ao(netif->device_type, opt);
689}
690
706static inline int gnrc_netif_ipv6_group_to_l2_group(gnrc_netif_t *netif,
707 const ipv6_addr_t *ipv6_group,
708 uint8_t *l2_group)
709{
710 return l2util_ipv6_group_to_l2_group(netif->device_type, ipv6_group,
711 l2_group);
712}
713
733int gnrc_netif_ipv6_add_prefix(gnrc_netif_t *netif,
734 const ipv6_addr_t *pfx, uint8_t pfx_len,
735 uint32_t valid, uint32_t pref);
736#else /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
737#define gnrc_netif_ipv6_init_mtu(netif) (void)netif
738#define gnrc_netif_ipv6_iid_from_addr(netif, addr, addr_len, iid) (-ENOTSUP)
739#define gnrc_netif_ipv6_iid_to_addr(netif, iid, addr) (-ENOTSUP)
740#define gnrc_netif_ndp_addr_len_from_l2ao(netif, opt) (-ENOTSUP)
741#define gnrc_netif_ipv6_get_iid(netif, iid) (-ENOTSUP)
742#define gnrc_netif_ipv6_group_to_l2_group(netif, ipv6_group, l2_group) (-ENOTSUP)
743#endif /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
746#ifdef __cplusplus
747}
748#endif
749
750#endif /* NET_GNRC_NETIF_INTERNAL_H */
#define assert(cond)
abort the program if assertion is false
Definition assert.h:137
#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:58
#define GNRC_NETIF_FLAGS_HAS_L2ADDR
Network interface has link-layer address.
Definition flags.h:47
#define GNRC_NETIF_FLAGS_6LO_ABR
This interface acts as a 6Lo border router to the LLN.
Definition flags.h:109
#define GNRC_NETIF_FLAGS_IPV6_FORWARDING
Network interface is enabled for IPv6 forwarding.
Definition flags.h:52
#define GNRC_NETIF_FLAGS_6LN
This interface represents a 6Lo node (6LN) according to RFC 6775.
Definition flags.h:132
#define GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_TENTATIVE
Tentative states (with encoded DAD retransmissions)
Definition ipv6.h:55
#define GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_MASK
Mask for the address' state.
Definition ipv6.h:46
Definition for GNRC's network interfaces.
#define ENOTSUP
Not supported (may be the same value as [EOPNOTSUPP]).
Definition errno.h:130
#define CONFIG_GNRC_IPV6_NIB_6LBR
enable features for 6Lo border router
Definition conf.h:91
#define CONFIG_GNRC_IPV6_NIB_6LR
enable features for 6Lo router
Definition conf.h:101
#define CONFIG_GNRC_IPV6_NIB_6LN
enable features for 6Lo node
Definition conf.h:112
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:103
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:45
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:71
#define IS_ACTIVE(macro)
Allows to verify a macro definition outside the preprocessor.
Definition modules.h:60
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:251
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:86
Representation of a network interface.
Definition netif.h:135
msg_bus_t bus[GNRC_NETIF_BUS_NUMOF]
Event Message Bus.
Definition netif.h:153
uint32_t flags
Flags for the interface.
Definition netif.h:160
uint8_t device_type
Device type.
Definition netif.h:225
uint8_t l2addr_len
Length in bytes of gnrc_netif_t::l2addr.
Definition netif.h:199
uint8_t l2addr[GNRC_NETIF_L2ADDR_MAXLEN]
The link-layer address currently used as the source address on this interface.
Definition netif.h:192
gnrc_netif_ipv6_t ipv6
IPv6 component.
Definition netif.h:147
General NDP option format.
Definition ndp.h:298
Data type to represent an EUI-64.
Definition eui64.h:55
Data type to represent an IPv6 address.
Definition addr.h:72