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 <kernel_defines.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
31 #include "net/gnrc/ipv6/nib/conf.h"
32 #endif
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
41 #define GNRC_NETIF_PKTQ_DEQUEUE_MSG (0x1233)
42 
46 #define NETDEV_MSG_TYPE_EVENT (0x1234)
47 
55 void gnrc_netif_acquire(gnrc_netif_t *netif);
56 
64 void gnrc_netif_release(gnrc_netif_t *netif);
65 
66 #if IS_USED(MODULE_GNRC_NETIF_IPV6) || DOXYGEN
67 
102 int gnrc_netif_ipv6_addr_add_internal(gnrc_netif_t *netif,
103  const ipv6_addr_t *addr,
104  unsigned pfx_len, uint8_t flags);
105 
116 void gnrc_netif_ipv6_addr_remove_internal(gnrc_netif_t *netif,
117  const ipv6_addr_t *addr);
118 
119 
136 int gnrc_netif_ipv6_addr_idx(gnrc_netif_t *netif,
137  const ipv6_addr_t *addr);
138 
147 static inline uint8_t gnrc_netif_ipv6_addr_get_state(const gnrc_netif_t *netif,
148  int idx)
149 {
151 }
152 
163 static inline uint8_t gnrc_netif_ipv6_addr_dad_trans(const gnrc_netif_t *netif,
164  int idx)
165 {
167 }
168 
187 int gnrc_netif_ipv6_addr_match(gnrc_netif_t *netif,
188  const ipv6_addr_t *addr);
189 
216 ipv6_addr_t *gnrc_netif_ipv6_addr_best_src(gnrc_netif_t *netif,
217  const ipv6_addr_t *dst,
218  bool ll_only);
219 
231 gnrc_netif_t *gnrc_netif_get_by_ipv6_addr(const ipv6_addr_t *addr);
232 
242 gnrc_netif_t *gnrc_netif_get_by_prefix(const ipv6_addr_t *prefix);
243 
258 int gnrc_netif_ipv6_group_join_internal(gnrc_netif_t *netif,
259  const ipv6_addr_t *addr);
260 
271 void gnrc_netif_ipv6_group_leave_internal(gnrc_netif_t *netif,
272  const ipv6_addr_t *addr);
273 
290 int gnrc_netif_ipv6_group_idx(gnrc_netif_t *netif,
291  const ipv6_addr_t *addr);
292 
300 static inline void gnrc_netif_ipv6_bus_post(gnrc_netif_t *netif, int type,
301  const void *ctx)
302 {
303 #ifdef MODULE_GNRC_NETIF_BUS
304  msg_bus_post(&netif->bus[GNRC_NETIF_BUS_IPV6], type, ctx);
305 #else
306  (void) netif;
307  (void) type;
308  (void) ctx;
309 #endif
310 }
311 #endif /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
312 
327 static inline bool gnrc_netif_is_rtr(const gnrc_netif_t *netif)
328 {
329  if (IS_USED(MODULE_GNRC_IPV6_ROUTER)) {
330  return (netif->flags & GNRC_NETIF_FLAGS_IPV6_FORWARDING);
331  }
332  else {
333  return false;
334  }
335 }
336 
350 static inline bool gnrc_netif_is_rtr_adv(const gnrc_netif_t *netif)
351 {
352  if (IS_USED(MODULE_GNRC_IPV6_ROUTER)) {
353  return (netif->flags & GNRC_NETIF_FLAGS_IPV6_RTR_ADV);
354  }
355  else {
356  return false;
357  }
358 }
359 
369 bool gnrc_netif_dev_is_6lo(const gnrc_netif_t *netif);
370 
388 static inline bool gnrc_netif_is_6lo(const gnrc_netif_t *netif)
389 {
390  if ((!gnrc_netif_highlander() &&
391  IS_USED(MODULE_GNRC_SIXLOWPAN)) || \
392  IS_USED(MODULE_GNRC_SIXLOENC)) {
393  return gnrc_netif_dev_is_6lo(netif);
394  }
395  else if (gnrc_netif_highlander() && IS_USED(MODULE_GNRC_SIXLOWPAN)) {
396  return true;
397  }
398  else {
399  return false;
400  }
401 }
402 
417 static inline bool gnrc_netif_is_6ln(const gnrc_netif_t *netif)
418 {
420  return (netif->flags & GNRC_NETIF_FLAGS_6LN);
421  }
422  else {
423  return false;
424  }
425 }
426 
441 static inline bool gnrc_netif_is_6lr(const gnrc_netif_t *netif)
442 {
443  /* if flag checkers even evaluate, otherwise just assume their result */
445  (IS_USED(MODULE_GNRC_IPV6_ROUTER) ||
446  (!gnrc_netif_highlander()) ||
447  !IS_USED(MODULE_GNRC_SIXLOWPAN))) {
448  return gnrc_netif_is_rtr(netif) && gnrc_netif_is_6ln(netif);
449  }
450  else {
451  return false;
452  }
453 }
454 
469 static inline bool gnrc_netif_is_6lbr(const gnrc_netif_t *netif)
470 {
472  return (netif->flags & GNRC_NETIF_FLAGS_6LO_ABR) &&
473  gnrc_netif_is_6lr(netif);
474  }
475  else {
476  return false;
477  }
478 }
479 
500 netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif);
501 
522 int gnrc_netif_eui64_from_addr(const gnrc_netif_t *netif,
523  const uint8_t *addr, size_t addr_len,
524  eui64_t *eui64);
525 
541 static inline int gnrc_netif_get_eui64(gnrc_netif_t *netif, eui64_t *eui64)
542 {
543 #if GNRC_NETIF_L2ADDR_MAXLEN > 0
544  if (netif->flags & GNRC_NETIF_FLAGS_HAS_L2ADDR) {
545  return gnrc_netif_eui64_from_addr(netif,
546  netif->l2addr, netif->l2addr_len,
547  eui64);
548  }
549 #endif /* GNRC_NETIF_L2ADDR_MAXLEN > 0 */
550  (void)netif;
551  (void)eui64;
552  return -ENOTSUP;
553 }
554 
561 void gnrc_netif_init_6ln(gnrc_netif_t *netif);
562 
563 #if IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN)
564 
570 void gnrc_netif_ipv6_init_mtu(gnrc_netif_t *netif);
571 
595 int gnrc_netif_ipv6_iid_from_addr(const gnrc_netif_t *netif,
596  const uint8_t *addr, size_t addr_len,
597  eui64_t *iid);
598 
623 static inline int gnrc_netif_ipv6_iid_to_addr(const gnrc_netif_t *netif,
624  const eui64_t *iid, uint8_t *addr)
625 {
627  return l2util_ipv6_iid_to_addr(netif->device_type, iid, addr);
628 }
629 
649 static inline int gnrc_netif_ipv6_get_iid(gnrc_netif_t *netif, eui64_t *iid)
650 {
651 #if GNRC_NETIF_L2ADDR_MAXLEN > 0
652  if (netif->flags & GNRC_NETIF_FLAGS_HAS_L2ADDR) {
653  return gnrc_netif_ipv6_iid_from_addr(netif,
654  netif->l2addr, netif->l2addr_len,
655  iid);
656  }
657 #endif /* GNRC_NETIF_L2ADDR_MAXLEN > 0 */
658  (void)netif;
659  (void)iid;
660  return -ENOTSUP;
661 }
662 
690 static inline int gnrc_netif_ndp_addr_len_from_l2ao(gnrc_netif_t *netif,
691  const ndp_opt_t *opt)
692 {
694  return l2util_ndp_addr_len_from_l2ao(netif->device_type, opt);
695 }
696 
712 static inline int gnrc_netif_ipv6_group_to_l2_group(gnrc_netif_t *netif,
713  const ipv6_addr_t *ipv6_group,
714  uint8_t *l2_group)
715 {
716  return l2util_ipv6_group_to_l2_group(netif->device_type, ipv6_group,
717  l2_group);
718 }
719 #else /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
720 #define gnrc_netif_ipv6_init_mtu(netif) (void)netif
721 #define gnrc_netif_ipv6_iid_from_addr(netif, addr, addr_len, iid) (-ENOTSUP)
722 #define gnrc_netif_ipv6_iid_to_addr(netif, iid, addr) (-ENOTSUP)
723 #define gnrc_netif_ndp_addr_len_from_l2ao(netif, opt) (-ENOTSUP)
724 #define gnrc_netif_ipv6_get_iid(netif, iid) (-ENOTSUP)
725 #define gnrc_netif_ipv6_group_to_l2_group(netif, ipv6_group, l2_group) (-ENOTSUP)
726 #endif /* IS_USED(MODULE_GNRC_NETIF_IPV6) || defined(DOXYGEN) */
727 
729 #ifdef __cplusplus
730 }
731 #endif
732 
733 #endif /* NET_GNRC_NETIF_INTERNAL_H */
734 
CONFIG_GNRC_IPV6_NIB_6LR
#define CONFIG_GNRC_IPV6_NIB_6LR
enable features for 6Lo router
Definition: conf.h:103
netopt_t
netopt_t
Global list of configuration options available throughout the network stack, e.g.
Definition: netopt.h:50
GNRC_NETIF_FLAGS_IPV6_RTR_ADV
#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
ENOTSUP
#define ENOTSUP
Not supported (may be the same value as [EOPNOTSUPP]).
Definition: errno.h:130
l2util.h
Link-layer helper function definitions.
GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_MASK
#define GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_MASK
Mask for the address' state.
Definition: ipv6.h:46
GNRC_NETIF_FLAGS_6LN
#define GNRC_NETIF_FLAGS_6LN
This interface represents a 6Lo node (6LN) according to RFC 6775.
Definition: flags.h:126
CONFIG_GNRC_IPV6_NIB_6LBR
#define CONFIG_GNRC_IPV6_NIB_6LBR
enable features for 6Lo border router
Definition: conf.h:93
kernel_defines.h
Common macros and compiler attributes/pragmas configuration.
GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_TENTATIVE
#define GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_TENTATIVE
Tentative states (with encoded DAD retransmissions)
Definition: ipv6.h:55
assert
#define assert(cond)
abort the program if assertion is false
Definition: assert.h:104
ipv6_addr_t
Data type to represent an IPv6 address.
Definition: addr.h:74
netopt.h
Definition of global configuration options.
msg_bus_post
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:250
gnrc_netif_highlander
static bool gnrc_netif_highlander(void)
Check if there can only be one gnrc_netif_t interface.
Definition: netif.h:347
gnrc_netif_ipv6_t::addrs_flags
uint8_t addrs_flags[CONFIG_GNRC_NETIF_IPV6_ADDRS_NUMOF]
Flags for gnrc_netif_t::ipv6_addrs.
Definition: ipv6.h:86
gnrc_netif_t::flags
uint32_t flags
Flags for the interface.
Definition: netif.h:140
CONFIG_GNRC_IPV6_NIB_6LN
#define CONFIG_GNRC_IPV6_NIB_6LN
enable features for 6Lo node
Definition: conf.h:114
gnrc_netif_t::ipv6
gnrc_netif_ipv6_t ipv6
IPv6 component.
Definition: netif.h:127
gnrc_netif_t
Representation of a network interface.
Definition: netif.h:115
conf.h
Configuration macro definitions for neighbor information base.
GNRC_NETIF_FLAGS_HAS_L2ADDR
#define GNRC_NETIF_FLAGS_HAS_L2ADDR
Network interface has link-layer address.
Definition: flags.h:47
IS_ACTIVE
#define IS_ACTIVE(macro)
Allows to verify a macro definition outside the preprocessor.
Definition: kernel_defines.h:177
gnrc_netif_t::l2addr
uint8_t l2addr[GNRC_NETIF_L2ADDR_MAXLEN]
The link-layer address currently used as the source address on this interface.
Definition: netif.h:158
l2util_ndp_addr_len_from_l2ao
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...
l2util_ipv6_group_to_l2_group
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.
GNRC_NETIF_FLAGS_6LO_ABR
#define GNRC_NETIF_FLAGS_6LO_ABR
This interface acts as a 6Lo border router to the LLN.
Definition: flags.h:103
IS_USED
#define IS_USED(module)
Checks whether a module is being used or not. Can be used in C conditionals.
Definition: kernel_defines.h:188
eui64_t
Data type to represent an EUI-64.
Definition: eui64.h:55
netif.h
Definition for GNRC's network interfaces.
gnrc_netif_t::device_type
uint8_t device_type
Device type.
Definition: netif.h:187
GNRC_NETIF_BUS_IPV6
@ GNRC_NETIF_BUS_IPV6
provides gnrc_ipv6_event_t messages to subscribers
Definition: netif.h:83
GNRC_NETIF_FLAGS_IPV6_FORWARDING
#define GNRC_NETIF_FLAGS_IPV6_FORWARDING
Network interface is enabled for IPv6 forwarding.
Definition: flags.h:52
gnrc_netif_t::l2addr_len
uint8_t l2addr_len
Length in bytes of gnrc_netif_t::l2addr.
Definition: netif.h:165
ndp_opt_t
General NDP option format.
Definition: ndp.h:286
l2util_ipv6_iid_to_addr
int l2util_ipv6_iid_to_addr(int dev_type, const eui64_t *iid, uint8_t *addr)
Converts an IPv6 IID to a hardware address.
gnrc_netif_t::bus
msg_bus_t bus[GNRC_NETIF_BUS_NUMOF]
Event Message Bus.
Definition: netif.h:133