LCOV - code coverage report
Current view: top level - zephyr/net - net_context.h Hit Total Coverage
Test: new.info Lines: 84 84 100.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /** @file
       2             :  * @brief Network context definitions
       3             :  *
       4             :  * An API for applications to define a network connection.
       5             :  */
       6             : 
       7             : /*
       8             :  * Copyright (c) 2016 Intel Corporation
       9             :  * Copyright (c) 2021 Nordic Semiconductor
      10             :  *
      11             :  * SPDX-License-Identifier: Apache-2.0
      12             :  */
      13             : 
      14             : #ifndef ZEPHYR_INCLUDE_NET_NET_CONTEXT_H_
      15             : #define ZEPHYR_INCLUDE_NET_NET_CONTEXT_H_
      16             : 
      17             : /**
      18             :  * @brief Application network context
      19             :  * @defgroup net_context Application network context
      20             :  * @since 1.0
      21             :  * @version 0.8.0
      22             :  * @ingroup networking
      23             :  * @{
      24             :  */
      25             : 
      26             : #include <zephyr/kernel.h>
      27             : #include <zephyr/sys/atomic.h>
      28             : 
      29             : #include <zephyr/net/net_ip.h>
      30             : #include <zephyr/net/net_if.h>
      31             : #include <zephyr/net/net_stats.h>
      32             : 
      33             : #ifdef __cplusplus
      34             : extern "C" {
      35             : #endif
      36             : 
      37             : /** Is this context used or not */
      38           1 : #define NET_CONTEXT_IN_USE BIT(0)
      39             : 
      40             : /** @cond INTERNAL_HIDDEN */
      41             : 
      42             : /** State of the context (bits 1 & 2 in the flags) */
      43             : enum net_context_state {
      44             :         NET_CONTEXT_IDLE = 0,
      45             :         NET_CONTEXT_UNCONNECTED = 0,
      46             :         NET_CONTEXT_CONFIGURING = 1,
      47             :         NET_CONTEXT_CONNECTING = 1,
      48             :         NET_CONTEXT_READY = 2,
      49             :         NET_CONTEXT_CONNECTED = 2,
      50             :         NET_CONTEXT_LISTENING = 3,
      51             : };
      52             : 
      53             : /** @endcond */
      54             : 
      55             : /**
      56             :  * The address family, connection type and IP protocol are
      57             :  * stored into a bit field to save space.
      58             :  */
      59             : /** Protocol family of this connection */
      60           1 : #define NET_CONTEXT_FAMILY (BIT(3) | BIT(4) | BIT(5))
      61             : 
      62             : /** Type of the connection (datagram / stream / raw) */
      63           1 : #define NET_CONTEXT_TYPE   (BIT(6) | BIT(7))
      64             : 
      65             : /** Remote address set */
      66           1 : #define NET_CONTEXT_REMOTE_ADDR_SET  BIT(8)
      67             : 
      68             : /** Is the socket accepting connections */
      69           1 : #define NET_CONTEXT_ACCEPTING_SOCK  BIT(9)
      70             : 
      71             : /** Is the socket closing / closed */
      72           1 : #define NET_CONTEXT_CLOSING_SOCK  BIT(10)
      73             : 
      74             : /** Context is bound to a specific interface */
      75           1 : #define NET_CONTEXT_BOUND_TO_IFACE BIT(11)
      76             : 
      77             : struct net_context;
      78             : 
      79             : /**
      80             :  * @typedef net_context_recv_cb_t
      81             :  * @brief Network data receive callback.
      82             :  *
      83             :  * @details The recv callback is called after a network data packet is
      84             :  * received. This callback is called by RX thread so its stack and execution
      85             :  * context is used here. Keep processing in the callback minimal to reduce the
      86             :  * time spent blocked while handling packets.
      87             :  *
      88             :  * @param context The context to use.
      89             :  * @param pkt Network buffer that is received. If the pkt is not NULL,
      90             :  * then the callback will own the buffer and it needs to unref the pkt
      91             :  * as soon as it has finished working with it.  On EOF, pkt will be NULL.
      92             :  * @param ip_hdr a pointer to relevant IP (v4 or v6) header.
      93             :  * @param proto_hdr a pointer to relevant protocol (udp or tcp) header.
      94             :  * @param status Value is set to 0 if some data or the connection is
      95             :  * at EOF, <0 if there was an error receiving data, in this case the
      96             :  * pkt parameter is set to NULL.
      97             :  * @param user_data The user data given in net_recv() call.
      98             :  */
      99           1 : typedef void (*net_context_recv_cb_t)(struct net_context *context,
     100             :                                       struct net_pkt *pkt,
     101             :                                       union net_ip_header *ip_hdr,
     102             :                                       union net_proto_header *proto_hdr,
     103             :                                       int status,
     104             :                                       void *user_data);
     105             : 
     106             : /**
     107             :  * @typedef net_context_send_cb_t
     108             :  * @brief Network data send callback.
     109             :  *
     110             :  * @details The send callback is called after a network data packet is sent.
     111             :  * This callback is called by TX thread so its stack and execution context is
     112             :  * used here. Keep processing in the callback minimal to reduce the time spent
     113             :  * blocked while handling packets.
     114             :  *
     115             :  * @param context The context to use.
     116             :  * @param status Value is set to >= 0: amount of data that was sent,
     117             :  * < 0 there was an error sending data.
     118             :  * @param user_data The user data given in net_send() call.
     119             :  */
     120           1 : typedef void (*net_context_send_cb_t)(struct net_context *context,
     121             :                                       int status,
     122             :                                       void *user_data);
     123             : 
     124             : /**
     125             :  * @typedef net_tcp_accept_cb_t
     126             :  * @brief Accept callback
     127             :  *
     128             :  * @details The accept callback is called after a successful connection was
     129             :  * established or if there was an error while we were waiting for a connection
     130             :  * attempt. This callback is called by RX thread so its stack and execution
     131             :  * context is used here. Keep processing in the callback minimal to reduce the
     132             :  * time spent blocked while handling packets.
     133             :  *
     134             :  * @param new_context The context to use.
     135             :  * @param addr The peer address.
     136             :  * @param addrlen Length of the peer address.
     137             :  * @param status The status code, 0 on success, < 0 otherwise
     138             :  * @param user_data The user data given in net_context_accept() call.
     139             :  */
     140           1 : typedef void (*net_tcp_accept_cb_t)(struct net_context *new_context,
     141             :                                     struct sockaddr *addr,
     142             :                                     socklen_t addrlen,
     143             :                                     int status,
     144             :                                     void *user_data);
     145             : 
     146             : /**
     147             :  * @typedef net_context_connect_cb_t
     148             :  * @brief Connection callback.
     149             :  *
     150             :  * @details The connect callback is called after a connection is being
     151             :  * established.
     152             :  * For TCP connections, this callback is called by RX thread so its stack and
     153             :  * execution context is used here. The callback is called after the TCP
     154             :  * connection was established or if the connection failed. Keep processing in
     155             :  * the callback minimal to reduce the time spent blocked while handling
     156             :  * packets.
     157             :  * For UDP connections, this callback is called immediately by
     158             :  * net_context_connect() function. UDP is a connectionless protocol so the
     159             :  * connection can be thought of being established immediately.
     160             :  *
     161             :  * @param context The context to use.
     162             :  * @param status Status of the connection establishment. This is 0
     163             :  * if the connection was established successfully, <0 if there was an
     164             :  * error.
     165             :  * @param user_data The user data given in net_context_connect() call.
     166             :  */
     167           1 : typedef void (*net_context_connect_cb_t)(struct net_context *context,
     168             :                                          int status,
     169             :                                          void *user_data);
     170             : 
     171             : /* The net_pkt_get_slab_func_t is here in order to avoid circular
     172             :  * dependency between net_pkt.h and net_context.h
     173             :  */
     174             : /**
     175             :  * @typedef net_pkt_get_slab_func_t
     176             :  *
     177             :  * @brief Function that is called to get the slab that is used
     178             :  * for net_pkt allocations.
     179             :  *
     180             :  * @return Pointer to valid struct k_mem_slab instance.
     181             :  */
     182             : typedef struct k_mem_slab *(*net_pkt_get_slab_func_t)(void);
     183             : 
     184             : /* The net_pkt_get_pool_func_t is here in order to avoid circular
     185             :  * dependency between net_pkt.h and net_context.h
     186             :  */
     187             : /**
     188             :  * @typedef net_pkt_get_pool_func_t
     189             :  *
     190             :  * @brief Function that is called to get the pool that is used
     191             :  * for net_buf allocations.
     192             :  *
     193             :  * @return Pointer to valid struct net_buf_pool instance.
     194             :  */
     195             : typedef struct net_buf_pool *(*net_pkt_get_pool_func_t)(void);
     196             : 
     197             : struct net_tcp;
     198             : 
     199             : struct net_conn_handle;
     200             : 
     201             : /**
     202             :  * Note that we do not store the actual source IP address in the context
     203             :  * because the address is already set in the network interface struct.
     204             :  * If there is no such source address there, the packet cannot be sent
     205             :  * anyway. This saves 12 bytes / context in IPv6.
     206             :  */
     207           1 : __net_socket struct net_context {
     208             :         /** First member of the structure to allow to put contexts into a FIFO.
     209             :          */
     210           1 :         void *fifo_reserved;
     211             : 
     212             :         /** User data associated with a context.
     213             :          */
     214           1 :         void *user_data;
     215             : 
     216             :         /** Reference count
     217             :          */
     218           1 :         atomic_t refcount;
     219             : 
     220             :         /** Internal lock for protecting this context from multiple access.
     221             :          */
     222           1 :         struct k_mutex lock;
     223             : 
     224             :         /** Local endpoint address. Note that the values are in network byte
     225             :          * order.
     226             :          */
     227           1 :         struct sockaddr_ptr local;
     228             : 
     229             :         /** Remote endpoint address. Note that the values are in network byte
     230             :          * order.
     231             :          */
     232           1 :         struct sockaddr remote;
     233             : 
     234             :         /** Connection handle */
     235           1 :         struct net_conn_handle *conn_handler;
     236             : 
     237             :         /** Receive callback to be called when desired packet
     238             :          * has been received.
     239             :          */
     240           1 :         net_context_recv_cb_t recv_cb;
     241             : 
     242             :         /** Send callback to be called when the packet has been sent
     243             :          * successfully.
     244             :          */
     245           1 :         net_context_send_cb_t send_cb;
     246             : 
     247             :         /** Connect callback to be called when a connection has been
     248             :          *  established.
     249             :          */
     250           1 :         net_context_connect_cb_t connect_cb;
     251             : 
     252             : #if defined(CONFIG_NET_CONTEXT_NET_PKT_POOL)
     253             :         /** Get TX net_buf pool for this context.
     254             :          */
     255             :         net_pkt_get_slab_func_t tx_slab;
     256             : 
     257             :         /** Get DATA net_buf pool for this context.
     258             :          */
     259             :         net_pkt_get_pool_func_t data_pool;
     260             : #endif /* CONFIG_NET_CONTEXT_NET_PKT_POOL */
     261             : 
     262             : #if defined(CONFIG_NET_TCP)
     263             :         /** TCP connection information */
     264           1 :         void *tcp;
     265             : #endif /* CONFIG_NET_TCP */
     266             : 
     267             : #if defined(CONFIG_NET_CONTEXT_SYNC_RECV)
     268             :         /**
     269             :          * Semaphore to signal synchronous recv call completion.
     270             :          */
     271             :         struct k_sem recv_data_wait;
     272             : #endif /* CONFIG_NET_CONTEXT_SYNC_RECV */
     273             : 
     274             : #if defined(CONFIG_NET_SOCKETS)
     275             :         /** BSD socket private data */
     276             :         void *socket_data;
     277             : 
     278             :         /** Per-socket packet or connection queues */
     279             :         union {
     280             :                 struct k_fifo recv_q;
     281             :                 struct k_fifo accept_q;
     282             :         };
     283             : 
     284             :         struct {
     285             :                 /** Condition variable used when receiving data */
     286             :                 struct k_condvar recv;
     287             : 
     288             :                 /** Mutex used by condition variable */
     289             :                 struct k_mutex *lock;
     290             :         } cond;
     291             : #endif /* CONFIG_NET_SOCKETS */
     292             : 
     293             : #if defined(CONFIG_NET_OFFLOAD)
     294             :         /** context for use by offload drivers */
     295             :         void *offload_context;
     296             : #endif /* CONFIG_NET_OFFLOAD */
     297             : 
     298             : #if defined(CONFIG_NET_SOCKETS_CAN)
     299             :         int can_filter_id;
     300             : #endif /* CONFIG_NET_SOCKETS_CAN */
     301             : 
     302             :         /** Option values */
     303             :         struct {
     304             : #if defined(CONFIG_NET_CONTEXT_PRIORITY)
     305             :                 /** Priority of the network data sent via this net_context */
     306             :                 uint8_t priority;
     307             : #endif
     308             : #if defined(CONFIG_NET_CONTEXT_TXTIME)
     309             :                 /** When to send the packet out */
     310             :                 bool txtime;
     311             : #endif
     312             : #if defined(CONFIG_SOCKS)
     313             :                 /** Socks proxy address */
     314             :                 struct {
     315             :                         struct sockaddr addr;
     316             :                         socklen_t addrlen;
     317             :                 } proxy;
     318             : #endif
     319             : #if defined(CONFIG_NET_CONTEXT_CLAMP_PORT_RANGE)
     320             :                 /** Restrict local port range between these values.
     321             :                  * The option takes an uint32_t value with the high 16 bits
     322             :                  * set to the upper range bound, and the low 16 bits set to
     323             :                  * the lower range bound.  Range bounds are inclusive. The
     324             :                  * 16-bit values should be in host byte order.
     325             :                  * The lower bound has to be less than the upper bound when
     326             :                  * both bounds are not zero. Otherwise, setting the option
     327             :                  * fails with EINVAL.
     328             :                  * If either bound is outside of the global local port range,
     329             :                  * or is zero, then that bound has no effect.
     330             :                  */
     331             :                 uint32_t port_range;
     332             : #endif
     333             : #if defined(CONFIG_NET_CONTEXT_RCVTIMEO)
     334             :                 /** Receive timeout */
     335             :                 k_timeout_t rcvtimeo;
     336             : #endif
     337             : #if defined(CONFIG_NET_CONTEXT_SNDTIMEO)
     338             :                 /** Send timeout */
     339             :                 k_timeout_t sndtimeo;
     340             : #endif
     341             : #if defined(CONFIG_NET_CONTEXT_RCVBUF)
     342             :                 /** Receive buffer maximum size */
     343             :                 uint16_t rcvbuf;
     344             : #endif
     345             : #if defined(CONFIG_NET_CONTEXT_SNDBUF)
     346             :                 /** Send buffer maximum size */
     347             :                 uint16_t sndbuf;
     348             : #endif
     349             : #if defined(CONFIG_NET_CONTEXT_DSCP_ECN)
     350             :                 /**
     351             :                  * DSCP (Differentiated Services Code point) and
     352             :                  * ECN (Explicit Congestion Notification) values.
     353             :                  */
     354             :                 uint8_t dscp_ecn;
     355             : #endif
     356             : #if defined(CONFIG_NET_CONTEXT_REUSEADDR)
     357             :                 /** Re-use address (SO_REUSEADDR) flag on a socket. */
     358             :                 bool reuseaddr;
     359             : #endif
     360             : #if defined(CONFIG_NET_CONTEXT_REUSEPORT)
     361             :                 /** Re-use port (SO_REUSEPORT) flag on a socket. */
     362             :                 bool reuseport;
     363             : #endif
     364             : #if defined(CONFIG_NET_IPV4_MAPPING_TO_IPV6)
     365             :                 /** Support v4-mapped-on-v6 addresses */
     366             :                 bool ipv6_v6only;
     367             : #endif
     368             : #if defined(CONFIG_NET_CONTEXT_RECV_PKTINFO)
     369             :                 /** Receive network packet information in recvmsg() call */
     370             :                 bool recv_pktinfo;
     371             : #endif
     372             : #if defined(CONFIG_NET_IPV6)
     373             :                 /**
     374             :                  * Source address selection preferences. Currently used only for IPv6,
     375             :                  * see RFC 5014 for details.
     376             :                  */
     377             :                 uint16_t addr_preferences;
     378             : #endif
     379             : #if defined(CONFIG_NET_IPV6) || defined(CONFIG_NET_IPV4)
     380             :                 union {
     381             :                         /**
     382             :                          * IPv6 multicast output network interface for this context/socket.
     383             :                          * Only allowed for SOCK_DGRAM or SOCK_RAW type sockets.
     384             :                          */
     385             :                         uint8_t ipv6_mcast_ifindex;
     386             : 
     387             :                         /**
     388             :                          * IPv4 multicast output network interface for this context/socket.
     389             :                          * Only allowed for SOCK_DGRAM type sockets.
     390             :                          */
     391             :                         uint8_t ipv4_mcast_ifindex;
     392             :                 };
     393             : #endif /* CONFIG_NET_IPV6 || CONFIG_NET_IPV4 */
     394             : 
     395             : #if defined(CONFIG_NET_CONTEXT_TIMESTAMPING)
     396             :                 /** Enable RX, TX or both timestamps of packets send through sockets. */
     397             :                 uint8_t timestamping;
     398             : #endif
     399           1 :         } options;
     400             : 
     401             :         /** Protocol (UDP, TCP or IEEE 802.3 protocol value) */
     402           1 :         uint16_t proto;
     403             : 
     404             :         /** Flags for the context */
     405           1 :         uint16_t flags;
     406             : 
     407             :         /** Network interface assigned to this context */
     408           1 :         int8_t iface;
     409             : 
     410             :         /** IPv6 hop limit or IPv4 ttl for packets sent via this context. */
     411             :         union {
     412             :                 struct {
     413           1 :                         uint8_t ipv6_hop_limit;       /**< IPv6 hop limit */
     414           1 :                         uint8_t ipv6_mcast_hop_limit; /**< IPv6 multicast hop limit */
     415             :                 };
     416             :                 struct {
     417           1 :                         uint8_t ipv4_ttl;       /**< IPv4 TTL */
     418           1 :                         uint8_t ipv4_mcast_ttl; /**< IPv4 multicast TTL */
     419             :                 };
     420           1 :         };
     421             : 
     422             : #if defined(CONFIG_SOCKS)
     423             :         /** Is socks proxy enabled */
     424             :         bool proxy_enabled;
     425             : #endif
     426             : 
     427             : };
     428             : 
     429             : /**
     430             :  * @brief Is this context used or not.
     431             :  *
     432             :  * @param context Network context.
     433             :  *
     434             :  * @return True if the context is currently in use, False otherwise.
     435             :  */
     436           1 : static inline bool net_context_is_used(struct net_context *context)
     437             : {
     438             :         NET_ASSERT(context);
     439             : 
     440             :         return context->flags & NET_CONTEXT_IN_USE;
     441             : }
     442             : 
     443             : /**
     444             :  * @brief Is this context bound to a network interface.
     445             :  *
     446             :  * @param context Network context.
     447             :  *
     448             :  * @return True if the context is bound to network interface, False otherwise.
     449             :  */
     450           1 : static inline bool net_context_is_bound_to_iface(struct net_context *context)
     451             : {
     452             :         NET_ASSERT(context);
     453             : 
     454             :         return context->flags & NET_CONTEXT_BOUND_TO_IFACE;
     455             : }
     456             : 
     457             : /**
     458             :  * @brief Is this context is accepting data now.
     459             :  *
     460             :  * @param context Network context.
     461             :  *
     462             :  * @return True if the context is accepting connections, False otherwise.
     463             :  */
     464           1 : static inline bool net_context_is_accepting(struct net_context *context)
     465             : {
     466             :         NET_ASSERT(context);
     467             : 
     468             :         return context->flags & NET_CONTEXT_ACCEPTING_SOCK;
     469             : }
     470             : 
     471             : /**
     472             :  * @brief Set this context to accept data now.
     473             :  *
     474             :  * @param context Network context.
     475             :  * @param accepting True if accepting, False if not
     476             :  */
     477           1 : static inline void net_context_set_accepting(struct net_context *context,
     478             :                                              bool accepting)
     479             : {
     480             :         NET_ASSERT(context);
     481             : 
     482             :         if (accepting) {
     483             :                 context->flags |= NET_CONTEXT_ACCEPTING_SOCK;
     484             :         } else {
     485             :                 context->flags &= (uint16_t)~NET_CONTEXT_ACCEPTING_SOCK;
     486             :         }
     487             : }
     488             : 
     489             : /**
     490             :  * @brief Is this context closing.
     491             :  *
     492             :  * @param context Network context.
     493             :  *
     494             :  * @return True if the context is closing, False otherwise.
     495             :  */
     496           1 : static inline bool net_context_is_closing(struct net_context *context)
     497             : {
     498             :         NET_ASSERT(context);
     499             : 
     500             :         return context->flags & NET_CONTEXT_CLOSING_SOCK;
     501             : }
     502             : 
     503             : /**
     504             :  * @brief Set this context to closing.
     505             :  *
     506             :  * @param context Network context.
     507             :  * @param closing True if closing, False if not
     508             :  */
     509           1 : static inline void net_context_set_closing(struct net_context *context,
     510             :                                            bool closing)
     511             : {
     512             :         NET_ASSERT(context);
     513             : 
     514             :         if (closing) {
     515             :                 context->flags |= NET_CONTEXT_CLOSING_SOCK;
     516             :         } else {
     517             :                 context->flags &= (uint16_t)~NET_CONTEXT_CLOSING_SOCK;
     518             :         }
     519             : }
     520             : 
     521             : /** @cond INTERNAL_HIDDEN */
     522             : 
     523             : #define NET_CONTEXT_STATE_SHIFT 1
     524             : #define NET_CONTEXT_STATE_MASK 0x03
     525             : 
     526             : /** @endcond */
     527             : 
     528             : /**
     529             :  * @brief Get state for this network context.
     530             :  *
     531             :  * @details This function returns the state of the context.
     532             :  *
     533             :  * @param context Network context.
     534             :  *
     535             :  * @return Network state.
     536             :  */
     537             : static inline
     538           1 : enum net_context_state net_context_get_state(struct net_context *context)
     539             : {
     540             :         NET_ASSERT(context);
     541             : 
     542             :         return (enum net_context_state)
     543             :                 ((context->flags >> NET_CONTEXT_STATE_SHIFT) &
     544             :                 NET_CONTEXT_STATE_MASK);
     545             : }
     546             : 
     547             : /**
     548             :  * @brief Set state for this network context.
     549             :  *
     550             :  * @details This function sets the state of the context.
     551             :  *
     552             :  * @param context Network context.
     553             :  * @param state New network context state.
     554             :  */
     555           1 : static inline void net_context_set_state(struct net_context *context,
     556             :                                          enum net_context_state state)
     557             : {
     558             :         NET_ASSERT(context);
     559             : 
     560             :         context->flags &= ~(NET_CONTEXT_STATE_MASK << NET_CONTEXT_STATE_SHIFT);
     561             :         context->flags |= ((state & NET_CONTEXT_STATE_MASK) <<
     562             :                            NET_CONTEXT_STATE_SHIFT);
     563             : }
     564             : 
     565             : /**
     566             :  * @brief Get address family for this network context.
     567             :  *
     568             :  * @details This function returns the address family (IPv4 or IPv6)
     569             :  * of the context.
     570             :  *
     571             :  * @param context Network context.
     572             :  *
     573             :  * @return Network state.
     574             :  */
     575           1 : static inline sa_family_t net_context_get_family(struct net_context *context)
     576             : {
     577             :         NET_ASSERT(context);
     578             : 
     579             :         return ((context->flags & NET_CONTEXT_FAMILY) >> 3);
     580             : }
     581             : 
     582             : /**
     583             :  * @brief Set address family for this network context.
     584             :  *
     585             :  * @details This function sets the address family (IPv4, IPv6 or AF_PACKET)
     586             :  * of the context.
     587             :  *
     588             :  * @param context Network context.
     589             :  * @param family Address family (AF_INET, AF_INET6, AF_PACKET, AF_CAN)
     590             :  */
     591           1 : static inline void net_context_set_family(struct net_context *context,
     592             :                                           sa_family_t family)
     593             : {
     594             :         uint8_t flag = 0U;
     595             : 
     596             :         NET_ASSERT(context);
     597             : 
     598             :         if (family == AF_UNSPEC || family == AF_INET || family == AF_INET6 ||
     599             :             family == AF_PACKET || family == AF_CAN) {
     600             :                 /* Family is in BIT(4), BIT(5) and BIT(6) */
     601             :                 flag = (uint8_t)(family << 3);
     602             :         }
     603             : 
     604             :         context->flags |= flag;
     605             : }
     606             : 
     607             : /**
     608             :  * @brief Get context type for this network context.
     609             :  *
     610             :  * @details This function returns the context type (stream, datagram or raw)
     611             :  * of the context.
     612             :  *
     613             :  * @param context Network context.
     614             :  *
     615             :  * @return Network context type.
     616             :  */
     617             : static inline
     618           1 : enum net_sock_type net_context_get_type(struct net_context *context)
     619             : {
     620             :         NET_ASSERT(context);
     621             : 
     622             :         return (enum net_sock_type)((context->flags & NET_CONTEXT_TYPE) >> 6);
     623             : }
     624             : 
     625             : /**
     626             :  * @brief Set context type for this network context.
     627             :  *
     628             :  * @details This function sets the context type (stream or datagram)
     629             :  * of the context.
     630             :  *
     631             :  * @param context Network context.
     632             :  * @param type Context type (SOCK_STREAM or SOCK_DGRAM)
     633             :  */
     634           1 : static inline void net_context_set_type(struct net_context *context,
     635             :                                         enum net_sock_type type)
     636             : {
     637             :         uint16_t flag = 0U;
     638             : 
     639             :         NET_ASSERT(context);
     640             : 
     641             :         if (type == SOCK_DGRAM || type == SOCK_STREAM || type == SOCK_RAW) {
     642             :                 /* Type is in BIT(6) and BIT(7)*/
     643             :                 flag = (uint16_t)(type << 6);
     644             :         }
     645             : 
     646             :         context->flags |= flag;
     647             : }
     648             : 
     649             : /**
     650             :  * @brief Set CAN filter id for this network context.
     651             :  *
     652             :  * @details This function sets the CAN filter id of the context.
     653             :  *
     654             :  * @param context Network context.
     655             :  * @param filter_id CAN filter id
     656             :  */
     657             : #if defined(CONFIG_NET_SOCKETS_CAN)
     658             : static inline void net_context_set_can_filter_id(struct net_context *context,
     659             :                                              int filter_id)
     660             : {
     661             :         NET_ASSERT(context);
     662             : 
     663             :         context->can_filter_id = filter_id;
     664             : }
     665             : #else
     666           1 : static inline void net_context_set_can_filter_id(struct net_context *context,
     667             :                                              int filter_id)
     668             : {
     669             :         ARG_UNUSED(context);
     670             :         ARG_UNUSED(filter_id);
     671             : }
     672             : #endif
     673             : 
     674             : /**
     675             :  * @brief Get CAN filter id for this network context.
     676             :  *
     677             :  * @details This function gets the CAN filter id of the context.
     678             :  *
     679             :  * @param context Network context.
     680             :  *
     681             :  * @return Filter id of this network context
     682             :  */
     683             : #if defined(CONFIG_NET_SOCKETS_CAN)
     684             : static inline int net_context_get_can_filter_id(struct net_context *context)
     685             : {
     686             :         NET_ASSERT(context);
     687             : 
     688             :         return context->can_filter_id;
     689             : }
     690             : #else
     691           1 : static inline int net_context_get_can_filter_id(struct net_context *context)
     692             : {
     693             :         ARG_UNUSED(context);
     694             : 
     695             :         return -1;
     696             : }
     697             : #endif
     698             : 
     699             : /**
     700             :  * @brief Get context IP protocol for this network context.
     701             :  *
     702             :  * @details This function returns the IP protocol (UDP / TCP /
     703             :  * IEEE 802.3 protocol value) of the context.
     704             :  *
     705             :  * @param context Network context.
     706             :  *
     707             :  * @return Network context IP protocol.
     708             :  */
     709           1 : static inline uint16_t net_context_get_proto(struct net_context *context)
     710             : {
     711             :         return context->proto;
     712             : }
     713             : 
     714             : /**
     715             :  * @brief Set context IP protocol for this network context.
     716             :  *
     717             :  * @details This function sets the context IP protocol (UDP / TCP)
     718             :  * of the context.
     719             :  *
     720             :  * @param context Network context.
     721             :  * @param proto Context IP protocol (IPPROTO_UDP, IPPROTO_TCP or IEEE 802.3
     722             :  * protocol value)
     723             :  */
     724           1 : static inline void net_context_set_proto(struct net_context *context,
     725             :                                          uint16_t proto)
     726             : {
     727             :         context->proto = proto;
     728             : }
     729             : 
     730             : /**
     731             :  * @brief Get network interface for this context.
     732             :  *
     733             :  * @details This function returns the used network interface.
     734             :  *
     735             :  * @param context Network context.
     736             :  *
     737             :  * @return Context network interface if context is bind to interface,
     738             :  * NULL otherwise.
     739             :  */
     740             : static inline
     741           1 : struct net_if *net_context_get_iface(struct net_context *context)
     742             : {
     743             :         NET_ASSERT(context);
     744             : 
     745             :         return net_if_get_by_index(context->iface);
     746             : }
     747             : 
     748             : /**
     749             :  * @brief Set network interface for this context.
     750             :  *
     751             :  * @details This function binds network interface to this context.
     752             :  *
     753             :  * @param context Network context.
     754             :  * @param iface Network interface.
     755             :  */
     756           1 : static inline void net_context_set_iface(struct net_context *context,
     757             :                                          struct net_if *iface)
     758             : {
     759             :         NET_ASSERT(iface);
     760             : 
     761             :         context->iface = (uint8_t)net_if_get_by_iface(iface);
     762             : }
     763             : 
     764             : /**
     765             :  * @brief Bind network interface to this context.
     766             :  *
     767             :  * @details This function binds network interface to this context.
     768             :  *
     769             :  * @param context Network context.
     770             :  * @param iface Network interface.
     771             :  */
     772           1 : static inline void net_context_bind_iface(struct net_context *context,
     773             :                                           struct net_if *iface)
     774             : {
     775             :         NET_ASSERT(iface);
     776             : 
     777             :         context->flags |= NET_CONTEXT_BOUND_TO_IFACE;
     778             :         net_context_set_iface(context, iface);
     779             : }
     780             : 
     781             : /**
     782             :  * @brief Get IPv4 TTL (time-to-live) value for this context.
     783             :  *
     784             :  * @details This function returns the IPv4 TTL (time-to-live) value that is
     785             :  *          set to this context.
     786             :  *
     787             :  * @param context Network context.
     788             :  *
     789             :  * @return IPv4 TTL value
     790             :  */
     791           1 : static inline uint8_t net_context_get_ipv4_ttl(struct net_context *context)
     792             : {
     793             :         return context->ipv4_ttl;
     794             : }
     795             : 
     796             : /**
     797             :  * @brief Set IPv4 TTL (time-to-live) value for this context.
     798             :  *
     799             :  * @details This function sets the IPv4 TTL (time-to-live) value for
     800             :  *          this context.
     801             :  *
     802             :  * @param context Network context.
     803             :  * @param ttl IPv4 time-to-live value.
     804             :  */
     805           1 : static inline void net_context_set_ipv4_ttl(struct net_context *context,
     806             :                                             uint8_t ttl)
     807             : {
     808             :         context->ipv4_ttl = ttl;
     809             : }
     810             : 
     811             : /**
     812             :  * @brief Get IPv4 multicast TTL (time-to-live) value for this context.
     813             :  *
     814             :  * @details This function returns the IPv4 multicast TTL (time-to-live) value
     815             :  *          that is set to this context.
     816             :  *
     817             :  * @param context Network context.
     818             :  *
     819             :  * @return IPv4 multicast TTL value
     820             :  */
     821           1 : static inline uint8_t net_context_get_ipv4_mcast_ttl(struct net_context *context)
     822             : {
     823             :         return context->ipv4_mcast_ttl;
     824             : }
     825             : 
     826             : /**
     827             :  * @brief Set IPv4 multicast TTL (time-to-live) value for this context.
     828             :  *
     829             :  * @details This function sets the IPv4 multicast TTL (time-to-live) value for
     830             :  *          this context.
     831             :  *
     832             :  * @param context Network context.
     833             :  * @param ttl IPv4 multicast time-to-live value.
     834             :  */
     835           1 : static inline void net_context_set_ipv4_mcast_ttl(struct net_context *context,
     836             :                                                   uint8_t ttl)
     837             : {
     838             :         context->ipv4_mcast_ttl = ttl;
     839             : }
     840             : 
     841             : /**
     842             :  * @brief Get IPv6 hop limit value for this context.
     843             :  *
     844             :  * @details This function returns the IPv6 hop limit value that is set to this
     845             :  *          context.
     846             :  *
     847             :  * @param context Network context.
     848             :  *
     849             :  * @return IPv6 hop limit value
     850             :  */
     851           1 : static inline uint8_t net_context_get_ipv6_hop_limit(struct net_context *context)
     852             : {
     853             :         return context->ipv6_hop_limit;
     854             : }
     855             : 
     856             : /**
     857             :  * @brief Set IPv6 hop limit value for this context.
     858             :  *
     859             :  * @details This function sets the IPv6 hop limit value for this context.
     860             :  *
     861             :  * @param context Network context.
     862             :  * @param hop_limit IPv6 hop limit value.
     863             :  */
     864           1 : static inline void net_context_set_ipv6_hop_limit(struct net_context *context,
     865             :                                                   uint8_t hop_limit)
     866             : {
     867             :         context->ipv6_hop_limit = hop_limit;
     868             : }
     869             : 
     870             : /**
     871             :  * @brief Get IPv6 multicast hop limit value for this context.
     872             :  *
     873             :  * @details This function returns the IPv6 multicast hop limit value
     874             :  *          that is set to this context.
     875             :  *
     876             :  * @param context Network context.
     877             :  *
     878             :  * @return IPv6 multicast hop limit value
     879             :  */
     880           1 : static inline uint8_t net_context_get_ipv6_mcast_hop_limit(struct net_context *context)
     881             : {
     882             :         return context->ipv6_mcast_hop_limit;
     883             : }
     884             : 
     885             : /**
     886             :  * @brief Set IPv6 multicast hop limit value for this context.
     887             :  *
     888             :  * @details This function sets the IPv6 multicast hop limit value for
     889             :  *          this context.
     890             :  *
     891             :  * @param context Network context.
     892             :  * @param hop_limit IPv6 multicast hop limit value.
     893             :  */
     894           1 : static inline void net_context_set_ipv6_mcast_hop_limit(struct net_context *context,
     895             :                                                         uint8_t hop_limit)
     896             : {
     897             :         context->ipv6_mcast_hop_limit = hop_limit;
     898             : }
     899             : 
     900             : /**
     901             :  * @brief Enable or disable socks proxy support for this context.
     902             :  *
     903             :  * @details This function either enables or disables socks proxy support for
     904             :  *          this context.
     905             :  *
     906             :  * @param context Network context.
     907             :  * @param enable Enable socks proxy or disable it.
     908             :  */
     909             : #if defined(CONFIG_SOCKS)
     910             : static inline void net_context_set_proxy_enabled(struct net_context *context,
     911             :                                                  bool enable)
     912             : {
     913             :         context->proxy_enabled = enable;
     914             : }
     915             : #else
     916           1 : static inline void net_context_set_proxy_enabled(struct net_context *context,
     917             :                                                  bool enable)
     918             : {
     919             :         ARG_UNUSED(context);
     920             :         ARG_UNUSED(enable);
     921             : }
     922             : #endif
     923             : 
     924             : /**
     925             :  * @brief Is socks proxy support enabled or disabled for this context.
     926             :  *
     927             :  * @details This function returns current socks proxy status for
     928             :  *          this context.
     929             :  *
     930             :  * @param context Network context.
     931             :  *
     932             :  * @return True if socks proxy is enabled for this context, False otherwise
     933             :  */
     934             : #if defined(CONFIG_SOCKS)
     935             : static inline bool net_context_is_proxy_enabled(struct net_context *context)
     936             : {
     937             :         return context->proxy_enabled;
     938             : }
     939             : #else
     940           1 : static inline bool net_context_is_proxy_enabled(struct net_context *context)
     941             : {
     942             :         ARG_UNUSED(context);
     943             :         return false;
     944             : }
     945             : #endif
     946             : 
     947             : /**
     948             :  * @brief Get network context.
     949             :  *
     950             :  * @details Network context is used to define the connection 5-tuple
     951             :  * (protocol, remote address, remote port, source address and source
     952             :  * port). Random free port number will be assigned to source port when
     953             :  * context is created. This is similar as BSD socket() function.
     954             :  * The context will be created with a reference count of 1.
     955             :  *
     956             :  * @param family IP address family (AF_INET or AF_INET6)
     957             :  * @param type Type of the socket, SOCK_STREAM or SOCK_DGRAM
     958             :  * @param ip_proto IP protocol, IPPROTO_UDP or IPPROTO_TCP. For raw socket
     959             :  * access, the value is the L2 protocol value from IEEE 802.3 (see ethernet.h)
     960             :  * @param context The allocated context is returned to the caller.
     961             :  *
     962             :  * @return 0 if ok, < 0 if error
     963             :  */
     964           1 : int net_context_get(sa_family_t family,
     965             :                     enum net_sock_type type,
     966             :                     uint16_t ip_proto,
     967             :                     struct net_context **context);
     968             : 
     969             : /**
     970             :  * @brief Close and unref a network context.
     971             :  *
     972             :  * @details This releases the context. It is not possible to send or
     973             :  * receive data via this context after this call.  This is similar as
     974             :  * BSD shutdown() function.  For legacy compatibility, this function
     975             :  * will implicitly decrement the reference count and possibly destroy
     976             :  * the context either now or when it reaches a final state.
     977             :  *
     978             :  * @param context The context to be closed.
     979             :  *
     980             :  * @return 0 if ok, < 0 if error
     981             :  */
     982           1 : int net_context_put(struct net_context *context);
     983             : 
     984             : /**
     985             :  * @brief Take a reference count to a net_context, preventing destruction
     986             :  *
     987             :  * @details Network contexts are not recycled until their reference
     988             :  * count reaches zero.  Note that this does not prevent any "close"
     989             :  * behavior that results from errors or net_context_put.  It simply
     990             :  * prevents the context from being recycled for further use.
     991             :  *
     992             :  * @param context The context on which to increment the reference count
     993             :  *
     994             :  * @return The new reference count
     995             :  */
     996           1 : int net_context_ref(struct net_context *context);
     997             : 
     998             : /**
     999             :  * @brief Decrement the reference count to a network context
    1000             :  *
    1001             :  * @details Decrements the refcount.  If it reaches zero, the context
    1002             :  * will be recycled.  Note that this does not cause any
    1003             :  * network-visible "close" behavior (i.e. future packets to this
    1004             :  * connection may see TCP RST or ICMP port unreachable responses).  See
    1005             :  * net_context_put() for that.
    1006             :  *
    1007             :  * @param context The context on which to decrement the reference count
    1008             :  *
    1009             :  * @return The new reference count, zero if the context was destroyed
    1010             :  */
    1011           1 : int net_context_unref(struct net_context *context);
    1012             : 
    1013             : /**
    1014             :  * @brief Create IPv4 packet in provided net_pkt from context
    1015             :  *
    1016             :  * @param context Network context for a connection
    1017             :  * @param pkt Network packet
    1018             :  * @param src Source address, or NULL to choose a default
    1019             :  * @param dst Destination IPv4 address
    1020             :  *
    1021             :  * @return Return 0 on success, negative errno otherwise.
    1022             :  */
    1023             : #if defined(CONFIG_NET_IPV4)
    1024             : int net_context_create_ipv4_new(struct net_context *context,
    1025             :                                 struct net_pkt *pkt,
    1026             :                                 const struct in_addr *src,
    1027             :                                 const struct in_addr *dst);
    1028             : #else
    1029           1 : static inline int net_context_create_ipv4_new(struct net_context *context,
    1030             :                                               struct net_pkt *pkt,
    1031             :                                               const struct in_addr *src,
    1032             :                                               const struct in_addr *dst)
    1033             : {
    1034             :         return -1;
    1035             : }
    1036             : #endif /* CONFIG_NET_IPV4 */
    1037             : 
    1038             : /**
    1039             :  * @brief Create IPv6 packet in provided net_pkt from context
    1040             :  *
    1041             :  * @param context Network context for a connection
    1042             :  * @param pkt Network packet
    1043             :  * @param src Source address, or NULL to choose a default from context
    1044             :  * @param dst Destination IPv6 address
    1045             :  *
    1046             :  * @return Return 0 on success, negative errno otherwise.
    1047             :  */
    1048             : #if defined(CONFIG_NET_IPV6)
    1049             : int net_context_create_ipv6_new(struct net_context *context,
    1050             :                                 struct net_pkt *pkt,
    1051             :                                 const struct in6_addr *src,
    1052             :                                 const struct in6_addr *dst);
    1053             : #else
    1054           1 : static inline int net_context_create_ipv6_new(struct net_context *context,
    1055             :                                               struct net_pkt *pkt,
    1056             :                                               const struct in6_addr *src,
    1057             :                                               const struct in6_addr *dst)
    1058             : {
    1059             :         ARG_UNUSED(context);
    1060             :         ARG_UNUSED(pkt);
    1061             :         ARG_UNUSED(src);
    1062             :         ARG_UNUSED(dst);
    1063             :         return -1;
    1064             : }
    1065             : #endif /* CONFIG_NET_IPV6 */
    1066             : 
    1067             : /**
    1068             :  * @brief Assign a socket a local address.
    1069             :  *
    1070             :  * @details This is similar as BSD bind() function.
    1071             :  *
    1072             :  * @param context The context to be assigned.
    1073             :  * @param addr Address to assigned.
    1074             :  * @param addrlen Length of the address.
    1075             :  *
    1076             :  * @return 0 if ok, < 0 if error
    1077             :  */
    1078           1 : int net_context_bind(struct net_context *context,
    1079             :                      const struct sockaddr *addr,
    1080             :                      socklen_t addrlen);
    1081             : 
    1082             : /**
    1083             :  * @brief Mark the context as a listening one.
    1084             :  *
    1085             :  * @details This is similar as BSD listen() function.
    1086             :  *
    1087             :  * @param context The context to use.
    1088             :  * @param backlog The size of the pending connections backlog.
    1089             :  *
    1090             :  * @return 0 if ok, < 0 if error
    1091             :  */
    1092           1 : int net_context_listen(struct net_context *context,
    1093             :                        int backlog);
    1094             : 
    1095             : /**
    1096             :  * @brief            Create a network connection.
    1097             :  *
    1098             :  * @details          The net_context_connect function creates a network
    1099             :  *                   connection to the host specified by addr. After the
    1100             :  *                   connection is established, the user-supplied callback (cb)
    1101             :  *                   is executed. cb is called even if the timeout was set to
    1102             :  *                   K_FOREVER. cb is not called if the timeout expires.
    1103             :  *                   For datagram sockets (SOCK_DGRAM), this function only sets
    1104             :  *                   the peer address.
    1105             :  *                   This function is similar to the BSD connect() function.
    1106             :  *
    1107             :  * @param context    The network context.
    1108             :  * @param addr       The peer address to connect to.
    1109             :  * @param addrlen    Peer address length.
    1110             :  * @param cb         Callback function. Set to NULL if not required.
    1111             :  * @param timeout    The timeout value for the connection. Possible values:
    1112             :  *                   * K_NO_WAIT: this function will return immediately,
    1113             :  *                   * K_FOREVER: this function will block until the
    1114             :  *                                      connection is established,
    1115             :  *                   * >0: this function will wait the specified ms.
    1116             :  * @param user_data  Data passed to the callback function.
    1117             :  *
    1118             :  * @return           0 on success.
    1119             :  * @return           -EINVAL if an invalid parameter is passed as an argument.
    1120             :  * @return           -ENOTSUP if the operation is not supported or implemented.
    1121             :  * @return           -ETIMEDOUT if the connect operation times out.
    1122             :  */
    1123           1 : int net_context_connect(struct net_context *context,
    1124             :                         const struct sockaddr *addr,
    1125             :                         socklen_t addrlen,
    1126             :                         net_context_connect_cb_t cb,
    1127             :                         k_timeout_t timeout,
    1128             :                         void *user_data);
    1129             : 
    1130             : /**
    1131             :  * @brief Accept a network connection attempt.
    1132             :  *
    1133             :  * @details Accept a connection being established. This function
    1134             :  * will return immediately if the timeout is set to K_NO_WAIT.
    1135             :  * In this case the context will call the supplied callback when ever
    1136             :  * there is a connection established to this context. This is "a register
    1137             :  * handler and forget" type of call (async).
    1138             :  * If the timeout is set to K_FOREVER, the function will wait
    1139             :  * until the connection is established. Timeout value > 0, will wait as
    1140             :  * many ms.
    1141             :  * After the connection is established a caller-supplied callback is called.
    1142             :  * The callback is called even if timeout was set to K_FOREVER, the
    1143             :  * callback is called before this function will return in this case.
    1144             :  * The callback is not called if the timeout expires.
    1145             :  * This is similar as BSD accept() function.
    1146             :  *
    1147             :  * @param context The context to use.
    1148             :  * @param cb Caller-supplied callback function.
    1149             :  * @param timeout Timeout for the connection. Possible values
    1150             :  * are K_FOREVER, K_NO_WAIT, >0.
    1151             :  * @param user_data Caller-supplied user data.
    1152             :  *
    1153             :  * @return 0 if ok, < 0 if error
    1154             :  */
    1155           1 : int net_context_accept(struct net_context *context,
    1156             :                        net_tcp_accept_cb_t cb,
    1157             :                        k_timeout_t timeout,
    1158             :                        void *user_data);
    1159             : 
    1160             : /**
    1161             :  * @brief Send data to a peer.
    1162             :  *
    1163             :  * @details This function can be used to send network data to a peer
    1164             :  * connection. After the network buffer is sent, a caller-supplied
    1165             :  * callback is called. Note that the callback might be called after this
    1166             :  * function has returned. For context of type SOCK_DGRAM, the destination
    1167             :  * address must have been set by the call to net_context_connect().
    1168             :  * This is similar as BSD send() function.
    1169             :  *
    1170             :  * @param context The network context to use.
    1171             :  * @param buf The data buffer to send
    1172             :  * @param len Length of the buffer
    1173             :  * @param cb Caller-supplied callback function.
    1174             :  * @param timeout Currently this value is not used.
    1175             :  * @param user_data Caller-supplied user data.
    1176             :  *
    1177             :  * @return 0 if ok, < 0 if error
    1178             :  */
    1179           1 : int net_context_send(struct net_context *context,
    1180             :                      const void *buf,
    1181             :                      size_t len,
    1182             :                      net_context_send_cb_t cb,
    1183             :                      k_timeout_t timeout,
    1184             :                      void *user_data);
    1185             : 
    1186             : /**
    1187             :  * @brief Send data to a peer specified by address.
    1188             :  *
    1189             :  * @details This function can be used to send network data to a peer
    1190             :  * specified by address. This variant can only be used for datagram
    1191             :  * connections of type SOCK_DGRAM. After the network buffer is sent,
    1192             :  * a caller-supplied callback is called. Note that the callback might be
    1193             :  * called after this function has returned.
    1194             :  * This is similar as BSD sendto() function.
    1195             :  *
    1196             :  * @param context The network context to use.
    1197             :  * @param buf The data buffer to send
    1198             :  * @param len Length of the buffer
    1199             :  * @param dst_addr Destination address.
    1200             :  * @param addrlen Length of the address.
    1201             :  * @param cb Caller-supplied callback function.
    1202             :  * @param timeout Currently this value is not used.
    1203             :  * @param user_data Caller-supplied user data.
    1204             :  *
    1205             :  * @return numbers of bytes sent on success, a negative errno otherwise
    1206             :  */
    1207           1 : int net_context_sendto(struct net_context *context,
    1208             :                        const void *buf,
    1209             :                        size_t len,
    1210             :                        const struct sockaddr *dst_addr,
    1211             :                        socklen_t addrlen,
    1212             :                        net_context_send_cb_t cb,
    1213             :                        k_timeout_t timeout,
    1214             :                        void *user_data);
    1215             : 
    1216             : /**
    1217             :  * @brief Send data in iovec to a peer specified in msghdr struct.
    1218             :  *
    1219             :  * @details This function has similar semantics as Posix sendmsg() call.
    1220             :  * For unconnected socket, the msg_name field in msghdr must be set. For
    1221             :  * connected socket the msg_name should be set to NULL, and msg_namelen to 0.
    1222             :  * After the network buffer is sent, a caller-supplied callback is called.
    1223             :  * Note that the callback might be called after this function has returned.
    1224             :  *
    1225             :  * @param context The network context to use.
    1226             :  * @param msghdr The data to send
    1227             :  * @param flags Flags for the sending.
    1228             :  * @param cb Caller-supplied callback function.
    1229             :  * @param timeout Currently this value is not used.
    1230             :  * @param user_data Caller-supplied user data.
    1231             :  *
    1232             :  * @return numbers of bytes sent on success, a negative errno otherwise
    1233             :  */
    1234           1 : int net_context_sendmsg(struct net_context *context,
    1235             :                         const struct msghdr *msghdr,
    1236             :                         int flags,
    1237             :                         net_context_send_cb_t cb,
    1238             :                         k_timeout_t timeout,
    1239             :                         void *user_data);
    1240             : 
    1241             : /**
    1242             :  * @brief Receive network data from a peer specified by context.
    1243             :  *
    1244             :  * @details This function can be used to register a callback function
    1245             :  * that is called by the network stack when network data has been received
    1246             :  * for this context. As this function registers a callback, then there
    1247             :  * is no need to call this function multiple times if timeout is set to
    1248             :  * K_NO_WAIT.
    1249             :  * If callback function or user data changes, then the function can be called
    1250             :  * multiple times to register new values.
    1251             :  * This function will return immediately if the timeout is set to K_NO_WAIT.
    1252             :  * If the timeout is set to K_FOREVER, the function will wait until the
    1253             :  * network buffer is received. Timeout value > 0 will wait as many ms.
    1254             :  * After the network buffer is received, a caller-supplied callback is
    1255             :  * called. The callback is called even if timeout was set to K_FOREVER,
    1256             :  * the callback is called before this function will return in this case.
    1257             :  * The callback is not called if the timeout expires. The timeout functionality
    1258             :  * can be compiled out if synchronous behavior is not needed. The sync call
    1259             :  * logic requires some memory that can be saved if only async way of call is
    1260             :  * used. If CONFIG_NET_CONTEXT_SYNC_RECV is not set, then the timeout parameter
    1261             :  * value is ignored.
    1262             :  * This is similar as BSD recv() function.
    1263             :  * Note that net_context_bind() should be called before net_context_recv().
    1264             :  * Default random port number is assigned to local port. Only bind() will
    1265             :  * update connection information from context. If recv() is called before
    1266             :  * bind() call, it may refuse to bind to a context which already has
    1267             :  * a connection associated.
    1268             :  *
    1269             :  * @param context The network context to use.
    1270             :  * @param cb Caller-supplied callback function.
    1271             :  * @param timeout Caller-supplied timeout. Possible values
    1272             :  * are K_FOREVER, K_NO_WAIT, >0.
    1273             :  * @param user_data Caller-supplied user data.
    1274             :  *
    1275             :  * @return 0 if ok, < 0 if error
    1276             :  */
    1277           1 : int net_context_recv(struct net_context *context,
    1278             :                      net_context_recv_cb_t cb,
    1279             :                      k_timeout_t timeout,
    1280             :                      void *user_data);
    1281             : 
    1282             : /**
    1283             :  * @brief Update TCP receive window for context.
    1284             :  *
    1285             :  * @details This function should be used by an application which
    1286             :  * doesn't fully process incoming data in its receive callback,
    1287             :  * but for example, queues it. In this case, receive callback
    1288             :  * should decrease the window (call this function with a negative
    1289             :  * value) by the size of queued data, and function(s) which dequeue
    1290             :  * data - with positive value corresponding to the dequeued size.
    1291             :  * For example, if receive callback gets a packet with the data
    1292             :  * size of 256 and queues it, it should call this function with
    1293             :  * delta of -256. If a function extracts 10 bytes of the queued
    1294             :  * data, it should call it with delta of 10.
    1295             :  *
    1296             :  * @param context The TCP network context to use.
    1297             :  * @param delta Size, in bytes, by which to increase TCP receive
    1298             :  * window (negative value to decrease).
    1299             :  *
    1300             :  * @return 0 if ok, < 0 if error
    1301             :  */
    1302           1 : int net_context_update_recv_wnd(struct net_context *context,
    1303             :                                 int32_t delta);
    1304             : 
    1305             : /** @brief Network context options. These map to BSD socket option values. */
    1306           1 : enum net_context_option {
    1307             :         NET_OPT_PRIORITY          = 1,  /**< Context priority */
    1308             :         NET_OPT_TXTIME            = 2,  /**< TX time */
    1309             :         NET_OPT_SOCKS5            = 3,  /**< SOCKS5 */
    1310             :         NET_OPT_RCVTIMEO          = 4,  /**< Receive timeout */
    1311             :         NET_OPT_SNDTIMEO          = 5,  /**< Send timeout */
    1312             :         NET_OPT_RCVBUF            = 6,  /**< Receive buffer */
    1313             :         NET_OPT_SNDBUF            = 7,  /**< Send buffer */
    1314             :         NET_OPT_DSCP_ECN          = 8,  /**< DSCP ECN */
    1315             :         NET_OPT_REUSEADDR         = 9,  /**< Re-use address */
    1316             :         NET_OPT_REUSEPORT         = 10, /**< Re-use port */
    1317             :         NET_OPT_IPV6_V6ONLY       = 11, /**< Share IPv4 and IPv6 port space */
    1318             :         NET_OPT_RECV_PKTINFO      = 12, /**< Receive packet information */
    1319             :         NET_OPT_MCAST_TTL         = 13, /**< IPv4 multicast TTL */
    1320             :         NET_OPT_MCAST_HOP_LIMIT   = 14, /**< IPv6 multicast hop limit */
    1321             :         NET_OPT_UNICAST_HOP_LIMIT = 15, /**< IPv6 unicast hop limit */
    1322             :         NET_OPT_TTL               = 16, /**< IPv4 unicast TTL */
    1323             :         NET_OPT_ADDR_PREFERENCES  = 17, /**< IPv6 address preference */
    1324             :         NET_OPT_TIMESTAMPING      = 18, /**< Packet timestamping */
    1325             :         NET_OPT_MCAST_IFINDEX     = 19, /**< IPv6 multicast output network interface index */
    1326             :         NET_OPT_MTU               = 20, /**< IPv4 socket path MTU */
    1327             :         NET_OPT_LOCAL_PORT_RANGE  = 21, /**< Clamp local port range */
    1328             : };
    1329             : 
    1330             : /**
    1331             :  * @brief Set an connection option for this context.
    1332             :  *
    1333             :  * @param context The network context to use.
    1334             :  * @param option Option to set
    1335             :  * @param value Option value
    1336             :  * @param len Option length
    1337             :  *
    1338             :  * @return 0 if ok, <0 if error
    1339             :  */
    1340           1 : int net_context_set_option(struct net_context *context,
    1341             :                            enum net_context_option option,
    1342             :                            const void *value, size_t len);
    1343             : 
    1344             : /**
    1345             :  * @brief Get connection option value for this context.
    1346             :  *
    1347             :  * @param context The network context to use.
    1348             :  * @param option Option to set
    1349             :  * @param value Option value
    1350             :  * @param len Option length (returned to caller)
    1351             :  *
    1352             :  * @return 0 if ok, <0 if error
    1353             :  */
    1354           1 : int net_context_get_option(struct net_context *context,
    1355             :                            enum net_context_option option,
    1356             :                            void *value, size_t *len);
    1357             : 
    1358             : /**
    1359             :  * @typedef net_context_cb_t
    1360             :  * @brief Callback used while iterating over network contexts
    1361             :  *
    1362             :  * @param context A valid pointer on current network context
    1363             :  * @param user_data A valid pointer on some user data or NULL
    1364             :  */
    1365           1 : typedef void (*net_context_cb_t)(struct net_context *context, void *user_data);
    1366             : 
    1367             : /**
    1368             :  * @brief Go through all the network connections and call callback
    1369             :  * for each network context.
    1370             :  *
    1371             :  * @param cb User-supplied callback function to call.
    1372             :  * @param user_data User specified data.
    1373             :  */
    1374           1 : void net_context_foreach(net_context_cb_t cb, void *user_data);
    1375             : 
    1376             : /**
    1377             :  * @brief Set custom network buffer pools for context send operations
    1378             :  *
    1379             :  * Set custom network buffer pools used by the IP stack to allocate
    1380             :  * network buffers used by the context when sending data to the
    1381             :  * network. Using dedicated buffers may help make send operations on
    1382             :  * a given context more reliable, e.g. not be subject to buffer
    1383             :  * starvation due to operations on other network contexts. Buffer pools
    1384             :  * are set per context, but several contexts may share the same buffers.
    1385             :  * Note that there's no support for per-context custom receive packet
    1386             :  * pools.
    1387             :  *
    1388             :  * @param context Context that will use the given net_buf pools.
    1389             :  * @param tx_pool Pointer to the function that will return TX pool
    1390             :  * to the caller. The TX pool is used when sending data to network.
    1391             :  * There is one TX net_pkt for each network packet that is sent.
    1392             :  * @param data_pool Pointer to the function that will return DATA pool
    1393             :  * to the caller. The DATA pool is used to store data that is sent to
    1394             :  * the network.
    1395             :  */
    1396             : #if defined(CONFIG_NET_CONTEXT_NET_PKT_POOL)
    1397             : static inline void net_context_setup_pools(struct net_context *context,
    1398             :                                            net_pkt_get_slab_func_t tx_slab,
    1399             :                                            net_pkt_get_pool_func_t data_pool)
    1400             : {
    1401             :         NET_ASSERT(context);
    1402             : 
    1403             :         context->tx_slab = tx_slab;
    1404             :         context->data_pool = data_pool;
    1405             : }
    1406             : #else
    1407           1 : #define net_context_setup_pools(context, tx_pool, data_pool)
    1408             : #endif
    1409             : 
    1410             : /**
    1411             :  * @brief Check if a port is in use (bound)
    1412             :  *
    1413             :  * This function checks if a port is bound with respect to the specified
    1414             :  * @p ip_proto and @p local_addr.
    1415             :  *
    1416             :  * @param ip_proto the IP protocol
    1417             :  * @param local_port the port to check
    1418             :  * @param local_addr the network address
    1419             :  *
    1420             :  * @return true if the port is bound
    1421             :  * @return false if the port is not bound
    1422             :  */
    1423           1 : bool net_context_port_in_use(enum net_ip_protocol ip_proto,
    1424             :         uint16_t local_port, const struct sockaddr *local_addr);
    1425             : 
    1426             : #ifdef __cplusplus
    1427             : }
    1428             : #endif
    1429             : 
    1430             : /**
    1431             :  * @}
    1432             :  */
    1433             : 
    1434             : #endif /* ZEPHYR_INCLUDE_NET_NET_CONTEXT_H_ */

Generated by: LCOV version 1.14