LCOV - code coverage report
Current view: top level - zephyr/net - net_if.h Hit Total Coverage
Test: new.info Lines: 254 255 99.6 %
Date: 2024-12-21 18:13:37

          Line data    Source code
       1           1 : /*
       2             :  * Copyright (c) 2016 Intel Corporation.
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : /**
       8             :  * @file
       9             :  * @brief Public API for network interface
      10             :  */
      11             : 
      12             : #ifndef ZEPHYR_INCLUDE_NET_NET_IF_H_
      13             : #define ZEPHYR_INCLUDE_NET_NET_IF_H_
      14             : 
      15             : /**
      16             :  * @brief Network Interface abstraction layer
      17             :  * @defgroup net_if Network Interface abstraction layer
      18             :  * @since 1.5
      19             :  * @version 1.0.0
      20             :  * @ingroup networking
      21             :  * @{
      22             :  */
      23             : 
      24             : #include <zephyr/device.h>
      25             : #include <zephyr/sys/slist.h>
      26             : #include <zephyr/sys/iterable_sections.h>
      27             : #include <zephyr/net/net_core.h>
      28             : #include <zephyr/net/hostname.h>
      29             : #include <zephyr/net/net_linkaddr.h>
      30             : #include <zephyr/net/net_ip.h>
      31             : #include <zephyr/net/net_l2.h>
      32             : #include <zephyr/net/net_stats.h>
      33             : #include <zephyr/net/net_timeout.h>
      34             : 
      35             : #if defined(CONFIG_NET_DHCPV4) && defined(CONFIG_NET_NATIVE_IPV4)
      36             : #include <zephyr/net/dhcpv4.h>
      37             : #endif
      38             : #if defined(CONFIG_NET_DHCPV6) && defined(CONFIG_NET_NATIVE_IPV6)
      39             : #include <zephyr/net/dhcpv6.h>
      40             : #endif
      41             : #if defined(CONFIG_NET_IPV4_AUTO) && defined(CONFIG_NET_NATIVE_IPV4)
      42             : #include <zephyr/net/ipv4_autoconf.h>
      43             : #endif
      44             : 
      45             : #include <zephyr/net/prometheus/collector.h>
      46             : 
      47             : #ifdef __cplusplus
      48             : extern "C" {
      49             : #endif
      50             : 
      51             : /**
      52             :  * @brief Network Interface unicast IP addresses
      53             :  *
      54             :  * Stores the unicast IP addresses assigned to this network interface.
      55             :  */
      56           1 : struct net_if_addr {
      57             :         /** IP address */
      58           1 :         struct net_addr address;
      59             : 
      60             :         /** Reference counter. This is used to prevent address removal if there
      61             :          * are sockets that have bound the local endpoint to this address.
      62             :          */
      63           1 :         atomic_t atomic_ref;
      64             : 
      65             : #if defined(CONFIG_NET_NATIVE_IPV6)
      66             :         struct net_timeout lifetime;
      67             : #endif
      68             : 
      69             :         /** How the IP address was set */
      70           1 :         enum net_addr_type addr_type;
      71             : 
      72             :         /** What is the current state of the address */
      73           1 :         enum net_addr_state addr_state;
      74             : 
      75             : #if defined(CONFIG_NET_NATIVE_IPV6)
      76             : #if defined(CONFIG_NET_IPV6_PE)
      77             :         /** Address creation time. This is used to determine if the maximum
      78             :          * lifetime for this address is reached or not. The value is in seconds.
      79             :          */
      80             :         uint32_t addr_create_time;
      81             : 
      82             :         /** Preferred lifetime for the address in seconds.
      83             :          */
      84             :         uint32_t addr_preferred_lifetime;
      85             : 
      86             :         /** Address timeout value. This is only used if DAD needs to be redone
      87             :          * for this address because of earlier DAD failure. This value is in
      88             :          * seconds.
      89             :          */
      90             :         int32_t addr_timeout;
      91             : #endif
      92             : #endif /* CONFIG_NET_NATIVE_IPV6 */
      93             : 
      94             :         union {
      95             : #if defined(CONFIG_NET_IPV6_DAD)
      96             :                 struct {
      97             :                         /** Duplicate address detection (DAD) timer */
      98             :                         sys_snode_t dad_node;
      99             :                         uint32_t dad_start;
     100             : 
     101             :                         /** How many times we have done DAD */
     102             :                         uint8_t dad_count;
     103             :                 };
     104             : #endif /* CONFIG_NET_IPV6_DAD */
     105             : #if defined(CONFIG_NET_IPV4_ACD)
     106             :                 struct {
     107             :                         /** Address conflict detection (ACD) timer. */
     108             :                         sys_snode_t acd_node;
     109             :                         k_timepoint_t acd_timeout;
     110             : 
     111             :                         /** ACD probe/announcement counter. */
     112             :                         uint8_t acd_count;
     113             : 
     114             :                         /** ACD status. */
     115             :                         uint8_t acd_state;
     116             :                 };
     117             : #endif /* CONFIG_NET_IPV4_ACD */
     118           0 :         };
     119             : 
     120             : #if defined(CONFIG_NET_IPV6_DAD) || defined(CONFIG_NET_IPV4_ACD)
     121             :         /** What interface the conflict detection is running */
     122             :         uint8_t ifindex;
     123             : #endif
     124             : 
     125             :         /** Is the IP address valid forever */
     126           1 :         uint8_t is_infinite : 1;
     127             : 
     128             :         /** Is this IP address used or not */
     129           1 :         uint8_t is_used : 1;
     130             : 
     131             :         /** Is this IP address usage limited to the subnet (mesh) or not */
     132           1 :         uint8_t is_mesh_local : 1;
     133             : 
     134             :         /** Is this IP address temporary and generated for example by
     135             :          * IPv6 privacy extension (RFC 8981)
     136             :          */
     137           1 :         uint8_t is_temporary : 1;
     138             : 
     139             :         uint8_t _unused : 4;
     140             : };
     141             : 
     142             : /**
     143             :  * @brief Network Interface multicast IP addresses
     144             :  *
     145             :  * Stores the multicast IP addresses assigned to this network interface.
     146             :  */
     147           1 : struct net_if_mcast_addr {
     148             :         /** IP address */
     149           1 :         struct net_addr address;
     150             : 
     151             : #if defined(CONFIG_NET_IPV4_IGMPV3)
     152             :         /** Sources to filter on */
     153             :         struct net_addr sources[CONFIG_NET_IF_MCAST_IPV4_SOURCE_COUNT];
     154             : 
     155             :         /** Number of sources to be used by the filter */
     156             :         uint16_t sources_len;
     157             : 
     158             :         /** Filter mode (used in IGMPV3) */
     159             :         uint8_t record_type;
     160             : #endif
     161             : 
     162             :         /** Is this multicast IP address used or not */
     163           1 :         uint8_t is_used : 1;
     164             : 
     165             :         /** Did we join to this group */
     166           1 :         uint8_t is_joined : 1;
     167             : 
     168             :         uint8_t _unused : 6;
     169             : };
     170             : 
     171             : /**
     172             :  * @brief Network Interface IPv6 prefixes
     173             :  *
     174             :  * Stores the IPV6 prefixes assigned to this network interface.
     175             :  */
     176           1 : struct net_if_ipv6_prefix {
     177             :         /** Prefix lifetime */
     178           1 :         struct net_timeout lifetime;
     179             : 
     180             :         /** IPv6 prefix */
     181           1 :         struct in6_addr prefix;
     182             : 
     183             :         /** Backpointer to network interface where this prefix is used */
     184           1 :         struct net_if *iface;
     185             : 
     186             :         /** Prefix length */
     187           1 :         uint8_t len;
     188             : 
     189             :         /** Is the IP prefix valid forever */
     190           1 :         uint8_t is_infinite : 1;
     191             : 
     192             :         /** Is this prefix used or not */
     193           1 :         uint8_t is_used : 1;
     194             : 
     195             :         uint8_t _unused : 6;
     196             : };
     197             : 
     198             : /**
     199             :  * @brief Information about routers in the system.
     200             :  *
     201             :  * Stores the router information.
     202             :  */
     203           1 : struct net_if_router {
     204             :         /** Slist lifetime timer node */
     205           1 :         sys_snode_t node;
     206             : 
     207             :         /** IP address */
     208           1 :         struct net_addr address;
     209             : 
     210             :         /** Network interface the router is connected to */
     211           1 :         struct net_if *iface;
     212             : 
     213             :         /** Router life timer start */
     214           1 :         uint32_t life_start;
     215             : 
     216             :         /** Router lifetime */
     217           1 :         uint16_t lifetime;
     218             : 
     219             :         /** Is this router used or not */
     220           1 :         uint8_t is_used : 1;
     221             : 
     222             :         /** Is default router */
     223           1 :         uint8_t is_default : 1;
     224             : 
     225             :         /** Is the router valid forever */
     226           1 :         uint8_t is_infinite : 1;
     227             : 
     228             :         uint8_t _unused : 5;
     229             : };
     230             : 
     231             : /** Network interface flags. */
     232           1 : enum net_if_flag {
     233             :         /** Interface is admin up. */
     234             :         NET_IF_UP,
     235             : 
     236             :         /** Interface is pointopoint */
     237             :         NET_IF_POINTOPOINT,
     238             : 
     239             :         /** Interface is in promiscuous mode */
     240             :         NET_IF_PROMISC,
     241             : 
     242             :         /** Do not start the interface immediately after initialization.
     243             :          * This requires that either the device driver or some other entity
     244             :          * will need to manually take the interface up when needed.
     245             :          * For example for Ethernet this will happen when the driver calls
     246             :          * the net_eth_carrier_on() function.
     247             :          */
     248             :         NET_IF_NO_AUTO_START,
     249             : 
     250             :         /** Power management specific: interface is being suspended */
     251             :         NET_IF_SUSPENDED,
     252             : 
     253             :         /** Flag defines if received multicasts of other interface are
     254             :          * forwarded on this interface. This activates multicast
     255             :          * routing / forwarding for this interface.
     256             :          */
     257             :         NET_IF_FORWARD_MULTICASTS,
     258             : 
     259             :         /** Interface supports IPv4 */
     260             :         NET_IF_IPV4,
     261             : 
     262             :         /** Interface supports IPv6 */
     263             :         NET_IF_IPV6,
     264             : 
     265             :         /** Interface up and running (ready to receive and transmit). */
     266             :         NET_IF_RUNNING,
     267             : 
     268             :         /** Driver signals L1 is up. */
     269             :         NET_IF_LOWER_UP,
     270             : 
     271             :         /** Driver signals dormant. */
     272             :         NET_IF_DORMANT,
     273             : 
     274             :         /** IPv6 Neighbor Discovery disabled. */
     275             :         NET_IF_IPV6_NO_ND,
     276             : 
     277             :         /** IPv6 Multicast Listener Discovery disabled. */
     278             :         NET_IF_IPV6_NO_MLD,
     279             : 
     280             :         /** Mutex locking on TX data path disabled on the interface. */
     281             :         NET_IF_NO_TX_LOCK,
     282             : 
     283             : /** @cond INTERNAL_HIDDEN */
     284             :         /* Total number of flags - must be at the end of the enum */
     285             :         NET_IF_NUM_FLAGS
     286             : /** @endcond */
     287             : };
     288             : 
     289             : /** @brief Network interface operational status (RFC 2863). */
     290           1 : enum net_if_oper_state {
     291             :         NET_IF_OPER_UNKNOWN,        /**< Initial (unknown) value */
     292             :         NET_IF_OPER_NOTPRESENT,     /**< Hardware missing */
     293             :         NET_IF_OPER_DOWN,           /**< Interface is down */
     294             :         NET_IF_OPER_LOWERLAYERDOWN, /**< Lower layer interface is down */
     295             :         NET_IF_OPER_TESTING,        /**< Training mode */
     296             :         NET_IF_OPER_DORMANT,        /**< Waiting external action */
     297             :         NET_IF_OPER_UP,             /**< Interface is up */
     298             : } __packed;
     299             : 
     300             : #if defined(CONFIG_NET_OFFLOAD)
     301             : struct net_offload;
     302             : #endif /* CONFIG_NET_OFFLOAD */
     303             : 
     304             : /** @cond INTERNAL_HIDDEN */
     305             : #if defined(CONFIG_NET_IPV6)
     306             : #define NET_IF_MAX_IPV6_ADDR CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT
     307             : #define NET_IF_MAX_IPV6_MADDR CONFIG_NET_IF_MCAST_IPV6_ADDR_COUNT
     308             : #define NET_IF_MAX_IPV6_PREFIX CONFIG_NET_IF_IPV6_PREFIX_COUNT
     309             : #else
     310             : #define NET_IF_MAX_IPV6_ADDR 0
     311             : #define NET_IF_MAX_IPV6_MADDR 0
     312             : #define NET_IF_MAX_IPV6_PREFIX 0
     313             : #endif
     314             : /* @endcond */
     315             : 
     316             : /** IPv6 configuration */
     317           1 : struct net_if_ipv6 {
     318             :         /** Unicast IP addresses */
     319           1 :         struct net_if_addr unicast[NET_IF_MAX_IPV6_ADDR];
     320             : 
     321             :         /** Multicast IP addresses */
     322           1 :         struct net_if_mcast_addr mcast[NET_IF_MAX_IPV6_MADDR];
     323             : 
     324             :         /** Prefixes */
     325           1 :         struct net_if_ipv6_prefix prefix[NET_IF_MAX_IPV6_PREFIX];
     326             : 
     327             :         /** Default reachable time (RFC 4861, page 52) */
     328           1 :         uint32_t base_reachable_time;
     329             : 
     330             :         /** Reachable time (RFC 4861, page 20) */
     331           1 :         uint32_t reachable_time;
     332             : 
     333             :         /** Retransmit timer (RFC 4861, page 52) */
     334           1 :         uint32_t retrans_timer;
     335             : 
     336             : #if defined(CONFIG_NET_IPV6_IID_STABLE)
     337             :         /** IID (Interface Identifier) pointer used for link local address */
     338             :         struct net_if_addr *iid;
     339             : 
     340             :         /** Incremented when network interface goes down so that we can
     341             :          * generate new stable addresses when interface comes back up.
     342             :          */
     343             :         uint32_t network_counter;
     344             : #endif /* CONFIG_NET_IPV6_IID_STABLE */
     345             : 
     346             : #if defined(CONFIG_NET_IPV6_PE)
     347             :         /** Privacy extension DESYNC_FACTOR value from RFC 8981 ch 3.4.
     348             :          * "DESYNC_FACTOR is a random value within the range 0 - MAX_DESYNC_FACTOR.
     349             :          * It is computed every time a temporary address is created.
     350             :          */
     351             :         uint32_t desync_factor;
     352             : #endif /* CONFIG_NET_IPV6_PE */
     353             : 
     354             : #if defined(CONFIG_NET_IPV6_ND) && defined(CONFIG_NET_NATIVE_IPV6)
     355             :         /** Router solicitation timer node */
     356             :         sys_snode_t rs_node;
     357             : 
     358             :         /* RS start time */
     359             :         uint32_t rs_start;
     360             : 
     361             :         /** RS count */
     362             :         uint8_t rs_count;
     363             : #endif
     364             : 
     365             :         /** IPv6 hop limit */
     366           1 :         uint8_t hop_limit;
     367             : 
     368             :         /** IPv6 multicast hop limit */
     369           1 :         uint8_t mcast_hop_limit;
     370             : };
     371             : 
     372             : #if defined(CONFIG_NET_DHCPV6) && defined(CONFIG_NET_NATIVE_IPV6)
     373             : /** DHCPv6 configuration */
     374             : struct net_if_dhcpv6 {
     375             :         /** Used for timer list. */
     376             :         sys_snode_t node;
     377             : 
     378             :         /** Generated Client ID. */
     379             :         struct net_dhcpv6_duid_storage clientid;
     380             : 
     381             :         /** Server ID of the selected server. */
     382             :         struct net_dhcpv6_duid_storage serverid;
     383             : 
     384             :         /** DHCPv6 client state. */
     385             :         enum net_dhcpv6_state state;
     386             : 
     387             :         /** DHCPv6 client configuration parameters. */
     388             :         struct net_dhcpv6_params params;
     389             : 
     390             :         /** Timeout for the next event, absolute time, milliseconds. */
     391             :         uint64_t timeout;
     392             : 
     393             :         /** Time of the current exchange start, absolute time, milliseconds */
     394             :         uint64_t exchange_start;
     395             : 
     396             :         /** Renewal time, absolute time, milliseconds. */
     397             :         uint64_t t1;
     398             : 
     399             :         /** Rebinding time, absolute time, milliseconds. */
     400             :         uint64_t t2;
     401             : 
     402             :         /** The time when the last lease expires (terminates rebinding,
     403             :          *  DHCPv6 RFC8415, ch. 18.2.5). Absolute time, milliseconds.
     404             :          */
     405             :         uint64_t expire;
     406             : 
     407             :         /** Generated IAID for IA_NA. */
     408             :         uint32_t addr_iaid;
     409             : 
     410             :         /** Generated IAID for IA_PD. */
     411             :         uint32_t prefix_iaid;
     412             : 
     413             :         /** Retransmit timeout for the current message, milliseconds. */
     414             :         uint32_t retransmit_timeout;
     415             : 
     416             :         /** Current best server preference received. */
     417             :         int16_t server_preference;
     418             : 
     419             :         /** Retransmission counter. */
     420             :         uint8_t retransmissions;
     421             : 
     422             :         /** Transaction ID for current exchange. */
     423             :         uint8_t tid[DHCPV6_TID_SIZE];
     424             : 
     425             :         /** Prefix length. */
     426             :         uint8_t prefix_len;
     427             : 
     428             :         /** Assigned IPv6 prefix. */
     429             :         struct in6_addr prefix;
     430             : 
     431             :         /** Assigned IPv6 address. */
     432             :         struct in6_addr addr;
     433             : };
     434             : #endif /* defined(CONFIG_NET_DHCPV6) && defined(CONFIG_NET_NATIVE_IPV6) */
     435             : 
     436             : /** @cond INTERNAL_HIDDEN */
     437             : #if defined(CONFIG_NET_IPV4)
     438             : #define NET_IF_MAX_IPV4_ADDR CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT
     439             : #define NET_IF_MAX_IPV4_MADDR CONFIG_NET_IF_MCAST_IPV4_ADDR_COUNT
     440             : #else
     441             : #define NET_IF_MAX_IPV4_ADDR 0
     442             : #define NET_IF_MAX_IPV4_MADDR 0
     443             : #endif
     444             : /** @endcond */
     445             : 
     446             : /**
     447             :  * @brief Network Interface unicast IPv4 address and netmask
     448             :  *
     449             :  * Stores the unicast IPv4 address and related netmask.
     450             :  */
     451           1 : struct net_if_addr_ipv4 {
     452             :         /** IPv4 address */
     453           1 :         struct net_if_addr ipv4;
     454             :         /** Netmask */
     455           1 :         struct in_addr netmask;
     456             : };
     457             : 
     458             : /** IPv4 configuration */
     459           1 : struct net_if_ipv4 {
     460             :         /** Unicast IP addresses */
     461           1 :         struct net_if_addr_ipv4 unicast[NET_IF_MAX_IPV4_ADDR];
     462             : 
     463             :         /** Multicast IP addresses */
     464           1 :         struct net_if_mcast_addr mcast[NET_IF_MAX_IPV4_MADDR];
     465             : 
     466             :         /** Gateway */
     467           1 :         struct in_addr gw;
     468             : 
     469             :         /** IPv4 time-to-live */
     470           1 :         uint8_t ttl;
     471             : 
     472             :         /** IPv4 time-to-live for multicast packets */
     473           1 :         uint8_t mcast_ttl;
     474             : 
     475             : #if defined(CONFIG_NET_IPV4_ACD)
     476             :         /** IPv4 conflict count.  */
     477             :         uint8_t conflict_cnt;
     478             : #endif
     479             : };
     480             : 
     481             : #if defined(CONFIG_NET_DHCPV4) && defined(CONFIG_NET_NATIVE_IPV4)
     482             : struct net_if_dhcpv4 {
     483             :         /** Used for timer lists */
     484             :         sys_snode_t node;
     485             : 
     486             :         /** Timer start */
     487             :         int64_t timer_start;
     488             : 
     489             :         /** Time for INIT, DISCOVER, REQUESTING, RENEWAL */
     490             :         uint32_t request_time;
     491             : 
     492             :         uint32_t xid;
     493             : 
     494             :         /** IP address Lease time */
     495             :         uint32_t lease_time;
     496             : 
     497             :         /** IP address Renewal time */
     498             :         uint32_t renewal_time;
     499             : 
     500             :         /** IP address Rebinding time */
     501             :         uint32_t rebinding_time;
     502             : 
     503             :         /** Server ID */
     504             :         struct in_addr server_id;
     505             : 
     506             :         /** Requested IP addr */
     507             :         struct in_addr requested_ip;
     508             : 
     509             :         /** Received netmask from the server */
     510             :         struct in_addr netmask;
     511             : 
     512             :         /**
     513             :          *  DHCPv4 client state in the process of network
     514             :          *  address allocation.
     515             :          */
     516             :         enum net_dhcpv4_state state;
     517             : 
     518             :         /** Number of attempts made for REQUEST and RENEWAL messages */
     519             :         uint8_t attempts;
     520             : 
     521             :         /** The address of the server the request is sent to */
     522             :         struct in_addr request_server_addr;
     523             : 
     524             :         /** The source address of a received DHCP message */
     525             :         struct in_addr response_src_addr;
     526             : 
     527             : #ifdef CONFIG_NET_DHCPV4_OPTION_NTP_SERVER
     528             :         /** NTP server address */
     529             :         struct in_addr ntp_addr;
     530             : #endif
     531             : };
     532             : #endif /* CONFIG_NET_DHCPV4 */
     533             : 
     534             : #if defined(CONFIG_NET_IPV4_AUTO) && defined(CONFIG_NET_NATIVE_IPV4)
     535             : struct net_if_ipv4_autoconf {
     536             :         /** Backpointer to correct network interface */
     537             :         struct net_if *iface;
     538             : 
     539             :         /** Requested IP addr */
     540             :         struct in_addr requested_ip;
     541             : 
     542             :         /** IPV4 Autoconf state in the process of network address allocation.
     543             :          */
     544             :         enum net_ipv4_autoconf_state state;
     545             : };
     546             : #endif /* CONFIG_NET_IPV4_AUTO */
     547             : 
     548             : /** @cond INTERNAL_HIDDEN */
     549             : /* We always need to have at least one IP config */
     550             : #define NET_IF_MAX_CONFIGS 1
     551             : /** @endcond */
     552             : 
     553             : /**
     554             :  * @brief Network interface IP address configuration.
     555             :  */
     556           1 : struct net_if_ip {
     557             : #if defined(CONFIG_NET_IPV6)
     558             :         struct net_if_ipv6 *ipv6;
     559             : #endif /* CONFIG_NET_IPV6 */
     560             : 
     561             : #if defined(CONFIG_NET_IPV4)
     562             :         struct net_if_ipv4 *ipv4;
     563             : #endif /* CONFIG_NET_IPV4 */
     564             : };
     565             : 
     566             : /**
     567             :  * @brief IP and other configuration related data for network interface.
     568             :  */
     569           1 : struct net_if_config {
     570             : #if defined(CONFIG_NET_IP)
     571             :         /** IP address configuration setting */
     572             :         struct net_if_ip ip;
     573             : #endif
     574             : 
     575             : #if defined(CONFIG_NET_DHCPV4) && defined(CONFIG_NET_NATIVE_IPV4)
     576             :         struct net_if_dhcpv4 dhcpv4;
     577             : #endif /* CONFIG_NET_DHCPV4 */
     578             : 
     579             : #if defined(CONFIG_NET_DHCPV6) && defined(CONFIG_NET_NATIVE_IPV6)
     580             :         struct net_if_dhcpv6 dhcpv6;
     581             : #endif /* CONFIG_NET_DHCPV6 */
     582             : 
     583             : #if defined(CONFIG_NET_IPV4_AUTO) && defined(CONFIG_NET_NATIVE_IPV4)
     584             :         struct net_if_ipv4_autoconf ipv4auto;
     585             : #endif /* CONFIG_NET_IPV4_AUTO */
     586             : 
     587             : #if defined(CONFIG_NET_L2_VIRTUAL)
     588             :         /**
     589             :          * This list keeps track of the virtual network interfaces
     590             :          * that are attached to this network interface.
     591             :          */
     592             :         sys_slist_t virtual_interfaces;
     593             : #endif /* CONFIG_NET_L2_VIRTUAL */
     594             : 
     595             : #if defined(CONFIG_NET_INTERFACE_NAME)
     596             :         /**
     597             :          * Network interface can have a name and it is possible
     598             :          * to search a network interface using this name.
     599             :          */
     600             :         char name[CONFIG_NET_INTERFACE_NAME_LEN + 1];
     601             : #endif
     602             : };
     603             : 
     604             : /**
     605             :  * @brief Network traffic class.
     606             :  *
     607             :  * Traffic classes are used when sending or receiving data that is classified
     608             :  * with different priorities. So some traffic can be marked as high priority
     609             :  * and it will be sent or received first. Each network packet that is
     610             :  * transmitted or received goes through a fifo to a thread that will transmit
     611             :  * it.
     612             :  */
     613           1 : struct net_traffic_class {
     614             :         /** Fifo for handling this Tx or Rx packet */
     615           1 :         struct k_fifo fifo;
     616             : 
     617             :         /** Traffic class handler thread */
     618           1 :         struct k_thread handler;
     619             : 
     620             :         /** Stack for this handler */
     621           1 :         k_thread_stack_t *stack;
     622             : };
     623             : 
     624             : /**
     625             :  * @typedef net_socket_create_t
     626             : 
     627             :  * @brief A function prototype to create an offloaded socket. The prototype is
     628             :  *        compatible with socket() function.
     629             :  */
     630           1 : typedef int (*net_socket_create_t)(int, int, int);
     631             : 
     632             : /**
     633             :  * @brief Network Interface Device structure
     634             :  *
     635             :  * Used to handle a network interface on top of a device driver instance.
     636             :  * There can be many net_if_dev instance against the same device.
     637             :  *
     638             :  * Such interface is mainly to be used by the link layer, but is also tight
     639             :  * to a network context: it then makes the relation with a network context
     640             :  * and the network device.
     641             :  *
     642             :  * Because of the strong relationship between a device driver and such
     643             :  * network interface, each net_if_dev should be instantiated by one of the
     644             :  * network device init macros found in net_if.h.
     645             :  */
     646           1 : struct net_if_dev {
     647             :         /** The actually device driver instance the net_if is related to */
     648           1 :         const struct device *dev;
     649             : 
     650             :         /** Interface's L2 layer */
     651           1 :         const struct net_l2 * const l2;
     652             : 
     653             :         /** Interface's private L2 data pointer */
     654           1 :         void *l2_data;
     655             : 
     656             :         /** For internal use */
     657           1 :         ATOMIC_DEFINE(flags, NET_IF_NUM_FLAGS);
     658             : 
     659             :         /** The hardware link address */
     660           1 :         struct net_linkaddr link_addr;
     661             : 
     662             : #if defined(CONFIG_NET_OFFLOAD)
     663             :         /** TCP/IP Offload functions.
     664             :          * If non-NULL, then the TCP/IP stack is located
     665             :          * in the communication chip that is accessed via this
     666             :          * network interface.
     667             :          */
     668             :         struct net_offload *offload;
     669             : #endif /* CONFIG_NET_OFFLOAD */
     670             : 
     671             :         /** The hardware MTU */
     672           1 :         uint16_t mtu;
     673             : 
     674             : #if defined(CONFIG_NET_SOCKETS_OFFLOAD)
     675             :         /** A function pointer to create an offloaded socket.
     676             :          *  If non-NULL, the interface is considered offloaded at socket level.
     677             :          */
     678             :         net_socket_create_t socket_offload;
     679             : #endif /* CONFIG_NET_SOCKETS_OFFLOAD */
     680             : 
     681             :         /** RFC 2863 operational status */
     682           1 :         enum net_if_oper_state oper_state;
     683             : };
     684             : 
     685             : /**
     686             :  * @brief Network Interface structure
     687             :  *
     688             :  * Used to handle a network interface on top of a net_if_dev instance.
     689             :  * There can be many net_if instance against the same net_if_dev instance.
     690             :  *
     691             :  */
     692           1 : struct net_if {
     693             :         /** The net_if_dev instance the net_if is related to */
     694           1 :         struct net_if_dev *if_dev;
     695             : 
     696             : #if defined(CONFIG_NET_STATISTICS_PER_INTERFACE)
     697             :         /** Network statistics related to this network interface */
     698             :         struct net_stats stats;
     699             : 
     700             :         /** Promethus collector for this network interface */
     701             :         IF_ENABLED(CONFIG_NET_STATISTICS_VIA_PROMETHEUS,
     702             :                    (struct prometheus_collector *collector);)
     703             : #endif /* CONFIG_NET_STATISTICS_PER_INTERFACE */
     704             : 
     705             :         /** Network interface instance configuration */
     706           1 :         struct net_if_config config;
     707             : 
     708             : #if defined(CONFIG_NET_POWER_MANAGEMENT)
     709             :         /** Keep track of packets pending in traffic queues. This is
     710             :          * needed to avoid putting network device driver to sleep if
     711             :          * there are packets waiting to be sent.
     712             :          */
     713             :         int tx_pending;
     714             : #endif
     715             : 
     716             :         /** Mutex protecting this network interface instance */
     717           1 :         struct k_mutex lock;
     718             : 
     719             :         /** Mutex used when sending data */
     720           1 :         struct k_mutex tx_lock;
     721             : 
     722             :         /** Network interface specific flags */
     723             :         /** Enable IPv6 privacy extension (RFC 8981), this is enabled
     724             :          * by default if PE support is enabled in configuration.
     725             :          */
     726           1 :         uint8_t pe_enabled : 1;
     727             : 
     728             :         /** If PE is enabled, then this tells whether public addresses
     729             :          * are preferred over temporary ones for this interface.
     730             :          */
     731           1 :         uint8_t pe_prefer_public : 1;
     732             : 
     733             :         /** Unused bit flags (ignore) */
     734             :         uint8_t _unused : 6;
     735             : };
     736             : 
     737             : /** @cond INTERNAL_HIDDEN */
     738             : 
     739             : static inline void net_if_lock(struct net_if *iface)
     740             : {
     741             :         NET_ASSERT(iface);
     742             : 
     743             :         (void)k_mutex_lock(&iface->lock, K_FOREVER);
     744             : }
     745             : 
     746             : static inline void net_if_unlock(struct net_if *iface)
     747             : {
     748             :         NET_ASSERT(iface);
     749             : 
     750             :         k_mutex_unlock(&iface->lock);
     751             : }
     752             : 
     753             : static inline bool net_if_flag_is_set(struct net_if *iface,
     754             :                                       enum net_if_flag value);
     755             : 
     756             : static inline void net_if_tx_lock(struct net_if *iface)
     757             : {
     758             :         NET_ASSERT(iface);
     759             : 
     760             :         if (net_if_flag_is_set(iface, NET_IF_NO_TX_LOCK)) {
     761             :                 return;
     762             :         }
     763             : 
     764             :         (void)k_mutex_lock(&iface->tx_lock, K_FOREVER);
     765             : }
     766             : 
     767             : static inline void net_if_tx_unlock(struct net_if *iface)
     768             : {
     769             :         NET_ASSERT(iface);
     770             : 
     771             :         if (net_if_flag_is_set(iface, NET_IF_NO_TX_LOCK)) {
     772             :                 return;
     773             :         }
     774             : 
     775             :         k_mutex_unlock(&iface->tx_lock);
     776             : }
     777             : 
     778             : /** @endcond */
     779             : 
     780             : /**
     781             :  * @brief Set a value in network interface flags
     782             :  *
     783             :  * @param iface Pointer to network interface
     784             :  * @param value Flag value
     785             :  */
     786           1 : static inline void net_if_flag_set(struct net_if *iface,
     787             :                                    enum net_if_flag value)
     788             : {
     789             :         if (iface == NULL || iface->if_dev == NULL) {
     790             :                 return;
     791             :         }
     792             : 
     793             :         atomic_set_bit(iface->if_dev->flags, value);
     794             : }
     795             : 
     796             : /**
     797             :  * @brief Test and set a value in network interface flags
     798             :  *
     799             :  * @param iface Pointer to network interface
     800             :  * @param value Flag value
     801             :  *
     802             :  * @return true if the bit was set, false if it wasn't.
     803             :  */
     804           1 : static inline bool net_if_flag_test_and_set(struct net_if *iface,
     805             :                                             enum net_if_flag value)
     806             : {
     807             :         if (iface == NULL || iface->if_dev == NULL) {
     808             :                 return false;
     809             :         }
     810             : 
     811             :         return atomic_test_and_set_bit(iface->if_dev->flags, value);
     812             : }
     813             : 
     814             : /**
     815             :  * @brief Clear a value in network interface flags
     816             :  *
     817             :  * @param iface Pointer to network interface
     818             :  * @param value Flag value
     819             :  */
     820           1 : static inline void net_if_flag_clear(struct net_if *iface,
     821             :                                      enum net_if_flag value)
     822             : {
     823             :         if (iface == NULL || iface->if_dev == NULL) {
     824             :                 return;
     825             :         }
     826             : 
     827             :         atomic_clear_bit(iface->if_dev->flags, value);
     828             : }
     829             : 
     830             : /**
     831             :  * @brief Test and clear a value in network interface flags
     832             :  *
     833             :  * @param iface Pointer to network interface
     834             :  * @param value Flag value
     835             :  *
     836             :  * @return true if the bit was set, false if it wasn't.
     837             :  */
     838           1 : static inline bool net_if_flag_test_and_clear(struct net_if *iface,
     839             :                                               enum net_if_flag value)
     840             : {
     841             :         if (iface == NULL || iface->if_dev == NULL) {
     842             :                 return false;
     843             :         }
     844             : 
     845             :         return atomic_test_and_clear_bit(iface->if_dev->flags, value);
     846             : }
     847             : 
     848             : /**
     849             :  * @brief Check if a value in network interface flags is set
     850             :  *
     851             :  * @param iface Pointer to network interface
     852             :  * @param value Flag value
     853             :  *
     854             :  * @return True if the value is set, false otherwise
     855             :  */
     856           1 : static inline bool net_if_flag_is_set(struct net_if *iface,
     857             :                                       enum net_if_flag value)
     858             : {
     859             :         if (iface == NULL || iface->if_dev == NULL) {
     860             :                 return false;
     861             :         }
     862             : 
     863             :         return atomic_test_bit(iface->if_dev->flags, value);
     864             : }
     865             : 
     866             : /**
     867             :  * @brief Set an operational state on an interface
     868             :  *
     869             :  * @param iface Pointer to network interface
     870             :  * @param oper_state Operational state to set
     871             :  *
     872             :  * @return The new operational state of an interface
     873             :  */
     874           1 : static inline enum net_if_oper_state net_if_oper_state_set(
     875             :         struct net_if *iface, enum net_if_oper_state oper_state)
     876             : {
     877             :         if (iface == NULL || iface->if_dev == NULL) {
     878             :                 return NET_IF_OPER_UNKNOWN;
     879             :         }
     880             : 
     881             :         BUILD_ASSERT((enum net_if_oper_state)(-1) > 0 && NET_IF_OPER_UNKNOWN == 0);
     882             :         if (oper_state <= NET_IF_OPER_UP) {
     883             :                 iface->if_dev->oper_state = oper_state;
     884             :         }
     885             : 
     886             :         return iface->if_dev->oper_state;
     887             : }
     888             : 
     889             : /**
     890             :  * @brief Get an operational state of an interface
     891             :  *
     892             :  * @param iface Pointer to network interface
     893             :  *
     894             :  * @return Operational state of an interface
     895             :  */
     896           1 : static inline enum net_if_oper_state net_if_oper_state(struct net_if *iface)
     897             : {
     898             :         if (iface == NULL || iface->if_dev == NULL) {
     899             :                 return NET_IF_OPER_UNKNOWN;
     900             :         }
     901             : 
     902             :         return iface->if_dev->oper_state;
     903             : }
     904             : 
     905             : /**
     906             :  * @brief Send a packet through a net iface
     907             :  *
     908             :  * @param iface Pointer to a network interface structure
     909             :  * @param pkt Pointer to a net packet to send
     910             :  *
     911             :  * return verdict about the packet
     912             :  */
     913           1 : enum net_verdict net_if_send_data(struct net_if *iface, struct net_pkt *pkt);
     914             : 
     915             : /**
     916             :  * @brief Get a pointer to the interface L2
     917             :  *
     918             :  * @param iface a valid pointer to a network interface structure
     919             :  *
     920             :  * @return a pointer to the iface L2
     921             :  */
     922           1 : static inline const struct net_l2 *net_if_l2(struct net_if *iface)
     923             : {
     924             :         if (iface == NULL || iface->if_dev == NULL) {
     925             :                 return NULL;
     926             :         }
     927             : 
     928             :         return iface->if_dev->l2;
     929             : }
     930             : 
     931             : /**
     932             :  * @brief Input a packet through a net iface
     933             :  *
     934             :  * @param iface Pointer to a network interface structure
     935             :  * @param pkt Pointer to a net packet to input
     936             :  *
     937             :  * @return verdict about the packet
     938             :  */
     939           1 : enum net_verdict net_if_recv_data(struct net_if *iface, struct net_pkt *pkt);
     940             : 
     941             : /**
     942             :  * @brief Get a pointer to the interface L2 private data
     943             :  *
     944             :  * @param iface a valid pointer to a network interface structure
     945             :  *
     946             :  * @return a pointer to the iface L2 data
     947             :  */
     948           1 : static inline void *net_if_l2_data(struct net_if *iface)
     949             : {
     950             :         if (iface == NULL || iface->if_dev == NULL) {
     951             :                 return NULL;
     952             :         }
     953             : 
     954             :         return iface->if_dev->l2_data;
     955             : }
     956             : 
     957             : /**
     958             :  * @brief Get an network interface's device
     959             :  *
     960             :  * @param iface Pointer to a network interface structure
     961             :  *
     962             :  * @return a pointer to the device driver instance
     963             :  */
     964           1 : static inline const struct device *net_if_get_device(struct net_if *iface)
     965             : {
     966             :         if (iface == NULL || iface->if_dev == NULL) {
     967             :                 return NULL;
     968             :         }
     969             : 
     970             :         return iface->if_dev->dev;
     971             : }
     972             : 
     973             : /**
     974             :  * @brief Queue a packet to the net interface TX queue
     975             :  *
     976             :  * @param iface Pointer to a network interface structure
     977             :  * @param pkt Pointer to a net packet to queue
     978             :  */
     979           1 : void net_if_queue_tx(struct net_if *iface, struct net_pkt *pkt);
     980             : 
     981             : /**
     982             :  * @brief Return the IP offload status
     983             :  *
     984             :  * @param iface Network interface
     985             :  *
     986             :  * @return True if IP offloading is active, false otherwise.
     987             :  */
     988           1 : static inline bool net_if_is_ip_offloaded(struct net_if *iface)
     989             : {
     990             : #if defined(CONFIG_NET_OFFLOAD)
     991             :         return (iface != NULL && iface->if_dev != NULL &&
     992             :                 iface->if_dev->offload != NULL);
     993             : #else
     994             :         ARG_UNUSED(iface);
     995             : 
     996             :         return false;
     997             : #endif
     998             : }
     999             : 
    1000             : /**
    1001             :  * @brief Return offload status of a given network interface.
    1002             :  *
    1003             :  * @param iface Network interface
    1004             :  *
    1005             :  * @return True if IP or socket offloading is active, false otherwise.
    1006             :  */
    1007           1 : bool net_if_is_offloaded(struct net_if *iface);
    1008             : 
    1009             : /**
    1010             :  * @brief Return the IP offload plugin
    1011             :  *
    1012             :  * @param iface Network interface
    1013             :  *
    1014             :  * @return NULL if there is no offload plugin defined, valid pointer otherwise
    1015             :  */
    1016           1 : static inline struct net_offload *net_if_offload(struct net_if *iface)
    1017             : {
    1018             : #if defined(CONFIG_NET_OFFLOAD)
    1019             :         if (iface == NULL || iface->if_dev == NULL) {
    1020             :                 return NULL;
    1021             :         }
    1022             : 
    1023             :         return iface->if_dev->offload;
    1024             : #else
    1025             :         ARG_UNUSED(iface);
    1026             : 
    1027             :         return NULL;
    1028             : #endif
    1029             : }
    1030             : 
    1031             : /**
    1032             :  * @brief Return the socket offload status
    1033             :  *
    1034             :  * @param iface Network interface
    1035             :  *
    1036             :  * @return True if socket offloading is active, false otherwise.
    1037             :  */
    1038           1 : static inline bool net_if_is_socket_offloaded(struct net_if *iface)
    1039             : {
    1040             : #if defined(CONFIG_NET_SOCKETS_OFFLOAD)
    1041             :         if (iface == NULL || iface->if_dev == NULL) {
    1042             :                 return false;
    1043             :         }
    1044             : 
    1045             :         return (iface->if_dev->socket_offload != NULL);
    1046             : #else
    1047             :         ARG_UNUSED(iface);
    1048             : 
    1049             :         return false;
    1050             : #endif
    1051             : }
    1052             : 
    1053             : /**
    1054             :  * @brief Set the function to create an offloaded socket
    1055             :  *
    1056             :  * @param iface Network interface
    1057             :  * @param socket_offload A function to create an offloaded socket
    1058             :  */
    1059           1 : static inline void net_if_socket_offload_set(
    1060             :                 struct net_if *iface, net_socket_create_t socket_offload)
    1061             : {
    1062             : #if defined(CONFIG_NET_SOCKETS_OFFLOAD)
    1063             :         if (iface == NULL || iface->if_dev == NULL) {
    1064             :                 return;
    1065             :         }
    1066             : 
    1067             :         iface->if_dev->socket_offload = socket_offload;
    1068             : #else
    1069             :         ARG_UNUSED(iface);
    1070             :         ARG_UNUSED(socket_offload);
    1071             : #endif
    1072             : }
    1073             : 
    1074             : /**
    1075             :  * @brief Return the function to create an offloaded socket
    1076             :  *
    1077             :  * @param iface Network interface
    1078             :  *
    1079             :  * @return NULL if the interface is not socket offloaded, valid pointer otherwise
    1080             :  */
    1081           1 : static inline net_socket_create_t net_if_socket_offload(struct net_if *iface)
    1082             : {
    1083             : #if defined(CONFIG_NET_SOCKETS_OFFLOAD)
    1084             :         if (iface == NULL || iface->if_dev == NULL) {
    1085             :                 return NULL;
    1086             :         }
    1087             : 
    1088             :         return iface->if_dev->socket_offload;
    1089             : #else
    1090             :         ARG_UNUSED(iface);
    1091             : 
    1092             :         return NULL;
    1093             : #endif
    1094             : }
    1095             : 
    1096             : /**
    1097             :  * @brief Get an network interface's link address
    1098             :  *
    1099             :  * @param iface Pointer to a network interface structure
    1100             :  *
    1101             :  * @return a pointer to the network link address
    1102             :  */
    1103           1 : static inline struct net_linkaddr *net_if_get_link_addr(struct net_if *iface)
    1104             : {
    1105             :         if (iface == NULL || iface->if_dev == NULL) {
    1106             :                 return NULL;
    1107             :         }
    1108             : 
    1109             :         return &iface->if_dev->link_addr;
    1110             : }
    1111             : 
    1112             : /**
    1113             :  * @brief Return network configuration for this network interface
    1114             :  *
    1115             :  * @param iface Pointer to a network interface structure
    1116             :  *
    1117             :  * @return Pointer to configuration
    1118             :  */
    1119           1 : static inline struct net_if_config *net_if_get_config(struct net_if *iface)
    1120             : {
    1121             :         if (iface == NULL) {
    1122             :                 return NULL;
    1123             :         }
    1124             : 
    1125             :         return &iface->config;
    1126             : }
    1127             : 
    1128             : /**
    1129             :  * @brief Start duplicate address detection procedure.
    1130             :  *
    1131             :  * @param iface Pointer to a network interface structure
    1132             :  */
    1133             : #if defined(CONFIG_NET_IPV6_DAD) && defined(CONFIG_NET_NATIVE_IPV6)
    1134             : void net_if_start_dad(struct net_if *iface);
    1135             : #else
    1136           1 : static inline void net_if_start_dad(struct net_if *iface)
    1137             : {
    1138             :         ARG_UNUSED(iface);
    1139             : }
    1140             : #endif
    1141             : 
    1142             : /**
    1143             :  * @brief Start neighbor discovery and send router solicitation message.
    1144             :  *
    1145             :  * @param iface Pointer to a network interface structure
    1146             :  */
    1147           1 : void net_if_start_rs(struct net_if *iface);
    1148             : 
    1149             : 
    1150             : /**
    1151             :  * @brief Stop neighbor discovery.
    1152             :  *
    1153             :  * @param iface Pointer to a network interface structure
    1154             :  */
    1155             : #if defined(CONFIG_NET_IPV6_ND) && defined(CONFIG_NET_NATIVE_IPV6)
    1156             : void net_if_stop_rs(struct net_if *iface);
    1157             : #else
    1158           1 : static inline void net_if_stop_rs(struct net_if *iface)
    1159             : {
    1160             :         ARG_UNUSED(iface);
    1161             : }
    1162             : #endif /* CONFIG_NET_IPV6_ND */
    1163             : 
    1164             : /**
    1165             :  * @brief Provide a reachability hint for IPv6 Neighbor Discovery.
    1166             :  *
    1167             :  * This function is intended for upper-layer protocols to inform the IPv6
    1168             :  * Neighbor Discovery process about an active link to a specific neighbor.
    1169             :  * By signaling a recent "forward progress" event, such as the reception of
    1170             :  * an ACK, this function can help reduce unnecessary ND traffic as per the
    1171             :  * guidelines in RFC 4861 (section 7.3).
    1172             :  *
    1173             :  * @param iface A pointer to the network interface.
    1174             :  * @param ipv6_addr Pointer to the IPv6 address of the neighbor node.
    1175             :  */
    1176             : #if defined(CONFIG_NET_IPV6_ND) && defined(CONFIG_NET_NATIVE_IPV6)
    1177             : void net_if_nbr_reachability_hint(struct net_if *iface, const struct in6_addr *ipv6_addr);
    1178             : #else
    1179           1 : static inline void net_if_nbr_reachability_hint(struct net_if *iface,
    1180             :                                                 const struct in6_addr *ipv6_addr)
    1181             : {
    1182             :         ARG_UNUSED(iface);
    1183             :         ARG_UNUSED(ipv6_addr);
    1184             : }
    1185             : #endif
    1186             : 
    1187             : /** @cond INTERNAL_HIDDEN */
    1188             : 
    1189             : static inline int net_if_set_link_addr_unlocked(struct net_if *iface,
    1190             :                                                 uint8_t *addr, uint8_t len,
    1191             :                                                 enum net_link_type type)
    1192             : {
    1193             :         if (net_if_flag_is_set(iface, NET_IF_RUNNING)) {
    1194             :                 return -EPERM;
    1195             :         }
    1196             : 
    1197             :         net_if_get_link_addr(iface)->addr = addr;
    1198             :         net_if_get_link_addr(iface)->len = len;
    1199             :         net_if_get_link_addr(iface)->type = type;
    1200             : 
    1201             :         net_hostname_set_postfix(addr, len);
    1202             : 
    1203             :         return 0;
    1204             : }
    1205             : 
    1206             : int net_if_set_link_addr_locked(struct net_if *iface,
    1207             :                                 uint8_t *addr, uint8_t len,
    1208             :                                 enum net_link_type type);
    1209             : 
    1210             : #if CONFIG_NET_IF_LOG_LEVEL >= LOG_LEVEL_DBG
    1211             : extern int net_if_addr_unref_debug(struct net_if *iface,
    1212             :                                    sa_family_t family,
    1213             :                                    const void *addr,
    1214             :                                    const char *caller, int line);
    1215             : #define net_if_addr_unref(iface, family, addr) \
    1216             :         net_if_addr_unref_debug(iface, family, addr, __func__, __LINE__)
    1217             : 
    1218             : extern struct net_if_addr *net_if_addr_ref_debug(struct net_if *iface,
    1219             :                                                  sa_family_t family,
    1220             :                                                  const void *addr,
    1221             :                                                  const char *caller,
    1222             :                                                  int line);
    1223             : #define net_if_addr_ref(iface, family, addr) \
    1224             :         net_if_addr_ref_debug(iface, family, addr, __func__, __LINE__)
    1225             : #else
    1226             : extern int net_if_addr_unref(struct net_if *iface,
    1227             :                              sa_family_t family,
    1228             :                              const void *addr);
    1229             : extern struct net_if_addr *net_if_addr_ref(struct net_if *iface,
    1230             :                                            sa_family_t family,
    1231             :                                            const void *addr);
    1232             : #endif /* CONFIG_NET_IF_LOG_LEVEL */
    1233             : 
    1234             : /** @endcond */
    1235             : 
    1236             : /**
    1237             :  * @brief Set a network interface's link address
    1238             :  *
    1239             :  * @param iface Pointer to a network interface structure
    1240             :  * @param addr A pointer to a uint8_t buffer representing the address.
    1241             :  *             The buffer must remain valid throughout interface lifetime.
    1242             :  * @param len length of the address buffer
    1243             :  * @param type network bearer type of this link address
    1244             :  *
    1245             :  * @return 0 on success
    1246             :  */
    1247           1 : static inline int net_if_set_link_addr(struct net_if *iface,
    1248             :                                        uint8_t *addr, uint8_t len,
    1249             :                                        enum net_link_type type)
    1250             : {
    1251             : #if defined(CONFIG_NET_RAW_MODE)
    1252             :         return net_if_set_link_addr_unlocked(iface, addr, len, type);
    1253             : #else
    1254             :         return net_if_set_link_addr_locked(iface, addr, len, type);
    1255             : #endif
    1256             : }
    1257             : 
    1258             : /**
    1259             :  * @brief Get an network interface's MTU
    1260             :  *
    1261             :  * @param iface Pointer to a network interface structure
    1262             :  *
    1263             :  * @return the MTU
    1264             :  */
    1265           1 : static inline uint16_t net_if_get_mtu(struct net_if *iface)
    1266             : {
    1267             :         if (iface == NULL || iface->if_dev == NULL) {
    1268             :                 return 0U;
    1269             :         }
    1270             : 
    1271             :         return iface->if_dev->mtu;
    1272             : }
    1273             : 
    1274             : /**
    1275             :  * @brief Set an network interface's MTU
    1276             :  *
    1277             :  * @param iface Pointer to a network interface structure
    1278             :  * @param mtu New MTU, note that we store only 16 bit mtu value.
    1279             :  */
    1280           1 : static inline void net_if_set_mtu(struct net_if *iface,
    1281             :                                   uint16_t mtu)
    1282             : {
    1283             :         if (iface == NULL || iface->if_dev == NULL) {
    1284             :                 return;
    1285             :         }
    1286             : 
    1287             :         iface->if_dev->mtu = mtu;
    1288             : }
    1289             : 
    1290             : /**
    1291             :  * @brief Set the infinite status of the network interface address
    1292             :  *
    1293             :  * @param ifaddr IP address for network interface
    1294             :  * @param is_infinite Infinite status
    1295             :  */
    1296           1 : static inline void net_if_addr_set_lf(struct net_if_addr *ifaddr,
    1297             :                                       bool is_infinite)
    1298             : {
    1299             :         if (ifaddr == NULL) {
    1300             :                 return;
    1301             :         }
    1302             : 
    1303             :         ifaddr->is_infinite = is_infinite;
    1304             : }
    1305             : 
    1306             : /**
    1307             :  * @brief Get an interface according to link layer address.
    1308             :  *
    1309             :  * @param ll_addr Link layer address.
    1310             :  *
    1311             :  * @return Network interface or NULL if not found.
    1312             :  */
    1313           1 : struct net_if *net_if_get_by_link_addr(struct net_linkaddr *ll_addr);
    1314             : 
    1315             : /**
    1316             :  * @brief Find an interface from it's related device
    1317             :  *
    1318             :  * @param dev A valid struct device pointer to relate with an interface
    1319             :  *
    1320             :  * @return a valid struct net_if pointer on success, NULL otherwise
    1321             :  */
    1322           1 : struct net_if *net_if_lookup_by_dev(const struct device *dev);
    1323             : 
    1324             : /**
    1325             :  * @brief Get network interface IP config
    1326             :  *
    1327             :  * @param iface Interface to use.
    1328             :  *
    1329             :  * @return NULL if not found or pointer to correct config settings.
    1330             :  */
    1331           1 : static inline struct net_if_config *net_if_config_get(struct net_if *iface)
    1332             : {
    1333             :         if (iface == NULL) {
    1334             :                 return NULL;
    1335             :         }
    1336             : 
    1337             :         return &iface->config;
    1338             : }
    1339             : 
    1340             : /**
    1341             :  * @brief Remove a router from the system
    1342             :  *
    1343             :  * @param router Pointer to existing router
    1344             :  */
    1345           1 : void net_if_router_rm(struct net_if_router *router);
    1346             : 
    1347             : /**
    1348             :  * @brief Set the default network interface.
    1349             :  *
    1350             :  * @param iface New default interface, or NULL to revert to the one set by Kconfig.
    1351             :  */
    1352           1 : void net_if_set_default(struct net_if *iface);
    1353             : 
    1354             : /**
    1355             :  * @brief Get the default network interface.
    1356             :  *
    1357             :  * @return Default interface or NULL if no interfaces are configured.
    1358             :  */
    1359           1 : struct net_if *net_if_get_default(void);
    1360             : 
    1361             : /**
    1362             :  * @brief Get the first network interface according to its type.
    1363             :  *
    1364             :  * @param l2 Layer 2 type of the network interface.
    1365             :  *
    1366             :  * @return First network interface of a given type or NULL if no such
    1367             :  * interfaces was found.
    1368             :  */
    1369           1 : struct net_if *net_if_get_first_by_type(const struct net_l2 *l2);
    1370             : 
    1371             : /**
    1372             :  * @brief Get the first network interface which is up.
    1373             :  *
    1374             :  * @return First network interface which is up or NULL if all
    1375             :  * interfaces are down.
    1376             :  */
    1377           1 : struct net_if *net_if_get_first_up(void);
    1378             : 
    1379             : #if defined(CONFIG_NET_L2_IEEE802154)
    1380             : /**
    1381             :  * @brief Get the first IEEE 802.15.4 network interface.
    1382             :  *
    1383             :  * @return First IEEE 802.15.4 network interface or NULL if no such
    1384             :  * interfaces was found.
    1385             :  */
    1386             : static inline struct net_if *net_if_get_ieee802154(void)
    1387             : {
    1388             :         return net_if_get_first_by_type(&NET_L2_GET_NAME(IEEE802154));
    1389             : }
    1390             : #endif /* CONFIG_NET_L2_IEEE802154 */
    1391             : 
    1392             : /**
    1393             :  * @brief Allocate network interface IPv6 config.
    1394             :  *
    1395             :  * @details This function will allocate new IPv6 config.
    1396             :  *
    1397             :  * @param iface Interface to use.
    1398             :  * @param ipv6 Pointer to allocated IPv6 struct is returned to caller.
    1399             :  *
    1400             :  * @return 0 if ok, <0 if error
    1401             :  */
    1402           1 : int net_if_config_ipv6_get(struct net_if *iface,
    1403             :                            struct net_if_ipv6 **ipv6);
    1404             : 
    1405             : /**
    1406             :  * @brief Release network interface IPv6 config.
    1407             :  *
    1408             :  * @param iface Interface to use.
    1409             :  *
    1410             :  * @return 0 if ok, <0 if error
    1411             :  */
    1412           1 : int net_if_config_ipv6_put(struct net_if *iface);
    1413             : 
    1414             : /**
    1415             :  * @brief Check if this IPv6 address belongs to one of the interfaces.
    1416             :  *
    1417             :  * @param addr IPv6 address
    1418             :  * @param iface Pointer to interface is returned
    1419             :  *
    1420             :  * @return Pointer to interface address, NULL if not found.
    1421             :  */
    1422           1 : struct net_if_addr *net_if_ipv6_addr_lookup(const struct in6_addr *addr,
    1423             :                                             struct net_if **iface);
    1424             : 
    1425             : /**
    1426             :  * @brief Check if this IPv6 address belongs to this specific interfaces.
    1427             :  *
    1428             :  * @param iface Network interface
    1429             :  * @param addr IPv6 address
    1430             :  *
    1431             :  * @return Pointer to interface address, NULL if not found.
    1432             :  */
    1433           1 : struct net_if_addr *net_if_ipv6_addr_lookup_by_iface(struct net_if *iface,
    1434             :                                                      struct in6_addr *addr);
    1435             : 
    1436             : /**
    1437             :  * @brief Check if this IPv6 address belongs to one of the interface indices.
    1438             :  *
    1439             :  * @param addr IPv6 address
    1440             :  *
    1441             :  * @return >0 if address was found in given network interface index,
    1442             :  * all other values mean address was not found
    1443             :  */
    1444           1 : __syscall int net_if_ipv6_addr_lookup_by_index(const struct in6_addr *addr);
    1445             : 
    1446             : /**
    1447             :  * @brief Add a IPv6 address to an interface
    1448             :  *
    1449             :  * @param iface Network interface
    1450             :  * @param addr IPv6 address
    1451             :  * @param addr_type IPv6 address type
    1452             :  * @param vlifetime Validity time for this address
    1453             :  *
    1454             :  * @return Pointer to interface address, NULL if cannot be added
    1455             :  */
    1456           1 : struct net_if_addr *net_if_ipv6_addr_add(struct net_if *iface,
    1457             :                                          struct in6_addr *addr,
    1458             :                                          enum net_addr_type addr_type,
    1459             :                                          uint32_t vlifetime);
    1460             : 
    1461             : /**
    1462             :  * @brief Add a IPv6 address to an interface by index
    1463             :  *
    1464             :  * @param index Network interface index
    1465             :  * @param addr IPv6 address
    1466             :  * @param addr_type IPv6 address type
    1467             :  * @param vlifetime Validity time for this address
    1468             :  *
    1469             :  * @return True if ok, false if address could not be added
    1470             :  */
    1471           1 : __syscall bool net_if_ipv6_addr_add_by_index(int index,
    1472             :                                              struct in6_addr *addr,
    1473             :                                              enum net_addr_type addr_type,
    1474             :                                              uint32_t vlifetime);
    1475             : 
    1476             : /**
    1477             :  * @brief Update validity lifetime time of an IPv6 address.
    1478             :  *
    1479             :  * @param ifaddr Network IPv6 address
    1480             :  * @param vlifetime Validity time for this address
    1481             :  */
    1482           1 : void net_if_ipv6_addr_update_lifetime(struct net_if_addr *ifaddr,
    1483             :                                       uint32_t vlifetime);
    1484             : 
    1485             : /**
    1486             :  * @brief Remove an IPv6 address from an interface
    1487             :  *
    1488             :  * @param iface Network interface
    1489             :  * @param addr IPv6 address
    1490             :  *
    1491             :  * @return True if successfully removed, false otherwise
    1492             :  */
    1493           1 : bool net_if_ipv6_addr_rm(struct net_if *iface, const struct in6_addr *addr);
    1494             : 
    1495             : /**
    1496             :  * @brief Remove an IPv6 address from an interface by index
    1497             :  *
    1498             :  * @param index Network interface index
    1499             :  * @param addr IPv6 address
    1500             :  *
    1501             :  * @return True if successfully removed, false otherwise
    1502             :  */
    1503           1 : __syscall bool net_if_ipv6_addr_rm_by_index(int index,
    1504             :                                             const struct in6_addr *addr);
    1505             : 
    1506             : /**
    1507             :  * @typedef net_if_ip_addr_cb_t
    1508             :  * @brief Callback used while iterating over network interface IP addresses
    1509             :  *
    1510             :  * @param iface Pointer to the network interface the address belongs to
    1511             :  * @param addr Pointer to current IP address
    1512             :  * @param user_data A valid pointer to user data or NULL
    1513             :  */
    1514           1 : typedef void (*net_if_ip_addr_cb_t)(struct net_if *iface,
    1515             :                                     struct net_if_addr *addr,
    1516             :                                     void *user_data);
    1517             : 
    1518             : /**
    1519             :  * @brief Go through all IPv6 addresses on a network interface and call callback
    1520             :  * for each used address.
    1521             :  *
    1522             :  * @param iface Pointer to the network interface
    1523             :  * @param cb User-supplied callback function to call
    1524             :  * @param user_data User specified data
    1525             :  */
    1526           1 : void net_if_ipv6_addr_foreach(struct net_if *iface, net_if_ip_addr_cb_t cb,
    1527             :                               void *user_data);
    1528             : 
    1529             : /**
    1530             :  * @brief Add a IPv6 multicast address to an interface
    1531             :  *
    1532             :  * @param iface Network interface
    1533             :  * @param addr IPv6 multicast address
    1534             :  *
    1535             :  * @return Pointer to interface multicast address, NULL if cannot be added
    1536             :  */
    1537           1 : struct net_if_mcast_addr *net_if_ipv6_maddr_add(struct net_if *iface,
    1538             :                                                 const struct in6_addr *addr);
    1539             : 
    1540             : /**
    1541             :  * @brief Remove an IPv6 multicast address from an interface
    1542             :  *
    1543             :  * @param iface Network interface
    1544             :  * @param addr IPv6 multicast address
    1545             :  *
    1546             :  * @return True if successfully removed, false otherwise
    1547             :  */
    1548           1 : bool net_if_ipv6_maddr_rm(struct net_if *iface, const struct in6_addr *addr);
    1549             : 
    1550             : /**
    1551             :  * @typedef net_if_ip_maddr_cb_t
    1552             :  * @brief Callback used while iterating over network interface multicast IP addresses
    1553             :  *
    1554             :  * @param iface Pointer to the network interface the address belongs to
    1555             :  * @param maddr Pointer to current multicast IP address
    1556             :  * @param user_data A valid pointer to user data or NULL
    1557             :  */
    1558           1 : typedef void (*net_if_ip_maddr_cb_t)(struct net_if *iface,
    1559             :                                      struct net_if_mcast_addr *maddr,
    1560             :                                      void *user_data);
    1561             : 
    1562             : /**
    1563             :  * @brief Go through all IPv6 multicast addresses on a network interface and call
    1564             :  * callback for each used address.
    1565             :  *
    1566             :  * @param iface Pointer to the network interface
    1567             :  * @param cb User-supplied callback function to call
    1568             :  * @param user_data User specified data
    1569             :  */
    1570           1 : void net_if_ipv6_maddr_foreach(struct net_if *iface, net_if_ip_maddr_cb_t cb,
    1571             :                                void *user_data);
    1572             : 
    1573             : /**
    1574             :  * @brief Check if this IPv6 multicast address belongs to a specific interface
    1575             :  * or one of the interfaces.
    1576             :  *
    1577             :  * @param addr IPv6 address
    1578             :  * @param iface If *iface is null, then pointer to interface is returned,
    1579             :  * otherwise the *iface value needs to be matched.
    1580             :  *
    1581             :  * @return Pointer to interface multicast address, NULL if not found.
    1582             :  */
    1583           1 : struct net_if_mcast_addr *net_if_ipv6_maddr_lookup(const struct in6_addr *addr,
    1584             :                                                    struct net_if **iface);
    1585             : 
    1586             : /**
    1587             :  * @typedef net_if_mcast_callback_t
    1588             : 
    1589             :  * @brief Define a callback that is called whenever a IPv6 or IPv4 multicast
    1590             :  *        address group is joined or left.
    1591             :  * @param iface A pointer to a struct net_if to which the multicast address is
    1592             :  *        attached.
    1593             :  * @param addr IP multicast address.
    1594             :  * @param is_joined True if the multicast group is joined, false if group is left.
    1595             :  */
    1596           1 : typedef void (*net_if_mcast_callback_t)(struct net_if *iface,
    1597             :                                         const struct net_addr *addr,
    1598             :                                         bool is_joined);
    1599             : 
    1600             : /**
    1601             :  * @brief Multicast monitor handler struct.
    1602             :  *
    1603             :  * Stores the multicast callback information. Caller must make sure that
    1604             :  * the variable pointed by this is valid during the lifetime of
    1605             :  * registration. Typically this means that the variable cannot be
    1606             :  * allocated from stack.
    1607             :  */
    1608           1 : struct net_if_mcast_monitor {
    1609             :         /** Node information for the slist. */
    1610           1 :         sys_snode_t node;
    1611             : 
    1612             :         /** Network interface */
    1613           1 :         struct net_if *iface;
    1614             : 
    1615             :         /** Multicast callback */
    1616           1 :         net_if_mcast_callback_t cb;
    1617             : };
    1618             : 
    1619             : /**
    1620             :  * @brief Register a multicast monitor
    1621             :  *
    1622             :  * @param mon Monitor handle. This is a pointer to a monitor storage structure
    1623             :  * which should be allocated by caller, but does not need to be initialized.
    1624             :  * @param iface Network interface or NULL for all interfaces
    1625             :  * @param cb Monitor callback
    1626             :  */
    1627           1 : void net_if_mcast_mon_register(struct net_if_mcast_monitor *mon,
    1628             :                                struct net_if *iface,
    1629             :                                net_if_mcast_callback_t cb);
    1630             : 
    1631             : /**
    1632             :  * @brief Unregister a multicast monitor
    1633             :  *
    1634             :  * @param mon Monitor handle
    1635             :  */
    1636           1 : void net_if_mcast_mon_unregister(struct net_if_mcast_monitor *mon);
    1637             : 
    1638             : /**
    1639             :  * @brief Call registered multicast monitors
    1640             :  *
    1641             :  * @param iface Network interface
    1642             :  * @param addr Multicast address
    1643             :  * @param is_joined Is this multicast address group joined (true) or not (false)
    1644             :  */
    1645           1 : void net_if_mcast_monitor(struct net_if *iface, const struct net_addr *addr,
    1646             :                           bool is_joined);
    1647             : 
    1648             : /**
    1649             :  * @brief Mark a given multicast address to be joined.
    1650             :  *
    1651             :  * @param iface Network interface the address belongs to
    1652             :  * @param addr IPv6 multicast address
    1653             :  */
    1654           1 : void net_if_ipv6_maddr_join(struct net_if *iface,
    1655             :                             struct net_if_mcast_addr *addr);
    1656             : 
    1657             : /**
    1658             :  * @brief Check if given multicast address is joined or not.
    1659             :  *
    1660             :  * @param addr IPv6 multicast address
    1661             :  *
    1662             :  * @return True if address is joined, False otherwise.
    1663             :  */
    1664           1 : static inline bool net_if_ipv6_maddr_is_joined(struct net_if_mcast_addr *addr)
    1665             : {
    1666             :         if (addr == NULL) {
    1667             :                 return false;
    1668             :         }
    1669             : 
    1670             :         return addr->is_joined;
    1671             : }
    1672             : 
    1673             : /**
    1674             :  * @brief Mark a given multicast address to be left.
    1675             :  *
    1676             :  * @param iface Network interface the address belongs to
    1677             :  * @param addr IPv6 multicast address
    1678             :  */
    1679           1 : void net_if_ipv6_maddr_leave(struct net_if *iface,
    1680             :                              struct net_if_mcast_addr *addr);
    1681             : 
    1682             : /**
    1683             :  * @brief Return prefix that corresponds to this IPv6 address.
    1684             :  *
    1685             :  * @param iface Network interface
    1686             :  * @param addr IPv6 address
    1687             :  *
    1688             :  * @return Pointer to prefix, NULL if not found.
    1689             :  */
    1690           1 : struct net_if_ipv6_prefix *net_if_ipv6_prefix_get(struct net_if *iface,
    1691             :                                                   const struct in6_addr *addr);
    1692             : 
    1693             : /**
    1694             :  * @brief Check if this IPv6 prefix belongs to this interface
    1695             :  *
    1696             :  * @param iface Network interface
    1697             :  * @param addr IPv6 address
    1698             :  * @param len Prefix length
    1699             :  *
    1700             :  * @return Pointer to prefix, NULL if not found.
    1701             :  */
    1702           1 : struct net_if_ipv6_prefix *net_if_ipv6_prefix_lookup(struct net_if *iface,
    1703             :                                                      struct in6_addr *addr,
    1704             :                                                      uint8_t len);
    1705             : 
    1706             : /**
    1707             :  * @brief Add a IPv6 prefix to an network interface.
    1708             :  *
    1709             :  * @param iface Network interface
    1710             :  * @param prefix IPv6 address
    1711             :  * @param len Prefix length
    1712             :  * @param lifetime Prefix lifetime in seconds
    1713             :  *
    1714             :  * @return Pointer to prefix, NULL if the prefix was not added.
    1715             :  */
    1716           1 : struct net_if_ipv6_prefix *net_if_ipv6_prefix_add(struct net_if *iface,
    1717             :                                                   struct in6_addr *prefix,
    1718             :                                                   uint8_t len,
    1719             :                                                   uint32_t lifetime);
    1720             : 
    1721             : /**
    1722             :  * @brief Remove an IPv6 prefix from an interface
    1723             :  *
    1724             :  * @param iface Network interface
    1725             :  * @param addr IPv6 prefix address
    1726             :  * @param len Prefix length
    1727             :  *
    1728             :  * @return True if successfully removed, false otherwise
    1729             :  */
    1730           1 : bool net_if_ipv6_prefix_rm(struct net_if *iface, struct in6_addr *addr,
    1731             :                            uint8_t len);
    1732             : 
    1733             : /**
    1734             :  * @brief Set the infinite status of the prefix
    1735             :  *
    1736             :  * @param prefix IPv6 address
    1737             :  * @param is_infinite Infinite status
    1738             :  */
    1739           1 : static inline void net_if_ipv6_prefix_set_lf(struct net_if_ipv6_prefix *prefix,
    1740             :                                              bool is_infinite)
    1741             : {
    1742             :         prefix->is_infinite = is_infinite;
    1743             : }
    1744             : 
    1745             : /**
    1746             :  * @brief Set the prefix lifetime timer.
    1747             :  *
    1748             :  * @param prefix IPv6 address
    1749             :  * @param lifetime Prefix lifetime in seconds
    1750             :  */
    1751           1 : void net_if_ipv6_prefix_set_timer(struct net_if_ipv6_prefix *prefix,
    1752             :                                   uint32_t lifetime);
    1753             : 
    1754             : /**
    1755             :  * @brief Unset the prefix lifetime timer.
    1756             :  *
    1757             :  * @param prefix IPv6 address
    1758             :  */
    1759           1 : void net_if_ipv6_prefix_unset_timer(struct net_if_ipv6_prefix *prefix);
    1760             : 
    1761             : /**
    1762             :  * @brief Check if this IPv6 address is part of the subnet of our
    1763             :  * network interface.
    1764             :  *
    1765             :  * @param iface Network interface. This is returned to the caller.
    1766             :  * The iface can be NULL in which case we check all the interfaces.
    1767             :  * @param addr IPv6 address
    1768             :  *
    1769             :  * @return True if address is part of our subnet, false otherwise
    1770             :  */
    1771           1 : bool net_if_ipv6_addr_onlink(struct net_if **iface, struct in6_addr *addr);
    1772             : 
    1773             : /**
    1774             :  * @brief Get the IPv6 address of the given router
    1775             :  * @param router a network router
    1776             :  *
    1777             :  * @return pointer to the IPv6 address, or NULL if none
    1778             :  */
    1779             : #if defined(CONFIG_NET_NATIVE_IPV6)
    1780             : static inline struct in6_addr *net_if_router_ipv6(struct net_if_router *router)
    1781             : {
    1782             :         if (router == NULL) {
    1783             :                 return NULL;
    1784             :         }
    1785             : 
    1786             :         return &router->address.in6_addr;
    1787             : }
    1788             : #else
    1789           1 : static inline struct in6_addr *net_if_router_ipv6(struct net_if_router *router)
    1790             : {
    1791             :         static struct in6_addr addr;
    1792             : 
    1793             :         ARG_UNUSED(router);
    1794             : 
    1795             :         return &addr;
    1796             : }
    1797             : #endif
    1798             : 
    1799             : /**
    1800             :  * @brief Check if IPv6 address is one of the routers configured
    1801             :  * in the system.
    1802             :  *
    1803             :  * @param iface Network interface
    1804             :  * @param addr IPv6 address
    1805             :  *
    1806             :  * @return Pointer to router information, NULL if cannot be found
    1807             :  */
    1808           1 : struct net_if_router *net_if_ipv6_router_lookup(struct net_if *iface,
    1809             :                                                 struct in6_addr *addr);
    1810             : 
    1811             : /**
    1812             :  * @brief Find default router for this IPv6 address.
    1813             :  *
    1814             :  * @param iface Network interface. This can be NULL in which case we
    1815             :  * go through all the network interfaces to find a suitable router.
    1816             :  * @param addr IPv6 address
    1817             :  *
    1818             :  * @return Pointer to router information, NULL if cannot be found
    1819             :  */
    1820           1 : struct net_if_router *net_if_ipv6_router_find_default(struct net_if *iface,
    1821             :                                                       struct in6_addr *addr);
    1822             : 
    1823             : /**
    1824             :  * @brief Update validity lifetime time of a router.
    1825             :  *
    1826             :  * @param router Network IPv6 address
    1827             :  * @param lifetime Lifetime of this router.
    1828             :  */
    1829           1 : void net_if_ipv6_router_update_lifetime(struct net_if_router *router,
    1830             :                                         uint16_t lifetime);
    1831             : 
    1832             : /**
    1833             :  * @brief Add IPv6 router to the system.
    1834             :  *
    1835             :  * @param iface Network interface
    1836             :  * @param addr IPv6 address
    1837             :  * @param router_lifetime Lifetime of the router
    1838             :  *
    1839             :  * @return Pointer to router information, NULL if could not be added
    1840             :  */
    1841           1 : struct net_if_router *net_if_ipv6_router_add(struct net_if *iface,
    1842             :                                              struct in6_addr *addr,
    1843             :                                              uint16_t router_lifetime);
    1844             : 
    1845             : /**
    1846             :  * @brief Remove IPv6 router from the system.
    1847             :  *
    1848             :  * @param router Router information.
    1849             :  *
    1850             :  * @return True if successfully removed, false otherwise
    1851             :  */
    1852           1 : bool net_if_ipv6_router_rm(struct net_if_router *router);
    1853             : 
    1854             : /**
    1855             :  * @brief Get IPv6 hop limit specified for a given interface. This is the
    1856             :  * default value but can be overridden by the user.
    1857             :  *
    1858             :  * @param iface Network interface
    1859             :  *
    1860             :  * @return Hop limit
    1861             :  */
    1862             : #if defined(CONFIG_NET_NATIVE_IPV6)
    1863             : uint8_t net_if_ipv6_get_hop_limit(struct net_if *iface);
    1864             : #else
    1865           1 : static inline uint8_t net_if_ipv6_get_hop_limit(struct net_if *iface)
    1866             : {
    1867             :         ARG_UNUSED(iface);
    1868             : 
    1869             :         return 0;
    1870             : }
    1871             : #endif /* CONFIG_NET_NATIVE_IPV6 */
    1872             : 
    1873             : /**
    1874             :  * @brief Set the default IPv6 hop limit of a given interface.
    1875             :  *
    1876             :  * @param iface Network interface
    1877             :  * @param hop_limit New hop limit
    1878             :  */
    1879             : #if defined(CONFIG_NET_NATIVE_IPV6)
    1880             : void net_if_ipv6_set_hop_limit(struct net_if *iface, uint8_t hop_limit);
    1881             : #else
    1882           1 : static inline void net_if_ipv6_set_hop_limit(struct net_if *iface,
    1883             :                                              uint8_t hop_limit)
    1884             : {
    1885             :         ARG_UNUSED(iface);
    1886             :         ARG_UNUSED(hop_limit);
    1887             : }
    1888             : #endif /* CONFIG_NET_NATIVE_IPV6 */
    1889             : 
    1890             : /** @cond INTERNAL_HIDDEN */
    1891             : 
    1892             : /* The old hop limit setter function is deprecated because the naming
    1893             :  * of it was incorrect. The API name was missing "_if_" so this function
    1894             :  * should not be used.
    1895             :  */
    1896             : __deprecated
    1897             : static inline void net_ipv6_set_hop_limit(struct net_if *iface,
    1898             :                                           uint8_t hop_limit)
    1899             : {
    1900             :         net_if_ipv6_set_hop_limit(iface, hop_limit);
    1901             : }
    1902             : 
    1903             : /** @endcond */
    1904             : 
    1905             : /**
    1906             :  * @brief Get IPv6 multicast hop limit specified for a given interface. This is the
    1907             :  * default value but can be overridden by the user.
    1908             :  *
    1909             :  * @param iface Network interface
    1910             :  *
    1911             :  * @return Hop limit
    1912             :  */
    1913             : #if defined(CONFIG_NET_NATIVE_IPV6)
    1914             : uint8_t net_if_ipv6_get_mcast_hop_limit(struct net_if *iface);
    1915             : #else
    1916           1 : static inline uint8_t net_if_ipv6_get_mcast_hop_limit(struct net_if *iface)
    1917             : {
    1918             :         ARG_UNUSED(iface);
    1919             : 
    1920             :         return 0;
    1921             : }
    1922             : #endif /* CONFIG_NET_NATIVE_IPV6 */
    1923             : 
    1924             : /**
    1925             :  * @brief Set the default IPv6 multicast hop limit of a given interface.
    1926             :  *
    1927             :  * @param iface Network interface
    1928             :  * @param hop_limit New hop limit
    1929             :  */
    1930             : #if defined(CONFIG_NET_NATIVE_IPV6)
    1931             : void net_if_ipv6_set_mcast_hop_limit(struct net_if *iface, uint8_t hop_limit);
    1932             : #else
    1933           1 : static inline void net_if_ipv6_set_mcast_hop_limit(struct net_if *iface,
    1934             :                                                    uint8_t hop_limit)
    1935             : {
    1936             :         ARG_UNUSED(iface);
    1937             :         ARG_UNUSED(hop_limit);
    1938             : }
    1939             : #endif /* CONFIG_NET_NATIVE_IPV6 */
    1940             : 
    1941             : /**
    1942             :  * @brief Set IPv6 reachable time for a given interface
    1943             :  *
    1944             :  * @param iface Network interface
    1945             :  * @param reachable_time New reachable time
    1946             :  */
    1947           1 : static inline void net_if_ipv6_set_base_reachable_time(struct net_if *iface,
    1948             :                                                        uint32_t reachable_time)
    1949             : {
    1950             : #if defined(CONFIG_NET_NATIVE_IPV6)
    1951             :         if (iface == NULL) {
    1952             :                 return;
    1953             :         }
    1954             : 
    1955             :         if (!iface->config.ip.ipv6) {
    1956             :                 return;
    1957             :         }
    1958             : 
    1959             :         iface->config.ip.ipv6->base_reachable_time = reachable_time;
    1960             : #else
    1961             :         ARG_UNUSED(iface);
    1962             :         ARG_UNUSED(reachable_time);
    1963             : 
    1964             : #endif
    1965             : }
    1966             : 
    1967             : /**
    1968             :  * @brief Get IPv6 reachable timeout specified for a given interface
    1969             :  *
    1970             :  * @param iface Network interface
    1971             :  *
    1972             :  * @return Reachable timeout
    1973             :  */
    1974           1 : static inline uint32_t net_if_ipv6_get_reachable_time(struct net_if *iface)
    1975             : {
    1976             : #if defined(CONFIG_NET_NATIVE_IPV6)
    1977             :         if (iface == NULL) {
    1978             :                 return 0;
    1979             :         }
    1980             : 
    1981             :         if (!iface->config.ip.ipv6) {
    1982             :                 return 0;
    1983             :         }
    1984             : 
    1985             :         return iface->config.ip.ipv6->reachable_time;
    1986             : #else
    1987             :         ARG_UNUSED(iface);
    1988             :         return 0;
    1989             : #endif
    1990             : }
    1991             : 
    1992             : /**
    1993             :  * @brief Calculate next reachable time value for IPv6 reachable time
    1994             :  *
    1995             :  * @param ipv6 IPv6 address configuration
    1996             :  *
    1997             :  * @return Reachable time
    1998             :  */
    1999           1 : uint32_t net_if_ipv6_calc_reachable_time(struct net_if_ipv6 *ipv6);
    2000             : 
    2001             : /**
    2002             :  * @brief Set IPv6 reachable time for a given interface. This requires
    2003             :  * that base reachable time is set for the interface.
    2004             :  *
    2005             :  * @param ipv6 IPv6 address configuration
    2006             :  */
    2007           1 : static inline void net_if_ipv6_set_reachable_time(struct net_if_ipv6 *ipv6)
    2008             : {
    2009             : #if defined(CONFIG_NET_NATIVE_IPV6)
    2010             :         if (ipv6 == NULL) {
    2011             :                 return;
    2012             :         }
    2013             : 
    2014             :         ipv6->reachable_time = net_if_ipv6_calc_reachable_time(ipv6);
    2015             : #else
    2016             :         ARG_UNUSED(ipv6);
    2017             : #endif
    2018             : }
    2019             : 
    2020             : /**
    2021             :  * @brief Set IPv6 retransmit timer for a given interface
    2022             :  *
    2023             :  * @param iface Network interface
    2024             :  * @param retrans_timer New retransmit timer
    2025             :  */
    2026           1 : static inline void net_if_ipv6_set_retrans_timer(struct net_if *iface,
    2027             :                                                  uint32_t retrans_timer)
    2028             : {
    2029             : #if defined(CONFIG_NET_NATIVE_IPV6)
    2030             :         if (iface == NULL) {
    2031             :                 return;
    2032             :         }
    2033             : 
    2034             :         if (!iface->config.ip.ipv6) {
    2035             :                 return;
    2036             :         }
    2037             : 
    2038             :         iface->config.ip.ipv6->retrans_timer = retrans_timer;
    2039             : #else
    2040             :         ARG_UNUSED(iface);
    2041             :         ARG_UNUSED(retrans_timer);
    2042             : #endif
    2043             : }
    2044             : 
    2045             : /**
    2046             :  * @brief Get IPv6 retransmit timer specified for a given interface
    2047             :  *
    2048             :  * @param iface Network interface
    2049             :  *
    2050             :  * @return Retransmit timer
    2051             :  */
    2052           1 : static inline uint32_t net_if_ipv6_get_retrans_timer(struct net_if *iface)
    2053             : {
    2054             : #if defined(CONFIG_NET_NATIVE_IPV6)
    2055             :         if (iface == NULL) {
    2056             :                 return 0;
    2057             :         }
    2058             : 
    2059             :         if (!iface->config.ip.ipv6) {
    2060             :                 return 0;
    2061             :         }
    2062             : 
    2063             :         return iface->config.ip.ipv6->retrans_timer;
    2064             : #else
    2065             :         ARG_UNUSED(iface);
    2066             :         return 0;
    2067             : #endif
    2068             : }
    2069             : 
    2070             : /**
    2071             :  * @brief Get a IPv6 source address that should be used when sending
    2072             :  * network data to destination.
    2073             :  *
    2074             :  * @param iface Interface that was used when packet was received.
    2075             :  * If the interface is not known, then NULL can be given.
    2076             :  * @param dst IPv6 destination address
    2077             :  *
    2078             :  * @return Pointer to IPv6 address to use, NULL if no IPv6 address
    2079             :  * could be found.
    2080             :  */
    2081             : #if defined(CONFIG_NET_IPV6)
    2082             : const struct in6_addr *net_if_ipv6_select_src_addr(struct net_if *iface,
    2083             :                                                    const struct in6_addr *dst);
    2084             : #else
    2085           1 : static inline const struct in6_addr *net_if_ipv6_select_src_addr(
    2086             :         struct net_if *iface, const struct in6_addr *dst)
    2087             : {
    2088             :         ARG_UNUSED(iface);
    2089             :         ARG_UNUSED(dst);
    2090             : 
    2091             :         return NULL;
    2092             : }
    2093             : #endif
    2094             : 
    2095             : /**
    2096             :  * @brief Get a IPv6 source address that should be used when sending
    2097             :  * network data to destination. Use a hint set to the socket to select
    2098             :  * the proper address.
    2099             :  *
    2100             :  * @param iface Interface that was used when packet was received.
    2101             :  * If the interface is not known, then NULL can be given.
    2102             :  * @param dst IPv6 destination address
    2103             :  * @param flags Hint from the related socket. See RFC 5014 for value details.
    2104             :  *
    2105             :  * @return Pointer to IPv6 address to use, NULL if no IPv6 address
    2106             :  * could be found.
    2107             :  */
    2108             : #if defined(CONFIG_NET_IPV6)
    2109             : const struct in6_addr *net_if_ipv6_select_src_addr_hint(struct net_if *iface,
    2110             :                                                         const struct in6_addr *dst,
    2111             :                                                         int flags);
    2112             : #else
    2113           1 : static inline const struct in6_addr *net_if_ipv6_select_src_addr_hint(
    2114             :         struct net_if *iface, const struct in6_addr *dst, int flags)
    2115             : {
    2116             :         ARG_UNUSED(iface);
    2117             :         ARG_UNUSED(dst);
    2118             :         ARG_UNUSED(flags);
    2119             : 
    2120             :         return NULL;
    2121             : }
    2122             : #endif
    2123             : 
    2124             : /**
    2125             :  * @brief Get a network interface that should be used when sending
    2126             :  * IPv6 network data to destination.
    2127             :  *
    2128             :  * @param dst IPv6 destination address
    2129             :  *
    2130             :  * @return Pointer to network interface to use, NULL if no suitable interface
    2131             :  * could be found.
    2132             :  */
    2133             : #if defined(CONFIG_NET_IPV6)
    2134             : struct net_if *net_if_ipv6_select_src_iface(const struct in6_addr *dst);
    2135             : #else
    2136           1 : static inline struct net_if *net_if_ipv6_select_src_iface(
    2137             :         const struct in6_addr *dst)
    2138             : {
    2139             :         ARG_UNUSED(dst);
    2140             : 
    2141             :         return NULL;
    2142             : }
    2143             : #endif
    2144             : 
    2145             : /**
    2146             :  * @brief Get a IPv6 link local address in a given state.
    2147             :  *
    2148             :  * @param iface Interface to use. Must be a valid pointer to an interface.
    2149             :  * @param addr_state IPv6 address state (preferred, tentative, deprecated)
    2150             :  *
    2151             :  * @return Pointer to link local IPv6 address, NULL if no proper IPv6 address
    2152             :  * could be found.
    2153             :  */
    2154           1 : struct in6_addr *net_if_ipv6_get_ll(struct net_if *iface,
    2155             :                                     enum net_addr_state addr_state);
    2156             : 
    2157             : /**
    2158             :  * @brief Return link local IPv6 address from the first interface that has
    2159             :  * a link local address matching give state.
    2160             :  *
    2161             :  * @param state IPv6 address state (ANY, TENTATIVE, PREFERRED, DEPRECATED)
    2162             :  * @param iface Pointer to interface is returned
    2163             :  *
    2164             :  * @return Pointer to IPv6 address, NULL if not found.
    2165             :  */
    2166           1 : struct in6_addr *net_if_ipv6_get_ll_addr(enum net_addr_state state,
    2167             :                                          struct net_if **iface);
    2168             : 
    2169             : /**
    2170             :  * @brief Stop IPv6 Duplicate Address Detection (DAD) procedure if
    2171             :  * we find out that our IPv6 address is already in use.
    2172             :  *
    2173             :  * @param iface Interface where the DAD was running.
    2174             :  * @param addr IPv6 address that failed DAD
    2175             :  */
    2176           1 : void net_if_ipv6_dad_failed(struct net_if *iface, const struct in6_addr *addr);
    2177             : 
    2178             : /**
    2179             :  * @brief Return global IPv6 address from the first interface that has
    2180             :  * a global IPv6 address matching the given state.
    2181             :  *
    2182             :  * @param state IPv6 address state (ANY, TENTATIVE, PREFERRED, DEPRECATED)
    2183             :  * @param iface Caller can give an interface to check. If iface is set to NULL,
    2184             :  * then all the interfaces are checked. Pointer to interface where the IPv6
    2185             :  * address is defined is returned to the caller.
    2186             :  *
    2187             :  * @return Pointer to IPv6 address, NULL if not found.
    2188             :  */
    2189           1 : struct in6_addr *net_if_ipv6_get_global_addr(enum net_addr_state state,
    2190             :                                              struct net_if **iface);
    2191             : 
    2192             : /**
    2193             :  * @brief Allocate network interface IPv4 config.
    2194             :  *
    2195             :  * @details This function will allocate new IPv4 config.
    2196             :  *
    2197             :  * @param iface Interface to use.
    2198             :  * @param ipv4 Pointer to allocated IPv4 struct is returned to caller.
    2199             :  *
    2200             :  * @return 0 if ok, <0 if error
    2201             :  */
    2202           1 : int net_if_config_ipv4_get(struct net_if *iface,
    2203             :                            struct net_if_ipv4 **ipv4);
    2204             : 
    2205             : /**
    2206             :  * @brief Release network interface IPv4 config.
    2207             :  *
    2208             :  * @param iface Interface to use.
    2209             :  *
    2210             :  * @return 0 if ok, <0 if error
    2211             :  */
    2212           1 : int net_if_config_ipv4_put(struct net_if *iface);
    2213             : 
    2214             : /**
    2215             :  * @brief Get IPv4 time-to-live value specified for a given interface
    2216             :  *
    2217             :  * @param iface Network interface
    2218             :  *
    2219             :  * @return Time-to-live
    2220             :  */
    2221           1 : uint8_t net_if_ipv4_get_ttl(struct net_if *iface);
    2222             : 
    2223             : /**
    2224             :  * @brief Set IPv4 time-to-live value specified to a given interface
    2225             :  *
    2226             :  * @param iface Network interface
    2227             :  * @param ttl Time-to-live value
    2228             :  */
    2229           1 : void net_if_ipv4_set_ttl(struct net_if *iface, uint8_t ttl);
    2230             : 
    2231             : /**
    2232             :  * @brief Get IPv4 multicast time-to-live value specified for a given interface
    2233             :  *
    2234             :  * @param iface Network interface
    2235             :  *
    2236             :  * @return Time-to-live
    2237             :  */
    2238           1 : uint8_t net_if_ipv4_get_mcast_ttl(struct net_if *iface);
    2239             : 
    2240             : /**
    2241             :  * @brief Set IPv4 multicast time-to-live value specified to a given interface
    2242             :  *
    2243             :  * @param iface Network interface
    2244             :  * @param ttl Time-to-live value
    2245             :  */
    2246           1 : void net_if_ipv4_set_mcast_ttl(struct net_if *iface, uint8_t ttl);
    2247             : 
    2248             : /**
    2249             :  * @brief Check if this IPv4 address belongs to one of the interfaces.
    2250             :  *
    2251             :  * @param addr IPv4 address
    2252             :  * @param iface Interface is returned
    2253             :  *
    2254             :  * @return Pointer to interface address, NULL if not found.
    2255             :  */
    2256           1 : struct net_if_addr *net_if_ipv4_addr_lookup(const struct in_addr *addr,
    2257             :                                             struct net_if **iface);
    2258             : 
    2259             : /**
    2260             :  * @brief Add a IPv4 address to an interface
    2261             :  *
    2262             :  * @param iface Network interface
    2263             :  * @param addr IPv4 address
    2264             :  * @param addr_type IPv4 address type
    2265             :  * @param vlifetime Validity time for this address
    2266             :  *
    2267             :  * @return Pointer to interface address, NULL if cannot be added
    2268             :  */
    2269           1 : struct net_if_addr *net_if_ipv4_addr_add(struct net_if *iface,
    2270             :                                          struct in_addr *addr,
    2271             :                                          enum net_addr_type addr_type,
    2272             :                                          uint32_t vlifetime);
    2273             : 
    2274             : /**
    2275             :  * @brief Remove a IPv4 address from an interface
    2276             :  *
    2277             :  * @param iface Network interface
    2278             :  * @param addr IPv4 address
    2279             :  *
    2280             :  * @return True if successfully removed, false otherwise
    2281             :  */
    2282           1 : bool net_if_ipv4_addr_rm(struct net_if *iface, const struct in_addr *addr);
    2283             : 
    2284             : /**
    2285             :  * @brief Check if this IPv4 address belongs to one of the interface indices.
    2286             :  *
    2287             :  * @param addr IPv4 address
    2288             :  *
    2289             :  * @return >0 if address was found in given network interface index,
    2290             :  * all other values mean address was not found
    2291             :  */
    2292           1 : __syscall int net_if_ipv4_addr_lookup_by_index(const struct in_addr *addr);
    2293             : 
    2294             : /**
    2295             :  * @brief Add a IPv4 address to an interface by network interface index
    2296             :  *
    2297             :  * @param index Network interface index
    2298             :  * @param addr IPv4 address
    2299             :  * @param addr_type IPv4 address type
    2300             :  * @param vlifetime Validity time for this address
    2301             :  *
    2302             :  * @return True if ok, false if the address could not be added
    2303             :  */
    2304           1 : __syscall bool net_if_ipv4_addr_add_by_index(int index,
    2305             :                                              struct in_addr *addr,
    2306             :                                              enum net_addr_type addr_type,
    2307             :                                              uint32_t vlifetime);
    2308             : 
    2309             : /**
    2310             :  * @brief Remove a IPv4 address from an interface by interface index
    2311             :  *
    2312             :  * @param index Network interface index
    2313             :  * @param addr IPv4 address
    2314             :  *
    2315             :  * @return True if successfully removed, false otherwise
    2316             :  */
    2317           1 : __syscall bool net_if_ipv4_addr_rm_by_index(int index,
    2318             :                                             const struct in_addr *addr);
    2319             : 
    2320             : /**
    2321             :  * @brief Go through all IPv4 addresses on a network interface and call callback
    2322             :  * for each used address.
    2323             :  *
    2324             :  * @param iface Pointer to the network interface
    2325             :  * @param cb User-supplied callback function to call
    2326             :  * @param user_data User specified data
    2327             :  */
    2328           1 : void net_if_ipv4_addr_foreach(struct net_if *iface, net_if_ip_addr_cb_t cb,
    2329             :                               void *user_data);
    2330             : 
    2331             : /**
    2332             :  * @brief Add a IPv4 multicast address to an interface
    2333             :  *
    2334             :  * @param iface Network interface
    2335             :  * @param addr IPv4 multicast address
    2336             :  *
    2337             :  * @return Pointer to interface multicast address, NULL if cannot be added
    2338             :  */
    2339           1 : struct net_if_mcast_addr *net_if_ipv4_maddr_add(struct net_if *iface,
    2340             :                                                 const struct in_addr *addr);
    2341             : 
    2342             : /**
    2343             :  * @brief Remove an IPv4 multicast address from an interface
    2344             :  *
    2345             :  * @param iface Network interface
    2346             :  * @param addr IPv4 multicast address
    2347             :  *
    2348             :  * @return True if successfully removed, false otherwise
    2349             :  */
    2350           1 : bool net_if_ipv4_maddr_rm(struct net_if *iface, const struct in_addr *addr);
    2351             : 
    2352             : /**
    2353             :  * @brief Go through all IPv4 multicast addresses on a network interface and call
    2354             :  * callback for each used address.
    2355             :  *
    2356             :  * @param iface Pointer to the network interface
    2357             :  * @param cb User-supplied callback function to call
    2358             :  * @param user_data User specified data
    2359             :  */
    2360           1 : void net_if_ipv4_maddr_foreach(struct net_if *iface, net_if_ip_maddr_cb_t cb,
    2361             :                                void *user_data);
    2362             : 
    2363             : /**
    2364             :  * @brief Check if this IPv4 multicast address belongs to a specific interface
    2365             :  * or one of the interfaces.
    2366             :  *
    2367             :  * @param addr IPv4 address
    2368             :  * @param iface If *iface is null, then pointer to interface is returned,
    2369             :  * otherwise the *iface value needs to be matched.
    2370             :  *
    2371             :  * @return Pointer to interface multicast address, NULL if not found.
    2372             :  */
    2373           1 : struct net_if_mcast_addr *net_if_ipv4_maddr_lookup(const struct in_addr *addr,
    2374             :                                                    struct net_if **iface);
    2375             : 
    2376             : /**
    2377             :  * @brief Mark a given multicast address to be joined.
    2378             :  *
    2379             :  * @param iface Network interface the address belongs to
    2380             :  * @param addr IPv4 multicast address
    2381             :  */
    2382           1 : void net_if_ipv4_maddr_join(struct net_if *iface,
    2383             :                             struct net_if_mcast_addr *addr);
    2384             : 
    2385             : /**
    2386             :  * @brief Check if given multicast address is joined or not.
    2387             :  *
    2388             :  * @param addr IPv4 multicast address
    2389             :  *
    2390             :  * @return True if address is joined, False otherwise.
    2391             :  */
    2392           1 : static inline bool net_if_ipv4_maddr_is_joined(struct net_if_mcast_addr *addr)
    2393             : {
    2394             :         if (addr == NULL) {
    2395             :                 return false;
    2396             :         }
    2397             : 
    2398             :         return addr->is_joined;
    2399             : }
    2400             : 
    2401             : /**
    2402             :  * @brief Mark a given multicast address to be left.
    2403             :  *
    2404             :  * @param iface Network interface the address belongs to
    2405             :  * @param addr IPv4 multicast address
    2406             :  */
    2407           1 : void net_if_ipv4_maddr_leave(struct net_if *iface,
    2408             :                              struct net_if_mcast_addr *addr);
    2409             : 
    2410             : /**
    2411             :  * @brief Get the IPv4 address of the given router
    2412             :  * @param router a network router
    2413             :  *
    2414             :  * @return pointer to the IPv4 address, or NULL if none
    2415             :  */
    2416             : #if defined(CONFIG_NET_NATIVE_IPV4)
    2417             : static inline struct in_addr *net_if_router_ipv4(struct net_if_router *router)
    2418             : {
    2419             :         if (router == NULL) {
    2420             :                 return NULL;
    2421             :         }
    2422             : 
    2423             :         return &router->address.in_addr;
    2424             : }
    2425             : #else
    2426           1 : static inline struct in_addr *net_if_router_ipv4(struct net_if_router *router)
    2427             : {
    2428             :         static struct in_addr addr;
    2429             : 
    2430             :         ARG_UNUSED(router);
    2431             : 
    2432             :         return &addr;
    2433             : }
    2434             : #endif
    2435             : 
    2436             : /**
    2437             :  * @brief Check if IPv4 address is one of the routers configured
    2438             :  * in the system.
    2439             :  *
    2440             :  * @param iface Network interface
    2441             :  * @param addr IPv4 address
    2442             :  *
    2443             :  * @return Pointer to router information, NULL if cannot be found
    2444             :  */
    2445           1 : struct net_if_router *net_if_ipv4_router_lookup(struct net_if *iface,
    2446             :                                                 struct in_addr *addr);
    2447             : 
    2448             : /**
    2449             :  * @brief Find default router for this IPv4 address.
    2450             :  *
    2451             :  * @param iface Network interface. This can be NULL in which case we
    2452             :  * go through all the network interfaces to find a suitable router.
    2453             :  * @param addr IPv4 address
    2454             :  *
    2455             :  * @return Pointer to router information, NULL if cannot be found
    2456             :  */
    2457           1 : struct net_if_router *net_if_ipv4_router_find_default(struct net_if *iface,
    2458             :                                                       struct in_addr *addr);
    2459             : /**
    2460             :  * @brief Add IPv4 router to the system.
    2461             :  *
    2462             :  * @param iface Network interface
    2463             :  * @param addr IPv4 address
    2464             :  * @param is_default Is this router the default one
    2465             :  * @param router_lifetime Lifetime of the router
    2466             :  *
    2467             :  * @return Pointer to router information, NULL if could not be added
    2468             :  */
    2469           1 : struct net_if_router *net_if_ipv4_router_add(struct net_if *iface,
    2470             :                                              struct in_addr *addr,
    2471             :                                              bool is_default,
    2472             :                                              uint16_t router_lifetime);
    2473             : 
    2474             : /**
    2475             :  * @brief Remove IPv4 router from the system.
    2476             :  *
    2477             :  * @param router Router information.
    2478             :  *
    2479             :  * @return True if successfully removed, false otherwise
    2480             :  */
    2481           1 : bool net_if_ipv4_router_rm(struct net_if_router *router);
    2482             : 
    2483             : /**
    2484             :  * @brief Check if the given IPv4 address belongs to local subnet.
    2485             :  *
    2486             :  * @param iface Interface to use. Must be a valid pointer to an interface.
    2487             :  * @param addr IPv4 address
    2488             :  *
    2489             :  * @return True if address is part of local subnet, false otherwise.
    2490             :  */
    2491           1 : bool net_if_ipv4_addr_mask_cmp(struct net_if *iface,
    2492             :                                const struct in_addr *addr);
    2493             : 
    2494             : /**
    2495             :  * @brief Check if the given IPv4 address is a broadcast address.
    2496             :  *
    2497             :  * @param iface Interface to use. Must be a valid pointer to an interface.
    2498             :  * @param addr IPv4 address, this should be in network byte order
    2499             :  *
    2500             :  * @return True if address is a broadcast address, false otherwise.
    2501             :  */
    2502           1 : bool net_if_ipv4_is_addr_bcast(struct net_if *iface,
    2503             :                                const struct in_addr *addr);
    2504             : 
    2505             : /**
    2506             :  * @brief Get a network interface that should be used when sending
    2507             :  * IPv4 network data to destination.
    2508             :  *
    2509             :  * @param dst IPv4 destination address
    2510             :  *
    2511             :  * @return Pointer to network interface to use, NULL if no suitable interface
    2512             :  * could be found.
    2513             :  */
    2514             : #if defined(CONFIG_NET_IPV4)
    2515             : struct net_if *net_if_ipv4_select_src_iface(const struct in_addr *dst);
    2516             : #else
    2517           1 : static inline struct net_if *net_if_ipv4_select_src_iface(
    2518             :         const struct in_addr *dst)
    2519             : {
    2520             :         ARG_UNUSED(dst);
    2521             : 
    2522             :         return NULL;
    2523             : }
    2524             : #endif
    2525             : 
    2526             : /**
    2527             :  * @brief Get a IPv4 source address that should be used when sending
    2528             :  * network data to destination.
    2529             :  *
    2530             :  * @param iface Interface to use when sending the packet.
    2531             :  * If the interface is not known, then NULL can be given.
    2532             :  * @param dst IPv4 destination address
    2533             :  *
    2534             :  * @return Pointer to IPv4 address to use, NULL if no IPv4 address
    2535             :  * could be found.
    2536             :  */
    2537             : #if defined(CONFIG_NET_IPV4)
    2538             : const struct in_addr *net_if_ipv4_select_src_addr(struct net_if *iface,
    2539             :                                                   const struct in_addr *dst);
    2540             : #else
    2541           1 : static inline const struct in_addr *net_if_ipv4_select_src_addr(
    2542             :         struct net_if *iface, const struct in_addr *dst)
    2543             : {
    2544             :         ARG_UNUSED(iface);
    2545             :         ARG_UNUSED(dst);
    2546             : 
    2547             :         return NULL;
    2548             : }
    2549             : #endif
    2550             : 
    2551             : /**
    2552             :  * @brief Get a IPv4 link local address in a given state.
    2553             :  *
    2554             :  * @param iface Interface to use. Must be a valid pointer to an interface.
    2555             :  * @param addr_state IPv4 address state (preferred, tentative, deprecated)
    2556             :  *
    2557             :  * @return Pointer to link local IPv4 address, NULL if no proper IPv4 address
    2558             :  * could be found.
    2559             :  */
    2560           1 : struct in_addr *net_if_ipv4_get_ll(struct net_if *iface,
    2561             :                                    enum net_addr_state addr_state);
    2562             : 
    2563             : /**
    2564             :  * @brief Get a IPv4 global address in a given state.
    2565             :  *
    2566             :  * @param iface Interface to use. Must be a valid pointer to an interface.
    2567             :  * @param addr_state IPv4 address state (preferred, tentative, deprecated)
    2568             :  *
    2569             :  * @return Pointer to link local IPv4 address, NULL if no proper IPv4 address
    2570             :  * could be found.
    2571             :  */
    2572           1 : struct in_addr *net_if_ipv4_get_global_addr(struct net_if *iface,
    2573             :                                             enum net_addr_state addr_state);
    2574             : 
    2575             : /**
    2576             :  * @brief Get IPv4 netmask related to an address of an interface.
    2577             :  *
    2578             :  * @param iface Interface to use.
    2579             :  * @param addr IPv4 address to check.
    2580             :  *
    2581             :  * @return The netmask set on the interface related to the give address,
    2582             :  *         unspecified address if not found.
    2583             :  */
    2584           1 : struct in_addr net_if_ipv4_get_netmask_by_addr(struct net_if *iface,
    2585             :                                                const struct in_addr *addr);
    2586             : 
    2587             : /**
    2588             :  * @brief Get IPv4 netmask of an interface.
    2589             :  *
    2590             :  * @deprecated Use net_if_ipv4_get_netmask_by_addr() instead.
    2591             :  *
    2592             :  * @param iface Interface to use.
    2593             :  *
    2594             :  * @return The netmask set on the interface, unspecified address if not found.
    2595             :  */
    2596           1 : __deprecated struct in_addr net_if_ipv4_get_netmask(struct net_if *iface);
    2597             : 
    2598             : /**
    2599             :  * @brief Set IPv4 netmask for an interface.
    2600             :  *
    2601             :  * @deprecated Use net_if_ipv4_set_netmask_by_addr() instead.
    2602             :  *
    2603             :  * @param iface Interface to use.
    2604             :  * @param netmask IPv4 netmask
    2605             :  */
    2606           1 : __deprecated void net_if_ipv4_set_netmask(struct net_if *iface,
    2607             :                                           const struct in_addr *netmask);
    2608             : 
    2609             : /**
    2610             :  * @brief Set IPv4 netmask for an interface index.
    2611             :  *
    2612             :  * @deprecated Use net_if_ipv4_set_netmask_by_addr() instead.
    2613             :  *
    2614             :  * @param index Network interface index
    2615             :  * @param netmask IPv4 netmask
    2616             :  *
    2617             :  * @return True if netmask was added, false otherwise.
    2618             :  */
    2619           1 : __deprecated __syscall bool net_if_ipv4_set_netmask_by_index(int index,
    2620             :                                                              const struct in_addr *netmask);
    2621             : 
    2622             : /**
    2623             :  * @brief Set IPv4 netmask for an interface index for a given address.
    2624             :  *
    2625             :  * @param index Network interface index
    2626             :  * @param addr IPv4 address related to this netmask
    2627             :  * @param netmask IPv4 netmask
    2628             :  *
    2629             :  * @return True if netmask was added, false otherwise.
    2630             :  */
    2631           1 : __syscall bool net_if_ipv4_set_netmask_by_addr_by_index(int index,
    2632             :                                                         const struct in_addr *addr,
    2633             :                                                         const struct in_addr *netmask);
    2634             : 
    2635             : /**
    2636             :  * @brief Set IPv4 netmask for an interface index for a given address.
    2637             :  *
    2638             :  * @param iface Network interface
    2639             :  * @param addr IPv4 address related to this netmask
    2640             :  * @param netmask IPv4 netmask
    2641             :  *
    2642             :  * @return True if netmask was added, false otherwise.
    2643             :  */
    2644           1 : bool net_if_ipv4_set_netmask_by_addr(struct net_if *iface,
    2645             :                                      const struct in_addr *addr,
    2646             :                                      const struct in_addr *netmask);
    2647             : 
    2648             : /**
    2649             :  * @brief Get IPv4 gateway of an interface.
    2650             :  *
    2651             :  * @param iface Interface to use.
    2652             :  *
    2653             :  * @return The gateway set on the interface, unspecified address if not found.
    2654             :  */
    2655           1 : struct in_addr net_if_ipv4_get_gw(struct net_if *iface);
    2656             : 
    2657             : /**
    2658             :  * @brief Set IPv4 gateway for an interface.
    2659             :  *
    2660             :  * @param iface Interface to use.
    2661             :  * @param gw IPv4 address of an gateway
    2662             :  */
    2663           1 : void net_if_ipv4_set_gw(struct net_if *iface, const struct in_addr *gw);
    2664             : 
    2665             : /**
    2666             :  * @brief Set IPv4 gateway for an interface index.
    2667             :  *
    2668             :  * @param index Network interface index
    2669             :  * @param gw IPv4 address of an gateway
    2670             :  *
    2671             :  * @return True if gateway was added, false otherwise.
    2672             :  */
    2673           1 : __syscall bool net_if_ipv4_set_gw_by_index(int index, const struct in_addr *gw);
    2674             : 
    2675             : /**
    2676             :  * @brief Get a network interface that should be used when sending
    2677             :  * IPv6 or IPv4 network data to destination.
    2678             :  *
    2679             :  * @param dst IPv6 or IPv4 destination address
    2680             :  *
    2681             :  * @return Pointer to network interface to use. Note that the function
    2682             :  * will return the default network interface if the best network interface
    2683             :  * is not found.
    2684             :  */
    2685           1 : struct net_if *net_if_select_src_iface(const struct sockaddr *dst);
    2686             : 
    2687             : /**
    2688             :  * @typedef net_if_link_callback_t
    2689             :  * @brief Define callback that is called after a network packet
    2690             :  *        has been sent.
    2691             :  * @param iface A pointer to a struct net_if to which the net_pkt was sent to.
    2692             :  * @param dst Link layer address of the destination where the network packet was sent.
    2693             :  * @param status Send status, 0 is ok, < 0 error.
    2694             :  */
    2695           1 : typedef void (*net_if_link_callback_t)(struct net_if *iface,
    2696             :                                        struct net_linkaddr *dst,
    2697             :                                        int status);
    2698             : 
    2699             : /**
    2700             :  * @brief Link callback handler struct.
    2701             :  *
    2702             :  * Stores the link callback information. Caller must make sure that
    2703             :  * the variable pointed by this is valid during the lifetime of
    2704             :  * registration. Typically this means that the variable cannot be
    2705             :  * allocated from stack.
    2706             :  */
    2707           1 : struct net_if_link_cb {
    2708             :         /** Node information for the slist. */
    2709           1 :         sys_snode_t node;
    2710             : 
    2711             :         /** Link callback */
    2712           1 :         net_if_link_callback_t cb;
    2713             : };
    2714             : 
    2715             : /**
    2716             :  * @brief Register a link callback.
    2717             :  *
    2718             :  * @param link Caller specified handler for the callback.
    2719             :  * @param cb Callback to register.
    2720             :  */
    2721           1 : void net_if_register_link_cb(struct net_if_link_cb *link,
    2722             :                              net_if_link_callback_t cb);
    2723             : 
    2724             : /**
    2725             :  * @brief Unregister a link callback.
    2726             :  *
    2727             :  * @param link Caller specified handler for the callback.
    2728             :  */
    2729           1 : void net_if_unregister_link_cb(struct net_if_link_cb *link);
    2730             : 
    2731             : /**
    2732             :  * @brief Call a link callback function.
    2733             :  *
    2734             :  * @param iface Network interface.
    2735             :  * @param lladdr Destination link layer address
    2736             :  * @param status 0 is ok, < 0 error
    2737             :  */
    2738           1 : void net_if_call_link_cb(struct net_if *iface, struct net_linkaddr *lladdr,
    2739             :                          int status);
    2740             : 
    2741             : /** @cond INTERNAL_HIDDEN */
    2742             : 
    2743             : /* used to ensure encoding of checksum support in net_if.h and
    2744             :  * ethernet.h is the same
    2745             :  */
    2746             : #define NET_IF_CHECKSUM_NONE_BIT                        0
    2747             : #define NET_IF_CHECKSUM_IPV4_HEADER_BIT                 BIT(0)
    2748             : #define NET_IF_CHECKSUM_IPV4_ICMP_BIT                   BIT(1)
    2749             : /* Space for future protocols and restrictions for IPV4 */
    2750             : #define NET_IF_CHECKSUM_IPV6_HEADER_BIT                 BIT(10)
    2751             : #define NET_IF_CHECKSUM_IPV6_ICMP_BIT                   BIT(11)
    2752             : /* Space for future protocols and restrictions for IPV6 */
    2753             : #define NET_IF_CHECKSUM_TCP_BIT                         BIT(21)
    2754             : #define NET_IF_CHECKSUM_UDP_BIT                         BIT(22)
    2755             : 
    2756             : /** @endcond */
    2757             : 
    2758             : /**
    2759             :  * @brief Type of checksum for which support in the interface will be queried.
    2760             :  */
    2761           1 : enum net_if_checksum_type {
    2762             :         /** Interface supports IP version 4 header checksum calculation */
    2763             :         NET_IF_CHECKSUM_IPV4_HEADER = NET_IF_CHECKSUM_IPV4_HEADER_BIT,
    2764             :         /** Interface supports checksum calculation for TCP payload in IPv4 */
    2765             :         NET_IF_CHECKSUM_IPV4_TCP    = NET_IF_CHECKSUM_IPV4_HEADER_BIT |
    2766             :                                       NET_IF_CHECKSUM_TCP_BIT,
    2767             :         /** Interface supports checksum calculation for UDP payload in IPv4 */
    2768             :         NET_IF_CHECKSUM_IPV4_UDP    = NET_IF_CHECKSUM_IPV4_HEADER_BIT |
    2769             :                                       NET_IF_CHECKSUM_UDP_BIT,
    2770             :         /** Interface supports checksum calculation for ICMP4 payload in IPv4 */
    2771             :         NET_IF_CHECKSUM_IPV4_ICMP   = NET_IF_CHECKSUM_IPV4_ICMP_BIT,
    2772             :         /** Interface supports IP version 6 header checksum calculation */
    2773             :         NET_IF_CHECKSUM_IPV6_HEADER = NET_IF_CHECKSUM_IPV6_HEADER_BIT,
    2774             :         /** Interface supports checksum calculation for TCP payload in IPv6 */
    2775             :         NET_IF_CHECKSUM_IPV6_TCP    = NET_IF_CHECKSUM_IPV6_HEADER_BIT |
    2776             :                                       NET_IF_CHECKSUM_TCP_BIT,
    2777             :         /** Interface supports checksum calculation for UDP payload in IPv6 */
    2778             :         NET_IF_CHECKSUM_IPV6_UDP    = NET_IF_CHECKSUM_IPV6_HEADER_BIT |
    2779             :                                       NET_IF_CHECKSUM_UDP_BIT,
    2780             :         /** Interface supports checksum calculation for ICMP6 payload in IPv6 */
    2781             :         NET_IF_CHECKSUM_IPV6_ICMP   = NET_IF_CHECKSUM_IPV6_ICMP_BIT
    2782             : };
    2783             : 
    2784             : /**
    2785             :  * @brief Check if received network packet checksum calculation can be avoided
    2786             :  * or not. For example many ethernet devices support network packet offloading
    2787             :  * in which case the IP stack does not need to calculate the checksum.
    2788             :  *
    2789             :  * @param iface Network interface
    2790             :  * @param chksum_type L3 and/or L4 protocol for which to compute checksum
    2791             :  *
    2792             :  * @return True if checksum needs to be calculated, false otherwise.
    2793             :  */
    2794           1 : bool net_if_need_calc_rx_checksum(struct net_if *iface,
    2795             :                                   enum net_if_checksum_type chksum_type);
    2796             : 
    2797             : /**
    2798             :  * @brief Check if network packet checksum calculation can be avoided or not
    2799             :  * when sending the packet. For example many ethernet devices support network
    2800             :  * packet offloading in which case the IP stack does not need to calculate the
    2801             :  * checksum.
    2802             :  *
    2803             :  * @param iface Network interface
    2804             :  * @param chksum_type L3 and/or L4 protocol for which to compute checksum
    2805             :  *
    2806             :  * @return True if checksum needs to be calculated, false otherwise.
    2807             :  */
    2808           1 : bool net_if_need_calc_tx_checksum(struct net_if *iface,
    2809             :                                   enum net_if_checksum_type chksum_type);
    2810             : 
    2811             : /**
    2812             :  * @brief Get interface according to index
    2813             :  *
    2814             :  * @details This is a syscall only to provide access to the object for purposes
    2815             :  *          of assigning permissions.
    2816             :  *
    2817             :  * @param index Interface index
    2818             :  *
    2819             :  * @return Pointer to interface or NULL if not found.
    2820             :  */
    2821           1 : __syscall struct net_if *net_if_get_by_index(int index);
    2822             : 
    2823             : /**
    2824             :  * @brief Get interface index according to pointer
    2825             :  *
    2826             :  * @param iface Pointer to network interface
    2827             :  *
    2828             :  * @return Interface index
    2829             :  */
    2830           1 : int net_if_get_by_iface(struct net_if *iface);
    2831             : 
    2832             : /**
    2833             :  * @typedef net_if_cb_t
    2834             :  * @brief Callback used while iterating over network interfaces
    2835             :  *
    2836             :  * @param iface Pointer to current network interface
    2837             :  * @param user_data A valid pointer to user data or NULL
    2838             :  */
    2839           1 : typedef void (*net_if_cb_t)(struct net_if *iface, void *user_data);
    2840             : 
    2841             : /**
    2842             :  * @brief Go through all the network interfaces and call callback
    2843             :  * for each interface.
    2844             :  *
    2845             :  * @param cb User-supplied callback function to call
    2846             :  * @param user_data User specified data
    2847             :  */
    2848           1 : void net_if_foreach(net_if_cb_t cb, void *user_data);
    2849             : 
    2850             : /**
    2851             :  * @brief Bring interface up
    2852             :  *
    2853             :  * @param iface Pointer to network interface
    2854             :  *
    2855             :  * @return 0 on success
    2856             :  */
    2857           1 : int net_if_up(struct net_if *iface);
    2858             : 
    2859             : /**
    2860             :  * @brief Check if interface is up and running.
    2861             :  *
    2862             :  * @param iface Pointer to network interface
    2863             :  *
    2864             :  * @return True if interface is up, False if it is down.
    2865             :  */
    2866           1 : static inline bool net_if_is_up(struct net_if *iface)
    2867             : {
    2868             :         if (iface == NULL) {
    2869             :                 return false;
    2870             :         }
    2871             : 
    2872             :         return net_if_flag_is_set(iface, NET_IF_UP) &&
    2873             :                net_if_flag_is_set(iface, NET_IF_RUNNING);
    2874             : }
    2875             : 
    2876             : /**
    2877             :  * @brief Bring interface down
    2878             :  *
    2879             :  * @param iface Pointer to network interface
    2880             :  *
    2881             :  * @return 0 on success
    2882             :  */
    2883           1 : int net_if_down(struct net_if *iface);
    2884             : 
    2885             : /**
    2886             :  * @brief Check if interface was brought up by the administrator.
    2887             :  *
    2888             :  * @param iface Pointer to network interface
    2889             :  *
    2890             :  * @return True if interface is admin up, false otherwise.
    2891             :  */
    2892           1 : static inline bool net_if_is_admin_up(struct net_if *iface)
    2893             : {
    2894             :         if (iface == NULL) {
    2895             :                 return false;
    2896             :         }
    2897             : 
    2898             :         return net_if_flag_is_set(iface, NET_IF_UP);
    2899             : }
    2900             : 
    2901             : /**
    2902             :  * @brief Underlying network device has detected the carrier (cable connected).
    2903             :  *
    2904             :  * @details The function should be used by the respective network device driver
    2905             :  *          or L2 implementation to update its state on a network interface.
    2906             :  *
    2907             :  * @param iface Pointer to network interface
    2908             :  */
    2909           1 : void net_if_carrier_on(struct net_if *iface);
    2910             : 
    2911             : /**
    2912             :  * @brief Underlying network device has lost the carrier (cable disconnected).
    2913             :  *
    2914             :  * @details The function should be used by the respective network device driver
    2915             :  *          or L2 implementation to update its state on a network interface.
    2916             :  *
    2917             :  * @param iface Pointer to network interface
    2918             :  */
    2919           1 : void net_if_carrier_off(struct net_if *iface);
    2920             : 
    2921             : /**
    2922             :  * @brief Check if carrier is present on network device.
    2923             :  *
    2924             :  * @param iface Pointer to network interface
    2925             :  *
    2926             :  * @return True if carrier is present, false otherwise.
    2927             :  */
    2928           1 : static inline bool net_if_is_carrier_ok(struct net_if *iface)
    2929             : {
    2930             :         if (iface == NULL) {
    2931             :                 return false;
    2932             :         }
    2933             : 
    2934             :         return net_if_flag_is_set(iface, NET_IF_LOWER_UP);
    2935             : }
    2936             : 
    2937             : /**
    2938             :  * @brief Mark interface as dormant. Dormant state indicates that the interface
    2939             :  *        is not ready to pass packets yet, but is waiting for some event
    2940             :  *        (for example Wi-Fi network association).
    2941             :  *
    2942             :  * @details The function should be used by the respective network device driver
    2943             :  *          or L2 implementation to update its state on a network interface.
    2944             :  *
    2945             :  * @param iface Pointer to network interface
    2946             :  */
    2947           1 : void net_if_dormant_on(struct net_if *iface);
    2948             : 
    2949             : /**
    2950             :  * @brief Mark interface as not dormant.
    2951             :  *
    2952             :  * @details The function should be used by the respective network device driver
    2953             :  *          or L2 implementation to update its state on a network interface.
    2954             :  *
    2955             :  * @param iface Pointer to network interface
    2956             :  */
    2957           1 : void net_if_dormant_off(struct net_if *iface);
    2958             : 
    2959             : /**
    2960             :  * @brief Check if the interface is dormant.
    2961             :  *
    2962             :  * @param iface Pointer to network interface
    2963             :  *
    2964             :  * @return True if interface is dormant, false otherwise.
    2965             :  */
    2966           1 : static inline bool net_if_is_dormant(struct net_if *iface)
    2967             : {
    2968             :         if (iface == NULL) {
    2969             :                 return false;
    2970             :         }
    2971             : 
    2972             :         return net_if_flag_is_set(iface, NET_IF_DORMANT);
    2973             : }
    2974             : 
    2975             : #if defined(CONFIG_NET_PKT_TIMESTAMP) && defined(CONFIG_NET_NATIVE)
    2976             : /**
    2977             :  * @typedef net_if_timestamp_callback_t
    2978             :  * @brief Define callback that is called after a network packet
    2979             :  *        has been timestamped.
    2980             :  * @param "struct net_pkt *pkt" A pointer on a struct net_pkt which has
    2981             :  *        been timestamped after being sent.
    2982             :  */
    2983             : typedef void (*net_if_timestamp_callback_t)(struct net_pkt *pkt);
    2984             : 
    2985             : /**
    2986             :  * @brief Timestamp callback handler struct.
    2987             :  *
    2988             :  * Stores the timestamp callback information. Caller must make sure that
    2989             :  * the variable pointed by this is valid during the lifetime of
    2990             :  * registration. Typically this means that the variable cannot be
    2991             :  * allocated from stack.
    2992             :  */
    2993             : struct net_if_timestamp_cb {
    2994             :         /** Node information for the slist. */
    2995             :         sys_snode_t node;
    2996             : 
    2997             :         /** Packet for which the callback is needed.
    2998             :          *  A NULL value means all packets.
    2999             :          */
    3000             :         struct net_pkt *pkt;
    3001             : 
    3002             :         /** Net interface for which the callback is needed.
    3003             :          *  A NULL value means all interfaces.
    3004             :          */
    3005             :         struct net_if *iface;
    3006             : 
    3007             :         /** Timestamp callback */
    3008             :         net_if_timestamp_callback_t cb;
    3009             : };
    3010             : 
    3011             : /**
    3012             :  * @brief Register a timestamp callback.
    3013             :  *
    3014             :  * @param handle Caller specified handler for the callback.
    3015             :  * @param pkt Net packet for which the callback is registered. NULL for all
    3016             :  *            packets.
    3017             :  * @param iface Net interface for which the callback is. NULL for all
    3018             :  *              interfaces.
    3019             :  * @param cb Callback to register.
    3020             :  */
    3021             : void net_if_register_timestamp_cb(struct net_if_timestamp_cb *handle,
    3022             :                                   struct net_pkt *pkt,
    3023             :                                   struct net_if *iface,
    3024             :                                   net_if_timestamp_callback_t cb);
    3025             : 
    3026             : /**
    3027             :  * @brief Unregister a timestamp callback.
    3028             :  *
    3029             :  * @param handle Caller specified handler for the callback.
    3030             :  */
    3031             : void net_if_unregister_timestamp_cb(struct net_if_timestamp_cb *handle);
    3032             : 
    3033             : /**
    3034             :  * @brief Call a timestamp callback function.
    3035             :  *
    3036             :  * @param pkt Network buffer.
    3037             :  */
    3038             : void net_if_call_timestamp_cb(struct net_pkt *pkt);
    3039             : 
    3040             : /*
    3041             :  * @brief Add timestamped TX buffer to be handled
    3042             :  *
    3043             :  * @param pkt Timestamped buffer
    3044             :  */
    3045             : void net_if_add_tx_timestamp(struct net_pkt *pkt);
    3046             : #endif /* CONFIG_NET_PKT_TIMESTAMP */
    3047             : 
    3048             : /**
    3049             :  * @brief Set network interface into promiscuous mode
    3050             :  *
    3051             :  * @details Note that not all network technologies will support this.
    3052             :  *
    3053             :  * @param iface Pointer to network interface
    3054             :  *
    3055             :  * @return 0 on success, <0 if error
    3056             :  */
    3057             : #if defined(CONFIG_NET_PROMISCUOUS_MODE)
    3058             : int net_if_set_promisc(struct net_if *iface);
    3059             : #else
    3060           1 : static inline int net_if_set_promisc(struct net_if *iface)
    3061             : {
    3062             :         ARG_UNUSED(iface);
    3063             : 
    3064             :         return -ENOTSUP;
    3065             : }
    3066             : #endif
    3067             : 
    3068             : /**
    3069             :  * @brief Set network interface into normal mode
    3070             :  *
    3071             :  * @param iface Pointer to network interface
    3072             :  */
    3073             : #if defined(CONFIG_NET_PROMISCUOUS_MODE)
    3074             : void net_if_unset_promisc(struct net_if *iface);
    3075             : #else
    3076           1 : static inline void net_if_unset_promisc(struct net_if *iface)
    3077             : {
    3078             :         ARG_UNUSED(iface);
    3079             : }
    3080             : #endif
    3081             : 
    3082             : /**
    3083             :  * @brief Check if promiscuous mode is set or not.
    3084             :  *
    3085             :  * @param iface Pointer to network interface
    3086             :  *
    3087             :  * @return True if interface is in promisc mode,
    3088             :  *         False if interface is not in promiscuous mode.
    3089             :  */
    3090             : #if defined(CONFIG_NET_PROMISCUOUS_MODE)
    3091             : bool net_if_is_promisc(struct net_if *iface);
    3092             : #else
    3093           1 : static inline bool net_if_is_promisc(struct net_if *iface)
    3094             : {
    3095             :         ARG_UNUSED(iface);
    3096             : 
    3097             :         return false;
    3098             : }
    3099             : #endif
    3100             : 
    3101             : /**
    3102             :  * @brief Check if there are any pending TX network data for a given network
    3103             :  *        interface.
    3104             :  *
    3105             :  * @param iface Pointer to network interface
    3106             :  *
    3107             :  * @return True if there are pending TX network packets for this network
    3108             :  *         interface, False otherwise.
    3109             :  */
    3110           1 : static inline bool net_if_are_pending_tx_packets(struct net_if *iface)
    3111             : {
    3112             : #if defined(CONFIG_NET_POWER_MANAGEMENT)
    3113             :         return !!iface->tx_pending;
    3114             : #else
    3115             :         ARG_UNUSED(iface);
    3116             : 
    3117             :         return false;
    3118             : #endif
    3119             : }
    3120             : 
    3121             : #ifdef CONFIG_NET_POWER_MANAGEMENT
    3122             : /**
    3123             :  * @brief Suspend a network interface from a power management perspective
    3124             :  *
    3125             :  * @param iface Pointer to network interface
    3126             :  *
    3127             :  * @return 0 on success, or -EALREADY/-EBUSY as possible errors.
    3128             :  */
    3129             : int net_if_suspend(struct net_if *iface);
    3130             : 
    3131             : /**
    3132             :  * @brief Resume a network interface from a power management perspective
    3133             :  *
    3134             :  * @param iface Pointer to network interface
    3135             :  *
    3136             :  * @return 0 on success, or -EALREADY as a possible error.
    3137             :  */
    3138             : int net_if_resume(struct net_if *iface);
    3139             : 
    3140             : /**
    3141             :  * @brief Check if the network interface is suspended or not.
    3142             :  *
    3143             :  * @param iface Pointer to network interface
    3144             :  *
    3145             :  * @return True if interface is suspended, False otherwise.
    3146             :  */
    3147             : bool net_if_is_suspended(struct net_if *iface);
    3148             : #endif /* CONFIG_NET_POWER_MANAGEMENT */
    3149             : 
    3150             : /**
    3151             :  * @brief Check if the network interface supports Wi-Fi.
    3152             :  *
    3153             :  * @param iface Pointer to network interface
    3154             :  *
    3155             :  * @return True if interface supports Wi-Fi, False otherwise.
    3156             :  */
    3157           1 : bool net_if_is_wifi(struct net_if *iface);
    3158             : 
    3159             : /**
    3160             :  * @brief Get first Wi-Fi network interface.
    3161             :  *
    3162             :  * @return Pointer to network interface, NULL if not found.
    3163             :  */
    3164           1 : struct net_if *net_if_get_first_wifi(void);
    3165             : 
    3166             : /**
    3167             :  * @brief Get Wi-Fi network station interface.
    3168             :  *
    3169             :  * @return Pointer to network interface, NULL if not found.
    3170             :  */
    3171           1 : struct net_if *net_if_get_wifi_sta(void);
    3172             : 
    3173             : /**
    3174             :  * @brief Get first Wi-Fi network Soft-AP interface.
    3175             :  *
    3176             :  * @return Pointer to network interface, NULL if not found.
    3177             :  */
    3178           1 : struct net_if *net_if_get_wifi_sap(void);
    3179             : 
    3180             : /**
    3181             :  * @brief Get network interface name.
    3182             :  *
    3183             :  * @details If interface name support is not enabled, empty string is returned.
    3184             :  *
    3185             :  * @param iface Pointer to network interface
    3186             :  * @param buf User supplied buffer
    3187             :  * @param len Length of the user supplied buffer
    3188             :  *
    3189             :  * @return Length of the interface name copied to buf,
    3190             :  *         -EINVAL if invalid parameters,
    3191             :  *         -ERANGE if name cannot be copied to the user supplied buffer,
    3192             :  *         -ENOTSUP if interface name support is disabled,
    3193             :  */
    3194           1 : int net_if_get_name(struct net_if *iface, char *buf, int len);
    3195             : 
    3196             : /**
    3197             :  * @brief Set network interface name.
    3198             :  *
    3199             :  * @details Normally this function is not needed to call as the system
    3200             :  *          will automatically assign a name to the network interface.
    3201             :  *
    3202             :  * @param iface Pointer to network interface
    3203             :  * @param buf User supplied name
    3204             :  *
    3205             :  * @return 0 name is set correctly
    3206             :  *         -ENOTSUP interface name support is disabled
    3207             :  *         -EINVAL if invalid parameters are given,
    3208             :  *         -ENAMETOOLONG if name is too long
    3209             :  */
    3210           1 : int net_if_set_name(struct net_if *iface, const char *buf);
    3211             : 
    3212             : /**
    3213             :  * @brief Get interface index according to its name
    3214             :  *
    3215             :  * @param name Name of the network interface
    3216             :  *
    3217             :  * @return Interface index
    3218             :  */
    3219           1 : int net_if_get_by_name(const char *name);
    3220             : 
    3221             : /** @cond INTERNAL_HIDDEN */
    3222             : struct net_if_api {
    3223             :         void (*init)(struct net_if *iface);
    3224             : };
    3225             : 
    3226             : #define NET_IF_DHCPV4_INIT                                              \
    3227             :         IF_ENABLED(UTIL_AND(IS_ENABLED(CONFIG_NET_DHCPV4),              \
    3228             :                             IS_ENABLED(CONFIG_NET_NATIVE_IPV4)),        \
    3229             :                    (.dhcpv4.state = NET_DHCPV4_DISABLED,))
    3230             : 
    3231             : #define NET_IF_DHCPV6_INIT                                              \
    3232             :         IF_ENABLED(UTIL_AND(IS_ENABLED(CONFIG_NET_DHCPV6),              \
    3233             :                             IS_ENABLED(CONFIG_NET_NATIVE_IPV6)),        \
    3234             :                    (.dhcpv6.state = NET_DHCPV6_DISABLED,))
    3235             : 
    3236             : #define NET_IF_CONFIG_INIT                              \
    3237             :         .config = {                                     \
    3238             :                 IF_ENABLED(CONFIG_NET_IP, (.ip = {},))  \
    3239             :                 NET_IF_DHCPV4_INIT                      \
    3240             :                 NET_IF_DHCPV6_INIT                      \
    3241             :         }
    3242             : 
    3243             : #define NET_PROMETHEUS_GET_COLLECTOR_NAME(dev_id, sfx)                  \
    3244             :         net_stats_##dev_id##_##sfx##_collector
    3245             : #define NET_PROMETHEUS_INIT(dev_id, sfx)                                \
    3246             :         IF_ENABLED(CONFIG_NET_STATISTICS_VIA_PROMETHEUS,                \
    3247             :                    (.collector = &NET_PROMETHEUS_GET_COLLECTOR_NAME(dev_id, sfx),))
    3248             : 
    3249             : #define NET_IF_GET_NAME(dev_id, sfx) __net_if_##dev_id##_##sfx
    3250             : #define NET_IF_DEV_GET_NAME(dev_id, sfx) __net_if_dev_##dev_id##_##sfx
    3251             : 
    3252             : #define NET_IF_GET(dev_id, sfx)                                         \
    3253             :         ((struct net_if *)&NET_IF_GET_NAME(dev_id, sfx))
    3254             : 
    3255             : #if defined(CONFIG_NET_STATISTICS_VIA_PROMETHEUS)
    3256             : extern int net_stats_prometheus_scrape(struct prometheus_collector *collector,
    3257             :                                        struct prometheus_metric *metric,
    3258             :                                        void *user_data);
    3259             : #endif /* CONFIG_NET_STATISTICS_VIA_PROMETHEUS */
    3260             : 
    3261             : #define NET_IF_INIT(dev_id, sfx, _l2, _mtu, _num_configs)               \
    3262             :         static STRUCT_SECTION_ITERABLE(net_if_dev,                      \
    3263             :                                 NET_IF_DEV_GET_NAME(dev_id, sfx)) = {   \
    3264             :                 .dev = &(DEVICE_NAME_GET(dev_id)),                  \
    3265             :                 .l2 = &(NET_L2_GET_NAME(_l2)),                              \
    3266             :                 .l2_data = &(NET_L2_GET_DATA(dev_id, sfx)),         \
    3267             :                 .mtu = _mtu,                                            \
    3268             :                 .flags = {BIT(NET_IF_LOWER_UP)},                        \
    3269             :         };                                                              \
    3270             :         static Z_DECL_ALIGN(struct net_if)                              \
    3271             :                        NET_IF_GET_NAME(dev_id, sfx)[_num_configs]       \
    3272             :                        __used __in_section(_net_if, static,             \
    3273             :                                            dev_id) = {                  \
    3274             :                 [0 ... (_num_configs - 1)] = {                          \
    3275             :                         .if_dev = &(NET_IF_DEV_GET_NAME(dev_id, sfx)),      \
    3276             :                         NET_IF_CONFIG_INIT                              \
    3277             :                 }                                                       \
    3278             :         };                                                              \
    3279             :         IF_ENABLED(CONFIG_NET_STATISTICS_VIA_PROMETHEUS,                \
    3280             :                    (static PROMETHEUS_COLLECTOR_DEFINE(                 \
    3281             :                            NET_PROMETHEUS_GET_COLLECTOR_NAME(dev_id,    \
    3282             :                                                              sfx),      \
    3283             :                            net_stats_prometheus_scrape,                 \
    3284             :                            NET_IF_GET(dev_id, sfx));                    \
    3285             :                     NET_STATS_PROMETHEUS(NET_IF_GET(dev_id, sfx),       \
    3286             :                                          dev_id, sfx);))
    3287             : 
    3288             : #define NET_IF_OFFLOAD_INIT(dev_id, sfx, _mtu)                          \
    3289             :         static STRUCT_SECTION_ITERABLE(net_if_dev,                      \
    3290             :                                 NET_IF_DEV_GET_NAME(dev_id, sfx)) = {   \
    3291             :                 .dev = &(DEVICE_NAME_GET(dev_id)),                  \
    3292             :                 .mtu = _mtu,                                            \
    3293             :                 .l2 = &(NET_L2_GET_NAME(OFFLOADED_NETDEV)),         \
    3294             :                 .flags = {BIT(NET_IF_LOWER_UP)},                        \
    3295             :         };                                                              \
    3296             :         static Z_DECL_ALIGN(struct net_if)                              \
    3297             :                 NET_IF_GET_NAME(dev_id, sfx)[NET_IF_MAX_CONFIGS]        \
    3298             :                        __used __in_section(_net_if, static,             \
    3299             :                                            dev_id) = {                  \
    3300             :                 [0 ... (NET_IF_MAX_CONFIGS - 1)] = {                    \
    3301             :                         .if_dev = &(NET_IF_DEV_GET_NAME(dev_id, sfx)),      \
    3302             :                         NET_IF_CONFIG_INIT                              \
    3303             :                 }                                                       \
    3304             :         };                                                              \
    3305             :         IF_ENABLED(CONFIG_NET_STATISTICS_VIA_PROMETHEUS,                \
    3306             :                    (static PROMETHEUS_COLLECTOR_DEFINE(                 \
    3307             :                            NET_PROMETHEUS_GET_COLLECTOR_NAME(dev_id,    \
    3308             :                                                              sfx),      \
    3309             :                            net_stats_prometheus_scrape,                 \
    3310             :                            NET_IF_GET(dev_id, sfx));                    \
    3311             :                     NET_STATS_PROMETHEUS(NET_IF_GET(dev_id, sfx),       \
    3312             :                                          dev_id, sfx);))
    3313             : 
    3314             : 
    3315             : /** @endcond */
    3316             : 
    3317             : /* Network device initialization macros */
    3318             : 
    3319             : #define Z_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, instance,     \
    3320             :                                    init_fn, pm, data, config, prio,     \
    3321             :                                    api, l2, l2_ctx_type, mtu)           \
    3322             :         Z_DEVICE_STATE_DEFINE(dev_id);                                  \
    3323             :         Z_DEVICE_DEFINE(node_id, dev_id, name, init_fn, pm, data,       \
    3324             :                         config, POST_KERNEL, prio, api,                 \
    3325             :                         &Z_DEVICE_STATE_NAME(dev_id));                      \
    3326             :         NET_L2_DATA_INIT(dev_id, instance, l2_ctx_type);                \
    3327             :         NET_IF_INIT(dev_id, instance, l2, mtu, NET_IF_MAX_CONFIGS)
    3328             : 
    3329             : #define Z_NET_DEVICE_INIT(node_id, dev_id, name, init_fn, pm, data,     \
    3330             :                           config, prio, api, l2, l2_ctx_type, mtu)      \
    3331             :         Z_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, 0, init_fn,   \
    3332             :                                    pm, data, config, prio, api, l2,     \
    3333             :                                    l2_ctx_type, mtu)
    3334             : 
    3335             : /**
    3336             :  * @brief Create a network interface and bind it to network device.
    3337             :  *
    3338             :  * @param dev_id Network device id.
    3339             :  * @param name The name this instance of the driver exposes to
    3340             :  * the system.
    3341             :  * @param init_fn Address to the init function of the driver.
    3342             :  * @param pm Reference to struct pm_device associated with the device.
    3343             :  * (optional).
    3344             :  * @param data Pointer to the device's private data.
    3345             :  * @param config The address to the structure containing the
    3346             :  * configuration information for this instance of the driver.
    3347             :  * @param prio The initialization level at which configuration occurs.
    3348             :  * @param api Provides an initial pointer to the API function struct
    3349             :  * used by the driver. Can be NULL.
    3350             :  * @param l2 Network L2 layer for this network interface.
    3351             :  * @param l2_ctx_type Type of L2 context data.
    3352             :  * @param mtu Maximum transfer unit in bytes for this network interface.
    3353             :  */
    3354             : #define NET_DEVICE_INIT(dev_id, name, init_fn, pm, data, config, prio,  \
    3355           1 :                         api, l2, l2_ctx_type, mtu)                      \
    3356             :         Z_NET_DEVICE_INIT(DT_INVALID_NODE, dev_id, name, init_fn, pm,   \
    3357             :                           data, config, prio, api, l2, l2_ctx_type, mtu)
    3358             : 
    3359             : /**
    3360             :  * @brief Like NET_DEVICE_INIT but taking metadata from a devicetree node.
    3361             :  * Create a network interface and bind it to network device.
    3362             :  *
    3363             :  * @param node_id The devicetree node identifier.
    3364             :  * @param init_fn Address to the init function of the driver.
    3365             :  * @param pm Reference to struct pm_device associated with the device.
    3366             :  * (optional).
    3367             :  * @param data Pointer to the device's private data.
    3368             :  * @param config The address to the structure containing the
    3369             :  * configuration information for this instance of the driver.
    3370             :  * @param prio The initialization level at which configuration occurs.
    3371             :  * @param api Provides an initial pointer to the API function struct
    3372             :  * used by the driver. Can be NULL.
    3373             :  * @param l2 Network L2 layer for this network interface.
    3374             :  * @param l2_ctx_type Type of L2 context data.
    3375             :  * @param mtu Maximum transfer unit in bytes for this network interface.
    3376             :  */
    3377             : #define NET_DEVICE_DT_DEFINE(node_id, init_fn, pm, data,                \
    3378           1 :                              config, prio, api, l2, l2_ctx_type, mtu)   \
    3379             :         Z_NET_DEVICE_INIT(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
    3380             :                           DEVICE_DT_NAME(node_id), init_fn, pm, data,   \
    3381             :                           config, prio, api, l2, l2_ctx_type, mtu)
    3382             : 
    3383             : /**
    3384             :  * @brief Like NET_DEVICE_DT_DEFINE for an instance of a DT_DRV_COMPAT compatible
    3385             :  *
    3386             :  * @param inst instance number.  This is replaced by
    3387             :  * <tt>DT_DRV_COMPAT(inst)</tt> in the call to NET_DEVICE_DT_DEFINE.
    3388             :  *
    3389             :  * @param ... other parameters as expected by NET_DEVICE_DT_DEFINE.
    3390             :  */
    3391           1 : #define NET_DEVICE_DT_INST_DEFINE(inst, ...) \
    3392             :         NET_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
    3393             : 
    3394             : /**
    3395             :  * @brief Create multiple network interfaces and bind them to network device.
    3396             :  * If your network device needs more than one instance of a network interface,
    3397             :  * use this macro below and provide a different instance suffix each time
    3398             :  * (0, 1, 2, ... or a, b, c ... whatever works for you)
    3399             :  *
    3400             :  * @param dev_id Network device id.
    3401             :  * @param name The name this instance of the driver exposes to
    3402             :  * the system.
    3403             :  * @param instance Instance identifier.
    3404             :  * @param init_fn Address to the init function of the driver.
    3405             :  * @param pm Reference to struct pm_device associated with the device.
    3406             :  * (optional).
    3407             :  * @param data Pointer to the device's private data.
    3408             :  * @param config The address to the structure containing the
    3409             :  * configuration information for this instance of the driver.
    3410             :  * @param prio The initialization level at which configuration occurs.
    3411             :  * @param api Provides an initial pointer to the API function struct
    3412             :  * used by the driver. Can be NULL.
    3413             :  * @param l2 Network L2 layer for this network interface.
    3414             :  * @param l2_ctx_type Type of L2 context data.
    3415             :  * @param mtu Maximum transfer unit in bytes for this network interface.
    3416             :  */
    3417             : #define NET_DEVICE_INIT_INSTANCE(dev_id, name, instance, init_fn, pm,   \
    3418             :                                  data, config, prio, api, l2,           \
    3419           1 :                                  l2_ctx_type, mtu)                      \
    3420             :         Z_NET_DEVICE_INIT_INSTANCE(DT_INVALID_NODE, dev_id, name,       \
    3421             :                                    instance, init_fn, pm, data, config, \
    3422             :                                    prio, api, l2, l2_ctx_type, mtu)
    3423             : 
    3424             : /**
    3425             :  * @brief Like NET_DEVICE_OFFLOAD_INIT but taking metadata from a devicetree.
    3426             :  * Create multiple network interfaces and bind them to network device.
    3427             :  * If your network device needs more than one instance of a network interface,
    3428             :  * use this macro below and provide a different instance suffix each time
    3429             :  * (0, 1, 2, ... or a, b, c ... whatever works for you)
    3430             :  *
    3431             :  * @param node_id The devicetree node identifier.
    3432             :  * @param instance Instance identifier.
    3433             :  * @param init_fn Address to the init function of the driver.
    3434             :  * @param pm Reference to struct pm_device associated with the device.
    3435             :  * (optional).
    3436             :  * @param data Pointer to the device's private data.
    3437             :  * @param config The address to the structure containing the
    3438             :  * configuration information for this instance of the driver.
    3439             :  * @param prio The initialization level at which configuration occurs.
    3440             :  * @param api Provides an initial pointer to the API function struct
    3441             :  * used by the driver. Can be NULL.
    3442             :  * @param l2 Network L2 layer for this network interface.
    3443             :  * @param l2_ctx_type Type of L2 context data.
    3444             :  * @param mtu Maximum transfer unit in bytes for this network interface.
    3445             :  */
    3446             : #define NET_DEVICE_DT_DEFINE_INSTANCE(node_id, instance, init_fn, pm,   \
    3447             :                                       data, config, prio, api, l2,      \
    3448           1 :                                       l2_ctx_type, mtu)                 \
    3449             :         Z_NET_DEVICE_INIT_INSTANCE(node_id,                             \
    3450             :                                    Z_DEVICE_DT_DEV_ID(node_id),         \
    3451             :                                    DEVICE_DT_NAME(node_id), instance,   \
    3452             :                                    init_fn, pm, data, config, prio,     \
    3453             :                                    api, l2, l2_ctx_type, mtu)
    3454             : 
    3455             : /**
    3456             :  * @brief Like NET_DEVICE_DT_DEFINE_INSTANCE for an instance of a DT_DRV_COMPAT
    3457             :  * compatible
    3458             :  *
    3459             :  * @param inst instance number.  This is replaced by
    3460             :  * <tt>DT_DRV_COMPAT(inst)</tt> in the call to NET_DEVICE_DT_DEFINE_INSTANCE.
    3461             :  *
    3462             :  * @param ... other parameters as expected by NET_DEVICE_DT_DEFINE_INSTANCE.
    3463             :  */
    3464           1 : #define NET_DEVICE_DT_INST_DEFINE_INSTANCE(inst, ...) \
    3465             :         NET_DEVICE_DT_DEFINE_INSTANCE(DT_DRV_INST(inst), __VA_ARGS__)
    3466             : 
    3467             : #define Z_NET_DEVICE_OFFLOAD_INIT(node_id, dev_id, name, init_fn, pm,   \
    3468             :                                   data, config, prio, api, mtu)         \
    3469             :         Z_DEVICE_STATE_DEFINE(dev_id);                                  \
    3470             :         Z_DEVICE_DEFINE(node_id, dev_id, name, init_fn, pm, data,       \
    3471             :                         config, POST_KERNEL, prio, api,                 \
    3472             :                         &Z_DEVICE_STATE_NAME(dev_id));                      \
    3473             :         NET_IF_OFFLOAD_INIT(dev_id, 0, mtu)
    3474             : 
    3475             : /**
    3476             :  * @brief Create a offloaded network interface and bind it to network device.
    3477             :  * The offloaded network interface is implemented by a device vendor HAL or
    3478             :  * similar.
    3479             :  *
    3480             :  * @param dev_id Network device id.
    3481             :  * @param name The name this instance of the driver exposes to
    3482             :  * the system.
    3483             :  * @param init_fn Address to the init function of the driver.
    3484             :  * @param pm Reference to struct pm_device associated with the device.
    3485             :  * (optional).
    3486             :  * @param data Pointer to the device's private data.
    3487             :  * @param config The address to the structure containing the
    3488             :  * configuration information for this instance of the driver.
    3489             :  * @param prio The initialization level at which configuration occurs.
    3490             :  * @param api Provides an initial pointer to the API function struct
    3491             :  * used by the driver. Can be NULL.
    3492             :  * @param mtu Maximum transfer unit in bytes for this network interface.
    3493             :  */
    3494             : #define NET_DEVICE_OFFLOAD_INIT(dev_id, name, init_fn, pm, data,        \
    3495           1 :                                 config, prio, api, mtu)                 \
    3496             :         Z_NET_DEVICE_OFFLOAD_INIT(DT_INVALID_NODE, dev_id, name,        \
    3497             :                                   init_fn, pm, data, config, prio, api, \
    3498             :                                   mtu)
    3499             : 
    3500             : /**
    3501             :  * @brief Like NET_DEVICE_OFFLOAD_INIT but taking metadata from a devicetree
    3502             :  * node. Create a offloaded network interface and bind it to network device.
    3503             :  * The offloaded network interface is implemented by a device vendor HAL or
    3504             :  * similar.
    3505             :  *
    3506             :  * @param node_id The devicetree node identifier.
    3507             :  * @param init_fn Address to the init function of the driver.
    3508             :  * @param pm Reference to struct pm_device associated with the device.
    3509             :  * (optional).
    3510             :  * @param data Pointer to the device's private data.
    3511             :  * @param config The address to the structure containing the
    3512             :  * configuration information for this instance of the driver.
    3513             :  * @param prio The initialization level at which configuration occurs.
    3514             :  * @param api Provides an initial pointer to the API function struct
    3515             :  * used by the driver. Can be NULL.
    3516             :  * @param mtu Maximum transfer unit in bytes for this network interface.
    3517             :  */
    3518             : #define NET_DEVICE_DT_OFFLOAD_DEFINE(node_id, init_fn, pm, data,        \
    3519           1 :                                      config, prio, api, mtu)            \
    3520             :         Z_NET_DEVICE_OFFLOAD_INIT(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
    3521             :                                   DEVICE_DT_NAME(node_id), init_fn, pm, \
    3522             :                                   data, config, prio, api, mtu)
    3523             : 
    3524             : /**
    3525             :  * @brief Like NET_DEVICE_DT_OFFLOAD_DEFINE for an instance of a DT_DRV_COMPAT
    3526             :  * compatible
    3527             :  *
    3528             :  * @param inst instance number.  This is replaced by
    3529             :  * <tt>DT_DRV_COMPAT(inst)</tt> in the call to NET_DEVICE_DT_OFFLOAD_DEFINE.
    3530             :  *
    3531             :  * @param ... other parameters as expected by NET_DEVICE_DT_OFFLOAD_DEFINE.
    3532             :  */
    3533           1 : #define NET_DEVICE_DT_INST_OFFLOAD_DEFINE(inst, ...) \
    3534             :         NET_DEVICE_DT_OFFLOAD_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
    3535             : 
    3536             : /**
    3537             :  * @brief Count the number of network interfaces.
    3538             :  *
    3539             :  * @param[out] _dst Pointer to location where result is written.
    3540             :  */
    3541           1 : #define NET_IFACE_COUNT(_dst) \
    3542             :                 do {                                                    \
    3543             :                         extern struct net_if _net_if_list_start[];      \
    3544             :                         extern struct net_if _net_if_list_end[];        \
    3545             :                         *(_dst) = ((uintptr_t)_net_if_list_end -        \
    3546             :                                    (uintptr_t)_net_if_list_start) /     \
    3547             :                                 sizeof(struct net_if);                  \
    3548             :                 } while (0)
    3549             : 
    3550             : #ifdef __cplusplus
    3551             : }
    3552             : #endif
    3553             : 
    3554             : #include <zephyr/syscalls/net_if.h>
    3555             : 
    3556             : /**
    3557             :  * @}
    3558             :  */
    3559             : 
    3560             : #endif /* ZEPHYR_INCLUDE_NET_NET_IF_H_ */

Generated by: LCOV version 1.14