xref: /aosp_15_r20/external/libwebsockets/lib/plat/optee/network.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * libwebsockets - small server side websockets and web server implementation
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Copyright (C) 2010 - 2019 Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*1c60b9acSAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to
8*1c60b9acSAndroid Build Coastguard Worker  * deal in the Software without restriction, including without limitation the
9*1c60b9acSAndroid Build Coastguard Worker  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*1c60b9acSAndroid Build Coastguard Worker  * sell copies of the Software, and to permit persons to whom the Software is
11*1c60b9acSAndroid Build Coastguard Worker  * furnished to do so, subject to the following conditions:
12*1c60b9acSAndroid Build Coastguard Worker  *
13*1c60b9acSAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
14*1c60b9acSAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
15*1c60b9acSAndroid Build Coastguard Worker  *
16*1c60b9acSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*1c60b9acSAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*1c60b9acSAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*1c60b9acSAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*1c60b9acSAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*1c60b9acSAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*1c60b9acSAndroid Build Coastguard Worker  * IN THE SOFTWARE.
23*1c60b9acSAndroid Build Coastguard Worker  */
24*1c60b9acSAndroid Build Coastguard Worker 
25*1c60b9acSAndroid Build Coastguard Worker #include "private-lib-core.h"
26*1c60b9acSAndroid Build Coastguard Worker 
27*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_MBEDTLS)
28*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_HAVE_MBEDTLS_NET_SOCKETS)
29*1c60b9acSAndroid Build Coastguard Worker #include "mbedtls/net_sockets.h"
30*1c60b9acSAndroid Build Coastguard Worker #else
31*1c60b9acSAndroid Build Coastguard Worker #include "mbedtls/net.h"
32*1c60b9acSAndroid Build Coastguard Worker #endif
33*1c60b9acSAndroid Build Coastguard Worker #endif
34*1c60b9acSAndroid Build Coastguard Worker 
35*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_pipe_create(struct lws * wsi)36*1c60b9acSAndroid Build Coastguard Worker lws_plat_pipe_create(struct lws *wsi)
37*1c60b9acSAndroid Build Coastguard Worker {
38*1c60b9acSAndroid Build Coastguard Worker 	return 1;
39*1c60b9acSAndroid Build Coastguard Worker }
40*1c60b9acSAndroid Build Coastguard Worker 
41*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_pipe_signal(struct lws * wsi)42*1c60b9acSAndroid Build Coastguard Worker lws_plat_pipe_signal(struct lws *wsi)
43*1c60b9acSAndroid Build Coastguard Worker {
44*1c60b9acSAndroid Build Coastguard Worker 	return 1;
45*1c60b9acSAndroid Build Coastguard Worker }
46*1c60b9acSAndroid Build Coastguard Worker 
47*1c60b9acSAndroid Build Coastguard Worker void
lws_plat_pipe_close(struct lws * wsi)48*1c60b9acSAndroid Build Coastguard Worker lws_plat_pipe_close(struct lws *wsi)
49*1c60b9acSAndroid Build Coastguard Worker {
50*1c60b9acSAndroid Build Coastguard Worker }
51*1c60b9acSAndroid Build Coastguard Worker 
52*1c60b9acSAndroid Build Coastguard Worker int
lws_send_pipe_choked(struct lws * wsi)53*1c60b9acSAndroid Build Coastguard Worker lws_send_pipe_choked(struct lws *wsi)
54*1c60b9acSAndroid Build Coastguard Worker {
55*1c60b9acSAndroid Build Coastguard Worker 	struct lws *wsi_eff;
56*1c60b9acSAndroid Build Coastguard Worker 
57*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_HTTP2)
58*1c60b9acSAndroid Build Coastguard Worker 	wsi_eff = lws_get_network_wsi(wsi);
59*1c60b9acSAndroid Build Coastguard Worker #else
60*1c60b9acSAndroid Build Coastguard Worker 	wsi_eff = wsi;
61*1c60b9acSAndroid Build Coastguard Worker #endif
62*1c60b9acSAndroid Build Coastguard Worker 
63*1c60b9acSAndroid Build Coastguard Worker 	/* the fact we checked implies we avoided back-to-back writes */
64*1c60b9acSAndroid Build Coastguard Worker 	wsi_eff->could_have_pending = 0;
65*1c60b9acSAndroid Build Coastguard Worker 
66*1c60b9acSAndroid Build Coastguard Worker 	/* treat the fact we got a truncated send pending as if we're choked */
67*1c60b9acSAndroid Build Coastguard Worker 	if (lws_has_buffered_out(wsi_eff)
68*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_HTTP_STREAM_COMPRESSION)
69*1c60b9acSAndroid Build Coastguard Worker 	    || wsi->http.comp_ctx.buflist_comp ||
70*1c60b9acSAndroid Build Coastguard Worker 	       wsi->http.comp_ctx.may_have_more
71*1c60b9acSAndroid Build Coastguard Worker #endif
72*1c60b9acSAndroid Build Coastguard Worker 	)
73*1c60b9acSAndroid Build Coastguard Worker 		return 1;
74*1c60b9acSAndroid Build Coastguard Worker 
75*1c60b9acSAndroid Build Coastguard Worker 	/* okay to send another packet without blocking */
76*1c60b9acSAndroid Build Coastguard Worker 
77*1c60b9acSAndroid Build Coastguard Worker 	return 0;
78*1c60b9acSAndroid Build Coastguard Worker }
79*1c60b9acSAndroid Build Coastguard Worker 
80*1c60b9acSAndroid Build Coastguard Worker int
lws_poll_listen_fd(struct lws_pollfd * fd)81*1c60b9acSAndroid Build Coastguard Worker lws_poll_listen_fd(struct lws_pollfd *fd)
82*1c60b9acSAndroid Build Coastguard Worker {
83*1c60b9acSAndroid Build Coastguard Worker //	return poll(fd, 1, 0);
84*1c60b9acSAndroid Build Coastguard Worker 
85*1c60b9acSAndroid Build Coastguard Worker 	return 0;
86*1c60b9acSAndroid Build Coastguard Worker }
87*1c60b9acSAndroid Build Coastguard Worker 
88*1c60b9acSAndroid Build Coastguard Worker 
89*1c60b9acSAndroid Build Coastguard Worker int
_lws_plat_service_tsi(struct lws_context * context,int timeout_ms,int tsi)90*1c60b9acSAndroid Build Coastguard Worker _lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
91*1c60b9acSAndroid Build Coastguard Worker {
92*1c60b9acSAndroid Build Coastguard Worker 	lws_usec_t timeout_us = timeout_ms * LWS_US_PER_MS;
93*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_per_thread *pt;
94*1c60b9acSAndroid Build Coastguard Worker 	int n = -1, m, c, a = 0;
95*1c60b9acSAndroid Build Coastguard Worker 	//char buf;
96*1c60b9acSAndroid Build Coastguard Worker 
97*1c60b9acSAndroid Build Coastguard Worker 	/* stay dead once we are dead */
98*1c60b9acSAndroid Build Coastguard Worker 
99*1c60b9acSAndroid Build Coastguard Worker 	if (!context)
100*1c60b9acSAndroid Build Coastguard Worker 		return 1;
101*1c60b9acSAndroid Build Coastguard Worker 
102*1c60b9acSAndroid Build Coastguard Worker 	pt = &context->pt[tsi];
103*1c60b9acSAndroid Build Coastguard Worker 
104*1c60b9acSAndroid Build Coastguard Worker 	if (timeout_ms < 0)
105*1c60b9acSAndroid Build Coastguard Worker 		timeout_ms = 0;
106*1c60b9acSAndroid Build Coastguard Worker 	else
107*1c60b9acSAndroid Build Coastguard Worker 		timeout_ms = 2000000000;
108*1c60b9acSAndroid Build Coastguard Worker 
109*1c60b9acSAndroid Build Coastguard Worker 	if (!pt->service_tid_detected && context->vhost_list) {
110*1c60b9acSAndroid Build Coastguard Worker 		struct lws _lws;
111*1c60b9acSAndroid Build Coastguard Worker 
112*1c60b9acSAndroid Build Coastguard Worker 		memset(&_lws, 0, sizeof(_lws));
113*1c60b9acSAndroid Build Coastguard Worker 		_lws.context = context;
114*1c60b9acSAndroid Build Coastguard Worker 
115*1c60b9acSAndroid Build Coastguard Worker 		pt->service_tid = context->vhost_list->protocols[0].callback(
116*1c60b9acSAndroid Build Coastguard Worker 			&_lws, LWS_CALLBACK_GET_THREAD_ID, NULL, NULL, 0);
117*1c60b9acSAndroid Build Coastguard Worker 		pt->service_tid_detected = 1;
118*1c60b9acSAndroid Build Coastguard Worker 	}
119*1c60b9acSAndroid Build Coastguard Worker 
120*1c60b9acSAndroid Build Coastguard Worker 	/*
121*1c60b9acSAndroid Build Coastguard Worker 	 * is there anybody with pending stuff that needs service forcing?
122*1c60b9acSAndroid Build Coastguard Worker 	 */
123*1c60b9acSAndroid Build Coastguard Worker 	if (lws_service_adjust_timeout(context, 1, tsi)) {
124*1c60b9acSAndroid Build Coastguard Worker again:
125*1c60b9acSAndroid Build Coastguard Worker 		a = 0;
126*1c60b9acSAndroid Build Coastguard Worker 		if (timeout_us) {
127*1c60b9acSAndroid Build Coastguard Worker 			lws_usec_t us;
128*1c60b9acSAndroid Build Coastguard Worker 
129*1c60b9acSAndroid Build Coastguard Worker 			lws_pt_lock(pt, __func__);
130*1c60b9acSAndroid Build Coastguard Worker 			/* don't stay in poll wait longer than next hr timeout */
131*1c60b9acSAndroid Build Coastguard Worker 			us = __lws_sul_service_ripe(pt->pt_sul_owner,
132*1c60b9acSAndroid Build Coastguard Worker 						    LWS_COUNT_PT_SUL_OWNERS,
133*1c60b9acSAndroid Build Coastguard Worker 						    lws_now_usecs());
134*1c60b9acSAndroid Build Coastguard Worker 			if (us && us < timeout_us)
135*1c60b9acSAndroid Build Coastguard Worker 				timeout_us = us;
136*1c60b9acSAndroid Build Coastguard Worker 
137*1c60b9acSAndroid Build Coastguard Worker 			lws_pt_unlock(pt);
138*1c60b9acSAndroid Build Coastguard Worker 		}
139*1c60b9acSAndroid Build Coastguard Worker 
140*1c60b9acSAndroid Build Coastguard Worker 		n = poll(pt->fds, pt->fds_count, timeout_us / LWS_US_PER_MS);
141*1c60b9acSAndroid Build Coastguard Worker 
142*1c60b9acSAndroid Build Coastguard Worker 		m = 0;
143*1c60b9acSAndroid Build Coastguard Worker 
144*1c60b9acSAndroid Build Coastguard Worker 		if (pt->context->tls_ops &&
145*1c60b9acSAndroid Build Coastguard Worker 		    pt->context->tls_ops->fake_POLLIN_for_buffered)
146*1c60b9acSAndroid Build Coastguard Worker 			m = pt->context->tls_ops->fake_POLLIN_for_buffered(pt);
147*1c60b9acSAndroid Build Coastguard Worker 
148*1c60b9acSAndroid Build Coastguard Worker 		if (/*!pt->ws.rx_draining_ext_list && */!m && !n) /* nothing to do */
149*1c60b9acSAndroid Build Coastguard Worker 			return 0;
150*1c60b9acSAndroid Build Coastguard Worker 	} else
151*1c60b9acSAndroid Build Coastguard Worker 		a = 1;
152*1c60b9acSAndroid Build Coastguard Worker 
153*1c60b9acSAndroid Build Coastguard Worker 	m = lws_service_flag_pending(context, tsi);
154*1c60b9acSAndroid Build Coastguard Worker 	if (m)
155*1c60b9acSAndroid Build Coastguard Worker 		c = -1; /* unknown limit */
156*1c60b9acSAndroid Build Coastguard Worker 	else
157*1c60b9acSAndroid Build Coastguard Worker 		if (n < 0) {
158*1c60b9acSAndroid Build Coastguard Worker 			if (LWS_ERRNO != LWS_EINTR)
159*1c60b9acSAndroid Build Coastguard Worker 				return -1;
160*1c60b9acSAndroid Build Coastguard Worker 			return 0;
161*1c60b9acSAndroid Build Coastguard Worker 		} else
162*1c60b9acSAndroid Build Coastguard Worker 			c = n;
163*1c60b9acSAndroid Build Coastguard Worker 
164*1c60b9acSAndroid Build Coastguard Worker 	/* any socket with events to service? */
165*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < (int)pt->fds_count && c; n++) {
166*1c60b9acSAndroid Build Coastguard Worker 		if (!pt->fds[n].revents)
167*1c60b9acSAndroid Build Coastguard Worker 			continue;
168*1c60b9acSAndroid Build Coastguard Worker 
169*1c60b9acSAndroid Build Coastguard Worker 		c--;
170*1c60b9acSAndroid Build Coastguard Worker #if 0
171*1c60b9acSAndroid Build Coastguard Worker 		if (pt->fds[n].fd == pt->dummy_pipe_fds[0]) {
172*1c60b9acSAndroid Build Coastguard Worker 			if (read(pt->fds[n].fd, &buf, 1) != 1)
173*1c60b9acSAndroid Build Coastguard Worker 				lwsl_err("Cannot read from dummy pipe.");
174*1c60b9acSAndroid Build Coastguard Worker 			continue;
175*1c60b9acSAndroid Build Coastguard Worker 		}
176*1c60b9acSAndroid Build Coastguard Worker #endif
177*1c60b9acSAndroid Build Coastguard Worker 		m = lws_service_fd_tsi(context, &pt->fds[n], tsi);
178*1c60b9acSAndroid Build Coastguard Worker 		if (m < 0)
179*1c60b9acSAndroid Build Coastguard Worker 			return -1;
180*1c60b9acSAndroid Build Coastguard Worker 		/* if something closed, retry this slot */
181*1c60b9acSAndroid Build Coastguard Worker 		if (m)
182*1c60b9acSAndroid Build Coastguard Worker 			n--;
183*1c60b9acSAndroid Build Coastguard Worker 	}
184*1c60b9acSAndroid Build Coastguard Worker 
185*1c60b9acSAndroid Build Coastguard Worker 	if (a)
186*1c60b9acSAndroid Build Coastguard Worker 		goto again;
187*1c60b9acSAndroid Build Coastguard Worker 
188*1c60b9acSAndroid Build Coastguard Worker 	return 0;
189*1c60b9acSAndroid Build Coastguard Worker }
190*1c60b9acSAndroid Build Coastguard Worker 
191*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_service(struct lws_context * context,int timeout_ms)192*1c60b9acSAndroid Build Coastguard Worker lws_plat_service(struct lws_context *context, int timeout_ms)
193*1c60b9acSAndroid Build Coastguard Worker {
194*1c60b9acSAndroid Build Coastguard Worker 	return _lws_plat_service_tsi(context, timeout_ms, 0);
195*1c60b9acSAndroid Build Coastguard Worker }
196*1c60b9acSAndroid Build Coastguard Worker 
197*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_set_socket_options(struct lws_vhost * vhost,int fd,int unix_skt)198*1c60b9acSAndroid Build Coastguard Worker lws_plat_set_socket_options(struct lws_vhost *vhost, int fd, int unix_skt)
199*1c60b9acSAndroid Build Coastguard Worker {
200*1c60b9acSAndroid Build Coastguard Worker 	return 0;
201*1c60b9acSAndroid Build Coastguard Worker }
202*1c60b9acSAndroid Build Coastguard Worker 
203*1c60b9acSAndroid Build Coastguard Worker 
204*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_write_cert(struct lws_vhost * vhost,int is_key,int fd,void * buf,size_t len)205*1c60b9acSAndroid Build Coastguard Worker lws_plat_write_cert(struct lws_vhost *vhost, int is_key, int fd, void *buf,
206*1c60b9acSAndroid Build Coastguard Worker 			size_t len)
207*1c60b9acSAndroid Build Coastguard Worker {
208*1c60b9acSAndroid Build Coastguard Worker 	return 1;
209*1c60b9acSAndroid Build Coastguard Worker }
210*1c60b9acSAndroid Build Coastguard Worker 
211*1c60b9acSAndroid Build Coastguard Worker 
212*1c60b9acSAndroid Build Coastguard Worker /* cast a struct sockaddr_in6 * into addr for ipv6 */
213*1c60b9acSAndroid Build Coastguard Worker 
214*1c60b9acSAndroid Build Coastguard Worker int
lws_interface_to_sa(int ipv6,const char * ifname,struct sockaddr_in * addr,size_t addrlen)215*1c60b9acSAndroid Build Coastguard Worker lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
216*1c60b9acSAndroid Build Coastguard Worker 		    size_t addrlen)
217*1c60b9acSAndroid Build Coastguard Worker {
218*1c60b9acSAndroid Build Coastguard Worker 	return -1;
219*1c60b9acSAndroid Build Coastguard Worker }
220*1c60b9acSAndroid Build Coastguard Worker 
221*1c60b9acSAndroid Build Coastguard Worker void
lws_plat_insert_socket_into_fds(struct lws_context * context,struct lws * wsi)222*1c60b9acSAndroid Build Coastguard Worker lws_plat_insert_socket_into_fds(struct lws_context *context, struct lws *wsi)
223*1c60b9acSAndroid Build Coastguard Worker {
224*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
225*1c60b9acSAndroid Build Coastguard Worker 
226*1c60b9acSAndroid Build Coastguard Worker 	pt->fds[pt->fds_count++].revents = 0;
227*1c60b9acSAndroid Build Coastguard Worker }
228*1c60b9acSAndroid Build Coastguard Worker 
229*1c60b9acSAndroid Build Coastguard Worker void
lws_plat_delete_socket_from_fds(struct lws_context * context,struct lws * wsi,int m)230*1c60b9acSAndroid Build Coastguard Worker lws_plat_delete_socket_from_fds(struct lws_context *context,
231*1c60b9acSAndroid Build Coastguard Worker 						struct lws *wsi, int m)
232*1c60b9acSAndroid Build Coastguard Worker {
233*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
234*1c60b9acSAndroid Build Coastguard Worker 
235*1c60b9acSAndroid Build Coastguard Worker 	pt->fds_count--;
236*1c60b9acSAndroid Build Coastguard Worker }
237*1c60b9acSAndroid Build Coastguard Worker 
238*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_change_pollfd(struct lws_context * context,struct lws * wsi,struct lws_pollfd * pfd)239*1c60b9acSAndroid Build Coastguard Worker lws_plat_change_pollfd(struct lws_context *context,
240*1c60b9acSAndroid Build Coastguard Worker 		      struct lws *wsi, struct lws_pollfd *pfd)
241*1c60b9acSAndroid Build Coastguard Worker {
242*1c60b9acSAndroid Build Coastguard Worker 	return 0;
243*1c60b9acSAndroid Build Coastguard Worker }
244*1c60b9acSAndroid Build Coastguard Worker 
245*1c60b9acSAndroid Build Coastguard Worker const char *
lws_plat_inet_ntop(int af,const void * src,char * dst,socklen_t cnt)246*1c60b9acSAndroid Build Coastguard Worker lws_plat_inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
247*1c60b9acSAndroid Build Coastguard Worker {
248*1c60b9acSAndroid Build Coastguard Worker 	//return inet_ntop(af, src, dst, cnt);
249*1c60b9acSAndroid Build Coastguard Worker 	return "lws_plat_inet_ntop";
250*1c60b9acSAndroid Build Coastguard Worker }
251*1c60b9acSAndroid Build Coastguard Worker 
252*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_inet_pton(int af,const char * src,void * dst)253*1c60b9acSAndroid Build Coastguard Worker lws_plat_inet_pton(int af, const char *src, void *dst)
254*1c60b9acSAndroid Build Coastguard Worker {
255*1c60b9acSAndroid Build Coastguard Worker 	//return inet_pton(af, src, dst);
256*1c60b9acSAndroid Build Coastguard Worker 	return 1;
257*1c60b9acSAndroid Build Coastguard Worker }
258*1c60b9acSAndroid Build Coastguard Worker 
259*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_set_socket_options_ip(int fd,uint8_t pri,unsigned int lws_flags)260*1c60b9acSAndroid Build Coastguard Worker lws_plat_set_socket_options_ip(int fd, uint8_t pri, unsigned int lws_flags)
261*1c60b9acSAndroid Build Coastguard Worker {
262*1c60b9acSAndroid Build Coastguard Worker 	return 0;
263*1c60b9acSAndroid Build Coastguard Worker }
264*1c60b9acSAndroid Build Coastguard Worker 
265*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_vhost_tls_client_ctx_init(struct lws_vhost * vhost)266*1c60b9acSAndroid Build Coastguard Worker lws_plat_vhost_tls_client_ctx_init(struct lws_vhost *vhost)
267*1c60b9acSAndroid Build Coastguard Worker {
268*1c60b9acSAndroid Build Coastguard Worker 	return 0;
269*1c60b9acSAndroid Build Coastguard Worker }
270*1c60b9acSAndroid Build Coastguard Worker 
271*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_MBEDTLS)
272*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_mbedtls_net_send(void * ctx,const uint8_t * buf,size_t len)273*1c60b9acSAndroid Build Coastguard Worker lws_plat_mbedtls_net_send(void *ctx, const uint8_t *buf, size_t len)
274*1c60b9acSAndroid Build Coastguard Worker {
275*1c60b9acSAndroid Build Coastguard Worker 	int fd = ((mbedtls_net_context *) ctx)->fd;
276*1c60b9acSAndroid Build Coastguard Worker 	int ret;
277*1c60b9acSAndroid Build Coastguard Worker 
278*1c60b9acSAndroid Build Coastguard Worker 	if (fd < 0)
279*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_NET_INVALID_CONTEXT;
280*1c60b9acSAndroid Build Coastguard Worker 
281*1c60b9acSAndroid Build Coastguard Worker 	ret = write(fd, buf, len);
282*1c60b9acSAndroid Build Coastguard Worker 	if (ret >= 0)
283*1c60b9acSAndroid Build Coastguard Worker 		return ret;
284*1c60b9acSAndroid Build Coastguard Worker 
285*1c60b9acSAndroid Build Coastguard Worker 	if (errno == EAGAIN || errno == EWOULDBLOCK)
286*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_SSL_WANT_WRITE;
287*1c60b9acSAndroid Build Coastguard Worker 
288*1c60b9acSAndroid Build Coastguard Worker 	if (errno == EPIPE || errno == ECONNRESET)
289*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_NET_CONN_RESET;
290*1c60b9acSAndroid Build Coastguard Worker 
291*1c60b9acSAndroid Build Coastguard Worker 	if( errno == EINTR )
292*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_SSL_WANT_WRITE;
293*1c60b9acSAndroid Build Coastguard Worker 
294*1c60b9acSAndroid Build Coastguard Worker 	return MBEDTLS_ERR_NET_SEND_FAILED;
295*1c60b9acSAndroid Build Coastguard Worker }
296*1c60b9acSAndroid Build Coastguard Worker 
297*1c60b9acSAndroid Build Coastguard Worker int
lws_plat_mbedtls_net_recv(void * ctx,unsigned char * buf,size_t len)298*1c60b9acSAndroid Build Coastguard Worker lws_plat_mbedtls_net_recv(void *ctx, unsigned char *buf, size_t len)
299*1c60b9acSAndroid Build Coastguard Worker {
300*1c60b9acSAndroid Build Coastguard Worker 	int fd = ((mbedtls_net_context *) ctx)->fd;
301*1c60b9acSAndroid Build Coastguard Worker 	int ret;
302*1c60b9acSAndroid Build Coastguard Worker 
303*1c60b9acSAndroid Build Coastguard Worker 	if (fd < 0)
304*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_NET_INVALID_CONTEXT;
305*1c60b9acSAndroid Build Coastguard Worker 
306*1c60b9acSAndroid Build Coastguard Worker 	ret = (int)read(fd, buf, len);
307*1c60b9acSAndroid Build Coastguard Worker 	if (ret >= 0)
308*1c60b9acSAndroid Build Coastguard Worker 		return ret;
309*1c60b9acSAndroid Build Coastguard Worker 
310*1c60b9acSAndroid Build Coastguard Worker 	if (errno == EAGAIN || errno == EWOULDBLOCK)
311*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_SSL_WANT_READ;
312*1c60b9acSAndroid Build Coastguard Worker 
313*1c60b9acSAndroid Build Coastguard Worker 	if (errno == EPIPE || errno == ECONNRESET)
314*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_NET_CONN_RESET;
315*1c60b9acSAndroid Build Coastguard Worker 
316*1c60b9acSAndroid Build Coastguard Worker 	if (errno == EINTR)
317*1c60b9acSAndroid Build Coastguard Worker 		return MBEDTLS_ERR_SSL_WANT_READ;
318*1c60b9acSAndroid Build Coastguard Worker 
319*1c60b9acSAndroid Build Coastguard Worker 	return MBEDTLS_ERR_NET_RECV_FAILED;
320*1c60b9acSAndroid Build Coastguard Worker }
321*1c60b9acSAndroid Build Coastguard Worker 
322*1c60b9acSAndroid Build Coastguard Worker #endif
323