1 /** @file
2  @brief Generic connection handling.
3 
4  This is not to be included by the application.
5  */
6 
7 /*
8  * Copyright (c) 2016 Intel Corporation
9  *
10  * SPDX-License-Identifier: Apache-2.0
11  */
12 
13 #ifndef __CONNECTION_H
14 #define __CONNECTION_H
15 
16 #include <zephyr/types.h>
17 
18 #include <zephyr/sys/util.h>
19 
20 #include <zephyr/net/net_context.h>
21 #include <zephyr/net/net_core.h>
22 #include <zephyr/net/net_ip.h>
23 #include <zephyr/net/net_pkt.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 struct net_conn;
30 
31 struct net_conn_handle;
32 
33 /**
34  * @brief Function that is called by connection subsystem when a
35  * net packet is received which matches local and remote address
36  * (and port in case of TCP/UDP packets).
37  *
38  * The arguments ip_hdr and proto_hdr are NULL in case of non-IP
39  * protocols.
40  */
41 typedef enum net_verdict (*net_conn_cb_t)(struct net_conn *conn,
42 					  struct net_pkt *pkt,
43 					  union net_ip_header *ip_hdr,
44 					  union net_proto_header *proto_hdr,
45 					  void *user_data);
46 
47 /**
48  * @brief Information about a connection in the system.
49  *
50  * Stores the connection information.
51  *
52  */
53 struct net_conn {
54 	/** Internal slist node */
55 	sys_snode_t node;
56 
57 	/** Remote socket address */
58 	struct sockaddr remote_addr;
59 
60 	/** Local socket address */
61 	struct sockaddr local_addr;
62 
63 	/** Callback to be called when matching net packet is received */
64 	net_conn_cb_t cb;
65 
66 	/** A pointer to the net_context corresponding to the connection.
67 	 *  Can be NULL if no net_context is associated.
68 	 */
69 	struct net_context *context;
70 
71 	/** Possible user to pass to the callback */
72 	void *user_data;
73 
74 	/** Connection protocol */
75 	uint16_t proto;
76 
77 	/** Protocol family */
78 	uint8_t family;
79 
80 	/** Flags for the connection */
81 	uint8_t flags;
82 
83 	/** Is v4-mapping-to-v6 enabled for this connection */
84 	uint8_t v6only : 1;
85 };
86 
87 /**
88  * @brief Register a callback to be called when a net packet
89  * is received corresponding to received packet.
90  *
91  * @param proto Protocol for the connection (depends on the protocol
92  *              family, e.g. UDP/TCP in the case of AF_INET/AF_INET6)
93  * @param family Protocol family (AF_*)
94  * @param remote_addr Remote address of the connection end point.
95  * @param local_addr Local address of the connection end point.
96  * @param remote_port Remote port of the connection end point.
97  * @param local_port Local port of the connection end point.
98  * @param cb Callback to be called when a matching net pkt is received
99  * @param context net_context structure related to the connection.
100  * @param user_data User data supplied by caller.
101  * @param handle Connection handle that can be used when unregistering
102  *
103  * @return Return 0 if the registration succeed, <0 otherwise.
104  */
105 #if defined(CONFIG_NET_NATIVE)
106 int net_conn_register(uint16_t proto, uint8_t family,
107 		      const struct sockaddr *remote_addr,
108 		      const struct sockaddr *local_addr,
109 		      uint16_t remote_port,
110 		      uint16_t local_port,
111 		      struct net_context *context,
112 		      net_conn_cb_t cb,
113 		      void *user_data,
114 		      struct net_conn_handle **handle);
115 #else
net_conn_register(uint16_t proto,uint8_t family,const struct sockaddr * remote_addr,const struct sockaddr * local_addr,uint16_t remote_port,uint16_t local_port,struct net_context * context,net_conn_cb_t cb,void * user_data,struct net_conn_handle ** handle)116 static inline int net_conn_register(uint16_t proto, uint8_t family,
117 				    const struct sockaddr *remote_addr,
118 				    const struct sockaddr *local_addr,
119 				    uint16_t remote_port,
120 				    uint16_t local_port,
121 				    struct net_context *context,
122 				    net_conn_cb_t cb,
123 				    void *user_data,
124 				    struct net_conn_handle **handle)
125 {
126 	ARG_UNUSED(proto);
127 	ARG_UNUSED(family);
128 	ARG_UNUSED(remote_addr);
129 	ARG_UNUSED(local_addr);
130 	ARG_UNUSED(remote_port);
131 	ARG_UNUSED(local_port);
132 	ARG_UNUSED(cb);
133 	ARG_UNUSED(context);
134 	ARG_UNUSED(user_data);
135 	ARG_UNUSED(handle);
136 
137 	return -ENOTSUP;
138 }
139 #endif
140 
141 /**
142  * @brief Unregister connection handler.
143  *
144  * @param handle Handle from registering.
145  *
146  * @return Return 0 if the unregistration succeed, <0 otherwise.
147  */
148 #if defined(CONFIG_NET_NATIVE)
149 int net_conn_unregister(struct net_conn_handle *handle);
150 #else
net_conn_unregister(struct net_conn_handle * handle)151 static inline int net_conn_unregister(struct net_conn_handle *handle)
152 {
153 	ARG_UNUSED(handle);
154 
155 	return -ENOTSUP;
156 }
157 #endif
158 
159 /**
160  * @brief Update the callback, user data, remote address, and port
161  * for a registered connection handle.
162  *
163  * @param handle A handle registered with net_conn_register()
164  * @param cb Callback to be called
165  * @param user_data User data supplied by caller.
166  * @param remote_addr Remote address
167  * @param remote_port Remote port
168  *
169  * @return Return 0 if the change succeed, <0 otherwise.
170  */
171 int net_conn_update(struct net_conn_handle *handle,
172 		    net_conn_cb_t cb,
173 		    void *user_data,
174 		    const struct sockaddr *remote_addr,
175 		    uint16_t remote_port);
176 
177 /**
178  * @brief Called by net_core.c when a network packet is received.
179  *
180  * @param pkt Network packet holding received data
181  * @param proto Protocol for the connection
182  *
183  * @return NET_OK if the packet was consumed, NET_DROP if
184  * the packet parsing failed and the caller should handle
185  * the received packet. If corresponding IP protocol support is
186  * disabled, the function will always return NET_DROP.
187  */
188 #if defined(CONFIG_NET_IP) || defined(CONFIG_NET_CONNECTION_SOCKETS)
189 enum net_verdict net_conn_input(struct net_pkt *pkt,
190 				union net_ip_header *ip_hdr,
191 				uint8_t proto,
192 				union net_proto_header *proto_hdr);
193 #else
net_conn_input(struct net_pkt * pkt,union net_ip_header * ip_hdr,uint8_t proto,union net_proto_header * proto_hdr)194 static inline enum net_verdict net_conn_input(struct net_pkt *pkt,
195 					      union net_ip_header *ip_hdr,
196 					      uint8_t proto,
197 					      union net_proto_header *proto_hdr)
198 {
199 	return NET_DROP;
200 }
201 #endif /* CONFIG_NET_IP || CONFIG_NET_CONNECTION_SOCKETS */
202 
203 /**
204  * @typedef net_conn_foreach_cb_t
205  * @brief Callback used while iterating over network connection
206  * handlers.
207  *
208  * @param conn A valid pointer on current network connection handler.
209  * @param user_data A valid pointer on some user data or NULL
210  */
211 typedef void (*net_conn_foreach_cb_t)(struct net_conn *conn, void *user_data);
212 
213 /**
214  * @brief Go through all the network connection handlers and call callback
215  * for each network connection handler.
216  *
217  * @param cb User supplied callback function to call.
218  * @param user_data User specified data.
219  */
220 void net_conn_foreach(net_conn_foreach_cb_t cb, void *user_data);
221 
222 #if defined(CONFIG_NET_NATIVE)
223 void net_conn_init(void);
224 #else
225 #define net_conn_init(...)
226 #endif
227 
228 #ifdef __cplusplus
229 }
230 #endif
231 
232 #endif /* __CONNECTION_H */
233