2016-05-02 09:02:04 +02:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2016 Intel Corporation.
|
|
|
|
*
|
2017-01-18 17:01:01 -08:00
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
2016-05-02 09:02:04 +02:00
|
|
|
*/
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* @brief Public API for network interface
|
|
|
|
*/
|
|
|
|
|
2018-09-14 10:43:44 -07:00
|
|
|
#ifndef ZEPHYR_INCLUDE_NET_NET_IF_H_
|
|
|
|
#define ZEPHYR_INCLUDE_NET_NET_IF_H_
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-01-06 14:10:06 +01:00
|
|
|
/**
|
|
|
|
* @brief Network Interface abstraction layer
|
|
|
|
* @defgroup net_if Network Interface abstraction layer
|
2017-11-17 11:43:53 -05:00
|
|
|
* @ingroup networking
|
2017-01-06 14:10:06 +01:00
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
#include <device.h>
|
|
|
|
#include <misc/slist.h>
|
|
|
|
|
|
|
|
#include <net/net_core.h>
|
2017-09-21 23:30:32 +03:00
|
|
|
#include <net/hostname.h>
|
2016-11-12 00:13:24 +02:00
|
|
|
#include <net/net_linkaddr.h>
|
|
|
|
#include <net/net_ip.h>
|
|
|
|
#include <net/net_l2.h>
|
2018-03-27 11:31:31 +03:00
|
|
|
#include <net/net_stats.h>
|
2018-08-17 17:04:10 +03:00
|
|
|
#include <net/net_timeout.h>
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
#if defined(CONFIG_NET_DHCPV4)
|
|
|
|
#include <net/dhcpv4.h>
|
|
|
|
#endif
|
2018-07-30 18:28:35 +03:00
|
|
|
#if defined(CONFIG_NET_IPV4_AUTO)
|
|
|
|
#include <net/ipv4_autoconf.h>
|
|
|
|
#endif
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Network Interface unicast IP addresses
|
|
|
|
*
|
|
|
|
* Stores the unicast IP addresses assigned to this network interface.
|
|
|
|
*/
|
|
|
|
struct net_if_addr {
|
|
|
|
/** IP address */
|
|
|
|
struct net_addr address;
|
|
|
|
|
2018-08-17 10:20:05 +03:00
|
|
|
#if defined(CONFIG_NET_IPV6)
|
2018-08-17 17:04:10 +03:00
|
|
|
struct net_timeout lifetime;
|
2018-08-17 10:20:05 +03:00
|
|
|
#endif
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV6_DAD)
|
|
|
|
/** Duplicate address detection (DAD) timer */
|
|
|
|
struct k_delayed_work dad_timer;
|
2017-04-12 23:00:21 +03:00
|
|
|
#endif
|
|
|
|
/** How the IP address was set */
|
|
|
|
enum net_addr_type addr_type;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-04-12 23:00:21 +03:00
|
|
|
/** What is the current state of the address */
|
|
|
|
enum net_addr_state addr_state;
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV6_DAD)
|
2016-11-12 00:13:24 +02:00
|
|
|
/** How many times we have done DAD */
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t dad_count;
|
2017-04-12 23:00:21 +03:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/** Is the IP address valid forever */
|
2018-08-10 17:21:08 +03:00
|
|
|
u8_t is_infinite : 1;
|
2017-04-12 23:00:21 +03:00
|
|
|
|
|
|
|
/** Is this IP address used or not */
|
2018-08-10 17:21:08 +03:00
|
|
|
u8_t is_used : 1;
|
|
|
|
|
|
|
|
u8_t _unused : 6;
|
2016-11-12 00:13:24 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Network Interface multicast IP addresses
|
|
|
|
*
|
|
|
|
* Stores the multicast IP addresses assigned to this network interface.
|
|
|
|
*/
|
|
|
|
struct net_if_mcast_addr {
|
2018-07-25 13:22:49 +03:00
|
|
|
/** IP address */
|
|
|
|
struct net_addr address;
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/** Is this multicast IP address used or not */
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t is_used : 1;
|
2017-02-10 09:36:09 +02:00
|
|
|
|
|
|
|
/** Did we join to this group */
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t is_joined : 1;
|
2017-02-10 09:36:09 +02:00
|
|
|
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t _unused : 6;
|
2016-11-12 00:13:24 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV6)
|
|
|
|
/**
|
|
|
|
* @brief Network Interface IPv6 prefixes
|
|
|
|
*
|
|
|
|
* Stores the multicast IP addresses assigned to this network interface.
|
|
|
|
*/
|
|
|
|
struct net_if_ipv6_prefix {
|
2017-04-12 22:54:08 +03:00
|
|
|
/** Prefix lifetime */
|
2018-08-27 14:02:09 +03:00
|
|
|
struct net_timeout lifetime;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/** IPv6 prefix */
|
|
|
|
struct in6_addr prefix;
|
|
|
|
|
2018-08-17 13:33:20 +03:00
|
|
|
/** Backpointer to network interface where this prefix is used */
|
|
|
|
struct net_if *iface;
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/** Prefix length */
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t len;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/** Is the IP prefix valid forever */
|
2018-08-10 17:21:08 +03:00
|
|
|
u8_t is_infinite : 1;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-04-12 22:54:08 +03:00
|
|
|
/** Is this prefix used or not */
|
2018-08-10 17:21:08 +03:00
|
|
|
u8_t is_used : 1;
|
|
|
|
|
|
|
|
u8_t _unused : 6;
|
2016-11-12 00:13:24 +02:00
|
|
|
};
|
|
|
|
#endif /* CONFIG_NET_IPV6 */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Information about routers in the system.
|
|
|
|
*
|
|
|
|
* Stores the router information.
|
|
|
|
*/
|
|
|
|
struct net_if_router {
|
2017-04-12 22:54:08 +03:00
|
|
|
/** Router lifetime */
|
|
|
|
struct k_delayed_work lifetime;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/** IP address */
|
|
|
|
struct net_addr address;
|
|
|
|
|
2017-04-12 22:54:08 +03:00
|
|
|
/** Network interface the router is connected to */
|
|
|
|
struct net_if *iface;
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/** Is this router used or not */
|
2018-08-10 17:21:08 +03:00
|
|
|
u8_t is_used : 1;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/** Is default router */
|
2018-08-10 17:21:08 +03:00
|
|
|
u8_t is_default : 1;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/** Is the router valid forever */
|
2018-08-10 17:21:08 +03:00
|
|
|
u8_t is_infinite : 1;
|
|
|
|
|
|
|
|
u8_t _unused : 5;
|
2016-11-12 00:13:24 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Special alignment is needed for net_if which is stored in
|
|
|
|
* a net_if linker section if there are more than one network
|
|
|
|
* interface in the system. If there is only one network interface,
|
|
|
|
* then this alignment is not needed, unfortunately this cannot be
|
|
|
|
* known beforehand.
|
|
|
|
*
|
|
|
|
* The net_if struct needs to be aligned to 32 byte boundary,
|
|
|
|
* otherwise the __net_if_end will point to wrong location and net_if
|
|
|
|
* initialization done in net_if_init() will not find proper values
|
|
|
|
* for the second interface.
|
|
|
|
*
|
|
|
|
* So this alignment is a workaround and should eventually be removed.
|
|
|
|
*/
|
|
|
|
#define __net_if_align __aligned(32)
|
|
|
|
|
2016-12-19 14:18:10 +02:00
|
|
|
enum {
|
|
|
|
/* interface is up/ready to receive and transmit */
|
|
|
|
NET_IF_UP,
|
|
|
|
|
2017-02-02 11:58:15 +02:00
|
|
|
/* interface is pointopoint */
|
|
|
|
NET_IF_POINTOPOINT,
|
|
|
|
|
2018-07-20 16:42:54 +03:00
|
|
|
/* interface is in promiscuous mode */
|
|
|
|
NET_IF_PROMISC,
|
|
|
|
|
2016-12-19 14:18:10 +02:00
|
|
|
/* Total number of flags - must be at the end of the enum */
|
|
|
|
NET_IF_NUM_FLAGS
|
|
|
|
};
|
|
|
|
|
2017-03-09 05:43:01 -08:00
|
|
|
#if defined(CONFIG_NET_OFFLOAD)
|
2017-03-09 06:08:19 -08:00
|
|
|
struct net_offload;
|
2017-03-09 05:43:01 -08:00
|
|
|
#endif /* CONFIG_NET_OFFLOAD */
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
#if defined(CONFIG_NET_IPV6)
|
|
|
|
#define NET_IF_MAX_IPV6_ADDR CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT
|
|
|
|
#define NET_IF_MAX_IPV6_MADDR CONFIG_NET_IF_MCAST_IPV6_ADDR_COUNT
|
|
|
|
#define NET_IF_MAX_IPV6_PREFIX CONFIG_NET_IF_IPV6_PREFIX_COUNT
|
|
|
|
|
|
|
|
struct net_if_ipv6 {
|
|
|
|
/** Unicast IP addresses */
|
|
|
|
struct net_if_addr unicast[NET_IF_MAX_IPV6_ADDR];
|
|
|
|
|
|
|
|
/** Multicast IP addresses */
|
|
|
|
struct net_if_mcast_addr mcast[NET_IF_MAX_IPV6_MADDR];
|
|
|
|
|
|
|
|
/** Prefixes */
|
|
|
|
struct net_if_ipv6_prefix prefix[NET_IF_MAX_IPV6_PREFIX];
|
|
|
|
|
|
|
|
/** Router solicitation timer */
|
|
|
|
struct k_delayed_work rs_timer;
|
|
|
|
|
|
|
|
/** Default reachable time (RFC 4861, page 52) */
|
|
|
|
u32_t base_reachable_time;
|
|
|
|
|
|
|
|
/** Reachable time (RFC 4861, page 20) */
|
|
|
|
u32_t reachable_time;
|
|
|
|
|
|
|
|
/** Retransmit timer (RFC 4861, page 52) */
|
|
|
|
u32_t retrans_timer;
|
|
|
|
|
|
|
|
/** IPv6 hop limit */
|
|
|
|
u8_t hop_limit;
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV6_DAD)
|
|
|
|
/** IPv6 current duplicate address detection count */
|
|
|
|
u8_t dad_count;
|
|
|
|
#endif /* CONFIG_NET_IPV6_DAD */
|
|
|
|
|
|
|
|
/** RS count */
|
|
|
|
u8_t rs_count;
|
|
|
|
};
|
|
|
|
#endif /* CONFIG_NET_IPV6 */
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV4)
|
|
|
|
#define NET_IF_MAX_IPV4_ADDR CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT
|
|
|
|
#define NET_IF_MAX_IPV4_MADDR CONFIG_NET_IF_MCAST_IPV4_ADDR_COUNT
|
|
|
|
|
|
|
|
struct net_if_ipv4 {
|
|
|
|
/** Unicast IP addresses */
|
|
|
|
struct net_if_addr unicast[NET_IF_MAX_IPV4_ADDR];
|
|
|
|
|
|
|
|
/** Multicast IP addresses */
|
|
|
|
struct net_if_mcast_addr mcast[NET_IF_MAX_IPV4_MADDR];
|
|
|
|
|
|
|
|
/** Gateway */
|
|
|
|
struct in_addr gw;
|
|
|
|
|
|
|
|
/** Netmask */
|
|
|
|
struct in_addr netmask;
|
|
|
|
|
|
|
|
/** IPv4 time-to-live */
|
|
|
|
u8_t ttl;
|
|
|
|
};
|
|
|
|
#endif /* CONFIG_NET_IPV4 */
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_DHCPV4)
|
|
|
|
struct net_if_dhcpv4 {
|
2018-07-25 13:55:01 +02:00
|
|
|
/** Used for timer lists */
|
|
|
|
sys_snode_t node;
|
|
|
|
|
|
|
|
/** Timer start */
|
|
|
|
s64_t timer_start;
|
|
|
|
|
|
|
|
/** Time for INIT, DISCOVER, REQUESTING, RENEWAL */
|
|
|
|
u32_t request_time;
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
u32_t xid;
|
|
|
|
|
|
|
|
/** IP address Lease time */
|
|
|
|
u32_t lease_time;
|
|
|
|
|
|
|
|
/** IP address Renewal time */
|
|
|
|
u32_t renewal_time;
|
|
|
|
|
|
|
|
/** IP address Rebinding time */
|
|
|
|
u32_t rebinding_time;
|
|
|
|
|
|
|
|
/** Server ID */
|
|
|
|
struct in_addr server_id;
|
|
|
|
|
|
|
|
/** Requested IP addr */
|
|
|
|
struct in_addr requested_ip;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* DHCPv4 client state in the process of network
|
|
|
|
* address allocation.
|
|
|
|
*/
|
|
|
|
enum net_dhcpv4_state state;
|
|
|
|
|
|
|
|
/** Number of attempts made for REQUEST and RENEWAL messages */
|
|
|
|
u8_t attempts;
|
|
|
|
};
|
|
|
|
#endif /* CONFIG_NET_DHCPV4 */
|
|
|
|
|
2018-07-30 18:28:35 +03:00
|
|
|
#if defined(CONFIG_NET_IPV4_AUTO)
|
|
|
|
struct net_if_ipv4_autoconf {
|
|
|
|
/** Used for timer lists */
|
|
|
|
sys_snode_t node;
|
|
|
|
|
|
|
|
/** Backpointer to correct network interface */
|
|
|
|
struct net_if *iface;
|
|
|
|
|
|
|
|
/** Timer start */
|
|
|
|
s64_t timer_start;
|
|
|
|
|
|
|
|
/** Time for INIT, DISCOVER, REQUESTING, RENEWAL */
|
|
|
|
u32_t timer_timeout;
|
|
|
|
|
|
|
|
/** Current IP addr */
|
|
|
|
struct in_addr current_ip;
|
|
|
|
|
|
|
|
/** Requested IP addr */
|
|
|
|
struct in_addr requested_ip;
|
|
|
|
|
|
|
|
/** IPV4 Autoconf state in the process of network address allocation.
|
|
|
|
*/
|
|
|
|
enum net_ipv4_autoconf_state state;
|
|
|
|
|
|
|
|
/** Number of sent probe requests */
|
|
|
|
u8_t probe_cnt;
|
|
|
|
|
|
|
|
/** Number of sent announcements */
|
|
|
|
u8_t announce_cnt;
|
|
|
|
|
|
|
|
/** Incoming conflict count */
|
|
|
|
u8_t conflict_cnt;
|
|
|
|
};
|
|
|
|
#endif /* CONFIG_NET_IPV4_AUTO */
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
/* We always need to have at least one IP config */
|
|
|
|
#define NET_IF_MAX_CONFIGS 1
|
2017-03-09 05:43:01 -08:00
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
2018-01-11 16:06:53 +02:00
|
|
|
* @brief Network interface IP address configuration.
|
|
|
|
*/
|
|
|
|
struct net_if_ip {
|
|
|
|
#if defined(CONFIG_NET_IPV6)
|
2018-01-19 19:01:23 +02:00
|
|
|
struct net_if_ipv6 *ipv6;
|
2018-01-11 16:06:53 +02:00
|
|
|
#endif /* CONFIG_NET_IPV6 */
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV4)
|
2018-01-19 19:01:23 +02:00
|
|
|
struct net_if_ipv4 *ipv4;
|
2018-01-11 16:06:53 +02:00
|
|
|
#endif /* CONFIG_NET_IPV4 */
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief IP and other configuration related data for network interface.
|
|
|
|
*/
|
|
|
|
struct net_if_config {
|
|
|
|
/** IP address configuration setting */
|
|
|
|
struct net_if_ip ip;
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_DHCPV4)
|
|
|
|
struct net_if_dhcpv4 dhcpv4;
|
|
|
|
#endif /* CONFIG_NET_DHCPV4 */
|
2018-07-30 18:28:35 +03:00
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV4_AUTO)
|
|
|
|
struct net_if_ipv4_autoconf ipv4auto;
|
|
|
|
#endif /* CONFIG_NET_IPV4_AUTO */
|
2018-01-11 16:06:53 +02:00
|
|
|
};
|
|
|
|
|
2018-02-07 15:00:08 +02:00
|
|
|
/**
|
|
|
|
* @brief Network traffic class.
|
|
|
|
*
|
|
|
|
* Traffic classes are used when sending or receiving data that is classified
|
|
|
|
* with different priorities. So some traffic can be marked as high priority
|
|
|
|
* and it will be sent or received first. There is always at least one work
|
|
|
|
* queue in the system for Rx and Tx. Each network packet that is transmitted
|
|
|
|
* or received goes through a work queue thread that will transmit it.
|
|
|
|
*/
|
|
|
|
struct net_traffic_class {
|
|
|
|
/** Work queue for handling this Tx or Rx packet */
|
|
|
|
struct k_work_q work_q;
|
|
|
|
|
|
|
|
/** Stack for this work queue */
|
|
|
|
k_thread_stack_t *stack;
|
|
|
|
|
|
|
|
/** Traffic class value */
|
|
|
|
int tc;
|
|
|
|
};
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
/**
|
|
|
|
* @brief Network Interface Device structure
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* Used to handle a network interface on top of a device driver instance.
|
2018-01-11 16:06:53 +02:00
|
|
|
* There can be many net_if_dev instance against the same device.
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* Such interface is mainly to be used by the link layer, but is also tight
|
|
|
|
* to a network context: it then makes the relation with a network context
|
|
|
|
* and the network device.
|
|
|
|
*
|
|
|
|
* Because of the strong relationship between a device driver and such
|
2018-01-11 16:06:53 +02:00
|
|
|
* network interface, each net_if_dev should be instantiated by
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
2018-01-11 16:06:53 +02:00
|
|
|
struct net_if_dev {
|
2016-11-12 00:13:24 +02:00
|
|
|
/** The actually device driver instance the net_if is related to */
|
|
|
|
struct device *dev;
|
|
|
|
|
|
|
|
/** Interface's L2 layer */
|
2017-02-14 12:47:42 +01:00
|
|
|
const struct net_l2 * const l2;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/** Interface's private L2 data pointer */
|
|
|
|
void *l2_data;
|
|
|
|
|
2017-04-12 22:54:08 +03:00
|
|
|
/* For internal use */
|
|
|
|
ATOMIC_DEFINE(flags, NET_IF_NUM_FLAGS);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/** The hardware link address */
|
|
|
|
struct net_linkaddr link_addr;
|
|
|
|
|
2017-03-09 05:43:01 -08:00
|
|
|
#if defined(CONFIG_NET_OFFLOAD)
|
|
|
|
/** TCP/IP Offload functions.
|
|
|
|
* If non-NULL, then the TCP/IP stack is located
|
|
|
|
* in the communication chip that is accessed via this
|
|
|
|
* network interface.
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
2017-03-09 06:08:19 -08:00
|
|
|
struct net_offload *offload;
|
2017-03-09 05:43:01 -08:00
|
|
|
#endif /* CONFIG_NET_OFFLOAD */
|
2018-07-25 13:22:49 +03:00
|
|
|
|
|
|
|
/** The hardware MTU */
|
|
|
|
u16_t mtu;
|
2018-01-11 16:06:53 +02:00
|
|
|
};
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
/**
|
|
|
|
* @brief Network Interface structure
|
|
|
|
*
|
|
|
|
* Used to handle a network interface on top of a net_if_dev instance.
|
|
|
|
* There can be many net_if instance against the same net_if_dev instance.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
struct net_if {
|
|
|
|
/** The net_if_dev instance the net_if is related to */
|
|
|
|
struct net_if_dev *if_dev;
|
2017-04-12 22:54:08 +03:00
|
|
|
|
2018-03-27 11:31:31 +03:00
|
|
|
#if defined(CONFIG_NET_STATISTICS_PER_INTERFACE)
|
|
|
|
/** Network statistics related to this network interface */
|
|
|
|
struct net_stats stats;
|
|
|
|
#endif /* CONFIG_NET_STATISTICS_PER_INTERFACE */
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
/** Network interface instance configuration */
|
|
|
|
struct net_if_config config;
|
2018-03-27 17:59:23 +03:00
|
|
|
} __net_if_align;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
2017-04-05 08:37:44 +02:00
|
|
|
* @brief Send a packet through a net iface
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param pkt Pointer to a net packet to send
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* return verdict about the packet
|
|
|
|
*/
|
2017-04-05 08:37:44 +02:00
|
|
|
enum net_verdict net_if_send_data(struct net_if *iface, struct net_pkt *pkt);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
/**
|
|
|
|
* @brief Get a pointer to the interface L2
|
|
|
|
*
|
|
|
|
* @param iface a valid pointer to a network interface structure
|
|
|
|
*
|
|
|
|
* @return a pointer to the iface L2
|
|
|
|
*/
|
|
|
|
static inline const struct net_l2 * const net_if_l2(struct net_if *iface)
|
|
|
|
{
|
|
|
|
return iface->if_dev->l2;
|
|
|
|
}
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
2017-04-05 08:37:44 +02:00
|
|
|
* @brief Input a packet through a net iface
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param pkt Pointer to a net packet to input
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @return verdict about the packet
|
|
|
|
*/
|
2018-07-23 14:03:11 +03:00
|
|
|
enum net_verdict net_if_recv_data(struct net_if *iface, struct net_pkt *pkt);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get link layer header size for this network interface
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param dst_ip6 Pointer to the destination IPv6 address or NULL if not
|
|
|
|
* relevant
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @return Return the link layer header size
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
static inline u16_t net_if_get_ll_reserve(struct net_if *iface,
|
2017-08-08 14:41:23 +03:00
|
|
|
const struct in6_addr *dst_ip6)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2017-05-03 10:32:24 +02:00
|
|
|
#if defined(CONFIG_NET_OFFLOAD)
|
|
|
|
if (iface->if_dev->offload) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
return net_if_l2(iface)->reserve(iface, (void *)dst_ip6);
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-05-11 15:19:24 +03:00
|
|
|
* @brief Get a pointer to the interface L2 private data
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param iface a valid pointer to a network interface structure
|
|
|
|
*
|
2017-05-11 15:19:24 +03:00
|
|
|
* @return a pointer to the iface L2 data
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
|
|
|
static inline void *net_if_l2_data(struct net_if *iface)
|
|
|
|
{
|
2018-01-11 16:06:53 +02:00
|
|
|
return iface->if_dev->l2_data;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get an network interface's device
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
|
|
|
*
|
2017-05-11 15:19:24 +03:00
|
|
|
* @return a pointer to the device driver instance
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
|
|
|
static inline struct device *net_if_get_device(struct net_if *iface)
|
|
|
|
{
|
2018-01-11 16:06:53 +02:00
|
|
|
return iface->if_dev->dev;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-05-11 15:19:24 +03:00
|
|
|
* @brief Queue a packet to the net interface TX queue
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param pkt Pointer to a net packet to queue
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
2018-02-07 15:00:08 +02:00
|
|
|
void net_if_queue_tx(struct net_if *iface, struct net_pkt *pkt);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-03-09 05:43:01 -08:00
|
|
|
#if defined(CONFIG_NET_OFFLOAD)
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
2017-05-11 15:19:24 +03:00
|
|
|
* @brief Return the IP offload status
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return True if IP offlining is active, false otherwise.
|
|
|
|
*/
|
|
|
|
static inline bool net_if_is_ip_offloaded(struct net_if *iface)
|
|
|
|
{
|
2018-01-11 16:06:53 +02:00
|
|
|
return (iface->if_dev->offload != NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Return the IP offload plugin
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return NULL if there is no offload plugin defined, valid pointer otherwise
|
|
|
|
*/
|
|
|
|
static inline struct net_offload *net_if_offload(struct net_if *iface)
|
|
|
|
{
|
|
|
|
return iface->if_dev->offload;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
2017-03-09 05:43:01 -08:00
|
|
|
#endif
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get an network interface's link address
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
|
|
|
*
|
2017-05-11 15:19:24 +03:00
|
|
|
* @return a pointer to the network link address
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
|
|
|
static inline struct net_linkaddr *net_if_get_link_addr(struct net_if *iface)
|
|
|
|
{
|
2018-01-11 16:06:53 +02:00
|
|
|
return &iface->if_dev->link_addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Return network configuration for this network interface
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
|
|
|
*
|
|
|
|
* @return Pointer to configuration
|
|
|
|
*/
|
|
|
|
static inline struct net_if_config *net_if_get_config(struct net_if *iface)
|
|
|
|
{
|
|
|
|
return &iface->config;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Start duplicate address detection procedure.
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
|
|
|
*/
|
|
|
|
#if defined(CONFIG_NET_IPV6_DAD)
|
|
|
|
void net_if_start_dad(struct net_if *iface);
|
|
|
|
#else
|
|
|
|
#define net_if_start_dad(iface)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Start neighbor discovery and send router solicitation message.
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
|
|
|
*/
|
|
|
|
void net_if_start_rs(struct net_if *iface);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set a network interface's link address
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param addr a pointer to a u8_t buffer representing the address
|
2016-11-12 00:13:24 +02:00
|
|
|
* @param len length of the address buffer
|
2017-02-15 13:20:31 +02:00
|
|
|
* @param type network bearer type of this link address
|
2016-12-19 14:18:10 +02:00
|
|
|
*
|
|
|
|
* @return 0 on success
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
2016-12-19 14:18:10 +02:00
|
|
|
static inline int net_if_set_link_addr(struct net_if *iface,
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t *addr, u8_t len,
|
2017-02-15 13:20:31 +02:00
|
|
|
enum net_link_type type)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-11 16:06:53 +02:00
|
|
|
if (atomic_test_bit(iface->if_dev->flags, NET_IF_UP)) {
|
2016-12-19 14:18:10 +02:00
|
|
|
return -EPERM;
|
|
|
|
}
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
net_if_get_link_addr(iface)->addr = addr;
|
|
|
|
net_if_get_link_addr(iface)->len = len;
|
|
|
|
net_if_get_link_addr(iface)->type = type;
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-09-21 23:30:32 +03:00
|
|
|
net_hostname_set_postfix(addr, len);
|
|
|
|
|
2016-12-19 14:18:10 +02:00
|
|
|
return 0;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get an network interface's MTU
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
|
|
|
*
|
|
|
|
* @return the MTU
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
static inline u16_t net_if_get_mtu(struct net_if *iface)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-11 16:06:53 +02:00
|
|
|
return iface->if_dev->mtu;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set an network interface's MTU
|
|
|
|
*
|
|
|
|
* @param iface Pointer to a network interface structure
|
|
|
|
* @param mtu New MTU, note that we store only 16 bit mtu value.
|
|
|
|
*/
|
|
|
|
static inline void net_if_set_mtu(struct net_if *iface,
|
2017-04-21 09:27:50 -05:00
|
|
|
u16_t mtu)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-11 16:06:53 +02:00
|
|
|
iface->if_dev->mtu = mtu;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set the infinite status of the network interface address
|
|
|
|
*
|
|
|
|
* @param ifaddr IP address for network interface
|
|
|
|
* @param is_infinite Infinite status
|
|
|
|
*/
|
|
|
|
static inline void net_if_addr_set_lf(struct net_if_addr *ifaddr,
|
|
|
|
bool is_infinite)
|
|
|
|
{
|
|
|
|
ifaddr->is_infinite = is_infinite;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get an interface according to link layer address.
|
|
|
|
*
|
|
|
|
* @param ll_addr Link layer address.
|
|
|
|
*
|
|
|
|
* @return Network interface or NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if *net_if_get_by_link_addr(struct net_linkaddr *ll_addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Find an interface from it's related device
|
|
|
|
*
|
|
|
|
* @param dev A valid struct device pointer to relate with an interface
|
|
|
|
*
|
|
|
|
* @return a valid struct net_if pointer on success, NULL otherwise
|
|
|
|
*/
|
|
|
|
struct net_if *net_if_lookup_by_dev(struct device *dev);
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
/**
|
|
|
|
* @brief Get network interface IP config
|
|
|
|
*
|
|
|
|
* @param iface Interface to use.
|
|
|
|
*
|
|
|
|
* @return NULL if not found or pointer to correct config settings.
|
|
|
|
*/
|
|
|
|
static inline struct net_if_config *net_if_config_get(struct net_if *iface)
|
|
|
|
{
|
|
|
|
return &iface->config;
|
|
|
|
}
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Remove a router from the system
|
|
|
|
*
|
|
|
|
* @param router Pointer to existing router
|
|
|
|
*/
|
|
|
|
static inline void net_if_router_rm(struct net_if_router *router)
|
|
|
|
{
|
|
|
|
router->is_used = false;
|
|
|
|
|
|
|
|
/* FIXME - remove timer */
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get the default network interface.
|
|
|
|
*
|
|
|
|
* @return Default interface or NULL if no interfaces are configured.
|
|
|
|
*/
|
|
|
|
struct net_if *net_if_get_default(void);
|
|
|
|
|
2017-08-08 08:38:47 +03:00
|
|
|
/**
|
|
|
|
* @brief Get the first network interface according to its type.
|
|
|
|
*
|
|
|
|
* @param l2 Layer 2 type of the network interface.
|
|
|
|
*
|
|
|
|
* @return First network interface of a given type or NULL if no such
|
|
|
|
* interfaces was found.
|
|
|
|
*/
|
|
|
|
struct net_if *net_if_get_first_by_type(const struct net_l2 *l2);
|
|
|
|
|
2017-08-08 12:05:49 +03:00
|
|
|
#if defined(CONFIG_NET_L2_IEEE802154)
|
|
|
|
/**
|
|
|
|
* @brief Get the first IEEE 802.15.4 network interface.
|
|
|
|
*
|
|
|
|
* @return First IEEE 802.15.4 network interface or NULL if no such
|
|
|
|
* interfaces was found.
|
|
|
|
*/
|
|
|
|
static inline struct net_if *net_if_get_ieee802154(void)
|
|
|
|
{
|
|
|
|
return net_if_get_first_by_type(&NET_L2_GET_NAME(IEEE802154));
|
|
|
|
}
|
|
|
|
#endif /* CONFIG_NET_L2_IEEE802154 */
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
#if defined(CONFIG_NET_IPV6)
|
2018-01-19 19:01:23 +02:00
|
|
|
/**
|
|
|
|
* @brief Allocate network interface IPv6 config.
|
|
|
|
*
|
|
|
|
* @details This function will allocate new IPv6 config.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use.
|
|
|
|
* @param ipv6 Pointer to allocated IPv6 struct is returned to caller.
|
|
|
|
*
|
|
|
|
* @return 0 if ok, <0 if error
|
|
|
|
*/
|
|
|
|
int net_if_config_ipv6_get(struct net_if *iface,
|
|
|
|
struct net_if_ipv6 **ipv6);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Release network interface IPv6 config.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use.
|
|
|
|
*
|
|
|
|
* @return 0 if ok, <0 if error
|
|
|
|
*/
|
|
|
|
int net_if_config_ipv6_put(struct net_if *iface);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Check if this IPv6 address belongs to one of the interfaces.
|
|
|
|
*
|
|
|
|
* @param addr IPv6 address
|
|
|
|
* @param iface Pointer to interface is returned
|
|
|
|
*
|
|
|
|
* @return Pointer to interface address, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if_addr *net_if_ipv6_addr_lookup(const struct in6_addr *addr,
|
|
|
|
struct net_if **iface);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if this IPv6 address belongs to this specific interfaces.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 address
|
|
|
|
*
|
|
|
|
* @return Pointer to interface address, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if_addr *net_if_ipv6_addr_lookup_by_iface(struct net_if *iface,
|
2018-08-07 12:57:21 +03:00
|
|
|
struct in6_addr *addr);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Add a IPv6 address to an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 address
|
|
|
|
* @param addr_type IPv6 address type
|
|
|
|
* @param vlifetime Validity time for this address
|
|
|
|
*
|
|
|
|
* @return Pointer to interface address, NULL if cannot be added
|
|
|
|
*/
|
|
|
|
struct net_if_addr *net_if_ipv6_addr_add(struct net_if *iface,
|
|
|
|
struct in6_addr *addr,
|
|
|
|
enum net_addr_type addr_type,
|
2017-04-21 09:27:50 -05:00
|
|
|
u32_t vlifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Update validity lifetime time of an IPv6 address.
|
|
|
|
*
|
|
|
|
* @param ifaddr Network IPv6 address
|
|
|
|
* @param vlifetime Validity time for this address
|
|
|
|
*/
|
|
|
|
void net_if_ipv6_addr_update_lifetime(struct net_if_addr *ifaddr,
|
2017-04-21 09:27:50 -05:00
|
|
|
u32_t vlifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Remove an IPv6 address from an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 address
|
|
|
|
*
|
|
|
|
* @return True if successfully removed, false otherwise
|
|
|
|
*/
|
2017-04-12 10:34:59 +03:00
|
|
|
bool net_if_ipv6_addr_rm(struct net_if *iface, const struct in6_addr *addr);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Add a IPv6 multicast address to an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 multicast address
|
|
|
|
*
|
|
|
|
* @return Pointer to interface multicast address, NULL if cannot be added
|
|
|
|
*/
|
|
|
|
struct net_if_mcast_addr *net_if_ipv6_maddr_add(struct net_if *iface,
|
2017-02-09 09:48:31 +02:00
|
|
|
const struct in6_addr *addr);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Remove an IPv6 multicast address from an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 multicast address
|
|
|
|
*
|
|
|
|
* @return True if successfully removed, false otherwise
|
|
|
|
*/
|
2017-02-09 09:48:31 +02:00
|
|
|
bool net_if_ipv6_maddr_rm(struct net_if *iface, const struct in6_addr *addr);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
2017-02-09 09:50:50 +02:00
|
|
|
* @brief Check if this IPv6 multicast address belongs to a specific interface
|
|
|
|
* or one of the interfaces.
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param addr IPv6 address
|
2017-02-09 09:50:50 +02:00
|
|
|
* @param iface If *iface is null, then pointer to interface is returned,
|
|
|
|
* otherwise the *iface value needs to be matched.
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @return Pointer to interface multicast address, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if_mcast_addr *net_if_ipv6_maddr_lookup(const struct in6_addr *addr,
|
|
|
|
struct net_if **iface);
|
|
|
|
|
2017-08-29 09:57:27 +03:00
|
|
|
/**
|
|
|
|
* @typedef net_if_mcast_callback_t
|
|
|
|
|
|
|
|
* @brief Define callback that is called whenever IPv6 multicast address group
|
|
|
|
* is joined or left.
|
|
|
|
|
|
|
|
* @param "struct net_if *iface" A pointer to a struct net_if to which the
|
|
|
|
* multicast address is attached.
|
|
|
|
* @param "const struct in6_addr *addr" IPv6 multicast address.
|
|
|
|
* @param "bool is_joined" True if the address is joined, false if left.
|
|
|
|
*/
|
|
|
|
typedef void (*net_if_mcast_callback_t)(struct net_if *iface,
|
|
|
|
const struct in6_addr *addr,
|
|
|
|
bool is_joined);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Multicast monitor handler struct.
|
|
|
|
*
|
|
|
|
* Stores the multicast callback information. Caller must make sure that
|
|
|
|
* the variable pointed by this is valid during the lifetime of
|
|
|
|
* registration. Typically this means that the variable cannot be
|
|
|
|
* allocated from stack.
|
|
|
|
*/
|
|
|
|
struct net_if_mcast_monitor {
|
|
|
|
/** Node information for the slist. */
|
|
|
|
sys_snode_t node;
|
|
|
|
|
|
|
|
/** Network interface */
|
|
|
|
struct net_if *iface;
|
|
|
|
|
|
|
|
/** Multicast callback */
|
|
|
|
net_if_mcast_callback_t cb;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Register a multicast monitor
|
|
|
|
*
|
|
|
|
* @param mon Monitor handle. This is a pointer to a monitor storage structure
|
|
|
|
* which should be allocated by caller, but does not need to be initialized.
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param cb Monitor callback
|
|
|
|
*/
|
|
|
|
void net_if_mcast_mon_register(struct net_if_mcast_monitor *mon,
|
|
|
|
struct net_if *iface,
|
|
|
|
net_if_mcast_callback_t cb);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Unregister a multicast monitor
|
|
|
|
*
|
|
|
|
* @param mon Monitor handle
|
|
|
|
*/
|
|
|
|
void net_if_mcast_mon_unregister(struct net_if_mcast_monitor *mon);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Call registered multicast monitors
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr Multicast address
|
|
|
|
* @param is_joined Is this multicast address joined (true) or not (false)
|
|
|
|
*/
|
|
|
|
void net_if_mcast_monitor(struct net_if *iface, const struct in6_addr *addr,
|
|
|
|
bool is_joined);
|
|
|
|
|
2017-02-10 09:36:09 +02:00
|
|
|
/**
|
|
|
|
* @brief Mark a given multicast address to be joined.
|
|
|
|
*
|
|
|
|
* @param addr IPv6 multicast address
|
|
|
|
*/
|
|
|
|
static inline void net_if_ipv6_maddr_join(struct net_if_mcast_addr *addr)
|
|
|
|
{
|
|
|
|
NET_ASSERT(addr);
|
|
|
|
|
|
|
|
addr->is_joined = true;
|
|
|
|
}
|
|
|
|
|
2017-02-10 09:45:32 +02:00
|
|
|
/**
|
|
|
|
* @brief Check if given multicast address is joined or not.
|
|
|
|
*
|
|
|
|
* @param addr IPv6 multicast address
|
|
|
|
*
|
|
|
|
* @return True if address is joined, False otherwise.
|
|
|
|
*/
|
|
|
|
static inline bool net_if_ipv6_maddr_is_joined(struct net_if_mcast_addr *addr)
|
|
|
|
{
|
|
|
|
NET_ASSERT(addr);
|
|
|
|
|
|
|
|
return addr->is_joined;
|
|
|
|
}
|
|
|
|
|
2017-02-10 09:36:09 +02:00
|
|
|
/**
|
|
|
|
* @brief Mark a given multicast address to be left.
|
|
|
|
*
|
|
|
|
* @param addr IPv6 multicast address
|
|
|
|
*/
|
|
|
|
static inline void net_if_ipv6_maddr_leave(struct net_if_mcast_addr *addr)
|
|
|
|
{
|
|
|
|
NET_ASSERT(addr);
|
|
|
|
|
|
|
|
addr->is_joined = false;
|
|
|
|
}
|
|
|
|
|
2018-08-22 12:41:30 +03:00
|
|
|
/**
|
|
|
|
* @brief Return prefix that corresponds to this IPv6 address.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 address
|
|
|
|
*
|
|
|
|
* @return Pointer to prefix, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if_ipv6_prefix *net_if_ipv6_prefix_get(struct net_if *iface,
|
|
|
|
struct in6_addr *addr);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Check if this IPv6 prefix belongs to this interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 address
|
|
|
|
* @param len Prefix length
|
|
|
|
*
|
|
|
|
* @return Pointer to prefix, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if_ipv6_prefix *net_if_ipv6_prefix_lookup(struct net_if *iface,
|
|
|
|
struct in6_addr *addr,
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t len);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Add a IPv6 prefix to an network interface.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param prefix IPv6 address
|
|
|
|
* @param len Prefix length
|
|
|
|
* @param lifetime Prefix lifetime in seconds
|
|
|
|
*
|
|
|
|
* @return Pointer to prefix, NULL if the prefix was not added.
|
|
|
|
*/
|
|
|
|
struct net_if_ipv6_prefix *net_if_ipv6_prefix_add(struct net_if *iface,
|
|
|
|
struct in6_addr *prefix,
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t len,
|
|
|
|
u32_t lifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Remove an IPv6 prefix from an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 prefix address
|
|
|
|
* @param len Prefix length
|
|
|
|
*
|
|
|
|
* @return True if successfully removed, false otherwise
|
|
|
|
*/
|
|
|
|
bool net_if_ipv6_prefix_rm(struct net_if *iface, struct in6_addr *addr,
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t len);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set the infinite status of the prefix
|
|
|
|
*
|
|
|
|
* @param prefix IPv6 address
|
|
|
|
* @param is_infinite Infinite status
|
|
|
|
*/
|
|
|
|
static inline void net_if_ipv6_prefix_set_lf(struct net_if_ipv6_prefix *prefix,
|
|
|
|
bool is_infinite)
|
|
|
|
{
|
|
|
|
prefix->is_infinite = is_infinite;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set the prefix lifetime timer.
|
|
|
|
*
|
|
|
|
* @param prefix IPv6 address
|
|
|
|
* @param lifetime Prefix lifetime in seconds
|
|
|
|
*/
|
|
|
|
void net_if_ipv6_prefix_set_timer(struct net_if_ipv6_prefix *prefix,
|
2017-04-21 09:27:50 -05:00
|
|
|
u32_t lifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Unset the prefix lifetime timer.
|
|
|
|
*
|
|
|
|
* @param prefix IPv6 address
|
|
|
|
*/
|
|
|
|
void net_if_ipv6_prefix_unset_timer(struct net_if_ipv6_prefix *prefix);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if this IPv6 address is part of the subnet of our
|
|
|
|
* network interface.
|
|
|
|
*
|
|
|
|
* @param iface Network interface. This is returned to the caller.
|
|
|
|
* The iface can be NULL in which case we check all the interfaces.
|
|
|
|
* @param addr IPv6 address
|
|
|
|
*
|
|
|
|
* @return True if address is part of our subnet, false otherwise
|
|
|
|
*/
|
|
|
|
bool net_if_ipv6_addr_onlink(struct net_if **iface, struct in6_addr *addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if IPv6 address is one of the routers configured
|
|
|
|
* in the system.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 address
|
|
|
|
*
|
|
|
|
* @return Pointer to router information, NULL if cannot be found
|
|
|
|
*/
|
|
|
|
struct net_if_router *net_if_ipv6_router_lookup(struct net_if *iface,
|
|
|
|
struct in6_addr *addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Find default router for this IPv6 address.
|
|
|
|
*
|
|
|
|
* @param iface Network interface. This can be NULL in which case we
|
|
|
|
* go through all the network interfaces to find a suitable router.
|
|
|
|
* @param addr IPv6 address
|
|
|
|
*
|
|
|
|
* @return Pointer to router information, NULL if cannot be found
|
|
|
|
*/
|
|
|
|
struct net_if_router *net_if_ipv6_router_find_default(struct net_if *iface,
|
|
|
|
struct in6_addr *addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Update validity lifetime time of a router.
|
|
|
|
*
|
|
|
|
* @param router Network IPv6 address
|
|
|
|
* @param lifetime Lifetime of this router.
|
|
|
|
*/
|
|
|
|
void net_if_ipv6_router_update_lifetime(struct net_if_router *router,
|
2017-04-21 09:27:50 -05:00
|
|
|
u32_t lifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Add IPv6 router to the system.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv6 address
|
|
|
|
* @param router_lifetime Lifetime of the router
|
|
|
|
*
|
|
|
|
* @return Pointer to router information, NULL if could not be added
|
|
|
|
*/
|
|
|
|
struct net_if_router *net_if_ipv6_router_add(struct net_if *iface,
|
|
|
|
struct in6_addr *addr,
|
2017-04-21 09:27:50 -05:00
|
|
|
u16_t router_lifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Remove IPv6 router from the system.
|
|
|
|
*
|
|
|
|
* @param router Router information.
|
|
|
|
*
|
|
|
|
* @return True if successfully removed, false otherwise
|
|
|
|
*/
|
|
|
|
bool net_if_ipv6_router_rm(struct net_if_router *router);
|
|
|
|
|
|
|
|
/**
|
2017-04-11 10:21:48 +03:00
|
|
|
* @brief Get IPv6 hop limit specified for a given interface. This is the
|
|
|
|
* default value but can be overridden by the user.
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return Hop limit
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
static inline u8_t net_if_ipv6_get_hop_limit(struct net_if *iface)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv6) {
|
|
|
|
return 0;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
return iface->config.ip.ipv6->hop_limit;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-04-11 10:21:48 +03:00
|
|
|
* @brief Set the default IPv6 hop limit of a given interface.
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param hop_limit New hop limit
|
|
|
|
*/
|
|
|
|
static inline void net_ipv6_set_hop_limit(struct net_if *iface,
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t hop_limit)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv6) {
|
|
|
|
return;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
iface->config.ip.ipv6->hop_limit = hop_limit;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set IPv6 reachable time for a given interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param reachable_time New reachable time
|
|
|
|
*/
|
|
|
|
static inline void net_if_ipv6_set_base_reachable_time(struct net_if *iface,
|
2018-01-11 16:06:53 +02:00
|
|
|
u32_t reachable_time)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv6) {
|
|
|
|
return;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
iface->config.ip.ipv6->base_reachable_time = reachable_time;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get IPv6 reachable timeout specified for a given interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return Reachable timeout
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
static inline u32_t net_if_ipv6_get_reachable_time(struct net_if *iface)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv6) {
|
|
|
|
return 0;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
return iface->config.ip.ipv6->reachable_time;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Calculate next reachable time value for IPv6 reachable time
|
|
|
|
*
|
2018-01-19 19:01:23 +02:00
|
|
|
* @param ipv6 IPv6 address configuration
|
2016-11-12 00:13:24 +02:00
|
|
|
*
|
|
|
|
* @return Reachable time
|
|
|
|
*/
|
2018-01-19 19:01:23 +02:00
|
|
|
u32_t net_if_ipv6_calc_reachable_time(struct net_if_ipv6 *ipv6);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set IPv6 reachable time for a given interface. This requires
|
|
|
|
* that base reachable time is set for the interface.
|
|
|
|
*
|
2018-01-19 19:01:23 +02:00
|
|
|
* @param ipv6 IPv6 address configuration
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
2018-01-19 19:01:23 +02:00
|
|
|
static inline void net_if_ipv6_set_reachable_time(struct net_if_ipv6 *ipv6)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
ipv6->reachable_time = net_if_ipv6_calc_reachable_time(ipv6);
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set IPv6 retransmit timer for a given interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param retrans_timer New retransmit timer
|
|
|
|
*/
|
|
|
|
static inline void net_if_ipv6_set_retrans_timer(struct net_if *iface,
|
2017-04-21 09:27:50 -05:00
|
|
|
u32_t retrans_timer)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv6) {
|
|
|
|
return;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
iface->config.ip.ipv6->retrans_timer = retrans_timer;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get IPv6 retransmit timer specified for a given interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return Retransmit timer
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
static inline u32_t net_if_ipv6_get_retrans_timer(struct net_if *iface)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv6) {
|
|
|
|
return 0;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
return iface->config.ip.ipv6->retrans_timer;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get a IPv6 source address that should be used when sending
|
|
|
|
* network data to destination.
|
|
|
|
*
|
|
|
|
* @param iface Interface that was used when packet was received.
|
|
|
|
* If the interface is not known, then NULL can be given.
|
|
|
|
* @param dst IPv6 destination address
|
|
|
|
*
|
|
|
|
* @return Pointer to IPv6 address to use, NULL if no IPv6 address
|
|
|
|
* could be found.
|
|
|
|
*/
|
|
|
|
const struct in6_addr *net_if_ipv6_select_src_addr(struct net_if *iface,
|
|
|
|
struct in6_addr *dst);
|
|
|
|
|
2018-08-07 11:28:49 +03:00
|
|
|
/**
|
|
|
|
* @brief Get a network interface that should be used when sending
|
|
|
|
* IPv6 network data to destination.
|
|
|
|
*
|
|
|
|
* @param dst IPv6 destination address
|
|
|
|
*
|
|
|
|
* @return Pointer to network interface to use, NULL if no suitable interface
|
|
|
|
* could be found.
|
|
|
|
*/
|
|
|
|
struct net_if *net_if_ipv6_select_src_iface(struct in6_addr *dst);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Get a IPv6 link local address in a given state.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use. Must be a valid pointer to an interface.
|
|
|
|
* @param addr_state IPv6 address state (preferred, tentative, deprecated)
|
|
|
|
*
|
|
|
|
* @return Pointer to link local IPv6 address, NULL if no proper IPv6 address
|
|
|
|
* could be found.
|
|
|
|
*/
|
|
|
|
struct in6_addr *net_if_ipv6_get_ll(struct net_if *iface,
|
|
|
|
enum net_addr_state addr_state);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Return link local IPv6 address from the first interface that has
|
|
|
|
* a link local address matching give state.
|
|
|
|
*
|
|
|
|
* @param state IPv6 address state (ANY, TENTATIVE, PREFERRED, DEPRECATED)
|
|
|
|
* @param iface Pointer to interface is returned
|
|
|
|
*
|
|
|
|
* @return Pointer to IPv6 address, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct in6_addr *net_if_ipv6_get_ll_addr(enum net_addr_state state,
|
|
|
|
struct net_if **iface);
|
|
|
|
|
2017-04-12 10:25:54 +03:00
|
|
|
/**
|
|
|
|
* @brief Stop IPv6 Duplicate Address Detection (DAD) procedure if
|
|
|
|
* we find out that our IPv6 address is already in use.
|
|
|
|
*
|
|
|
|
* @param iface Interface where the DAD was running.
|
|
|
|
* @param addr IPv6 address that failed DAD
|
|
|
|
*/
|
|
|
|
void net_if_ipv6_dad_failed(struct net_if *iface, const struct in6_addr *addr);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Return global IPv6 address from the first interface that has
|
|
|
|
* a global IPv6 address either in TENTATIVE or PREFERRED state.
|
|
|
|
*
|
|
|
|
* @param iface Caller can give an interface to check. If iface is set to NULL,
|
|
|
|
* then all the interfaces are checked. Pointer to interface where the IPv6
|
|
|
|
* address is defined is returned to the caller.
|
|
|
|
*
|
|
|
|
* @return Pointer to IPv6 address, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct in6_addr *net_if_ipv6_get_global_addr(struct net_if **iface);
|
|
|
|
#else
|
|
|
|
#define net_if_ipv6_select_src_addr(...)
|
2018-08-07 11:28:49 +03:00
|
|
|
#define net_if_ipv6_select_src_iface(...) NULL
|
2016-11-12 00:13:24 +02:00
|
|
|
#endif /* CONFIG_NET_IPV6 */
|
|
|
|
|
|
|
|
#if defined(CONFIG_NET_IPV4)
|
2018-01-19 19:01:23 +02:00
|
|
|
/**
|
|
|
|
* @brief Allocate network interface IPv4 config.
|
|
|
|
*
|
|
|
|
* @details This function will allocate new IPv4 config.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use.
|
|
|
|
* @param ipv4 Pointer to allocated IPv4 struct is returned to caller.
|
|
|
|
*
|
|
|
|
* @return 0 if ok, <0 if error
|
|
|
|
*/
|
|
|
|
int net_if_config_ipv4_get(struct net_if *iface,
|
|
|
|
struct net_if_ipv4 **ipv4);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Release network interface IPv4 config.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use.
|
|
|
|
*
|
|
|
|
* @return 0 if ok, <0 if error
|
|
|
|
*/
|
|
|
|
int net_if_config_ipv4_put(struct net_if *iface);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Get IPv4 time-to-live value specified for a given interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return Time-to-live
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
static inline u8_t net_if_ipv4_get_ttl(struct net_if *iface)
|
2016-11-12 00:13:24 +02:00
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv4) {
|
|
|
|
return 0;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
return iface->config.ip.ipv4->ttl;
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if this IPv4 address belongs to one of the interfaces.
|
|
|
|
*
|
|
|
|
* @param addr IPv4 address
|
|
|
|
* @param iface Interface is returned
|
|
|
|
*
|
|
|
|
* @return Pointer to interface address, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if_addr *net_if_ipv4_addr_lookup(const struct in_addr *addr,
|
|
|
|
struct net_if **iface);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Add a IPv4 address to an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv4 address
|
|
|
|
* @param addr_type IPv4 address type
|
|
|
|
* @param vlifetime Validity time for this address
|
|
|
|
*
|
|
|
|
* @return Pointer to interface address, NULL if cannot be added
|
|
|
|
*/
|
|
|
|
struct net_if_addr *net_if_ipv4_addr_add(struct net_if *iface,
|
|
|
|
struct in_addr *addr,
|
|
|
|
enum net_addr_type addr_type,
|
2017-04-21 09:27:50 -05:00
|
|
|
u32_t vlifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Remove a IPv4 address from an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv4 address
|
|
|
|
*
|
|
|
|
* @return True if successfully removed, false otherwise
|
|
|
|
*/
|
|
|
|
bool net_if_ipv4_addr_rm(struct net_if *iface, struct in_addr *addr);
|
|
|
|
|
2017-09-21 23:06:59 +03:00
|
|
|
/**
|
|
|
|
* @brief Add a IPv4 multicast address to an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv4 multicast address
|
|
|
|
*
|
|
|
|
* @return Pointer to interface multicast address, NULL if cannot be added
|
|
|
|
*/
|
|
|
|
struct net_if_mcast_addr *net_if_ipv4_maddr_add(struct net_if *iface,
|
|
|
|
const struct in_addr *addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Remove an IPv4 multicast address from an interface
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv4 multicast address
|
|
|
|
*
|
|
|
|
* @return True if successfully removed, false otherwise
|
|
|
|
*/
|
|
|
|
bool net_if_ipv4_maddr_rm(struct net_if *iface, const struct in_addr *addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if this IPv4 multicast address belongs to a specific interface
|
|
|
|
* or one of the interfaces.
|
|
|
|
*
|
|
|
|
* @param addr IPv4 address
|
|
|
|
* @param iface If *iface is null, then pointer to interface is returned,
|
|
|
|
* otherwise the *iface value needs to be matched.
|
|
|
|
*
|
|
|
|
* @return Pointer to interface multicast address, NULL if not found.
|
|
|
|
*/
|
|
|
|
struct net_if_mcast_addr *net_if_ipv4_maddr_lookup(const struct in_addr *addr,
|
|
|
|
struct net_if **iface);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if IPv4 address is one of the routers configured
|
|
|
|
* in the system.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv4 address
|
|
|
|
*
|
|
|
|
* @return Pointer to router information, NULL if cannot be found
|
|
|
|
*/
|
|
|
|
struct net_if_router *net_if_ipv4_router_lookup(struct net_if *iface,
|
|
|
|
struct in_addr *addr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Add IPv4 router to the system.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
* @param addr IPv4 address
|
|
|
|
* @param is_default Is this router the default one
|
|
|
|
* @param router_lifetime Lifetime of the router
|
|
|
|
*
|
|
|
|
* @return Pointer to router information, NULL if could not be added
|
|
|
|
*/
|
|
|
|
struct net_if_router *net_if_ipv4_router_add(struct net_if *iface,
|
|
|
|
struct in_addr *addr,
|
|
|
|
bool is_default,
|
2017-04-21 09:27:50 -05:00
|
|
|
u16_t router_lifetime);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if the given IPv4 address belongs to local subnet.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use. Must be a valid pointer to an interface.
|
|
|
|
* @param addr IPv4 address
|
|
|
|
*
|
|
|
|
* @return True if address is part of local subnet, false otherwise.
|
|
|
|
*/
|
|
|
|
bool net_if_ipv4_addr_mask_cmp(struct net_if *iface,
|
|
|
|
struct in_addr *addr);
|
|
|
|
|
2018-01-31 16:09:38 +02:00
|
|
|
/**
|
|
|
|
* @brief Get a network interface that should be used when sending
|
|
|
|
* IPv4 network data to destination.
|
|
|
|
*
|
|
|
|
* @param dst IPv4 destination address
|
|
|
|
*
|
|
|
|
* @return Pointer to network interface to use, NULL if no suitable interface
|
|
|
|
* could be found.
|
|
|
|
*/
|
|
|
|
struct net_if *net_if_ipv4_select_src_iface(struct in_addr *dst);
|
|
|
|
|
2018-04-27 13:01:33 +03:00
|
|
|
/**
|
|
|
|
* @brief Get a IPv4 source address that should be used when sending
|
|
|
|
* network data to destination.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use when sending the packet.
|
|
|
|
* If the interface is not known, then NULL can be given.
|
|
|
|
* @param dst IPv4 destination address
|
|
|
|
*
|
|
|
|
* @return Pointer to IPv4 address to use, NULL if no IPv4 address
|
|
|
|
* could be found.
|
|
|
|
*/
|
|
|
|
const struct in_addr *net_if_ipv4_select_src_addr(struct net_if *dst_iface,
|
|
|
|
struct in_addr *dst);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get a IPv4 link local address in a given state.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use. Must be a valid pointer to an interface.
|
|
|
|
* @param addr_state IPv4 address state (preferred, tentative, deprecated)
|
|
|
|
*
|
|
|
|
* @return Pointer to link local IPv4 address, NULL if no proper IPv4 address
|
|
|
|
* could be found.
|
|
|
|
*/
|
|
|
|
struct in_addr *net_if_ipv4_get_ll(struct net_if *iface,
|
|
|
|
enum net_addr_state addr_state);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Set IPv4 netmask for an interface.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use.
|
|
|
|
* @param netmask IPv4 netmask
|
|
|
|
*/
|
|
|
|
static inline void net_if_ipv4_set_netmask(struct net_if *iface,
|
|
|
|
struct in_addr *netmask)
|
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (net_if_config_ipv4_get(iface, NULL) < 0) {
|
|
|
|
return;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv4) {
|
|
|
|
return;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
net_ipaddr_copy(&iface->config.ip.ipv4->netmask, netmask);
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set IPv4 gateway for an interface.
|
|
|
|
*
|
|
|
|
* @param iface Interface to use.
|
|
|
|
* @param gw IPv4 address of an gateway
|
|
|
|
*/
|
|
|
|
static inline void net_if_ipv4_set_gw(struct net_if *iface,
|
|
|
|
struct in_addr *gw)
|
|
|
|
{
|
2018-01-19 19:01:23 +02:00
|
|
|
if (net_if_config_ipv4_get(iface, NULL) < 0) {
|
|
|
|
return;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
if (!iface->config.ip.ipv4) {
|
|
|
|
return;
|
|
|
|
}
|
2018-01-11 16:06:53 +02:00
|
|
|
|
2018-01-19 19:01:23 +02:00
|
|
|
net_ipaddr_copy(&iface->config.ip.ipv4->gw, gw);
|
2016-11-12 00:13:24 +02:00
|
|
|
}
|
2018-08-07 13:05:55 +03:00
|
|
|
#else
|
|
|
|
#define net_if_ipv4_select_src_iface(...) NULL
|
2016-11-12 00:13:24 +02:00
|
|
|
#endif /* CONFIG_NET_IPV4 */
|
|
|
|
|
2018-08-07 13:05:55 +03:00
|
|
|
/**
|
|
|
|
* @brief Get a network interface that should be used when sending
|
|
|
|
* IPv6 or IPv4 network data to destination.
|
|
|
|
*
|
|
|
|
* @param dst IPv6 or IPv4 destination address
|
|
|
|
*
|
|
|
|
* @return Pointer to network interface to use. Note that the function
|
|
|
|
* will return the default network interface if the best network interface
|
|
|
|
* is not found.
|
|
|
|
*/
|
|
|
|
struct net_if *net_if_select_src_iface(const struct sockaddr *dst);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @typedef net_if_link_callback_t
|
|
|
|
* @brief Define callback that is called after a network packet
|
|
|
|
* has been sent.
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param "struct net_if *iface" A pointer to a struct net_if to which the
|
2017-04-05 08:37:44 +02:00
|
|
|
* the net_pkt was sent to.
|
2016-11-12 00:13:24 +02:00
|
|
|
* @param "struct net_linkaddr *dst" Link layer address of the destination
|
|
|
|
* where the network packet was sent.
|
|
|
|
* @param "int status" Send status, 0 is ok, < 0 error.
|
|
|
|
*/
|
|
|
|
typedef void (*net_if_link_callback_t)(struct net_if *iface,
|
|
|
|
struct net_linkaddr *dst,
|
|
|
|
int status);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Link callback handler struct.
|
|
|
|
*
|
|
|
|
* Stores the link callback information. Caller must make sure that
|
|
|
|
* the variable pointed by this is valid during the lifetime of
|
|
|
|
* registration. Typically this means that the variable cannot be
|
|
|
|
* allocated from stack.
|
|
|
|
*/
|
|
|
|
struct net_if_link_cb {
|
|
|
|
/** Node information for the slist. */
|
|
|
|
sys_snode_t node;
|
|
|
|
|
|
|
|
/** Link callback */
|
|
|
|
net_if_link_callback_t cb;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Register a link callback.
|
|
|
|
*
|
|
|
|
* @param link Caller specified handler for the callback.
|
|
|
|
* @param cb Callback to register.
|
|
|
|
*/
|
|
|
|
void net_if_register_link_cb(struct net_if_link_cb *link,
|
|
|
|
net_if_link_callback_t cb);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Unregister a link callback.
|
|
|
|
*
|
|
|
|
* @param link Caller specified handler for the callback.
|
|
|
|
*/
|
|
|
|
void net_if_unregister_link_cb(struct net_if_link_cb *link);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Call a link callback function.
|
|
|
|
*
|
|
|
|
* @param iface Network interface.
|
|
|
|
* @param lladdr Destination link layer address
|
|
|
|
* @param status 0 is ok, < 0 error
|
|
|
|
*/
|
|
|
|
void net_if_call_link_cb(struct net_if *iface, struct net_linkaddr *lladdr,
|
|
|
|
int status);
|
|
|
|
|
2018-03-14 10:55:19 +02:00
|
|
|
/**
|
|
|
|
* @brief Check if received network packet checksum calculation can be avoided
|
|
|
|
* or not. For example many ethernet devices support network packet offloading
|
|
|
|
* in which case the IP stack does not need to calculate the checksum.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return True if checksum needs to be calculated, false otherwise.
|
|
|
|
*/
|
|
|
|
bool net_if_need_calc_rx_checksum(struct net_if *iface);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if network packet checksum calculation can be avoided or not
|
|
|
|
* when sending the packet. For example many ethernet devices support network
|
|
|
|
* packet offloading in which case the IP stack does not need to calculate the
|
|
|
|
* checksum.
|
|
|
|
*
|
|
|
|
* @param iface Network interface
|
|
|
|
*
|
|
|
|
* @return True if checksum needs to be calculated, false otherwise.
|
|
|
|
*/
|
|
|
|
bool net_if_need_calc_tx_checksum(struct net_if *iface);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* @brief Get interface according to index
|
|
|
|
*
|
|
|
|
* @param index Interface index
|
|
|
|
*
|
|
|
|
* @return Pointer to interface or NULL if not found.
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
struct net_if *net_if_get_by_index(u8_t index);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get interface index according to pointer
|
|
|
|
*
|
|
|
|
* @param iface Pointer to network interface
|
|
|
|
*
|
|
|
|
* @return Interface index
|
|
|
|
*/
|
2017-04-21 09:27:50 -05:00
|
|
|
u8_t net_if_get_by_iface(struct net_if *iface);
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-01-06 14:10:06 +01:00
|
|
|
/**
|
|
|
|
* @typedef net_if_cb_t
|
|
|
|
* @brief Callback used while iterating over network interfaces
|
|
|
|
*
|
|
|
|
* @param iface Pointer to current network interface
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param user_data A valid pointer to user data or NULL
|
2017-01-06 14:10:06 +01:00
|
|
|
*/
|
2016-11-12 00:13:24 +02:00
|
|
|
typedef void (*net_if_cb_t)(struct net_if *iface, void *user_data);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Go through all the network interfaces and call callback
|
|
|
|
* for each interface.
|
|
|
|
*
|
2017-08-10 08:21:28 -07:00
|
|
|
* @param cb User-supplied callback function to call
|
2017-05-11 15:19:24 +03:00
|
|
|
* @param user_data User specified data
|
2016-11-12 00:13:24 +02:00
|
|
|
*/
|
|
|
|
void net_if_foreach(net_if_cb_t cb, void *user_data);
|
|
|
|
|
2016-12-19 14:18:10 +02:00
|
|
|
/**
|
|
|
|
* @brief Bring interface up
|
|
|
|
*
|
|
|
|
* @param iface Pointer to network interface
|
|
|
|
*
|
|
|
|
* @return 0 on success
|
|
|
|
*/
|
|
|
|
int net_if_up(struct net_if *iface);
|
|
|
|
|
2017-07-27 14:35:17 +03:00
|
|
|
/**
|
|
|
|
* @brief Check if interface is up.
|
|
|
|
*
|
|
|
|
* @param iface Pointer to network interface
|
|
|
|
*
|
|
|
|
* @return True if interface is up, False if it is down.
|
|
|
|
*/
|
|
|
|
static inline bool net_if_is_up(struct net_if *iface)
|
|
|
|
{
|
|
|
|
NET_ASSERT(iface);
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
return atomic_test_bit(iface->if_dev->flags, NET_IF_UP);
|
2017-07-27 14:35:17 +03:00
|
|
|
}
|
|
|
|
|
2017-02-23 22:13:18 +00:00
|
|
|
/**
|
2016-12-19 14:18:10 +02:00
|
|
|
* @brief Bring interface down
|
|
|
|
*
|
|
|
|
* @param iface Pointer to network interface
|
|
|
|
*
|
|
|
|
* @return 0 on success
|
|
|
|
*/
|
|
|
|
int net_if_down(struct net_if *iface);
|
|
|
|
|
2018-01-24 15:20:21 +02:00
|
|
|
#if defined(CONFIG_NET_PKT_TIMESTAMP)
|
|
|
|
/**
|
|
|
|
* @typedef net_if_timestamp_callback_t
|
|
|
|
* @brief Define callback that is called after a network packet
|
|
|
|
* has been timestamped.
|
|
|
|
* @param "struct net_pkt *pkt" A pointer on a struct net_pkt which has
|
|
|
|
* been timestamped after being sent.
|
|
|
|
*/
|
|
|
|
typedef void (*net_if_timestamp_callback_t)(struct net_pkt *pkt);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Timestamp callback handler struct.
|
|
|
|
*
|
|
|
|
* Stores the timestamp callback information. Caller must make sure that
|
|
|
|
* the variable pointed by this is valid during the lifetime of
|
|
|
|
* registration. Typically this means that the variable cannot be
|
|
|
|
* allocated from stack.
|
|
|
|
*/
|
|
|
|
struct net_if_timestamp_cb {
|
|
|
|
/** Node information for the slist. */
|
|
|
|
sys_snode_t node;
|
|
|
|
|
2018-06-04 14:23:12 +02:00
|
|
|
/** Packet for which the callback is needed.
|
|
|
|
* A NULL value means all packets.
|
|
|
|
*/
|
|
|
|
struct net_pkt *pkt;
|
|
|
|
|
2018-01-24 15:20:21 +02:00
|
|
|
/** Net interface for which the callback is needed.
|
|
|
|
* A NULL value means all interfaces.
|
|
|
|
*/
|
|
|
|
struct net_if *iface;
|
|
|
|
|
|
|
|
/** Timestamp callback */
|
|
|
|
net_if_timestamp_callback_t cb;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Register a timestamp callback.
|
|
|
|
*
|
|
|
|
* @param handle Caller specified handler for the callback.
|
2018-06-04 14:23:12 +02:00
|
|
|
* @param pkt Net packet for which the callback is registered. NULL for all
|
|
|
|
* packets.
|
2018-01-24 15:20:21 +02:00
|
|
|
* @param iface Net interface for which the callback is. NULL for all
|
|
|
|
* interfaces.
|
|
|
|
* @param cb Callback to register.
|
|
|
|
*/
|
|
|
|
void net_if_register_timestamp_cb(struct net_if_timestamp_cb *handle,
|
2018-06-04 14:23:12 +02:00
|
|
|
struct net_pkt *pkt,
|
2018-01-24 15:20:21 +02:00
|
|
|
struct net_if *iface,
|
|
|
|
net_if_timestamp_callback_t cb);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Unregister a timestamp callback.
|
|
|
|
*
|
|
|
|
* @param handle Caller specified handler for the callback.
|
|
|
|
*/
|
|
|
|
void net_if_unregister_timestamp_cb(struct net_if_timestamp_cb *handle);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Call a timestamp callback function.
|
|
|
|
*
|
|
|
|
* @param pkt Network buffer.
|
|
|
|
*/
|
|
|
|
void net_if_call_timestamp_cb(struct net_pkt *pkt);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @brief Add timestamped TX buffer to be handled
|
|
|
|
*
|
|
|
|
* @param pkt Timestamped buffer
|
|
|
|
*/
|
|
|
|
void net_if_add_tx_timestamp(struct net_pkt *pkt);
|
|
|
|
#endif /* CONFIG_NET_PKT_TIMESTAMP */
|
|
|
|
|
2018-07-20 16:42:54 +03:00
|
|
|
/**
|
|
|
|
* @brief Set network interface into promiscuous mode
|
|
|
|
*
|
|
|
|
* @details Note that not all network technologies will support this.
|
|
|
|
*
|
|
|
|
* @param iface Pointer to network interface
|
|
|
|
*
|
|
|
|
* @return 0 on success, <0 if error
|
|
|
|
*/
|
|
|
|
int net_if_set_promisc(struct net_if *iface);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set network interface into normal mode
|
|
|
|
*
|
|
|
|
* @param iface Pointer to network interface
|
|
|
|
*/
|
|
|
|
void net_if_unset_promisc(struct net_if *iface);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Check if promiscuous mode is set or not.
|
|
|
|
*
|
|
|
|
* @param iface Pointer to network interface
|
|
|
|
*
|
|
|
|
* @return True if interface is in promisc mode,
|
|
|
|
* False if interface is not in in promiscuous mode.
|
|
|
|
*/
|
|
|
|
bool net_if_is_promisc(struct net_if *iface);
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
struct net_if_api {
|
|
|
|
void (*init)(struct net_if *iface);
|
2017-04-05 08:37:44 +02:00
|
|
|
int (*send)(struct net_if *iface, struct net_pkt *pkt);
|
2016-11-12 00:13:24 +02:00
|
|
|
};
|
|
|
|
|
2017-02-10 19:10:27 +00:00
|
|
|
#if defined(CONFIG_NET_DHCPV4)
|
2017-02-11 17:45:17 +00:00
|
|
|
#define NET_IF_DHCPV4_INIT .dhcpv4.state = NET_DHCPV4_DISABLED,
|
2017-02-10 19:10:27 +00:00
|
|
|
#else
|
|
|
|
#define NET_IF_DHCPV4_INIT
|
|
|
|
#endif
|
|
|
|
|
2018-01-11 16:06:53 +02:00
|
|
|
#define NET_IF_CONFIG_INIT \
|
|
|
|
.config = { \
|
|
|
|
.ip = { \
|
|
|
|
}, \
|
|
|
|
NET_IF_DHCPV4_INIT \
|
|
|
|
}
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
#define NET_IF_GET_NAME(dev_name, sfx) (__net_if_##dev_name##_##sfx)
|
2018-01-11 16:06:53 +02:00
|
|
|
#define NET_IF_DEV_GET_NAME(dev_name, sfx) (__net_if_dev_##dev_name##_##sfx)
|
2017-03-08 09:30:03 +01:00
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
#define NET_IF_GET(dev_name, sfx) \
|
|
|
|
((struct net_if *)&NET_IF_GET_NAME(dev_name, sfx))
|
|
|
|
|
2018-01-19 12:24:33 +02:00
|
|
|
#define NET_IF_INIT(dev_name, sfx, _l2, _mtu, _num_configs) \
|
|
|
|
static struct net_if_dev (NET_IF_DEV_GET_NAME(dev_name, sfx)) \
|
|
|
|
__used __attribute__((__section__(".net_if_dev.data"))) = { \
|
2018-01-30 17:34:39 +02:00
|
|
|
.dev = &(DEVICE_NAME_GET(dev_name)), \
|
2016-11-12 00:13:24 +02:00
|
|
|
.l2 = &(NET_L2_GET_NAME(_l2)), \
|
|
|
|
.l2_data = &(NET_L2_GET_DATA(dev_name, sfx)), \
|
|
|
|
.mtu = _mtu, \
|
2018-01-11 16:06:53 +02:00
|
|
|
}; \
|
|
|
|
static struct net_if \
|
2018-01-19 12:24:33 +02:00
|
|
|
(NET_IF_GET_NAME(dev_name, sfx))[_num_configs] __used \
|
2018-01-11 16:06:53 +02:00
|
|
|
__attribute__((__section__(".net_if.data"))) = { \
|
2018-01-19 12:24:33 +02:00
|
|
|
[0 ... (_num_configs - 1)] = { \
|
2018-01-11 16:06:53 +02:00
|
|
|
.if_dev = &(NET_IF_DEV_GET_NAME(dev_name, sfx)), \
|
|
|
|
NET_IF_CONFIG_INIT \
|
|
|
|
} \
|
2018-02-07 15:00:08 +02:00
|
|
|
}
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-05-03 10:32:24 +02:00
|
|
|
#define NET_IF_OFFLOAD_INIT(dev_name, sfx, _mtu) \
|
|
|
|
static struct net_if_dev (NET_IF_DEV_GET_NAME(dev_name, sfx)) __used \
|
|
|
|
__attribute__((__section__(".net_if_dev.data"))) = { \
|
|
|
|
.dev = &(__device_##dev_name), \
|
|
|
|
.mtu = _mtu, \
|
|
|
|
}; \
|
|
|
|
static struct net_if \
|
|
|
|
(NET_IF_GET_NAME(dev_name, sfx))[NET_IF_MAX_CONFIGS] __used \
|
|
|
|
__attribute__((__section__(".net_if.data"))) = { \
|
|
|
|
[0 ... (NET_IF_MAX_CONFIGS - 1)] = { \
|
|
|
|
.if_dev = &(NET_IF_DEV_GET_NAME(dev_name, sfx)), \
|
|
|
|
NET_IF_CONFIG_INIT \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/* Network device initialization macros */
|
|
|
|
|
|
|
|
#define NET_DEVICE_INIT(dev_name, drv_name, init_fn, \
|
|
|
|
data, cfg_info, prio, api, l2, \
|
|
|
|
l2_ctx_type, mtu) \
|
|
|
|
DEVICE_AND_API_INIT(dev_name, drv_name, init_fn, data, \
|
|
|
|
cfg_info, POST_KERNEL, prio, api); \
|
|
|
|
NET_L2_DATA_INIT(dev_name, 0, l2_ctx_type); \
|
2018-01-19 12:24:33 +02:00
|
|
|
NET_IF_INIT(dev_name, 0, l2, mtu, NET_IF_MAX_CONFIGS)
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-05-03 10:32:24 +02:00
|
|
|
#define NET_DEVICE_OFFLOAD_INIT(dev_name, drv_name, init_fn, \
|
|
|
|
data, cfg_info, prio, api, mtu) \
|
|
|
|
DEVICE_AND_API_INIT(dev_name, drv_name, init_fn, data, \
|
|
|
|
cfg_info, POST_KERNEL, prio, api); \
|
|
|
|
NET_IF_OFFLOAD_INIT(dev_name, 0, mtu)
|
|
|
|
|
|
|
|
|
2016-11-12 00:13:24 +02:00
|
|
|
/**
|
|
|
|
* If your network device needs more than one instance of a network interface,
|
|
|
|
* Use this macro below and provide a different instance suffix each time
|
|
|
|
* (0, 1, 2, ... or a, b, c ... whatever works for you)
|
|
|
|
*/
|
|
|
|
#define NET_DEVICE_INIT_INSTANCE(dev_name, drv_name, instance, init_fn, \
|
|
|
|
data, cfg_info, prio, api, l2, \
|
|
|
|
l2_ctx_type, mtu) \
|
|
|
|
DEVICE_AND_API_INIT(dev_name, drv_name, init_fn, data, \
|
|
|
|
cfg_info, POST_KERNEL, prio, api); \
|
|
|
|
NET_L2_DATA_INIT(dev_name, instance, l2_ctx_type); \
|
2018-01-19 12:24:33 +02:00
|
|
|
NET_IF_INIT(dev_name, instance, l2, mtu, NET_IF_MAX_CONFIGS)
|
2016-11-12 00:13:24 +02:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
2016-05-02 09:02:04 +02:00
|
|
|
#endif
|
2016-11-12 00:13:24 +02:00
|
|
|
|
2017-01-06 14:10:06 +01:00
|
|
|
/**
|
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
2018-09-14 10:43:44 -07:00
|
|
|
#endif /* ZEPHYR_INCLUDE_NET_NET_IF_H_ */
|