LCOV - code coverage report
Current view: top level - zephyr/net - net_offload.h Coverage Total Hit
Test: new.info Lines: 100.0 % 1 1
Test Date: 2025-09-05 22:20:39

            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 offloading IP stack
      10              :  */
      11              : 
      12              : #ifndef ZEPHYR_INCLUDE_NET_NET_OFFLOAD_H_
      13              : #define ZEPHYR_INCLUDE_NET_NET_OFFLOAD_H_
      14              : 
      15              : /**
      16              :  * @brief Network offloading interface
      17              :  * @defgroup net_offload Network Offloading Interface
      18              :  * @since 1.7
      19              :  * @version 0.8.0
      20              :  * @ingroup networking
      21              :  * @{
      22              :  */
      23              : 
      24              : #include <zephyr/net_buf.h>
      25              : #include <zephyr/net/net_ip.h>
      26              : #include <zephyr/net/net_context.h>
      27              : 
      28              : #ifdef __cplusplus
      29              : extern "C" {
      30              : #endif
      31              : 
      32              : #if defined(CONFIG_NET_OFFLOAD)
      33              : 
      34              : /** @cond INTERNAL_HIDDEN */
      35              : 
      36              : static inline int32_t timeout_to_int32(k_timeout_t timeout)
      37              : {
      38              :         if (K_TIMEOUT_EQ(timeout, K_NO_WAIT)) {
      39              :                 return 0;
      40              :         } else if (K_TIMEOUT_EQ(timeout, K_FOREVER)) {
      41              :                 return -1;
      42              :         } else {
      43              :                 return k_ticks_to_ms_floor32(timeout.ticks);
      44              :         }
      45              : }
      46              : 
      47              : /** @endcond */
      48              : 
      49              : /** For return parameters and return values of the elements in this
      50              :  * struct, see similarly named functions in net_context.h
      51              :  */
      52              : struct net_offload {
      53              :         /**
      54              :          * This function is called when the socket is to be opened.
      55              :          */
      56              :         int (*get)(sa_family_t family,
      57              :                    enum net_sock_type type,
      58              :                    enum net_ip_protocol ip_proto,
      59              :                    struct net_context **context);
      60              : 
      61              :         /**
      62              :          * This function is called when user wants to bind to local IP address.
      63              :          */
      64              :         int (*bind)(struct net_context *context,
      65              :                     const struct sockaddr *addr,
      66              :                     socklen_t addrlen);
      67              : 
      68              :         /**
      69              :          * This function is called when user wants to mark the socket
      70              :          * to be a listening one.
      71              :          */
      72              :         int (*listen)(struct net_context *context, int backlog);
      73              : 
      74              :         /**
      75              :          * This function is called when user wants to create a connection
      76              :          * to a peer host.
      77              :          */
      78              :         int (*connect)(struct net_context *context,
      79              :                        const struct sockaddr *addr,
      80              :                        socklen_t addrlen,
      81              :                        net_context_connect_cb_t cb,
      82              :                        int32_t timeout,
      83              :                        void *user_data);
      84              : 
      85              :         /**
      86              :          * This function is called when user wants to accept a connection
      87              :          * being established.
      88              :          */
      89              :         int (*accept)(struct net_context *context,
      90              :                       net_tcp_accept_cb_t cb,
      91              :                       int32_t timeout,
      92              :                       void *user_data);
      93              : 
      94              :         /**
      95              :          * This function is called when user wants to send data to peer host.
      96              :          */
      97              :         int (*send)(struct net_pkt *pkt,
      98              :                     net_context_send_cb_t cb,
      99              :                     int32_t timeout,
     100              :                     void *user_data);
     101              : 
     102              :         /**
     103              :          * This function is called when user wants to send data to peer host.
     104              :          */
     105              :         int (*sendto)(struct net_pkt *pkt,
     106              :                       const struct sockaddr *dst_addr,
     107              :                       socklen_t addrlen,
     108              :                       net_context_send_cb_t cb,
     109              :                       int32_t timeout,
     110              :                       void *user_data);
     111              : 
     112              :         /**
     113              :          * This function is called when user wants to receive data from peer
     114              :          * host.
     115              :          */
     116              :         int (*recv)(struct net_context *context,
     117              :                     net_context_recv_cb_t cb,
     118              :                     int32_t timeout,
     119              :                     void *user_data);
     120              : 
     121              :         /**
     122              :          * This function is called when user wants to close the socket.
     123              :          */
     124              :         int (*put)(struct net_context *context);
     125              : };
     126              : 
     127              : /**
     128              :  * @brief Get a network socket/context from the offloaded IP stack.
     129              :  *
     130              :  * @details Network socket is used to define the connection
     131              :  * 5-tuple (protocol, remote address, remote port, source
     132              :  * address and source port). This is similar as BSD socket()
     133              :  * function.
     134              :  *
     135              :  * @param iface Network interface where the offloaded IP stack can be
     136              :  * reached.
     137              :  * @param family IP address family (AF_INET or AF_INET6)
     138              :  * @param type Type of the socket, SOCK_STREAM or SOCK_DGRAM
     139              :  * @param ip_proto IP protocol, IPPROTO_UDP or IPPROTO_TCP
     140              :  * @param context The allocated context is returned to the caller.
     141              :  *
     142              :  * @return 0 if ok, < 0 if error
     143              :  */
     144              : static inline int net_offload_get(struct net_if *iface,
     145              :                                   sa_family_t family,
     146              :                                   enum net_sock_type type,
     147              :                                   enum net_ip_protocol ip_proto,
     148              :                                   struct net_context **context)
     149              : {
     150              :         NET_ASSERT(iface);
     151              :         NET_ASSERT(net_if_offload(iface));
     152              :         NET_ASSERT(net_if_offload(iface)->get);
     153              : 
     154              :         return net_if_offload(iface)->get(family, type, ip_proto, context);
     155              : }
     156              : 
     157              : /**
     158              :  * @brief Assign a socket a local address.
     159              :  *
     160              :  * @details This is similar as BSD bind() function.
     161              :  *
     162              :  * @param iface Network interface where the offloaded IP stack can be
     163              :  * reached.
     164              :  * @param context The context to be assigned.
     165              :  * @param addr Address to assigned.
     166              :  * @param addrlen Length of the address.
     167              :  *
     168              :  * @return 0 if ok, < 0 if error
     169              :  */
     170              : static inline int net_offload_bind(struct net_if *iface,
     171              :                                    struct net_context *context,
     172              :                                    const struct sockaddr *addr,
     173              :                                    socklen_t addrlen)
     174              : {
     175              :         NET_ASSERT(iface);
     176              :         NET_ASSERT(net_if_offload(iface));
     177              :         NET_ASSERT(net_if_offload(iface)->bind);
     178              : 
     179              :         return net_if_offload(iface)->bind(context, addr, addrlen);
     180              : }
     181              : 
     182              : /**
     183              :  * @brief Mark the context as a listening one.
     184              :  *
     185              :  * @details This is similar as BSD listen() function.
     186              :  *
     187              :  * @param iface Network interface where the offloaded IP stack can be
     188              :  * reached.
     189              :  * @param context The context to use.
     190              :  * @param backlog The size of the pending connections backlog.
     191              :  *
     192              :  * @return 0 if ok, < 0 if error
     193              :  */
     194              : static inline int net_offload_listen(struct net_if *iface,
     195              :                                      struct net_context *context,
     196              :                                      int backlog)
     197              : {
     198              :         NET_ASSERT(iface);
     199              :         NET_ASSERT(net_if_offload(iface));
     200              :         NET_ASSERT(net_if_offload(iface)->listen);
     201              : 
     202              :         return net_if_offload(iface)->listen(context, backlog);
     203              : }
     204              : 
     205              : /**
     206              :  * @brief            Create a network connection.
     207              :  *
     208              :  * @details          The net_context_connect function creates a network
     209              :  *                   connection to the host specified by addr. After the
     210              :  *                   connection is established, the user-supplied callback (cb)
     211              :  *                   is executed. cb is called even if the timeout was set to
     212              :  *                   K_FOREVER. cb is not called if the timeout expires.
     213              :  *                   For datagram sockets (SOCK_DGRAM), this function only sets
     214              :  *                   the peer address.
     215              :  *                   This function is similar to the BSD connect() function.
     216              :  *
     217              :  * @param iface      Network interface where the offloaded IP stack can be
     218              :  *                   reached.
     219              :  * @param context    The network context.
     220              :  * @param addr       The peer address to connect to.
     221              :  * @param addrlen    Peer address length.
     222              :  * @param cb         Callback function. Set to NULL if not required.
     223              :  * @param timeout    The timeout value for the connection. Possible values:
     224              :  *                   * K_NO_WAIT: this function will return immediately,
     225              :  *                   * K_FOREVER: this function will block until the
     226              :  *                                      connection is established,
     227              :  *                   * >0: this function will wait the specified ms.
     228              :  * @param user_data  Data passed to the callback function.
     229              :  *
     230              :  * @return           0 on success.
     231              :  * @return           -EINVAL if an invalid parameter is passed as an argument.
     232              :  * @return           -ENOTSUP if the operation is not supported or implemented.
     233              :  */
     234              : static inline int net_offload_connect(struct net_if *iface,
     235              :                                       struct net_context *context,
     236              :                                       const struct sockaddr *addr,
     237              :                                       socklen_t addrlen,
     238              :                                       net_context_connect_cb_t cb,
     239              :                                       k_timeout_t timeout,
     240              :                                       void *user_data)
     241              : {
     242              :         NET_ASSERT(iface);
     243              :         NET_ASSERT(net_if_offload(iface));
     244              :         NET_ASSERT(net_if_offload(iface)->connect);
     245              : 
     246              :         return net_if_offload(iface)->connect(
     247              :                 context, addr, addrlen, cb,
     248              :                 timeout_to_int32(timeout),
     249              :                 user_data);
     250              : }
     251              : 
     252              : /**
     253              :  * @brief Accept a network connection attempt.
     254              :  *
     255              :  * @details Accept a connection being established. This function
     256              :  * will return immediately if the timeout is set to K_NO_WAIT.
     257              :  * In this case the context will call the supplied callback when ever
     258              :  * there is a connection established to this context. This is "a register
     259              :  * handler and forget" type of call (async).
     260              :  * If the timeout is set to K_FOREVER, the function will wait
     261              :  * until the connection is established. Timeout value > 0, will wait as
     262              :  * many ms.
     263              :  * After the connection is established a caller-supplied callback is called.
     264              :  * The callback is called even if timeout was set to K_FOREVER, the
     265              :  * callback is called before this function will return in this case.
     266              :  * The callback is not called if the timeout expires.
     267              :  * This is similar as BSD accept() function.
     268              :  *
     269              :  * @param iface Network interface where the offloaded IP stack can be
     270              :  * reached.
     271              :  * @param context The context to use.
     272              :  * @param cb Caller-supplied callback function.
     273              :  * @param timeout Timeout for the connection. Possible values
     274              :  * are K_FOREVER, K_NO_WAIT, >0.
     275              :  * @param user_data Caller-supplied user data.
     276              :  *
     277              :  * @return 0 if ok, < 0 if error
     278              :  */
     279              : static inline int net_offload_accept(struct net_if *iface,
     280              :                                      struct net_context *context,
     281              :                                      net_tcp_accept_cb_t cb,
     282              :                                      k_timeout_t timeout,
     283              :                                      void *user_data)
     284              : {
     285              :         NET_ASSERT(iface);
     286              :         NET_ASSERT(net_if_offload(iface));
     287              :         NET_ASSERT(net_if_offload(iface)->accept);
     288              : 
     289              :         return net_if_offload(iface)->accept(
     290              :                 context, cb,
     291              :                 timeout_to_int32(timeout),
     292              :                 user_data);
     293              : }
     294              : 
     295              : /**
     296              :  * @brief Send a network packet to a peer.
     297              :  *
     298              :  * @details This function can be used to send network data to a peer
     299              :  * connection. This function will return immediately if the timeout
     300              :  * is set to K_NO_WAIT. If the timeout is set to K_FOREVER, the function
     301              :  * will wait until the network packet is sent. Timeout value > 0 will
     302              :  * wait as many ms. After the network packet is sent,
     303              :  * a caller-supplied callback is called. The callback is called even
     304              :  * if timeout was set to K_FOREVER, the callback is called
     305              :  * before this function will return in this case. The callback is not
     306              :  * called if the timeout expires. For context of type SOCK_DGRAM,
     307              :  * the destination address must have been set by the call to
     308              :  * net_context_connect().
     309              :  * This is similar as BSD send() function.
     310              :  *
     311              :  * @param iface Network interface where the offloaded IP stack can be
     312              :  * reached.
     313              :  * @param pkt The network packet to send.
     314              :  * @param cb Caller-supplied callback function.
     315              :  * @param timeout Timeout for the connection. Possible values
     316              :  * are K_FOREVER, K_NO_WAIT, >0.
     317              :  * @param user_data Caller-supplied user data.
     318              :  *
     319              :  * @return 0 if ok, < 0 if error
     320              :  */
     321              : static inline int net_offload_send(struct net_if *iface,
     322              :                                    struct net_pkt *pkt,
     323              :                                    net_context_send_cb_t cb,
     324              :                                    k_timeout_t timeout,
     325              :                                    void *user_data)
     326              : {
     327              :         NET_ASSERT(iface);
     328              :         NET_ASSERT(net_if_offload(iface));
     329              :         NET_ASSERT(net_if_offload(iface)->send);
     330              : 
     331              :         return net_if_offload(iface)->send(
     332              :                 pkt, cb,
     333              :                 timeout_to_int32(timeout),
     334              :                 user_data);
     335              : }
     336              : 
     337              : /**
     338              :  * @brief Send a network packet to a peer specified by address.
     339              :  *
     340              :  * @details This function can be used to send network data to a peer
     341              :  * specified by address. This variant can only be used for datagram
     342              :  * connections of type SOCK_DGRAM. This function will return immediately
     343              :  * if the timeout is set to K_NO_WAIT. If the timeout is set to K_FOREVER,
     344              :  * the function will wait until the network packet is sent. Timeout
     345              :  * value > 0 will wait as many ms. After the network packet
     346              :  * is sent, a caller-supplied callback is called. The callback is called
     347              :  * even if timeout was set to K_FOREVER, the callback is called
     348              :  * before this function will return. The callback is not called if the
     349              :  * timeout expires.
     350              :  * This is similar as BSD sendto() function.
     351              :  *
     352              :  * @param iface Network interface where the offloaded IP stack can be
     353              :  * reached.
     354              :  * @param pkt The network packet to send.
     355              :  * @param dst_addr Destination address. This will override the address
     356              :  * already set in network packet.
     357              :  * @param addrlen Length of the address.
     358              :  * @param cb Caller-supplied callback function.
     359              :  * @param timeout Timeout for the connection. Possible values
     360              :  * are K_FOREVER, K_NO_WAIT, >0.
     361              :  * @param user_data Caller-supplied user data.
     362              :  *
     363              :  * @return 0 if ok, < 0 if error
     364              :  */
     365              : static inline int net_offload_sendto(struct net_if *iface,
     366              :                                      struct net_pkt *pkt,
     367              :                                      const struct sockaddr *dst_addr,
     368              :                                      socklen_t addrlen,
     369              :                                      net_context_send_cb_t cb,
     370              :                                      k_timeout_t timeout,
     371              :                                      void *user_data)
     372              : {
     373              :         NET_ASSERT(iface);
     374              :         NET_ASSERT(net_if_offload(iface));
     375              :         NET_ASSERT(net_if_offload(iface)->sendto);
     376              : 
     377              :         return net_if_offload(iface)->sendto(
     378              :                 pkt, dst_addr, addrlen, cb,
     379              :                 timeout_to_int32(timeout),
     380              :                 user_data);
     381              : }
     382              : 
     383              : /**
     384              :  * @brief Receive network data from a peer specified by context.
     385              :  *
     386              :  * @details This function can be used to register a callback function
     387              :  * that is called by the network stack when network data has been received
     388              :  * for this context. As this function registers a callback, then there
     389              :  * is no need to call this function multiple times if timeout is set to
     390              :  * K_NO_WAIT.
     391              :  * If callback function or user data changes, then the function can be called
     392              :  * multiple times to register new values.
     393              :  * This function will return immediately if the timeout is set to K_NO_WAIT.
     394              :  * If the timeout is set to K_FOREVER, the function will wait until the
     395              :  * network packet is received. Timeout value > 0 will wait as many ms.
     396              :  * After the network packet is received, a caller-supplied callback is
     397              :  * called. The callback is called even if timeout was set to K_FOREVER,
     398              :  * the callback is called before this function will return in this case.
     399              :  * The callback is not called if the timeout expires. The timeout functionality
     400              :  * can be compiled out if synchronous behavior is not needed. The sync call
     401              :  * logic requires some memory that can be saved if only async way of call is
     402              :  * used. If CONFIG_NET_CONTEXT_SYNC_RECV is not set, then the timeout parameter
     403              :  * value is ignored.
     404              :  * This is similar as BSD recv() function.
     405              :  *
     406              :  * @param iface Network interface where the offloaded IP stack can be
     407              :  * reached.
     408              :  * @param context The network context to use.
     409              :  * @param cb Caller-supplied callback function.
     410              :  * @param timeout Caller-supplied timeout. Possible values
     411              :  * are K_FOREVER, K_NO_WAIT, >0.
     412              :  * @param user_data Caller-supplied user data.
     413              :  *
     414              :  * @return 0 if ok, < 0 if error
     415              :  */
     416              : static inline int net_offload_recv(struct net_if *iface,
     417              :                                    struct net_context *context,
     418              :                                    net_context_recv_cb_t cb,
     419              :                                    k_timeout_t timeout,
     420              :                                    void *user_data)
     421              : {
     422              :         NET_ASSERT(iface);
     423              :         NET_ASSERT(net_if_offload(iface));
     424              :         NET_ASSERT(net_if_offload(iface)->recv);
     425              : 
     426              :         return net_if_offload(iface)->recv(
     427              :                 context, cb,
     428              :                 timeout_to_int32(timeout),
     429              :                 user_data);
     430              : }
     431              : 
     432              : /**
     433              :  * @brief Free/close a network context.
     434              :  *
     435              :  * @details This releases the context. It is not possible to
     436              :  * send or receive data via this context after this call.
     437              :  * This is similar as BSD shutdown() function.
     438              :  *
     439              :  * @param iface Network interface where the offloaded IP stack can be
     440              :  * reached.
     441              :  * @param context The context to be closed.
     442              :  *
     443              :  * @return 0 if ok, < 0 if error
     444              :  */
     445              : static inline int net_offload_put(struct net_if *iface,
     446              :                                   struct net_context *context)
     447              : {
     448              :         NET_ASSERT(iface);
     449              :         NET_ASSERT(net_if_offload(iface));
     450              :         NET_ASSERT(net_if_offload(iface)->put);
     451              : 
     452              :         return net_if_offload(iface)->put(context);
     453              : }
     454              : 
     455              : #else
     456              : 
     457              : /** @cond INTERNAL_HIDDEN */
     458              : 
     459              : static inline int net_offload_get(struct net_if *iface,
     460              :                                   sa_family_t family,
     461              :                                   enum net_sock_type type,
     462              :                                   enum net_ip_protocol ip_proto,
     463              :                                   struct net_context **context)
     464              : {
     465              :         return 0;
     466              : }
     467              : 
     468              : static inline int net_offload_bind(struct net_if *iface,
     469              :                                    struct net_context *context,
     470              :                                    const struct sockaddr *addr,
     471              :                                    socklen_t addrlen)
     472              : {
     473              :         return 0;
     474              : }
     475              : 
     476              : static inline int net_offload_listen(struct net_if *iface,
     477              :                                      struct net_context *context,
     478              :                                      int backlog)
     479              : {
     480              :         return 0;
     481              : }
     482              : 
     483              : static inline int net_offload_connect(struct net_if *iface,
     484              :                                       struct net_context *context,
     485              :                                       const struct sockaddr *addr,
     486              :                                       socklen_t addrlen,
     487              :                                       net_context_connect_cb_t cb,
     488              :                                       k_timeout_t timeout,
     489              :                                       void *user_data)
     490              : {
     491              :         return 0;
     492              : }
     493              : 
     494              : static inline int net_offload_accept(struct net_if *iface,
     495              :                                      struct net_context *context,
     496              :                                      net_tcp_accept_cb_t cb,
     497              :                                      k_timeout_t timeout,
     498              :                                      void *user_data)
     499              : {
     500              :         return 0;
     501              : }
     502              : 
     503              : static inline int net_offload_send(struct net_if *iface,
     504              :                                    struct net_pkt *pkt,
     505              :                                    net_context_send_cb_t cb,
     506              :                                    k_timeout_t timeout,
     507              :                                    void *user_data)
     508              : {
     509              :         return 0;
     510              : }
     511              : 
     512              : static inline int net_offload_sendto(struct net_if *iface,
     513              :                                      struct net_pkt *pkt,
     514              :                                      const struct sockaddr *dst_addr,
     515              :                                      socklen_t addrlen,
     516              :                                      net_context_send_cb_t cb,
     517              :                                      k_timeout_t timeout,
     518              :                                      void *user_data)
     519              : {
     520              :         return 0;
     521              : }
     522              : 
     523              : static inline int net_offload_recv(struct net_if *iface,
     524              :                                    struct net_context *context,
     525              :                                    net_context_recv_cb_t cb,
     526              :                                    k_timeout_t timeout,
     527              :                                    void *user_data)
     528              : {
     529              :         return 0;
     530              : }
     531              : 
     532              : static inline int net_offload_put(struct net_if *iface,
     533              :                                   struct net_context *context)
     534              : {
     535              :         return 0;
     536              : }
     537              : 
     538              : /** @endcond */
     539              : 
     540              : #endif /* CONFIG_NET_OFFLOAD */
     541              : 
     542              : #ifdef __cplusplus
     543              : }
     544              : #endif
     545              : 
     546              : /**
     547              :  * @}
     548              :  */
     549              : 
     550              : #endif /* ZEPHYR_INCLUDE_NET_NET_OFFLOAD_H_ */
        

Generated by: LCOV version 2.0-1