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 #include <assert.h>
12*1c60b9acSAndroid Build Coastguard Worker 
13*1c60b9acSAndroid Build Coastguard Worker extern int interrupted, bad;
14*1c60b9acSAndroid Build Coastguard Worker 
15*1c60b9acSAndroid Build Coastguard Worker typedef struct myss {
16*1c60b9acSAndroid Build Coastguard Worker 	struct lws_ss_handle 		*ss;
17*1c60b9acSAndroid Build Coastguard Worker 	void				*opaque_data;
18*1c60b9acSAndroid Build Coastguard Worker 	/* ... application specific state ... */
19*1c60b9acSAndroid Build Coastguard Worker 
20*1c60b9acSAndroid Build Coastguard Worker 	lws_sorted_usec_list_t		sul;
21*1c60b9acSAndroid Build Coastguard Worker 	int				count;
22*1c60b9acSAndroid Build Coastguard Worker 	char				upgraded;
23*1c60b9acSAndroid Build Coastguard Worker 
24*1c60b9acSAndroid Build Coastguard Worker } myss_srv_t;
25*1c60b9acSAndroid Build Coastguard Worker 
26*1c60b9acSAndroid Build Coastguard Worker /*
27*1c60b9acSAndroid Build Coastguard Worker  * This is the Secure Streams Server RX and TX
28*1c60b9acSAndroid Build Coastguard Worker  */
29*1c60b9acSAndroid Build Coastguard Worker 
30*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
myss_raw_rx(void * userobj,const uint8_t * buf,size_t len,int flags)31*1c60b9acSAndroid Build Coastguard Worker myss_raw_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
32*1c60b9acSAndroid Build Coastguard Worker {
33*1c60b9acSAndroid Build Coastguard Worker //	myss_srv_t *m = (myss_srv_t *)userobj;
34*1c60b9acSAndroid Build Coastguard Worker 
35*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: len %d, flags: %d\n", __func__, (int)len, flags);
36*1c60b9acSAndroid Build Coastguard Worker 	lwsl_hexdump_info(buf, len);
37*1c60b9acSAndroid Build Coastguard Worker 
38*1c60b9acSAndroid Build Coastguard Worker 	/*
39*1c60b9acSAndroid Build Coastguard Worker 	 * If we received the whole message, for our example it means
40*1c60b9acSAndroid Build Coastguard Worker 	 * we are done.
41*1c60b9acSAndroid Build Coastguard Worker 	 */
42*1c60b9acSAndroid Build Coastguard Worker 	if (flags & LWSSS_FLAG_EOM) {
43*1c60b9acSAndroid Build Coastguard Worker 		bad = 0;
44*1c60b9acSAndroid Build Coastguard Worker 		interrupted = 1;
45*1c60b9acSAndroid Build Coastguard Worker 	}
46*1c60b9acSAndroid Build Coastguard Worker 
47*1c60b9acSAndroid Build Coastguard Worker 	return 0;
48*1c60b9acSAndroid Build Coastguard Worker }
49*1c60b9acSAndroid Build Coastguard Worker 
50*1c60b9acSAndroid Build Coastguard Worker /* this is the callback that mediates sending the incrementing number */
51*1c60b9acSAndroid Build Coastguard Worker 
52*1c60b9acSAndroid Build Coastguard Worker static void
spam_sul_cb(struct lws_sorted_usec_list * sul)53*1c60b9acSAndroid Build Coastguard Worker spam_sul_cb(struct lws_sorted_usec_list *sul)
54*1c60b9acSAndroid Build Coastguard Worker {
55*1c60b9acSAndroid Build Coastguard Worker 	myss_srv_t *m = lws_container_of(sul, myss_srv_t, sul);
56*1c60b9acSAndroid Build Coastguard Worker 
57*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_ss_request_tx(m->ss))
58*1c60b9acSAndroid Build Coastguard Worker 		lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
59*1c60b9acSAndroid Build Coastguard Worker 			 100 * LWS_US_PER_MS);
60*1c60b9acSAndroid Build Coastguard Worker }
61*1c60b9acSAndroid Build Coastguard Worker 
62*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
myss_raw_tx(void * userobj,lws_ss_tx_ordinal_t ord,uint8_t * buf,size_t * len,int * flags)63*1c60b9acSAndroid Build Coastguard Worker myss_raw_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,
64*1c60b9acSAndroid Build Coastguard Worker 	int *flags)
65*1c60b9acSAndroid Build Coastguard Worker {
66*1c60b9acSAndroid Build Coastguard Worker 	myss_srv_t *m = (myss_srv_t *)userobj;
67*1c60b9acSAndroid Build Coastguard Worker 
68*1c60b9acSAndroid Build Coastguard Worker 	*flags = LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;
69*1c60b9acSAndroid Build Coastguard Worker 
70*1c60b9acSAndroid Build Coastguard Worker 	*len = (unsigned int)lws_snprintf((char *)buf, *len, "hello from raw %d\n", m->count++);
71*1c60b9acSAndroid Build Coastguard Worker 
72*1c60b9acSAndroid Build Coastguard Worker 	lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
73*1c60b9acSAndroid Build Coastguard Worker 			 100 * LWS_US_PER_MS);
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 static lws_ss_state_return_t
myss_raw_state(void * userobj,void * sh,lws_ss_constate_t state,lws_ss_tx_ordinal_t ack)79*1c60b9acSAndroid Build Coastguard Worker myss_raw_state(void *userobj, void *sh, lws_ss_constate_t state,
80*1c60b9acSAndroid Build Coastguard Worker 	   lws_ss_tx_ordinal_t ack)
81*1c60b9acSAndroid Build Coastguard Worker {
82*1c60b9acSAndroid Build Coastguard Worker 	myss_srv_t *m = (myss_srv_t *)userobj;
83*1c60b9acSAndroid Build Coastguard Worker 
84*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: %p %s, ord 0x%x\n", __func__, m->ss,
85*1c60b9acSAndroid Build Coastguard Worker 		  lws_ss_state_name((int)state), (unsigned int)ack);
86*1c60b9acSAndroid Build Coastguard Worker 
87*1c60b9acSAndroid Build Coastguard Worker 	switch (state) {
88*1c60b9acSAndroid Build Coastguard Worker 	case LWSSSCS_DISCONNECTED:
89*1c60b9acSAndroid Build Coastguard Worker 		lws_sul_cancel(&m->sul);
90*1c60b9acSAndroid Build Coastguard Worker 		break;
91*1c60b9acSAndroid Build Coastguard Worker 	case LWSSSCS_CONNECTED:
92*1c60b9acSAndroid Build Coastguard Worker 		return lws_ss_request_tx(m->ss);
93*1c60b9acSAndroid Build Coastguard Worker 
94*1c60b9acSAndroid Build Coastguard Worker 	default:
95*1c60b9acSAndroid Build Coastguard Worker 		break;
96*1c60b9acSAndroid Build Coastguard Worker 	}
97*1c60b9acSAndroid Build Coastguard Worker 
98*1c60b9acSAndroid Build Coastguard Worker 	return 0;
99*1c60b9acSAndroid Build Coastguard Worker }
100*1c60b9acSAndroid Build Coastguard Worker 
101*1c60b9acSAndroid Build Coastguard Worker const lws_ss_info_t ssi_server = {
102*1c60b9acSAndroid Build Coastguard Worker 	.handle_offset			= offsetof(myss_srv_t, ss),
103*1c60b9acSAndroid Build Coastguard Worker 	.opaque_user_data_offset	= offsetof(myss_srv_t, opaque_data),
104*1c60b9acSAndroid Build Coastguard Worker 	.streamtype			= "myrawserver",
105*1c60b9acSAndroid Build Coastguard Worker 	.rx				= myss_raw_rx,
106*1c60b9acSAndroid Build Coastguard Worker 	.tx				= myss_raw_tx,
107*1c60b9acSAndroid Build Coastguard Worker 	.state				= myss_raw_state,
108*1c60b9acSAndroid Build Coastguard Worker 	.user_alloc			= sizeof(myss_srv_t),
109*1c60b9acSAndroid Build Coastguard Worker };
110