1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * ws protocol handler plugin for testing raw file and raw socket
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Written in 2010-2019 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 * The person who associated a work with this deed has dedicated
10*1c60b9acSAndroid Build Coastguard Worker * the work to the public domain by waiving all of his or her rights
11*1c60b9acSAndroid Build Coastguard Worker * to the work worldwide under copyright law, including all related
12*1c60b9acSAndroid Build Coastguard Worker * and neighboring rights, to the extent allowed by law. You can copy,
13*1c60b9acSAndroid Build Coastguard Worker * modify, distribute and perform the work, even for commercial purposes,
14*1c60b9acSAndroid Build Coastguard Worker * all without asking permission.
15*1c60b9acSAndroid Build Coastguard Worker *
16*1c60b9acSAndroid Build Coastguard Worker * These test plugins are intended to be adapted for use in your code, which
17*1c60b9acSAndroid Build Coastguard Worker * may be proprietary. So unlike the library itself, they are licensed
18*1c60b9acSAndroid Build Coastguard Worker * Public Domain.
19*1c60b9acSAndroid Build Coastguard Worker *
20*1c60b9acSAndroid Build Coastguard Worker * This plugin test both raw file descriptors and raw socket descriptors. It
21*1c60b9acSAndroid Build Coastguard Worker * can test both or just one depending on how you configure it. libwebsockets-
22*1c60b9acSAndroid Build Coastguard Worker * test-server-v2.0 is set up to test both.
23*1c60b9acSAndroid Build Coastguard Worker *
24*1c60b9acSAndroid Build Coastguard Worker * RAW File Descriptor Testing
25*1c60b9acSAndroid Build Coastguard Worker * ===========================
26*1c60b9acSAndroid Build Coastguard Worker *
27*1c60b9acSAndroid Build Coastguard Worker * Enable on a vhost like this
28*1c60b9acSAndroid Build Coastguard Worker *
29*1c60b9acSAndroid Build Coastguard Worker * "protocol-lws-raw-test": {
30*1c60b9acSAndroid Build Coastguard Worker * "status": "ok",
31*1c60b9acSAndroid Build Coastguard Worker * "fifo-path": "/tmp/lws-test-raw"
32*1c60b9acSAndroid Build Coastguard Worker * },
33*1c60b9acSAndroid Build Coastguard Worker *
34*1c60b9acSAndroid Build Coastguard Worker * Then you can feed it data through the FIFO like this
35*1c60b9acSAndroid Build Coastguard Worker *
36*1c60b9acSAndroid Build Coastguard Worker * $ sudo sh -c "echo hello > /tmp/lws-test-raw"
37*1c60b9acSAndroid Build Coastguard Worker *
38*1c60b9acSAndroid Build Coastguard Worker * This plugin simply prints the data. But it does it through the lws event
39*1c60b9acSAndroid Build Coastguard Worker * loop / service poll.
40*1c60b9acSAndroid Build Coastguard Worker *
41*1c60b9acSAndroid Build Coastguard Worker *
42*1c60b9acSAndroid Build Coastguard Worker * RAW Socket Descriptor Testing
43*1c60b9acSAndroid Build Coastguard Worker * =============================
44*1c60b9acSAndroid Build Coastguard Worker *
45*1c60b9acSAndroid Build Coastguard Worker * 1) You must give the vhost the option flag
46*1c60b9acSAndroid Build Coastguard Worker * LWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG
47*1c60b9acSAndroid Build Coastguard Worker *
48*1c60b9acSAndroid Build Coastguard Worker * 2) Enable on a vhost like this
49*1c60b9acSAndroid Build Coastguard Worker *
50*1c60b9acSAndroid Build Coastguard Worker * "protocol-lws-raw-test": {
51*1c60b9acSAndroid Build Coastguard Worker * "status": "ok",
52*1c60b9acSAndroid Build Coastguard Worker * "raw": "1"
53*1c60b9acSAndroid Build Coastguard Worker * },
54*1c60b9acSAndroid Build Coastguard Worker *
55*1c60b9acSAndroid Build Coastguard Worker * The "raw" pvo marks this protocol as being used for RAW connections.
56*1c60b9acSAndroid Build Coastguard Worker *
57*1c60b9acSAndroid Build Coastguard Worker * 3) Run libwebsockets-test-server-v2.0 and connect to it by telnet, eg
58*1c60b9acSAndroid Build Coastguard Worker *
59*1c60b9acSAndroid Build Coastguard Worker * telnet 127.0.0.1 7681
60*1c60b9acSAndroid Build Coastguard Worker *
61*1c60b9acSAndroid Build Coastguard Worker * type something that isn't a valid HTTP method and enter, before the
62*1c60b9acSAndroid Build Coastguard Worker * connection times out. The connection will switch to RAW mode using this
63*1c60b9acSAndroid Build Coastguard Worker * protocol, and pass the unused rx as a raw RX callback.
64*1c60b9acSAndroid Build Coastguard Worker *
65*1c60b9acSAndroid Build Coastguard Worker * The test protocol echos back what was typed on telnet to telnet.
66*1c60b9acSAndroid Build Coastguard Worker */
67*1c60b9acSAndroid Build Coastguard Worker
68*1c60b9acSAndroid Build Coastguard Worker #if !defined (LWS_PLUGIN_STATIC)
69*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_DLL)
70*1c60b9acSAndroid Build Coastguard Worker #define LWS_DLL
71*1c60b9acSAndroid Build Coastguard Worker #endif
72*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_INTERNAL)
73*1c60b9acSAndroid Build Coastguard Worker #define LWS_INTERNAL
74*1c60b9acSAndroid Build Coastguard Worker #endif
75*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
76*1c60b9acSAndroid Build Coastguard Worker #endif
77*1c60b9acSAndroid Build Coastguard Worker
78*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
79*1c60b9acSAndroid Build Coastguard Worker #include <fcntl.h>
80*1c60b9acSAndroid Build Coastguard Worker
81*1c60b9acSAndroid Build Coastguard Worker #include <sys/stat.h>
82*1c60b9acSAndroid Build Coastguard Worker
83*1c60b9acSAndroid Build Coastguard Worker struct per_vhost_data__raw_test {
84*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context;
85*1c60b9acSAndroid Build Coastguard Worker struct lws_vhost *vhost;
86*1c60b9acSAndroid Build Coastguard Worker const struct lws_protocols *protocol;
87*1c60b9acSAndroid Build Coastguard Worker char fifo_path[100];
88*1c60b9acSAndroid Build Coastguard Worker int fifo;
89*1c60b9acSAndroid Build Coastguard Worker char zero_length_read;
90*1c60b9acSAndroid Build Coastguard Worker };
91*1c60b9acSAndroid Build Coastguard Worker
92*1c60b9acSAndroid Build Coastguard Worker struct per_session_data__raw_test {
93*1c60b9acSAndroid Build Coastguard Worker int number;
94*1c60b9acSAndroid Build Coastguard Worker unsigned char buf[128];
95*1c60b9acSAndroid Build Coastguard Worker int len;
96*1c60b9acSAndroid Build Coastguard Worker };
97*1c60b9acSAndroid Build Coastguard Worker
98*1c60b9acSAndroid Build Coastguard Worker static int
callback_raw_test(struct lws * wsi,enum lws_callback_reasons reason,void * user,void * in,size_t len)99*1c60b9acSAndroid Build Coastguard Worker callback_raw_test(struct lws *wsi, enum lws_callback_reasons reason, void *user,
100*1c60b9acSAndroid Build Coastguard Worker void *in, size_t len)
101*1c60b9acSAndroid Build Coastguard Worker {
102*1c60b9acSAndroid Build Coastguard Worker struct per_session_data__raw_test *pss =
103*1c60b9acSAndroid Build Coastguard Worker (struct per_session_data__raw_test *)user;
104*1c60b9acSAndroid Build Coastguard Worker struct per_vhost_data__raw_test *vhd =
105*1c60b9acSAndroid Build Coastguard Worker (struct per_vhost_data__raw_test *)
106*1c60b9acSAndroid Build Coastguard Worker lws_protocol_vh_priv_get(lws_get_vhost(wsi),
107*1c60b9acSAndroid Build Coastguard Worker lws_get_protocol(wsi));
108*1c60b9acSAndroid Build Coastguard Worker lws_sock_file_fd_type u;
109*1c60b9acSAndroid Build Coastguard Worker
110*1c60b9acSAndroid Build Coastguard Worker (void)pss;
111*1c60b9acSAndroid Build Coastguard Worker
112*1c60b9acSAndroid Build Coastguard Worker switch (reason) {
113*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_PROTOCOL_INIT:
114*1c60b9acSAndroid Build Coastguard Worker vhd = lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),
115*1c60b9acSAndroid Build Coastguard Worker lws_get_protocol(wsi),
116*1c60b9acSAndroid Build Coastguard Worker sizeof(struct per_vhost_data__raw_test));
117*1c60b9acSAndroid Build Coastguard Worker if (!vhd)
118*1c60b9acSAndroid Build Coastguard Worker return 0;
119*1c60b9acSAndroid Build Coastguard Worker vhd->context = lws_get_context(wsi);
120*1c60b9acSAndroid Build Coastguard Worker vhd->protocol = lws_get_protocol(wsi);
121*1c60b9acSAndroid Build Coastguard Worker vhd->vhost = lws_get_vhost(wsi);
122*1c60b9acSAndroid Build Coastguard Worker {
123*1c60b9acSAndroid Build Coastguard Worker const struct lws_protocol_vhost_options *pvo =
124*1c60b9acSAndroid Build Coastguard Worker (const struct lws_protocol_vhost_options *)in;
125*1c60b9acSAndroid Build Coastguard Worker while (pvo) {
126*1c60b9acSAndroid Build Coastguard Worker if (!strcmp(pvo->name, "fifo-path"))
127*1c60b9acSAndroid Build Coastguard Worker lws_strncpy(vhd->fifo_path, pvo->value,
128*1c60b9acSAndroid Build Coastguard Worker sizeof(vhd->fifo_path));
129*1c60b9acSAndroid Build Coastguard Worker pvo = pvo->next;
130*1c60b9acSAndroid Build Coastguard Worker }
131*1c60b9acSAndroid Build Coastguard Worker if (vhd->fifo_path[0] == '\0') {
132*1c60b9acSAndroid Build Coastguard Worker lwsl_warn("%s: Missing pvo \"fifo-path\", "
133*1c60b9acSAndroid Build Coastguard Worker "raw file fd testing disabled\n",
134*1c60b9acSAndroid Build Coastguard Worker __func__);
135*1c60b9acSAndroid Build Coastguard Worker break;
136*1c60b9acSAndroid Build Coastguard Worker }
137*1c60b9acSAndroid Build Coastguard Worker }
138*1c60b9acSAndroid Build Coastguard Worker unlink(vhd->fifo_path);
139*1c60b9acSAndroid Build Coastguard Worker if (mkfifo(vhd->fifo_path, 0666)) {
140*1c60b9acSAndroid Build Coastguard Worker lwsl_err("mkfifo failed\n");
141*1c60b9acSAndroid Build Coastguard Worker return 1;
142*1c60b9acSAndroid Build Coastguard Worker }
143*1c60b9acSAndroid Build Coastguard Worker vhd->fifo = lws_open(vhd->fifo_path, O_NONBLOCK | O_RDONLY);
144*1c60b9acSAndroid Build Coastguard Worker if (vhd->fifo == -1) {
145*1c60b9acSAndroid Build Coastguard Worker lwsl_err("opening fifo failed\n");
146*1c60b9acSAndroid Build Coastguard Worker unlink(vhd->fifo_path);
147*1c60b9acSAndroid Build Coastguard Worker return 1;
148*1c60b9acSAndroid Build Coastguard Worker }
149*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("FIFO %s created\n", vhd->fifo_path);
150*1c60b9acSAndroid Build Coastguard Worker u.filefd = vhd->fifo;
151*1c60b9acSAndroid Build Coastguard Worker if (!lws_adopt_descriptor_vhost(vhd->vhost,
152*1c60b9acSAndroid Build Coastguard Worker LWS_ADOPT_RAW_FILE_DESC, u,
153*1c60b9acSAndroid Build Coastguard Worker "protocol-lws-raw-test",
154*1c60b9acSAndroid Build Coastguard Worker NULL)) {
155*1c60b9acSAndroid Build Coastguard Worker lwsl_err("Failed to adopt fifo descriptor\n");
156*1c60b9acSAndroid Build Coastguard Worker close(vhd->fifo);
157*1c60b9acSAndroid Build Coastguard Worker unlink(vhd->fifo_path);
158*1c60b9acSAndroid Build Coastguard Worker return 1;
159*1c60b9acSAndroid Build Coastguard Worker }
160*1c60b9acSAndroid Build Coastguard Worker break;
161*1c60b9acSAndroid Build Coastguard Worker
162*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_PROTOCOL_DESTROY:
163*1c60b9acSAndroid Build Coastguard Worker if (!vhd)
164*1c60b9acSAndroid Build Coastguard Worker break;
165*1c60b9acSAndroid Build Coastguard Worker if (vhd->fifo >= 0) {
166*1c60b9acSAndroid Build Coastguard Worker close(vhd->fifo);
167*1c60b9acSAndroid Build Coastguard Worker unlink(vhd->fifo_path);
168*1c60b9acSAndroid Build Coastguard Worker }
169*1c60b9acSAndroid Build Coastguard Worker break;
170*1c60b9acSAndroid Build Coastguard Worker
171*1c60b9acSAndroid Build Coastguard Worker
172*1c60b9acSAndroid Build Coastguard Worker /*
173*1c60b9acSAndroid Build Coastguard Worker * Callbacks related to Raw file descriptor testing
174*1c60b9acSAndroid Build Coastguard Worker */
175*1c60b9acSAndroid Build Coastguard Worker
176*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_ADOPT_FILE:
177*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_ADOPT_FILE\n");
178*1c60b9acSAndroid Build Coastguard Worker break;
179*1c60b9acSAndroid Build Coastguard Worker
180*1c60b9acSAndroid Build Coastguard Worker
181*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_RX_FILE:
182*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_RX_FILE\n");
183*1c60b9acSAndroid Build Coastguard Worker {
184*1c60b9acSAndroid Build Coastguard Worker char buf[256];
185*1c60b9acSAndroid Build Coastguard Worker int n;
186*1c60b9acSAndroid Build Coastguard Worker
187*1c60b9acSAndroid Build Coastguard Worker n = (int)read(vhd->fifo, buf, sizeof(buf) - 1);
188*1c60b9acSAndroid Build Coastguard Worker if (n < 0) {
189*1c60b9acSAndroid Build Coastguard Worker lwsl_err("FIFO read failed\n");
190*1c60b9acSAndroid Build Coastguard Worker return 1;
191*1c60b9acSAndroid Build Coastguard Worker }
192*1c60b9acSAndroid Build Coastguard Worker /*
193*1c60b9acSAndroid Build Coastguard Worker * When nobody opened the other side of the FIFO, the
194*1c60b9acSAndroid Build Coastguard Worker * FIFO fd acts well and only signals POLLIN when
195*1c60b9acSAndroid Build Coastguard Worker * somebody opened and wrote to it.
196*1c60b9acSAndroid Build Coastguard Worker *
197*1c60b9acSAndroid Build Coastguard Worker * But if the other side of the FIFO closed it, we will
198*1c60b9acSAndroid Build Coastguard Worker * see an endless POLLIN and 0 available to read.
199*1c60b9acSAndroid Build Coastguard Worker *
200*1c60b9acSAndroid Build Coastguard Worker * The only way to handle it is to reopen the FIFO our
201*1c60b9acSAndroid Build Coastguard Worker * side and wait for a new peer. This is a quirk of
202*1c60b9acSAndroid Build Coastguard Worker * FIFOs not of LWS.
203*1c60b9acSAndroid Build Coastguard Worker */
204*1c60b9acSAndroid Build Coastguard Worker if (n == 0) { /* peer closed - reopen in close processing */
205*1c60b9acSAndroid Build Coastguard Worker vhd->zero_length_read = 1;
206*1c60b9acSAndroid Build Coastguard Worker return 1;
207*1c60b9acSAndroid Build Coastguard Worker }
208*1c60b9acSAndroid Build Coastguard Worker buf[n] = '\0';
209*1c60b9acSAndroid Build Coastguard Worker lwsl_info("read %d\n", n);
210*1c60b9acSAndroid Build Coastguard Worker puts(buf);
211*1c60b9acSAndroid Build Coastguard Worker }
212*1c60b9acSAndroid Build Coastguard Worker break;
213*1c60b9acSAndroid Build Coastguard Worker
214*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_CLOSE_FILE:
215*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_CLOSE_FILE\n");
216*1c60b9acSAndroid Build Coastguard Worker if (vhd->zero_length_read) {
217*1c60b9acSAndroid Build Coastguard Worker vhd->zero_length_read = 0;
218*1c60b9acSAndroid Build Coastguard Worker close(vhd->fifo);
219*1c60b9acSAndroid Build Coastguard Worker /* the wsi that adopted the fifo file is closing...
220*1c60b9acSAndroid Build Coastguard Worker * reopen the fifo and readopt
221*1c60b9acSAndroid Build Coastguard Worker */
222*1c60b9acSAndroid Build Coastguard Worker vhd->fifo = lws_open(vhd->fifo_path,
223*1c60b9acSAndroid Build Coastguard Worker O_NONBLOCK | O_RDONLY);
224*1c60b9acSAndroid Build Coastguard Worker if (vhd->fifo == -1) {
225*1c60b9acSAndroid Build Coastguard Worker lwsl_err("opening fifo failed\n");
226*1c60b9acSAndroid Build Coastguard Worker return 1;
227*1c60b9acSAndroid Build Coastguard Worker }
228*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("FIFO %s reopened\n", vhd->fifo_path);
229*1c60b9acSAndroid Build Coastguard Worker u.filefd = vhd->fifo;
230*1c60b9acSAndroid Build Coastguard Worker if (!lws_adopt_descriptor_vhost(vhd->vhost, 0, u,
231*1c60b9acSAndroid Build Coastguard Worker "protocol-lws-raw-test", NULL)) {
232*1c60b9acSAndroid Build Coastguard Worker lwsl_err("Failed to adopt fifo descriptor\n");
233*1c60b9acSAndroid Build Coastguard Worker close(vhd->fifo);
234*1c60b9acSAndroid Build Coastguard Worker return 1;
235*1c60b9acSAndroid Build Coastguard Worker }
236*1c60b9acSAndroid Build Coastguard Worker }
237*1c60b9acSAndroid Build Coastguard Worker break;
238*1c60b9acSAndroid Build Coastguard Worker
239*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_WRITEABLE_FILE:
240*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_WRITEABLE_FILE\n");
241*1c60b9acSAndroid Build Coastguard Worker break;
242*1c60b9acSAndroid Build Coastguard Worker
243*1c60b9acSAndroid Build Coastguard Worker /*
244*1c60b9acSAndroid Build Coastguard Worker * Callbacks related to Raw socket descriptor testing
245*1c60b9acSAndroid Build Coastguard Worker */
246*1c60b9acSAndroid Build Coastguard Worker
247*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_ADOPT:
248*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_ADOPT\n");
249*1c60b9acSAndroid Build Coastguard Worker break;
250*1c60b9acSAndroid Build Coastguard Worker
251*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_RX:
252*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_RX %ld\n", (long)len);
253*1c60b9acSAndroid Build Coastguard Worker if (len > sizeof(pss->buf))
254*1c60b9acSAndroid Build Coastguard Worker len = sizeof(pss->buf);
255*1c60b9acSAndroid Build Coastguard Worker memcpy(pss->buf, in, len);
256*1c60b9acSAndroid Build Coastguard Worker pss->len = (int)len;
257*1c60b9acSAndroid Build Coastguard Worker lws_callback_on_writable(wsi);
258*1c60b9acSAndroid Build Coastguard Worker break;
259*1c60b9acSAndroid Build Coastguard Worker
260*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_CLOSE:
261*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_CLOSE\n");
262*1c60b9acSAndroid Build Coastguard Worker break;
263*1c60b9acSAndroid Build Coastguard Worker
264*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RAW_WRITEABLE:
265*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("LWS_CALLBACK_RAW_WRITEABLE\n");
266*1c60b9acSAndroid Build Coastguard Worker lws_write(wsi, pss->buf, (size_t)pss->len, LWS_WRITE_HTTP);
267*1c60b9acSAndroid Build Coastguard Worker break;
268*1c60b9acSAndroid Build Coastguard Worker
269*1c60b9acSAndroid Build Coastguard Worker default:
270*1c60b9acSAndroid Build Coastguard Worker break;
271*1c60b9acSAndroid Build Coastguard Worker }
272*1c60b9acSAndroid Build Coastguard Worker
273*1c60b9acSAndroid Build Coastguard Worker return 0;
274*1c60b9acSAndroid Build Coastguard Worker }
275*1c60b9acSAndroid Build Coastguard Worker
276*1c60b9acSAndroid Build Coastguard Worker #define LWS_PLUGIN_PROTOCOL_RAW_TEST \
277*1c60b9acSAndroid Build Coastguard Worker { \
278*1c60b9acSAndroid Build Coastguard Worker "protocol-lws-raw-test", \
279*1c60b9acSAndroid Build Coastguard Worker callback_raw_test, \
280*1c60b9acSAndroid Build Coastguard Worker sizeof(struct per_session_data__raw_test), \
281*1c60b9acSAndroid Build Coastguard Worker 1024, /* rx buf size must be >= permessage-deflate rx size */ 0, NULL, 0\
282*1c60b9acSAndroid Build Coastguard Worker }
283*1c60b9acSAndroid Build Coastguard Worker
284*1c60b9acSAndroid Build Coastguard Worker #if !defined (LWS_PLUGIN_STATIC)
285*1c60b9acSAndroid Build Coastguard Worker
286*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE const struct lws_protocols lws_raw_test_protocols[] = {
287*1c60b9acSAndroid Build Coastguard Worker LWS_PLUGIN_PROTOCOL_RAW_TEST
288*1c60b9acSAndroid Build Coastguard Worker };
289*1c60b9acSAndroid Build Coastguard Worker
290*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE const lws_plugin_protocol_t lws_raw_test = {
291*1c60b9acSAndroid Build Coastguard Worker .hdr = {
292*1c60b9acSAndroid Build Coastguard Worker "lws raw test",
293*1c60b9acSAndroid Build Coastguard Worker "lws_protocol_plugin",
294*1c60b9acSAndroid Build Coastguard Worker LWS_BUILD_HASH,
295*1c60b9acSAndroid Build Coastguard Worker LWS_PLUGIN_API_MAGIC
296*1c60b9acSAndroid Build Coastguard Worker },
297*1c60b9acSAndroid Build Coastguard Worker
298*1c60b9acSAndroid Build Coastguard Worker .protocols = lws_raw_test_protocols,
299*1c60b9acSAndroid Build Coastguard Worker .count_protocols = LWS_ARRAY_SIZE(lws_raw_test_protocols),
300*1c60b9acSAndroid Build Coastguard Worker .extensions = NULL,
301*1c60b9acSAndroid Build Coastguard Worker .count_extensions = 0,
302*1c60b9acSAndroid Build Coastguard Worker };
303*1c60b9acSAndroid Build Coastguard Worker
304*1c60b9acSAndroid Build Coastguard Worker #endif
305