netif.h
Go to the documentation of this file.
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 
24 #ifndef NET_GNRC_NETIF_H
25 #define NET_GNRC_NETIF_H
26 
27 #include <stddef.h>
28 #include <stdint.h>
29 #include <stdbool.h>
30 
31 #include "kernel_types.h"
32 #include "msg.h"
33 #include "net/ipv6/addr.h"
34 #include "net/gnrc/netapi.h"
35 #include "net/gnrc/pkt.h"
36 #include "net/gnrc/netif/conf.h"
37 #ifdef MODULE_GNRC_SIXLOWPAN
38 #include "net/gnrc/netif/6lo.h"
39 #endif
40 #include "net/gnrc/netif/flags.h"
41 #ifdef MODULE_GNRC_IPV6
42 #include "net/gnrc/netif/ipv6.h"
43 #endif
44 #ifdef MODULE_GNRC_MAC
45 #include "net/gnrc/netif/mac.h"
46 #endif
47 #include "net/netdev.h"
48 #include "rmutex.h"
49 
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53 
58 
62 typedef struct {
66 #if defined(MODULE_GNRC_IPV6) || DOXYGEN
68 #endif
69 #if defined(MODULE_GNRC_MAC) || DOXYGEN
71 #endif /* MODULE_GNRC_MAC */
72 
77  uint32_t flags;
78 #if (GNRC_NETIF_L2ADDR_MAXLEN > 0)
79 
85  uint8_t l2addr[GNRC_NETIF_L2ADDR_MAXLEN];
86 
92  uint8_t l2addr_len;
93 #endif
94 #if defined(MODULE_GNRC_SIXLOWPAN) || DOXYGEN
96 #endif
97  uint8_t cur_hl;
98  uint8_t device_type;
100 } gnrc_netif_t;
101 
118  void (*init)(gnrc_netif_t *netif);
119 
140  int (*send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt);
141 
158  gnrc_pktsnip_t *(*recv)(gnrc_netif_t *netif);
159 
174  int (*get)(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt);
175 
191  int (*set)(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt);
192 
203  void (*msg_handler)(gnrc_netif_t *netif, msg_t *msg);
204 };
205 
225 gnrc_netif_t *gnrc_netif_create(char *stack, int stacksize, char priority,
226  const char *name, netdev_t *dev,
227  const gnrc_netif_ops_t *ops);
228 
234 unsigned gnrc_netif_numof(void);
235 
245 
255 
276 static inline int gnrc_netif_ipv6_addrs_get(const gnrc_netif_t *netif,
277  ipv6_addr_t *addrs,
278  size_t max_len)
279 {
280  assert(netif != NULL);
281  assert(addrs != NULL);
282  assert(max_len >= sizeof(ipv6_addr_t));
283  return gnrc_netapi_get(netif->pid, NETOPT_IPV6_ADDR, 0, addrs, max_len);
284 }
285 
307 static inline int gnrc_netif_ipv6_addr_add(const gnrc_netif_t *netif,
308  ipv6_addr_t *addr, unsigned pfx_len,
309  uint8_t flags)
310 {
311  assert(netif != NULL);
312  assert(addr != NULL);
313  assert((pfx_len > 0) && (pfx_len <= 128));
314  return gnrc_netapi_set(netif->pid, NETOPT_IPV6_ADDR,
315  ((pfx_len << 8U) | flags), addr,
316  sizeof(ipv6_addr_t));
317 }
318 
332 static inline int gnrc_netif_ipv6_addr_remove(const gnrc_netif_t *netif,
333  ipv6_addr_t *addr)
334 {
335  assert(netif != NULL);
336  assert(addr != NULL);
338  0, addr, sizeof(ipv6_addr_t));
339 }
340 
361 static inline int gnrc_netif_ipv6_groups_get(const gnrc_netif_t *netif,
362  ipv6_addr_t *groups,
363  size_t max_len)
364 {
365  assert(netif != NULL);
366  assert(groups != NULL);
367  assert(max_len >= sizeof(ipv6_addr_t));
368  return gnrc_netapi_get(netif->pid, NETOPT_IPV6_GROUP, 0, groups, max_len);
369 }
370 
385 static inline int gnrc_netif_ipv6_group_join(const gnrc_netif_t *netif,
386  ipv6_addr_t *group)
387 {
388  assert(netif != NULL);
389  assert(group != NULL);
390  return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP, 0, group,
391  sizeof(ipv6_addr_t));
392 }
393 
407 static inline int gnrc_netif_ipv6_group_leave(const gnrc_netif_t *netif,
408  ipv6_addr_t *group)
409 {
410  assert(netif != NULL);
411  assert(group != NULL);
412  return gnrc_netapi_set(netif->pid, NETOPT_IPV6_GROUP_LEAVE, 0, group,
413  sizeof(ipv6_addr_t));
414 }
415 
428 
441  const gnrc_netapi_opt_t *opt);
442 
459 char *gnrc_netif_addr_to_str(const uint8_t *addr, size_t addr_len, char *out);
460 
479 size_t gnrc_netif_addr_from_str(const char *str, uint8_t *out);
480 
481 #ifdef __cplusplus
482 }
483 #endif
484 
485 #endif /* NET_GNRC_NETIF_H */
486 
static int gnrc_netif_ipv6_group_leave(const gnrc_netif_t *netif, ipv6_addr_t *group)
Leaves an IPv6 multicast group on an interface (if IPv6 is supported)
Definition: netif.h:407
Types used by the kernel.
Definitions low-level network driver interface.
uint8_t cur_hl
Current hop-limit for out-going packets.
Definition: netif.h:97
void(* msg_handler)(gnrc_netif_t *netif, msg_t *msg)
Message handler for network interface.
Definition: netif.h:203
gnrc_netif_t * gnrc_netif_create(char *stack, int stacksize, char priority, const char *name, netdev_t *dev, const gnrc_netif_ops_t *ops)
Creates a network interface.
6Lo component of gnrc_netif_t
Definition: 6lo.h:30
Definitions for IPv6 addresses.
size_t gnrc_netif_addr_from_str(const char *str, uint8_t *out)
Parses a string of colon-separated hexadecimals to a hardware address.
uint32_t flags
Flags for the interface.
Definition: netif.h:77
int(* send)(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
Send a packet over the network interface.
Definition: netif.h:140
int16_t kernel_pid_t
Unique process identifier.
Definition: kernel_types.h:83
General definitions for network packets and their helper functions.
int gnrc_netif_set_from_netdev(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt)
Default operation for gnrc_netif_ops_t::set()
Data structure to be send for setting (GNRC_NETAPI_MSG_TYPE_SET) and getting (GNRC_NETAPI_MSG_TYPE_GE...
Definition: netapi.h:99
6LoWPAN definitions for Network interface API
Configuration macros for Network interface API.
Common MAC module definitions for Network interface API
Generic interface to communicate with GNRC modules.
const gnrc_netif_ops_t * ops
Operations of the network interface.
Definition: netif.h:63
Mutex structure.
Definition: rmutex.h:36
IPv6 defintions for Network interface API.
uint8_t device_type
Device type.
Definition: netif.h:98
static int gnrc_netif_ipv6_addr_add(const gnrc_netif_t *netif, 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:307
Common MAC module component of gnrc_netif_mac_t
Definition: netif/mac.h:72
int gnrc_netif_get_from_netdev(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt)
Default operation for gnrc_netif_ops_t::get()
gnrc_netif_6lo_t sixlo
6Lo component
Definition: netif.h:95
static int gnrc_netif_ipv6_addr_remove(const gnrc_netif_t *netif, ipv6_addr_t *addr)
Removes a (unicast or anycast) IPv6 address from an interface (if IPv6 is supported) ...
Definition: netif.h:332
netdev_t * dev
Network device of the network interface.
Definition: netif.h:64
IPv6 component for gnrc_netif_t.
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_...
#define assert(cond)
abort the program if assertion is false
Definition: assert.h:104
Messaging API for inter process communication.
#define GNRC_NETIF_L2ADDR_MAXLEN
Maximum length of the link-layer address.
Definition: netif/conf.h:113
gnrc_netif_ipv6_t ipv6
IPv6 component.
Definition: netif.h:67
void(* init)(gnrc_netif_t *netif)
Initializes network interface beyond the default settings.
Definition: netif.h:118
rmutex_t mutex
Mutex of the interface.
Definition: netif.h:65
Structure to hold driver state.
Definition: netdev.h:275
Describes a message object which can be sent between threads.
Definition: msg.h:184
Recursive Mutex for thread synchronization.
Removes an IPv6 address as ipv6_addr_t from an interface.
Definition: netopt.h:99
get IPv6 addresses of an interface as array of ipv6_addr_t or add an IPv6 address as ipv6_addr_t to a...
Definition: netopt.h:95
unsigned gnrc_netif_numof(void)
Get number of network interfaces actually allocated.
Leaves an IPv6 multicast group as ipv6_addr_t on an interface.
Definition: netopt.h:128
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 addresss of an interface (if IPv6 is supported) ...
Definition: netif.h:276
kernel_pid_t pid
PID of the network interface&#39;s thread.
Definition: netif.h:99
Representation of a network interface.
Definition: netif.h:62
static int gnrc_netif_ipv6_group_join(const gnrc_netif_t *netif, ipv6_addr_t *group)
Joins an IPv6 multicast group on an interface (if IPv6 is supported)
Definition: netif.h:385
gnrc_netif_t * gnrc_netif_get_by_pid(kernel_pid_t pid)
Get network interface by PID.
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.
gnrc_netif_mac_t mac
Common MAC module component
Definition: netif.h:70
Type to represent parts (either headers or payload) of a packet, called snips.
Data type to represent an IPv6 address.
Definition: ipv6/addr.h:74
Flag definitions for Network interface API.
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:361
get IPv6 multicast groups of an interface as array of ipv6_addr_t or join an IPv6 multicast group as ...
Definition: netopt.h:123
int gnrc_netapi_set(kernel_pid_t pid, netopt_t opt, uint16_t context, void *data, size_t data_len)
Shortcut function for sending GNRC_NETAPI_MSG_TYPE_SET messages and parsing the returned GNRC_NETAPI_...
gnrc_netif_t * gnrc_netif_iter(const gnrc_netif_t *prev)
Iterate over all network interfaces.