1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-minimal-secure-streams-server
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2020 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker  * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker  */
9*1c60b9acSAndroid Build Coastguard Worker 
10*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
11*1c60b9acSAndroid Build Coastguard Worker 
12*1c60b9acSAndroid Build Coastguard Worker extern int interrupted, bad;
13*1c60b9acSAndroid Build Coastguard Worker 
14*1c60b9acSAndroid Build Coastguard Worker typedef struct myss {
15*1c60b9acSAndroid Build Coastguard Worker 	struct lws_ss_handle 	*ss;
16*1c60b9acSAndroid Build Coastguard Worker 	void			*opaque_data;
17*1c60b9acSAndroid Build Coastguard Worker 	/* ... application specific state ... */
18*1c60b9acSAndroid Build Coastguard Worker 	lws_sorted_usec_list_t	sul;
19*1c60b9acSAndroid Build Coastguard Worker 
20*1c60b9acSAndroid Build Coastguard Worker 	int			count;
21*1c60b9acSAndroid Build Coastguard Worker } myss_t;
22*1c60b9acSAndroid Build Coastguard Worker 
23*1c60b9acSAndroid Build Coastguard Worker /* secure streams payload interface */
24*1c60b9acSAndroid Build Coastguard Worker 
25*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
myss_rx(void * userobj,const uint8_t * buf,size_t len,int flags)26*1c60b9acSAndroid Build Coastguard Worker myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
27*1c60b9acSAndroid Build Coastguard Worker {
28*1c60b9acSAndroid Build Coastguard Worker //	myss_t *m = (myss_t *)userobj;
29*1c60b9acSAndroid Build Coastguard Worker 
30*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: len %d, flags: %d\n", __func__, (int)len, flags);
31*1c60b9acSAndroid Build Coastguard Worker 	lwsl_hexdump_info(buf, len);
32*1c60b9acSAndroid Build Coastguard Worker 
33*1c60b9acSAndroid Build Coastguard Worker 	/*
34*1c60b9acSAndroid Build Coastguard Worker 	 * If we received the whole message, for our example it means
35*1c60b9acSAndroid Build Coastguard Worker 	 * we are done.
36*1c60b9acSAndroid Build Coastguard Worker 	 */
37*1c60b9acSAndroid Build Coastguard Worker 	if (flags & LWSSS_FLAG_EOM) {
38*1c60b9acSAndroid Build Coastguard Worker 		bad = 0;
39*1c60b9acSAndroid Build Coastguard Worker 		interrupted = 1;
40*1c60b9acSAndroid Build Coastguard Worker 	}
41*1c60b9acSAndroid Build Coastguard Worker 
42*1c60b9acSAndroid Build Coastguard Worker 	return 0;
43*1c60b9acSAndroid Build Coastguard Worker }
44*1c60b9acSAndroid Build Coastguard Worker 
45*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
myss_tx(void * userobj,lws_ss_tx_ordinal_t ord,uint8_t * buf,size_t * len,int * flags)46*1c60b9acSAndroid Build Coastguard Worker myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,
47*1c60b9acSAndroid Build Coastguard Worker 	int *flags)
48*1c60b9acSAndroid Build Coastguard Worker {
49*1c60b9acSAndroid Build Coastguard Worker 	//myss_t *m = (myss_t *)userobj;
50*1c60b9acSAndroid Build Coastguard Worker 
51*1c60b9acSAndroid Build Coastguard Worker 	return LWSSSSRET_TX_DONT_SEND; /* don't want to write */
52*1c60b9acSAndroid Build Coastguard Worker }
53*1c60b9acSAndroid Build Coastguard Worker 
54*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
myss_state(void * userobj,void * sh,lws_ss_constate_t state,lws_ss_tx_ordinal_t ack)55*1c60b9acSAndroid Build Coastguard Worker myss_state(void *userobj, void *sh, lws_ss_constate_t state,
56*1c60b9acSAndroid Build Coastguard Worker 	   lws_ss_tx_ordinal_t ack)
57*1c60b9acSAndroid Build Coastguard Worker {
58*1c60b9acSAndroid Build Coastguard Worker 	myss_t *m = (myss_t *)userobj;
59*1c60b9acSAndroid Build Coastguard Worker 
60*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: %p %s, ord 0x%x\n", __func__, m->ss,
61*1c60b9acSAndroid Build Coastguard Worker 		  lws_ss_state_name((int)state), (unsigned int)ack);
62*1c60b9acSAndroid Build Coastguard Worker 
63*1c60b9acSAndroid Build Coastguard Worker 	switch (state) {
64*1c60b9acSAndroid Build Coastguard Worker 	case LWSSSCS_CREATING:
65*1c60b9acSAndroid Build Coastguard Worker 		return lws_ss_request_tx(m->ss);
66*1c60b9acSAndroid Build Coastguard Worker 		break;
67*1c60b9acSAndroid Build Coastguard Worker 	case LWSSSCS_ALL_RETRIES_FAILED:
68*1c60b9acSAndroid Build Coastguard Worker 		/* if we're out of retries, we want to close the app and FAIL */
69*1c60b9acSAndroid Build Coastguard Worker 		interrupted = 1;
70*1c60b9acSAndroid Build Coastguard Worker 		break;
71*1c60b9acSAndroid Build Coastguard Worker 	default:
72*1c60b9acSAndroid Build Coastguard Worker 		break;
73*1c60b9acSAndroid Build Coastguard Worker 	}
74*1c60b9acSAndroid Build Coastguard Worker 
75*1c60b9acSAndroid Build Coastguard Worker 	return 0;
76*1c60b9acSAndroid Build Coastguard Worker }
77*1c60b9acSAndroid Build Coastguard Worker 
78*1c60b9acSAndroid Build Coastguard Worker const lws_ss_info_t ssi_client = {
79*1c60b9acSAndroid Build Coastguard Worker 	.handle_offset			= offsetof(myss_t, ss),
80*1c60b9acSAndroid Build Coastguard Worker 	.opaque_user_data_offset	= offsetof(myss_t, opaque_data),
81*1c60b9acSAndroid Build Coastguard Worker 	.streamtype			= "mintest",
82*1c60b9acSAndroid Build Coastguard Worker 	.rx				= myss_rx,
83*1c60b9acSAndroid Build Coastguard Worker 	.tx				= myss_tx,
84*1c60b9acSAndroid Build Coastguard Worker 	.state				= myss_state,
85*1c60b9acSAndroid Build Coastguard Worker 	.user_alloc			= sizeof(myss_t),
86*1c60b9acSAndroid Build Coastguard Worker };
87