xref: /aosp_15_r20/external/libwebsockets/plugins/protocol_lws_raw_test.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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