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