1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * lws-minimal-secure-streams-smd
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 * This demonstrates a minimal http client using secure streams to access the
11*1c60b9acSAndroid Build Coastguard Worker * SMD api.
12*1c60b9acSAndroid Build Coastguard Worker */
13*1c60b9acSAndroid Build Coastguard Worker
14*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
15*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
16*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
17*1c60b9acSAndroid Build Coastguard Worker
18*1c60b9acSAndroid Build Coastguard Worker static int interrupted, bad = 1, count_p1, count_p2, count_tx, expected = 0;
19*1c60b9acSAndroid Build Coastguard Worker static unsigned int how_many_msg = 100, usec_interval = 1000;
20*1c60b9acSAndroid Build Coastguard Worker static lws_sorted_usec_list_t sul_timeout;
21*1c60b9acSAndroid Build Coastguard Worker
22*1c60b9acSAndroid Build Coastguard Worker /*
23*1c60b9acSAndroid Build Coastguard Worker * If the -proxy app is fulfilling our connection, then we don't need to have
24*1c60b9acSAndroid Build Coastguard Worker * the policy in the client.
25*1c60b9acSAndroid Build Coastguard Worker *
26*1c60b9acSAndroid Build Coastguard Worker * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over
27*1c60b9acSAndroid Build Coastguard Worker * a Unix Domain Socket. To test that, you need to separately run the
28*1c60b9acSAndroid Build Coastguard Worker * ./lws-minimal-secure-streams-proxy test app on the same machine.
29*1c60b9acSAndroid Build Coastguard Worker */
30*1c60b9acSAndroid Build Coastguard Worker
31*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_SS_USE_SSPC)
32*1c60b9acSAndroid Build Coastguard Worker static const char * const default_ss_policy =
33*1c60b9acSAndroid Build Coastguard Worker "{"
34*1c60b9acSAndroid Build Coastguard Worker "\"schema-version\":1,"
35*1c60b9acSAndroid Build Coastguard Worker "\"s\": ["
36*1c60b9acSAndroid Build Coastguard Worker "{"
37*1c60b9acSAndroid Build Coastguard Worker /*
38*1c60b9acSAndroid Build Coastguard Worker * "captive_portal_detect" describes
39*1c60b9acSAndroid Build Coastguard Worker * what to do in order to check if the path to
40*1c60b9acSAndroid Build Coastguard Worker * the Internet is being interrupted by a
41*1c60b9acSAndroid Build Coastguard Worker * captive portal. If there's a larger policy
42*1c60b9acSAndroid Build Coastguard Worker * fetched from elsewhere, it should also include
43*1c60b9acSAndroid Build Coastguard Worker * this since it needs to be done at least after
44*1c60b9acSAndroid Build Coastguard Worker * every DHCP acquisition
45*1c60b9acSAndroid Build Coastguard Worker */
46*1c60b9acSAndroid Build Coastguard Worker "\"captive_portal_detect\": {"
47*1c60b9acSAndroid Build Coastguard Worker "\"endpoint\": \"connectivitycheck.android.com\","
48*1c60b9acSAndroid Build Coastguard Worker "\"http_url\": \"generate_204\","
49*1c60b9acSAndroid Build Coastguard Worker "\"port\": 80,"
50*1c60b9acSAndroid Build Coastguard Worker "\"protocol\": \"h1\","
51*1c60b9acSAndroid Build Coastguard Worker "\"http_method\": \"GET\","
52*1c60b9acSAndroid Build Coastguard Worker "\"opportunistic\": true,"
53*1c60b9acSAndroid Build Coastguard Worker "\"http_expect\": 204,"
54*1c60b9acSAndroid Build Coastguard Worker "\"http_fail_redirect\": true"
55*1c60b9acSAndroid Build Coastguard Worker "}"
56*1c60b9acSAndroid Build Coastguard Worker "}"
57*1c60b9acSAndroid Build Coastguard Worker "]"
58*1c60b9acSAndroid Build Coastguard Worker "}"
59*1c60b9acSAndroid Build Coastguard Worker ;
60*1c60b9acSAndroid Build Coastguard Worker
61*1c60b9acSAndroid Build Coastguard Worker #endif
62*1c60b9acSAndroid Build Coastguard Worker
63*1c60b9acSAndroid Build Coastguard Worker typedef struct myss {
64*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_handle *ss;
65*1c60b9acSAndroid Build Coastguard Worker void *opaque_data;
66*1c60b9acSAndroid Build Coastguard Worker /* ... application specific state ... */
67*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t sul;
68*1c60b9acSAndroid Build Coastguard Worker char alternate;
69*1c60b9acSAndroid Build Coastguard Worker } myss_t;
70*1c60b9acSAndroid Build Coastguard Worker
71*1c60b9acSAndroid Build Coastguard Worker
72*1c60b9acSAndroid Build Coastguard Worker /* secure streams payload interface */
73*1c60b9acSAndroid Build Coastguard Worker
74*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
myss_rx(void * userobj,const uint8_t * buf,size_t len,int flags)75*1c60b9acSAndroid Build Coastguard Worker myss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
76*1c60b9acSAndroid Build Coastguard Worker {
77*1c60b9acSAndroid Build Coastguard Worker /*
78*1c60b9acSAndroid Build Coastguard Worker * Call the helper to translate into a real smd message and forward to
79*1c60b9acSAndroid Build Coastguard Worker * this context / process smd participants... except us, since we
80*1c60b9acSAndroid Build Coastguard Worker * definitely already received it
81*1c60b9acSAndroid Build Coastguard Worker */
82*1c60b9acSAndroid Build Coastguard Worker
83*1c60b9acSAndroid Build Coastguard Worker if (lws_smd_ss_rx_forward(userobj, buf, len))
84*1c60b9acSAndroid Build Coastguard Worker lwsl_warn("%s: forward failed\n", __func__);
85*1c60b9acSAndroid Build Coastguard Worker
86*1c60b9acSAndroid Build Coastguard Worker count_p1++;
87*1c60b9acSAndroid Build Coastguard Worker
88*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_OK;
89*1c60b9acSAndroid Build Coastguard Worker }
90*1c60b9acSAndroid Build Coastguard Worker
91*1c60b9acSAndroid Build Coastguard Worker static void
sul_tx_periodic_cb(lws_sorted_usec_list_t * sul)92*1c60b9acSAndroid Build Coastguard Worker sul_tx_periodic_cb(lws_sorted_usec_list_t *sul)
93*1c60b9acSAndroid Build Coastguard Worker {
94*1c60b9acSAndroid Build Coastguard Worker myss_t *m = lws_container_of(sul, myss_t, sul);
95*1c60b9acSAndroid Build Coastguard Worker
96*1c60b9acSAndroid Build Coastguard Worker lwsl_info("%s: requesting TX\n", __func__);
97*1c60b9acSAndroid Build Coastguard Worker if (lws_ss_request_tx(m->ss))
98*1c60b9acSAndroid Build Coastguard Worker lwsl_info("%s: req failed\n", __func__);
99*1c60b9acSAndroid Build Coastguard Worker }
100*1c60b9acSAndroid Build Coastguard Worker
101*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)102*1c60b9acSAndroid Build Coastguard Worker myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,
103*1c60b9acSAndroid Build Coastguard Worker int *flags)
104*1c60b9acSAndroid Build Coastguard Worker {
105*1c60b9acSAndroid Build Coastguard Worker myss_t *m = (myss_t *)userobj;
106*1c60b9acSAndroid Build Coastguard Worker
107*1c60b9acSAndroid Build Coastguard Worker lwsl_info("%s: sending SS smd\n", __func__);
108*1c60b9acSAndroid Build Coastguard Worker
109*1c60b9acSAndroid Build Coastguard Worker /*
110*1c60b9acSAndroid Build Coastguard Worker * The SS RX isn't going to see INTERACTION messages, because its class
111*1c60b9acSAndroid Build Coastguard Worker * filter doesn't accept INTERACTION class messages. The direct
112*1c60b9acSAndroid Build Coastguard Worker * participant we also set up for the test will see them though.
113*1c60b9acSAndroid Build Coastguard Worker *
114*1c60b9acSAndroid Build Coastguard Worker * Let's alternate between sending NETWORK class smd messages and
115*1c60b9acSAndroid Build Coastguard Worker * INTERACTION so we can test both rx paths
116*1c60b9acSAndroid Build Coastguard Worker */
117*1c60b9acSAndroid Build Coastguard Worker
118*1c60b9acSAndroid Build Coastguard Worker m->alternate++;
119*1c60b9acSAndroid Build Coastguard Worker
120*1c60b9acSAndroid Build Coastguard Worker if (m->alternate == 4) {
121*1c60b9acSAndroid Build Coastguard Worker /*
122*1c60b9acSAndroid Build Coastguard Worker * after a few, let's request a CPD check
123*1c60b9acSAndroid Build Coastguard Worker */
124*1c60b9acSAndroid Build Coastguard Worker
125*1c60b9acSAndroid Build Coastguard Worker if (lws_smd_ss_msg_printf(lws_ss_tag(m->ss), buf, len, LWSSMDCL_NETWORK,
126*1c60b9acSAndroid Build Coastguard Worker "{\"trigger\": \"cpdcheck\", "
127*1c60b9acSAndroid Build Coastguard Worker "\"src\":\"SS-test\"}"))
128*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_TX_DONT_SEND;
129*1c60b9acSAndroid Build Coastguard Worker } else
130*1c60b9acSAndroid Build Coastguard Worker if (lws_smd_ss_msg_printf(lws_ss_tag(m->ss), buf, len,
131*1c60b9acSAndroid Build Coastguard Worker (m->alternate & 1) ? LWSSMDCL_NETWORK :
132*1c60b9acSAndroid Build Coastguard Worker LWSSMDCL_INTERACTION,
133*1c60b9acSAndroid Build Coastguard Worker (m->alternate & 1) ?
134*1c60b9acSAndroid Build Coastguard Worker "{\"class\":\"NETWORK\",\"x\":%d}" :
135*1c60b9acSAndroid Build Coastguard Worker "{\"class\":\"INTERACTION\",\"x\":%d}",
136*1c60b9acSAndroid Build Coastguard Worker count_tx))
137*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_TX_DONT_SEND;
138*1c60b9acSAndroid Build Coastguard Worker
139*1c60b9acSAndroid Build Coastguard Worker *flags = LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;
140*1c60b9acSAndroid Build Coastguard Worker
141*1c60b9acSAndroid Build Coastguard Worker count_tx++;
142*1c60b9acSAndroid Build Coastguard Worker
143*1c60b9acSAndroid Build Coastguard Worker lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul,
144*1c60b9acSAndroid Build Coastguard Worker sul_tx_periodic_cb, usec_interval);
145*1c60b9acSAndroid Build Coastguard Worker
146*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_OK;
147*1c60b9acSAndroid Build Coastguard Worker }
148*1c60b9acSAndroid Build Coastguard Worker
149*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
myss_state(void * userobj,void * h_src,lws_ss_constate_t state,lws_ss_tx_ordinal_t ack)150*1c60b9acSAndroid Build Coastguard Worker myss_state(void *userobj, void *h_src, lws_ss_constate_t state,
151*1c60b9acSAndroid Build Coastguard Worker lws_ss_tx_ordinal_t ack)
152*1c60b9acSAndroid Build Coastguard Worker {
153*1c60b9acSAndroid Build Coastguard Worker myss_t *m = (myss_t *)userobj;
154*1c60b9acSAndroid Build Coastguard Worker
155*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: %s: %s (%d), ord 0x%x\n", __func__, lws_ss_tag(m->ss),
156*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_name((int)state), state, (unsigned int)ack);
157*1c60b9acSAndroid Build Coastguard Worker
158*1c60b9acSAndroid Build Coastguard Worker if (state == LWSSSCS_DESTROYING) {
159*1c60b9acSAndroid Build Coastguard Worker lws_sul_cancel(&m->sul);
160*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_OK;
161*1c60b9acSAndroid Build Coastguard Worker }
162*1c60b9acSAndroid Build Coastguard Worker
163*1c60b9acSAndroid Build Coastguard Worker if (state == LWSSSCS_CONNECTED) {
164*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: CONNECTED\n", __func__);
165*1c60b9acSAndroid Build Coastguard Worker lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul,
166*1c60b9acSAndroid Build Coastguard Worker sul_tx_periodic_cb, 1);
167*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_OK;
168*1c60b9acSAndroid Build Coastguard Worker }
169*1c60b9acSAndroid Build Coastguard Worker
170*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_OK;
171*1c60b9acSAndroid Build Coastguard Worker }
172*1c60b9acSAndroid Build Coastguard Worker
173*1c60b9acSAndroid Build Coastguard Worker static const lws_ss_info_t ssi_lws_smd = {
174*1c60b9acSAndroid Build Coastguard Worker .handle_offset = offsetof(myss_t, ss),
175*1c60b9acSAndroid Build Coastguard Worker .opaque_user_data_offset = offsetof(myss_t, opaque_data),
176*1c60b9acSAndroid Build Coastguard Worker .rx = myss_rx,
177*1c60b9acSAndroid Build Coastguard Worker .tx = myss_tx,
178*1c60b9acSAndroid Build Coastguard Worker .state = myss_state,
179*1c60b9acSAndroid Build Coastguard Worker .user_alloc = sizeof(myss_t),
180*1c60b9acSAndroid Build Coastguard Worker .streamtype = LWS_SMD_STREAMTYPENAME,
181*1c60b9acSAndroid Build Coastguard Worker .manual_initial_tx_credit = LWSSMDCL_SYSTEM_STATE |
182*1c60b9acSAndroid Build Coastguard Worker LWSSMDCL_METRICS |
183*1c60b9acSAndroid Build Coastguard Worker LWSSMDCL_NETWORK,
184*1c60b9acSAndroid Build Coastguard Worker };
185*1c60b9acSAndroid Build Coastguard Worker
186*1c60b9acSAndroid Build Coastguard Worker /* for comparison, this is a non-SS lws_smd participant */
187*1c60b9acSAndroid Build Coastguard Worker
188*1c60b9acSAndroid Build Coastguard Worker static int
direct_smd_cb(void * opaque,lws_smd_class_t _class,lws_usec_t timestamp,void * buf,size_t len)189*1c60b9acSAndroid Build Coastguard Worker direct_smd_cb(void *opaque, lws_smd_class_t _class, lws_usec_t timestamp,
190*1c60b9acSAndroid Build Coastguard Worker void *buf, size_t len)
191*1c60b9acSAndroid Build Coastguard Worker {
192*1c60b9acSAndroid Build Coastguard Worker struct lws_context **pctx = (struct lws_context **)opaque;
193*1c60b9acSAndroid Build Coastguard Worker
194*1c60b9acSAndroid Build Coastguard Worker // lwsl_notice("%s: class: 0x%x, ts: %llu\n", __func__, _class,
195*1c60b9acSAndroid Build Coastguard Worker // (unsigned long long)timestamp);
196*1c60b9acSAndroid Build Coastguard Worker // lwsl_hexdump_notice(buf, len);
197*1c60b9acSAndroid Build Coastguard Worker
198*1c60b9acSAndroid Build Coastguard Worker count_p2++;
199*1c60b9acSAndroid Build Coastguard Worker
200*1c60b9acSAndroid Build Coastguard Worker if (_class != LWSSMDCL_SYSTEM_STATE)
201*1c60b9acSAndroid Build Coastguard Worker return 0;
202*1c60b9acSAndroid Build Coastguard Worker
203*1c60b9acSAndroid Build Coastguard Worker if (!lws_json_simple_strcmp(buf, len, "\"state\":", "OPERATIONAL")) {
204*1c60b9acSAndroid Build Coastguard Worker
205*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_SS_USE_SSPC)
206*1c60b9acSAndroid Build Coastguard Worker /*
207*1c60b9acSAndroid Build Coastguard Worker * Let's trigger a CPD check, just as a test. SS can't see it
208*1c60b9acSAndroid Build Coastguard Worker * anyway since it doesn't listen for NETWORK but the direct /
209*1c60b9acSAndroid Build Coastguard Worker * local participant will see it and the result
210*1c60b9acSAndroid Build Coastguard Worker *
211*1c60b9acSAndroid Build Coastguard Worker * This process doesn't run the smd / captive portal action
212*1c60b9acSAndroid Build Coastguard Worker * when it's a client of the SS proxy. SMD has to be passed
213*1c60b9acSAndroid Build Coastguard Worker * via the SS _lws_smd proxied connection in that case.
214*1c60b9acSAndroid Build Coastguard Worker */
215*1c60b9acSAndroid Build Coastguard Worker (void)lws_smd_msg_printf(*pctx, LWSSMDCL_NETWORK,
216*1c60b9acSAndroid Build Coastguard Worker "{\"trigger\": \"cpdcheck\", \"src\":\"direct-test\"}");
217*1c60b9acSAndroid Build Coastguard Worker #endif
218*1c60b9acSAndroid Build Coastguard Worker
219*1c60b9acSAndroid Build Coastguard Worker /*
220*1c60b9acSAndroid Build Coastguard Worker * Create the SS link to lws_smd... notice in ssi_lws_smd
221*1c60b9acSAndroid Build Coastguard Worker * above, we tell this link to use a class filter that excludes
222*1c60b9acSAndroid Build Coastguard Worker * NETWORK messages.
223*1c60b9acSAndroid Build Coastguard Worker */
224*1c60b9acSAndroid Build Coastguard Worker
225*1c60b9acSAndroid Build Coastguard Worker if (lws_ss_create(*pctx, 0, &ssi_lws_smd, NULL, NULL, NULL, NULL)) {
226*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: failed to create secure stream\n",
227*1c60b9acSAndroid Build Coastguard Worker __func__);
228*1c60b9acSAndroid Build Coastguard Worker interrupted = 1;
229*1c60b9acSAndroid Build Coastguard Worker lws_cancel_service(*pctx);
230*1c60b9acSAndroid Build Coastguard Worker return -1;
231*1c60b9acSAndroid Build Coastguard Worker }
232*1c60b9acSAndroid Build Coastguard Worker }
233*1c60b9acSAndroid Build Coastguard Worker
234*1c60b9acSAndroid Build Coastguard Worker return 0;
235*1c60b9acSAndroid Build Coastguard Worker }
236*1c60b9acSAndroid Build Coastguard Worker
237*1c60b9acSAndroid Build Coastguard Worker
238*1c60b9acSAndroid Build Coastguard Worker static void
sul_timeout_cb(lws_sorted_usec_list_t * sul)239*1c60b9acSAndroid Build Coastguard Worker sul_timeout_cb(lws_sorted_usec_list_t *sul)
240*1c60b9acSAndroid Build Coastguard Worker {
241*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: test finishing\n", __func__);
242*1c60b9acSAndroid Build Coastguard Worker interrupted = 1;
243*1c60b9acSAndroid Build Coastguard Worker }
244*1c60b9acSAndroid Build Coastguard Worker
245*1c60b9acSAndroid Build Coastguard Worker
246*1c60b9acSAndroid Build Coastguard Worker static void
sigint_handler(int sig)247*1c60b9acSAndroid Build Coastguard Worker sigint_handler(int sig)
248*1c60b9acSAndroid Build Coastguard Worker {
249*1c60b9acSAndroid Build Coastguard Worker interrupted = 1;
250*1c60b9acSAndroid Build Coastguard Worker }
251*1c60b9acSAndroid Build Coastguard Worker
252*1c60b9acSAndroid Build Coastguard Worker extern int smd_ss_multi_test(int argc, const char **argv);
253*1c60b9acSAndroid Build Coastguard Worker
main(int argc,const char ** argv)254*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
255*1c60b9acSAndroid Build Coastguard Worker {
256*1c60b9acSAndroid Build Coastguard Worker struct lws_context_creation_info info;
257*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context;
258*1c60b9acSAndroid Build Coastguard Worker const char *p;
259*1c60b9acSAndroid Build Coastguard Worker
260*1c60b9acSAndroid Build Coastguard Worker signal(SIGINT, sigint_handler);
261*1c60b9acSAndroid Build Coastguard Worker
262*1c60b9acSAndroid Build Coastguard Worker memset(&info, 0, sizeof info);
263*1c60b9acSAndroid Build Coastguard Worker
264*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_SS_USE_SSPC)
265*1c60b9acSAndroid Build Coastguard Worker if (lws_cmdline_option(argc, argv, "--multi"))
266*1c60b9acSAndroid Build Coastguard Worker return smd_ss_multi_test(argc, argv);
267*1c60b9acSAndroid Build Coastguard Worker #endif
268*1c60b9acSAndroid Build Coastguard Worker
269*1c60b9acSAndroid Build Coastguard Worker lws_cmdline_option_handle_builtin(argc, argv, &info);
270*1c60b9acSAndroid Build Coastguard Worker
271*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "--count")))
272*1c60b9acSAndroid Build Coastguard Worker how_many_msg = (unsigned int)atol(p);
273*1c60b9acSAndroid Build Coastguard Worker
274*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "--interval")))
275*1c60b9acSAndroid Build Coastguard Worker usec_interval = (unsigned int)atol(p);
276*1c60b9acSAndroid Build Coastguard Worker
277*1c60b9acSAndroid Build Coastguard Worker lwsl_user("LWS Secure Streams SMD test client [-d<verb>]: "
278*1c60b9acSAndroid Build Coastguard Worker "%u msgs at %uus interval\n", how_many_msg, usec_interval);
279*1c60b9acSAndroid Build Coastguard Worker
280*1c60b9acSAndroid Build Coastguard Worker info.fd_limit_per_thread = 1 + 6 + 1;
281*1c60b9acSAndroid Build Coastguard Worker info.port = CONTEXT_PORT_NO_LISTEN;
282*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_SS_USE_SSPC)
283*1c60b9acSAndroid Build Coastguard Worker info.pss_policies_json = default_ss_policy;
284*1c60b9acSAndroid Build Coastguard Worker #else
285*1c60b9acSAndroid Build Coastguard Worker info.protocols = lws_sspc_protocols;
286*1c60b9acSAndroid Build Coastguard Worker {
287*1c60b9acSAndroid Build Coastguard Worker /* connect to ssproxy via UDS by default, else via
288*1c60b9acSAndroid Build Coastguard Worker * tcp connection to this port */
289*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "-p")))
290*1c60b9acSAndroid Build Coastguard Worker info.ss_proxy_port = (uint16_t)atoi(p);
291*1c60b9acSAndroid Build Coastguard Worker
292*1c60b9acSAndroid Build Coastguard Worker /* UDS "proxy.ss.lws" in abstract namespace, else this socket
293*1c60b9acSAndroid Build Coastguard Worker * path; when -p given this can specify the network interface
294*1c60b9acSAndroid Build Coastguard Worker * to bind to */
295*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "-i")))
296*1c60b9acSAndroid Build Coastguard Worker info.ss_proxy_bind = p;
297*1c60b9acSAndroid Build Coastguard Worker
298*1c60b9acSAndroid Build Coastguard Worker /* if -p given, -a specifies the proxy address to connect to */
299*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "-a")))
300*1c60b9acSAndroid Build Coastguard Worker info.ss_proxy_address = p;
301*1c60b9acSAndroid Build Coastguard Worker }
302*1c60b9acSAndroid Build Coastguard Worker #endif
303*1c60b9acSAndroid Build Coastguard Worker info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS |
304*1c60b9acSAndroid Build Coastguard Worker LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
305*1c60b9acSAndroid Build Coastguard Worker
306*1c60b9acSAndroid Build Coastguard Worker info.early_smd_cb = direct_smd_cb;
307*1c60b9acSAndroid Build Coastguard Worker info.early_smd_class_filter = 0xffffffff;
308*1c60b9acSAndroid Build Coastguard Worker info.early_smd_opaque = &context;
309*1c60b9acSAndroid Build Coastguard Worker
310*1c60b9acSAndroid Build Coastguard Worker /* create the context */
311*1c60b9acSAndroid Build Coastguard Worker
312*1c60b9acSAndroid Build Coastguard Worker context = lws_create_context(&info);
313*1c60b9acSAndroid Build Coastguard Worker if (!context) {
314*1c60b9acSAndroid Build Coastguard Worker lwsl_err("lws init failed\n");
315*1c60b9acSAndroid Build Coastguard Worker return 1;
316*1c60b9acSAndroid Build Coastguard Worker }
317*1c60b9acSAndroid Build Coastguard Worker
318*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_SS_USE_SSPC)
319*1c60b9acSAndroid Build Coastguard Worker if (!lws_create_vhost(context, &info)) {
320*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: failed to create default vhost\n", __func__);
321*1c60b9acSAndroid Build Coastguard Worker goto bail;
322*1c60b9acSAndroid Build Coastguard Worker }
323*1c60b9acSAndroid Build Coastguard Worker #endif
324*1c60b9acSAndroid Build Coastguard Worker
325*1c60b9acSAndroid Build Coastguard Worker /* set up the test timeout */
326*1c60b9acSAndroid Build Coastguard Worker
327*1c60b9acSAndroid Build Coastguard Worker lws_sul_schedule(context, 0, &sul_timeout, sul_timeout_cb,
328*1c60b9acSAndroid Build Coastguard Worker (how_many_msg * (usec_interval + 50000)) + LWS_US_PER_SEC);
329*1c60b9acSAndroid Build Coastguard Worker
330*1c60b9acSAndroid Build Coastguard Worker /* the event loop */
331*1c60b9acSAndroid Build Coastguard Worker
332*1c60b9acSAndroid Build Coastguard Worker while (lws_service(context, 0) >= 0 && !interrupted)
333*1c60b9acSAndroid Build Coastguard Worker ;
334*1c60b9acSAndroid Build Coastguard Worker
335*1c60b9acSAndroid Build Coastguard Worker /* compare what happened with what we expect */
336*1c60b9acSAndroid Build Coastguard Worker
337*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_SS_USE_SSPC)
338*1c60b9acSAndroid Build Coastguard Worker /* if SSPC
339*1c60b9acSAndroid Build Coastguard Worker *
340*1c60b9acSAndroid Build Coastguard Worker * - the SS _lws_smd link does not enable INTERACTION class, so doesn't
341*1c60b9acSAndroid Build Coastguard Worker * see these messages (count_p1 is half count_tx)
342*1c60b9acSAndroid Build Coastguard Worker *
343*1c60b9acSAndroid Build Coastguard Worker * - the direct smd participant sees local state, but it doesn't send
344*1c60b9acSAndroid Build Coastguard Worker * any local CPD request, since as a client it doesn't do CPD
345*1c60b9acSAndroid Build Coastguard Worker * directly (count_p2 -= 1 compared to non-SSPC)
346*1c60b9acSAndroid Build Coastguard Worker *
347*1c60b9acSAndroid Build Coastguard Worker * - one CPD trigger is sent on the proxied SS link (countp1 += 1)
348*1c60b9acSAndroid Build Coastguard Worker */
349*1c60b9acSAndroid Build Coastguard Worker if (count_p1 >= 6 && count_p2 >= 11 && count_tx >= 12)
350*1c60b9acSAndroid Build Coastguard Worker #else
351*1c60b9acSAndroid Build Coastguard Worker /* if not SSPC, then we can see direct smd activity */
352*1c60b9acSAndroid Build Coastguard Worker if (count_p1 >= 2 && count_p2 >= 15 && count_tx >= 5)
353*1c60b9acSAndroid Build Coastguard Worker #endif
354*1c60b9acSAndroid Build Coastguard Worker bad = 0;
355*1c60b9acSAndroid Build Coastguard Worker
356*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%d %d %d\n", count_p1, count_p2, count_tx);
357*1c60b9acSAndroid Build Coastguard Worker
358*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_SS_USE_SSPC)
359*1c60b9acSAndroid Build Coastguard Worker bail:
360*1c60b9acSAndroid Build Coastguard Worker #endif
361*1c60b9acSAndroid Build Coastguard Worker lws_context_destroy(context);
362*1c60b9acSAndroid Build Coastguard Worker
363*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "--expected-exit")))
364*1c60b9acSAndroid Build Coastguard Worker expected = atoi(p);
365*1c60b9acSAndroid Build Coastguard Worker
366*1c60b9acSAndroid Build Coastguard Worker if (bad == expected) {
367*1c60b9acSAndroid Build Coastguard Worker lwsl_user("Completed: OK (seen expected %d)\n", expected);
368*1c60b9acSAndroid Build Coastguard Worker return 0;
369*1c60b9acSAndroid Build Coastguard Worker }
370*1c60b9acSAndroid Build Coastguard Worker
371*1c60b9acSAndroid Build Coastguard Worker lwsl_err("Completed: failed: exit %d, expected %d\n", bad, expected);
372*1c60b9acSAndroid Build Coastguard Worker
373*1c60b9acSAndroid Build Coastguard Worker return 1;
374*1c60b9acSAndroid Build Coastguard Worker }
375