Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
net_context.h
Go to the documentation of this file.
1
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
24#include <kernel.h>
25#include <sys/atomic.h>
26
27#include <net/net_ip.h>
28#include <net/net_if.h>
29#include <net/net_stats.h>
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
36#define NET_CONTEXT_IN_USE BIT(0)
37
47};
48
54#define NET_CONTEXT_FAMILY (BIT(3) | BIT(4) | BIT(5))
55
57#define NET_CONTEXT_TYPE (BIT(6) | BIT(7))
58
60#define NET_CONTEXT_REMOTE_ADDR_SET BIT(8)
61
63#define NET_CONTEXT_ACCEPTING_SOCK BIT(9)
64
66#define NET_CONTEXT_CLOSING_SOCK BIT(10)
67
68/* Context is bound to a specific interface */
69#define NET_CONTEXT_BOUND_TO_IFACE BIT(11)
70
71struct net_context;
72
93typedef void (*net_context_recv_cb_t)(struct net_context *context,
94 struct net_pkt *pkt,
95 union net_ip_header *ip_hdr,
96 union net_proto_header *proto_hdr,
97 int status,
98 void *user_data);
99
114typedef void (*net_context_send_cb_t)(struct net_context *context,
115 int status,
116 void *user_data);
117
134typedef void (*net_tcp_accept_cb_t)(struct net_context *new_context,
135 struct sockaddr *addr,
136 socklen_t addrlen,
137 int status,
138 void *user_data);
139
161typedef void (*net_context_connect_cb_t)(struct net_context *context,
162 int status,
163 void *user_data);
164
165/* The net_pkt_get_slab_func_t is here in order to avoid circular
166 * dependency between net_pkt.h and net_context.h
167 */
176typedef struct k_mem_slab *(*net_pkt_get_slab_func_t)(void);
177
178/* The net_pkt_get_pool_func_t is here in order to avoid circular
179 * dependency between net_pkt.h and net_context.h
180 */
189typedef struct net_buf_pool *(*net_pkt_get_pool_func_t)(void);
190
191struct net_tcp;
192
193struct net_conn_handle;
194
201__net_socket struct net_context {
208
212
215 struct k_mutex lock;
216
220 struct sockaddr_ptr local;
221
226
228 struct net_conn_handle *conn_handler;
229
234
239
244
245#if defined(CONFIG_NET_CONTEXT_NET_PKT_POOL)
249
252 net_pkt_get_pool_func_t data_pool;
253#endif /* CONFIG_NET_CONTEXT_NET_PKT_POOL */
254
255#if defined(CONFIG_NET_TCP2)
257 void *tcp;
258#endif /* CONFIG_NET_TCP2 */
259
260#if defined(CONFIG_NET_CONTEXT_SYNC_RECV)
264 struct k_sem recv_data_wait;
265#endif /* CONFIG_NET_CONTEXT_SYNC_RECV */
266
267#if defined(CONFIG_NET_SOCKETS)
269 void *socket_data;
270
272 union {
273 struct k_fifo recv_q;
274 struct k_fifo accept_q;
275 };
276
277 struct {
279 struct k_condvar recv;
280
282 struct k_mutex *lock;
283 } cond;
284#endif /* CONFIG_NET_SOCKETS */
285
286#if defined(CONFIG_NET_OFFLOAD)
288 void *offload_context;
289#endif /* CONFIG_NET_OFFLOAD */
290
291#if defined(CONFIG_NET_SOCKETS_CAN)
292 int can_filter_id;
293#endif /* CONFIG_NET_SOCKETS_CAN */
294
296 struct {
297#if defined(CONFIG_NET_CONTEXT_PRIORITY)
299 uint8_t priority;
300#endif
301#if defined(CONFIG_NET_CONTEXT_TXTIME)
302 bool txtime;
303#endif
304#if defined(CONFIG_SOCKS)
305 struct {
306 struct sockaddr addr;
307 socklen_t addrlen;
308 } proxy;
309#endif
310#if defined(CONFIG_NET_CONTEXT_RCVTIMEO)
311 k_timeout_t rcvtimeo;
312#endif
313#if defined(CONFIG_NET_CONTEXT_SNDTIMEO)
314 k_timeout_t sndtimeo;
315#endif
317
320
323
326
328 union {
331 };
332
333#if defined(CONFIG_SOCKS)
334 bool proxy_enabled;
335#endif
336
337};
338
339static inline bool net_context_is_used(struct net_context *context)
340{
341 NET_ASSERT(context);
342
343 return context->flags & NET_CONTEXT_IN_USE;
344}
345
346static inline bool net_context_is_bound_to_iface(struct net_context *context)
347{
348 NET_ASSERT(context);
349
350 return context->flags & NET_CONTEXT_BOUND_TO_IFACE;
351}
352
360static inline bool net_context_is_accepting(struct net_context *context)
361{
362 NET_ASSERT(context);
363
364 return context->flags & NET_CONTEXT_ACCEPTING_SOCK;
365}
366
373static inline void net_context_set_accepting(struct net_context *context,
374 bool accepting)
375{
376 NET_ASSERT(context);
377
378 if (accepting) {
380 } else {
381 context->flags &= ~NET_CONTEXT_ACCEPTING_SOCK;
382 }
383}
384
392static inline bool net_context_is_closing(struct net_context *context)
393{
394 NET_ASSERT(context);
395
396 return context->flags & NET_CONTEXT_CLOSING_SOCK;
397}
398
405static inline void net_context_set_closing(struct net_context *context,
406 bool closing)
407{
408 NET_ASSERT(context);
409
410 if (closing) {
412 } else {
413 context->flags &= ~NET_CONTEXT_CLOSING_SOCK;
414 }
415}
416
417#define NET_CONTEXT_STATE_SHIFT 1
418#define NET_CONTEXT_STATE_MASK 0x03
419
429static inline
431{
432 NET_ASSERT(context);
433
434 return (enum net_context_state)
435 ((context->flags >> NET_CONTEXT_STATE_SHIFT) &
437}
438
447static inline void net_context_set_state(struct net_context *context,
449{
450 NET_ASSERT(context);
451
453 context->flags |= ((state & NET_CONTEXT_STATE_MASK) <<
455}
456
467static inline sa_family_t net_context_get_family(struct net_context *context)
468{
469 NET_ASSERT(context);
470
471 return ((context->flags & NET_CONTEXT_FAMILY) >> 3);
472}
473
483static inline void net_context_set_family(struct net_context *context,
484 sa_family_t family)
485{
486 uint8_t flag = 0U;
487
488 NET_ASSERT(context);
489
490 if (family == AF_UNSPEC || family == AF_INET || family == AF_INET6 ||
491 family == AF_PACKET || family == AF_CAN) {
492 /* Family is in BIT(4), BIT(5) and BIT(6) */
493 flag = family << 3;
494 }
495
496 context->flags |= flag;
497}
498
509static inline
511{
512 NET_ASSERT(context);
513
514 return (enum net_sock_type)((context->flags & NET_CONTEXT_TYPE) >> 6);
515}
516
526static inline void net_context_set_type(struct net_context *context,
527 enum net_sock_type type)
528{
529 uint16_t flag = 0U;
530
531 NET_ASSERT(context);
532
533 if (type == SOCK_DGRAM || type == SOCK_STREAM || type == SOCK_RAW) {
534 /* Type is in BIT(6) and BIT(7)*/
535 flag = type << 6;
536 }
537
538 context->flags |= flag;
539}
540
549#if defined(CONFIG_NET_SOCKETS_CAN)
550static inline void net_context_set_filter_id(struct net_context *context,
551 int filter_id)
552{
553 NET_ASSERT(context);
554
555 context->can_filter_id = filter_id;
556}
557#else
558static inline void net_context_set_filter_id(struct net_context *context,
559 int filter_id)
560{
561 ARG_UNUSED(context);
562 ARG_UNUSED(filter_id);
563}
564#endif
565
575#if defined(CONFIG_NET_SOCKETS_CAN)
576static inline int net_context_get_filter_id(struct net_context *context)
577{
578 NET_ASSERT(context);
579
580 return context->can_filter_id;
581}
582#else
583static inline int net_context_get_filter_id(struct net_context *context)
584{
585 ARG_UNUSED(context);
586
587 return -1;
588}
589#endif
590
601static inline uint16_t net_context_get_ip_proto(struct net_context *context)
602{
603 return context->proto;
604}
605
616static inline void net_context_set_ip_proto(struct net_context *context,
617 uint16_t proto)
618{
619 context->proto = proto;
620}
621
632static inline
634{
635 NET_ASSERT(context);
636
637 return net_if_get_by_index(context->iface);
638}
639
648static inline void net_context_set_iface(struct net_context *context,
649 struct net_if *iface)
650{
651 NET_ASSERT(iface);
652
653 context->iface = net_if_get_by_iface(iface);
654}
655
656static inline uint8_t net_context_get_ipv4_ttl(struct net_context *context)
657{
658 return context->ipv4_ttl;
659}
660
661static inline void net_context_set_ipv4_ttl(struct net_context *context,
662 uint8_t ttl)
663{
664 context->ipv4_ttl = ttl;
665}
666
668{
669 return context->ipv6_hop_limit;
670}
671
672static inline void net_context_set_ipv6_hop_limit(struct net_context *context,
673 uint8_t hop_limit)
674{
675 context->ipv6_hop_limit = hop_limit;
676}
677
678#if defined(CONFIG_SOCKS)
679static inline void net_context_set_proxy_enabled(struct net_context *context,
680 bool enable)
681{
682 context->proxy_enabled = enable;
683}
684
685static inline bool net_context_is_proxy_enabled(struct net_context *context)
686{
687 return context->proxy_enabled;
688}
689#else
690static inline void net_context_set_proxy_enabled(struct net_context *context,
691 bool enable)
692{
693 ARG_UNUSED(context);
694 ARG_UNUSED(enable);
695}
696
697static inline bool net_context_is_proxy_enabled(struct net_context *context)
698{
699 return false;
700}
701#endif
702
721 enum net_sock_type type,
722 uint16_t ip_proto,
723 struct net_context **context);
724
738int net_context_put(struct net_context *context);
739
752int net_context_ref(struct net_context *context);
753
767int net_context_unref(struct net_context *context);
768
779#if defined(CONFIG_NET_IPV4)
780int net_context_create_ipv4_new(struct net_context *context,
781 struct net_pkt *pkt,
782 const struct in_addr *src,
783 const struct in_addr *dst);
784#else
785static inline int net_context_create_ipv4_new(struct net_context *context,
786 struct net_pkt *pkt,
787 const struct in_addr *src,
788 const struct in_addr *dst)
789{
790 return -1;
791}
792#endif /* CONFIG_NET_IPV4 */
793
804#if defined(CONFIG_NET_IPV6)
805int net_context_create_ipv6_new(struct net_context *context,
806 struct net_pkt *pkt,
807 const struct in6_addr *src,
808 const struct in6_addr *dst);
809#else
810static inline int net_context_create_ipv6_new(struct net_context *context,
811 struct net_pkt *pkt,
812 const struct in6_addr *src,
813 const struct in6_addr *dst)
814{
815 return -1;
816}
817#endif /* CONFIG_NET_IPV6 */
818
830int net_context_bind(struct net_context *context,
831 const struct sockaddr *addr,
832 socklen_t addrlen);
833
844int net_context_listen(struct net_context *context,
845 int backlog);
846
876 const struct sockaddr *addr,
877 socklen_t addrlen,
880 void *user_data);
881
907int net_context_accept(struct net_context *context,
910 void *user_data);
911
931int net_context_send(struct net_context *context,
932 const void *buf,
933 size_t len,
936 void *user_data);
937
959int net_context_sendto(struct net_context *context,
960 const void *buf,
961 size_t len,
962 const struct sockaddr *dst_addr,
963 socklen_t addrlen,
966 void *user_data);
967
987 const struct msghdr *msghdr,
988 int flags,
991 void *user_data);
992
1029int net_context_recv(struct net_context *context,
1032 void *user_data);
1033
1055 int32_t delta);
1056
1063};
1064
1076 enum net_context_option option,
1077 const void *value, size_t len);
1078
1090 enum net_context_option option,
1091 void *value, size_t *len);
1092
1100typedef void (*net_context_cb_t)(struct net_context *context, void *user_data);
1101
1110
1131#if defined(CONFIG_NET_CONTEXT_NET_PKT_POOL)
1132static inline void net_context_setup_pools(struct net_context *context,
1134 net_pkt_get_pool_func_t data_pool)
1135{
1136 NET_ASSERT(context);
1137
1138 context->tx_slab = tx_slab;
1139 context->data_pool = data_pool;
1140}
1141#else
1142#define net_context_setup_pools(context, tx_pool, data_pool)
1143#endif
1144
1159 uint16_t local_port, const struct sockaddr *local_addr);
1160
1161#ifdef __cplusplus
1162}
1163#endif
1164
1169#endif /* ZEPHYR_INCLUDE_NET_NET_CONTEXT_H_ */
int atomic_t
Definition: atomic.h:21
ZTEST_BMEM int timeout
Definition: main.c:31
void
Definition: eswifi_shell.c:15
unsigned short int sa_family_t
Definition: net_ip.h:158
#define AF_CAN
Definition: net_ip.h:56
#define AF_INET
Definition: net_ip.h:53
#define AF_INET6
Definition: net_ip.h:54
#define AF_PACKET
Definition: net_ip.h:55
net_sock_type
Definition: net_ip.h:84
size_t socklen_t
Definition: net_ip.h:161
#define AF_UNSPEC
Definition: net_ip.h:52
net_ip_protocol
Definition: net_ip.h:62
@ SOCK_DGRAM
Definition: net_ip.h:86
@ SOCK_RAW
Definition: net_ip.h:87
@ SOCK_STREAM
Definition: net_ip.h:85
static void net_context_set_type(struct net_context *context, enum net_sock_type type)
Set context type for this network context.
Definition: net_context.h:526
void(* net_context_cb_t)(struct net_context *context, void *user_data)
Callback used while iterating over network contexts.
Definition: net_context.h:1100
void(* net_context_recv_cb_t)(struct net_context *context, struct net_pkt *pkt, union net_ip_header *ip_hdr, union net_proto_header *proto_hdr, int status, void *user_data)
Network data receive callback.
Definition: net_context.h:93
static void net_context_set_ipv6_hop_limit(struct net_context *context, uint8_t hop_limit)
Definition: net_context.h:672
int net_context_unref(struct net_context *context)
Decrement the reference count to a network context.
int net_context_bind(struct net_context *context, const struct sockaddr *addr, socklen_t addrlen)
Assign a socket a local address.
static void net_context_set_iface(struct net_context *context, struct net_if *iface)
Set network interface for this context.
Definition: net_context.h:648
static void net_context_set_ipv4_ttl(struct net_context *context, uint8_t ttl)
Definition: net_context.h:661
int net_context_accept(struct net_context *context, net_tcp_accept_cb_t cb, k_timeout_t timeout, void *user_data)
Accept a network connection attempt.
int net_context_put(struct net_context *context)
Close and unref a network context.
static enum net_sock_type net_context_get_type(struct net_context *context)
Get context type for this network context.
Definition: net_context.h:510
static bool net_context_is_accepting(struct net_context *context)
Is this context is accepting data now.
Definition: net_context.h:360
static sa_family_t net_context_get_family(struct net_context *context)
Get address family for this network context.
Definition: net_context.h:467
static bool net_context_is_bound_to_iface(struct net_context *context)
Definition: net_context.h:346
static void net_context_set_filter_id(struct net_context *context, int filter_id)
Set CAN filter id for this network context.
Definition: net_context.h:558
void(* net_tcp_accept_cb_t)(struct net_context *new_context, struct sockaddr *addr, socklen_t addrlen, int status, void *user_data)
Accept callback.
Definition: net_context.h:134
static void net_context_set_ip_proto(struct net_context *context, uint16_t proto)
Set context IP protocol for this network context.
Definition: net_context.h:616
int net_context_listen(struct net_context *context, int backlog)
Mark the context as a listening one.
static bool net_context_is_used(struct net_context *context)
Definition: net_context.h:339
int net_context_sendmsg(struct net_context *context, const struct msghdr *msghdr, int flags, net_context_send_cb_t cb, k_timeout_t timeout, void *user_data)
Send data in iovec to a peer specified in msghdr struct.
struct k_mem_slab *(* net_pkt_get_slab_func_t)(void)
Function that is called to get the slab that is used for net_pkt allocations.
Definition: net_context.h:176
int net_context_ref(struct net_context *context)
Take a reference count to a net_context, preventing destruction.
static uint16_t net_context_get_ip_proto(struct net_context *context)
Get context IP protocol for this network context.
Definition: net_context.h:601
void(* net_context_send_cb_t)(struct net_context *context, int status, void *user_data)
Network data send callback.
Definition: net_context.h:114
static enum net_context_state net_context_get_state(struct net_context *context)
Get state for this network context.
Definition: net_context.h:430
struct net_buf_pool *(* net_pkt_get_pool_func_t)(void)
Function that is called to get the pool that is used for net_buf allocations.
Definition: net_context.h:189
int net_context_connect(struct net_context *context, const struct sockaddr *addr, socklen_t addrlen, net_context_connect_cb_t cb, k_timeout_t timeout, void *user_data)
Create a network connection.
static bool net_context_is_proxy_enabled(struct net_context *context)
Definition: net_context.h:697
#define NET_CONTEXT_IN_USE
Definition: net_context.h:36
static void net_context_set_accepting(struct net_context *context, bool accepting)
Set this context to accept data now.
Definition: net_context.h:373
net_context_state
Definition: net_context.h:39
bool net_context_port_in_use(enum net_ip_protocol ip_proto, uint16_t local_port, const struct sockaddr *local_addr)
Check if a port is in use (bound)
static void net_context_set_family(struct net_context *context, sa_family_t family)
Set address family for this network context.
Definition: net_context.h:483
static int net_context_create_ipv6_new(struct net_context *context, struct net_pkt *pkt, const struct in6_addr *src, const struct in6_addr *dst)
Create IPv6 packet in provided net_pkt from context.
Definition: net_context.h:810
static int net_context_create_ipv4_new(struct net_context *context, struct net_pkt *pkt, const struct in_addr *src, const struct in_addr *dst)
Create IPv4 packet in provided net_pkt from context.
Definition: net_context.h:785
int net_context_recv(struct net_context *context, net_context_recv_cb_t cb, k_timeout_t timeout, void *user_data)
Receive network data from a peer specified by context.
static int net_context_get_filter_id(struct net_context *context)
Get CAN filter id for this network context.
Definition: net_context.h:583
#define NET_CONTEXT_CLOSING_SOCK
Definition: net_context.h:66
static uint8_t net_context_get_ipv6_hop_limit(struct net_context *context)
Definition: net_context.h:667
static void net_context_set_closing(struct net_context *context, bool closing)
Set this context to closing.
Definition: net_context.h:405
static void net_context_set_proxy_enabled(struct net_context *context, bool enable)
Definition: net_context.h:690
static uint8_t net_context_get_ipv4_ttl(struct net_context *context)
Definition: net_context.h:656
#define NET_CONTEXT_BOUND_TO_IFACE
Definition: net_context.h:69
void(* net_context_connect_cb_t)(struct net_context *context, int status, void *user_data)
Connection callback.
Definition: net_context.h:161
static void net_context_set_state(struct net_context *context, enum net_context_state state)
Set state for this network context.
Definition: net_context.h:447
net_context_option
Definition: net_context.h:1057
int net_context_update_recv_wnd(struct net_context *context, int32_t delta)
Update TCP receive window for context.
void net_context_foreach(net_context_cb_t cb, void *user_data)
Go through all the network connections and call callback for each network context.
int net_context_set_option(struct net_context *context, enum net_context_option option, const void *value, size_t len)
Set an connection option for this context.
#define NET_CONTEXT_STATE_MASK
Definition: net_context.h:418
int net_context_send(struct net_context *context, const void *buf, size_t len, net_context_send_cb_t cb, k_timeout_t timeout, void *user_data)
Send data to a peer.
static bool net_context_is_closing(struct net_context *context)
Is this context closing.
Definition: net_context.h:392
#define NET_CONTEXT_FAMILY
Definition: net_context.h:54
#define NET_CONTEXT_TYPE
Definition: net_context.h:57
#define NET_CONTEXT_STATE_SHIFT
Definition: net_context.h:417
#define net_context_setup_pools(context, tx_pool, data_pool)
Set custom network buffer pools for context send operations.
Definition: net_context.h:1142
int net_context_get(sa_family_t family, enum net_sock_type type, uint16_t ip_proto, struct net_context **context)
Get network context.
#define NET_CONTEXT_ACCEPTING_SOCK
Definition: net_context.h:63
int net_context_get_option(struct net_context *context, enum net_context_option option, void *value, size_t *len)
Get connection option value for this context.
int net_context_sendto(struct net_context *context, const void *buf, size_t len, const struct sockaddr *dst_addr, socklen_t addrlen, net_context_send_cb_t cb, k_timeout_t timeout, void *user_data)
Send data to a peer specified by address.
static struct net_if * net_context_get_iface(struct net_context *context)
Get network interface for this context.
Definition: net_context.h:633
@ NET_CONTEXT_CONNECTED
Definition: net_context.h:45
@ NET_CONTEXT_IDLE
Definition: net_context.h:40
@ NET_CONTEXT_CONNECTING
Definition: net_context.h:43
@ NET_CONTEXT_READY
Definition: net_context.h:44
@ NET_CONTEXT_UNCONNECTED
Definition: net_context.h:41
@ NET_CONTEXT_CONFIGURING
Definition: net_context.h:42
@ NET_CONTEXT_LISTENING
Definition: net_context.h:46
@ NET_OPT_PRIORITY
Definition: net_context.h:1058
@ NET_OPT_RCVTIMEO
Definition: net_context.h:1061
@ NET_OPT_TXTIME
Definition: net_context.h:1059
@ NET_OPT_SNDTIMEO
Definition: net_context.h:1062
@ NET_OPT_SOCKS5
Definition: net_context.h:1060
int net_if_get_by_iface(struct net_if *iface)
Get interface index according to pointer.
struct net_if * net_if_get_by_index(int index)
Get interface according to index.
flags
Definition: http_parser.h:131
state
Definition: http_parser_state.h:30
Public API for network interface.
IPv6 and IPv4 definitions.
Network statistics.
__INT32_TYPE__ int32_t
Definition: stdint.h:44
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
__UINT16_TYPE__ uint16_t
Definition: stdint.h:59
__INT8_TYPE__ int8_t
Definition: stdint.h:42
Definition: net_ip.h:139
Definition: net_ip.h:148
Definition: kernel.h:2786
Definition: kernel.h:2153
Definition: kernel.h:2680
Kernel timeout type.
Definition: sys_clock.h:65
Definition: net_ip.h:229
Network buffer pool representation.
Definition: buf.h:983
Definition: net_context.h:201
atomic_t refcount
Definition: net_context.h:211
void * user_data
Definition: net_context.h:207
uint16_t flags
Definition: net_context.h:322
net_context_send_cb_t send_cb
Definition: net_context.h:238
struct sockaddr remote
Definition: net_context.h:225
struct k_mutex lock
Definition: net_context.h:215
struct sockaddr_ptr local
Definition: net_context.h:220
uint8_t ipv4_ttl
Definition: net_context.h:330
struct net_context::@161 options
net_context_connect_cb_t connect_cb
Definition: net_context.h:243
struct net_conn_handle * conn_handler
Definition: net_context.h:228
uint16_t proto
Definition: net_context.h:319
int8_t iface
Definition: net_context.h:325
net_context_recv_cb_t recv_cb
Definition: net_context.h:233
uint8_t ipv6_hop_limit
Definition: net_context.h:329
Network Interface structure.
Definition: net_if.h:468
Network packet.
Definition: net_pkt.h:62
Definition: net_ip.h:335
Definition: wifi_winc1500.c:134
static uint32_t flag[3]
Definition: thread_competition.c:23
static const intptr_t user_data[5]
Definition: main.c:590
NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec)