xref: /aosp_15_r20/external/libwebsockets/include/libwebsockets/lws-system.h (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker  /*
2*1c60b9acSAndroid Build Coastguard Worker  * libwebsockets - small server side websockets and web server implementation
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Copyright (C) 2010 - 2021 Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*1c60b9acSAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to
8*1c60b9acSAndroid Build Coastguard Worker  * deal in the Software without restriction, including without limitation the
9*1c60b9acSAndroid Build Coastguard Worker  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*1c60b9acSAndroid Build Coastguard Worker  * sell copies of the Software, and to permit persons to whom the Software is
11*1c60b9acSAndroid Build Coastguard Worker  * furnished to do so, subject to the following conditions:
12*1c60b9acSAndroid Build Coastguard Worker  *
13*1c60b9acSAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
14*1c60b9acSAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
15*1c60b9acSAndroid Build Coastguard Worker  *
16*1c60b9acSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*1c60b9acSAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*1c60b9acSAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*1c60b9acSAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*1c60b9acSAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*1c60b9acSAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*1c60b9acSAndroid Build Coastguard Worker  * IN THE SOFTWARE.
23*1c60b9acSAndroid Build Coastguard Worker  *
24*1c60b9acSAndroid Build Coastguard Worker  * This provides a clean way to interface lws user code to be able to
25*1c60b9acSAndroid Build Coastguard Worker  * work unchanged on different systems for fetching common system information,
26*1c60b9acSAndroid Build Coastguard Worker  * and performing common system operations like reboot.
27*1c60b9acSAndroid Build Coastguard Worker  */
28*1c60b9acSAndroid Build Coastguard Worker 
29*1c60b9acSAndroid Build Coastguard Worker /*
30*1c60b9acSAndroid Build Coastguard Worker  * Types of system blob that can be set and retreived
31*1c60b9acSAndroid Build Coastguard Worker  */
32*1c60b9acSAndroid Build Coastguard Worker 
33*1c60b9acSAndroid Build Coastguard Worker typedef enum {
34*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_AUTH,
35*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_CLIENT_CERT_DER = LWS_SYSBLOB_TYPE_AUTH + 2,
36*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_CLIENT_KEY_DER,
37*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_DEVICE_SERIAL,
38*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION,
39*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_DEVICE_TYPE,
40*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_NTP_SERVER,
41*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_MQTT_CLIENT_ID,
42*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_MQTT_USERNAME,
43*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_MQTT_PASSWORD,
44*1c60b9acSAndroid Build Coastguard Worker 
45*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)
46*1c60b9acSAndroid Build Coastguard Worker 	/* extend 4 more auth blobs, each has 2 slots */
47*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_EXT_AUTH1,
48*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_EXT_AUTH2 = LWS_SYSBLOB_TYPE_EXT_AUTH1 + 2,
49*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_EXT_AUTH3 = LWS_SYSBLOB_TYPE_EXT_AUTH2 + 2,
50*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_EXT_AUTH4 = LWS_SYSBLOB_TYPE_EXT_AUTH3 + 2,
51*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_EXT_AUTH4_1,
52*1c60b9acSAndroid Build Coastguard Worker #endif
53*1c60b9acSAndroid Build Coastguard Worker 
54*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSBLOB_TYPE_COUNT /* ... always last */
55*1c60b9acSAndroid Build Coastguard Worker } lws_system_blob_item_t;
56*1c60b9acSAndroid Build Coastguard Worker 
57*1c60b9acSAndroid Build Coastguard Worker /* opaque generic blob whose content may be on-the-heap or pointed-to
58*1c60b9acSAndroid Build Coastguard Worker  * directly case by case.  When it's on the heap, it can be produced by
59*1c60b9acSAndroid Build Coastguard Worker  * appending (it's a buflist underneath).  Either way, it can be consumed by
60*1c60b9acSAndroid Build Coastguard Worker  * copying out a given length from a given offset.
61*1c60b9acSAndroid Build Coastguard Worker  */
62*1c60b9acSAndroid Build Coastguard Worker 
63*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_system_blob lws_system_blob_t;
64*1c60b9acSAndroid Build Coastguard Worker 
65*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE void
66*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_direct_set(lws_system_blob_t *b, const uint8_t *ptr, size_t len);
67*1c60b9acSAndroid Build Coastguard Worker 
68*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE void
69*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_heap_empty(lws_system_blob_t *b);
70*1c60b9acSAndroid Build Coastguard Worker 
71*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
72*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_heap_append(lws_system_blob_t *b, const uint8_t *ptr, size_t len);
73*1c60b9acSAndroid Build Coastguard Worker 
74*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE size_t
75*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_get_size(lws_system_blob_t *b);
76*1c60b9acSAndroid Build Coastguard Worker 
77*1c60b9acSAndroid Build Coastguard Worker /* return 0 and sets *ptr to point to blob data if possible, nonzero = fail */
78*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
79*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_get_single_ptr(lws_system_blob_t *b, const uint8_t **ptr);
80*1c60b9acSAndroid Build Coastguard Worker 
81*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
82*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_get(lws_system_blob_t *b, uint8_t *ptr, size_t *len, size_t ofs);
83*1c60b9acSAndroid Build Coastguard Worker 
84*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE void
85*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_destroy(lws_system_blob_t *b);
86*1c60b9acSAndroid Build Coastguard Worker 
87*1c60b9acSAndroid Build Coastguard Worker /*
88*1c60b9acSAndroid Build Coastguard Worker  * Get the opaque blob for index idx of various system blobs.  Returns 0 if
89*1c60b9acSAndroid Build Coastguard Worker  * *b was set otherwise nonzero means out of range
90*1c60b9acSAndroid Build Coastguard Worker  */
91*1c60b9acSAndroid Build Coastguard Worker 
92*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE lws_system_blob_t *
93*1c60b9acSAndroid Build Coastguard Worker lws_system_get_blob(struct lws_context *context, lws_system_blob_item_t type,
94*1c60b9acSAndroid Build Coastguard Worker                     int idx);
95*1c60b9acSAndroid Build Coastguard Worker 
96*1c60b9acSAndroid Build Coastguard Worker /*
97*1c60b9acSAndroid Build Coastguard Worker  * Lws view of system state... normal operation from user code perspective is
98*1c60b9acSAndroid Build Coastguard Worker  * dependent on implicit (eg, knowing the date for cert validation) and
99*1c60b9acSAndroid Build Coastguard Worker  * explicit dependencies.
100*1c60b9acSAndroid Build Coastguard Worker  *
101*1c60b9acSAndroid Build Coastguard Worker  * Bit of lws and user code can register notification handlers that can enforce
102*1c60b9acSAndroid Build Coastguard Worker  * dependent operations before state transitions can complete.
103*1c60b9acSAndroid Build Coastguard Worker  */
104*1c60b9acSAndroid Build Coastguard Worker 
105*1c60b9acSAndroid Build Coastguard Worker typedef enum { /* keep system_state_names[] in sync in context.c */
106*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_UNKNOWN,
107*1c60b9acSAndroid Build Coastguard Worker 
108*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_CONTEXT_CREATED,	 /* context was just created */
109*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_INITIALIZED,	 /* protocols initialized.  Lws itself
110*1c60b9acSAndroid Build Coastguard Worker 					  * can operate normally */
111*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_IFACE_COLDPLUG,	 /* existing net ifaces iterated */
112*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_DHCP,		 /* at least one net iface configured */
113*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_CPD_PRE_TIME,	 /* Captive portal detect without valid
114*1c60b9acSAndroid Build Coastguard Worker 					  * time, good for non-https tests... if
115*1c60b9acSAndroid Build Coastguard Worker 					  * you care about it, implement and
116*1c60b9acSAndroid Build Coastguard Worker 					  * call lws_system_ops_t
117*1c60b9acSAndroid Build Coastguard Worker 					  * .captive_portal_detect_request()
118*1c60b9acSAndroid Build Coastguard Worker 					  * and move the state forward according
119*1c60b9acSAndroid Build Coastguard Worker 					  * to the result. */
120*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_TIME_VALID,		 /* ntpclient ran, or hw time valid...
121*1c60b9acSAndroid Build Coastguard Worker 					  * tls cannot work until we reach here
122*1c60b9acSAndroid Build Coastguard Worker 					  */
123*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_CPD_POST_TIME,	 /* Captive portal detect after time was
124*1c60b9acSAndroid Build Coastguard Worker 					  * time, good for https tests... if
125*1c60b9acSAndroid Build Coastguard Worker 					  * you care about it, implement and
126*1c60b9acSAndroid Build Coastguard Worker 					  * call lws_system_ops_t
127*1c60b9acSAndroid Build Coastguard Worker 					  * .captive_portal_detect_request()
128*1c60b9acSAndroid Build Coastguard Worker 					  * and move the state forward according
129*1c60b9acSAndroid Build Coastguard Worker 					  * to the result. */
130*1c60b9acSAndroid Build Coastguard Worker 
131*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_POLICY_VALID,	 /* user code knows how to operate... */
132*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_REGISTERED,		 /* device has an identity... */
133*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_AUTH1,		 /* identity used for main auth token */
134*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_AUTH2,		 /* identity used for optional auth */
135*1c60b9acSAndroid Build Coastguard Worker 
136*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_OPERATIONAL,	 /* user code can operate normally */
137*1c60b9acSAndroid Build Coastguard Worker 
138*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_POLICY_INVALID,	 /* user code is changing its policies
139*1c60b9acSAndroid Build Coastguard Worker 					  * drop everything done with old
140*1c60b9acSAndroid Build Coastguard Worker 					  * policy, switch to new then enter
141*1c60b9acSAndroid Build Coastguard Worker 					  * LWS_SYSTATE_POLICY_VALID */
142*1c60b9acSAndroid Build Coastguard Worker 	LWS_SYSTATE_CONTEXT_DESTROYING,	 /* Context is being destroyed */
143*1c60b9acSAndroid Build Coastguard Worker } lws_system_states_t;
144*1c60b9acSAndroid Build Coastguard Worker 
145*1c60b9acSAndroid Build Coastguard Worker /* Captive Portal Detect -related */
146*1c60b9acSAndroid Build Coastguard Worker 
147*1c60b9acSAndroid Build Coastguard Worker typedef enum {
148*1c60b9acSAndroid Build Coastguard Worker 	LWS_CPD_UNKNOWN = 0,	/* test didn't happen ince last DHCP acq yet */
149*1c60b9acSAndroid Build Coastguard Worker 	LWS_CPD_INTERNET_OK,	/* no captive portal: our CPD test passed OK,
150*1c60b9acSAndroid Build Coastguard Worker 				 * we can go out on the internet */
151*1c60b9acSAndroid Build Coastguard Worker 	LWS_CPD_CAPTIVE_PORTAL,	/* we inferred we're behind a captive portal */
152*1c60b9acSAndroid Build Coastguard Worker 	LWS_CPD_NO_INTERNET,	/* we couldn't touch anything */
153*1c60b9acSAndroid Build Coastguard Worker } lws_cpd_result_t;
154*1c60b9acSAndroid Build Coastguard Worker 
155*1c60b9acSAndroid Build Coastguard Worker typedef void (*lws_attach_cb_t)(struct lws_context *context, int tsi, void *opaque);
156*1c60b9acSAndroid Build Coastguard Worker struct lws_attach_item;
157*1c60b9acSAndroid Build Coastguard Worker 
158*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
159*1c60b9acSAndroid Build Coastguard Worker lws_tls_jit_trust_got_cert_cb(struct lws_context *cx, void *got_opaque,
160*1c60b9acSAndroid Build Coastguard Worker 			      const uint8_t *skid, size_t skid_len,
161*1c60b9acSAndroid Build Coastguard Worker 			      const uint8_t *der, size_t der_len);
162*1c60b9acSAndroid Build Coastguard Worker 
163*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_system_ops {
164*1c60b9acSAndroid Build Coastguard Worker 	int (*reboot)(void);
165*1c60b9acSAndroid Build Coastguard Worker 	int (*set_clock)(lws_usec_t us);
166*1c60b9acSAndroid Build Coastguard Worker 	int (*attach)(struct lws_context *context, int tsi, lws_attach_cb_t cb,
167*1c60b9acSAndroid Build Coastguard Worker 		      lws_system_states_t state, void *opaque,
168*1c60b9acSAndroid Build Coastguard Worker 		      struct lws_attach_item **get);
169*1c60b9acSAndroid Build Coastguard Worker 	/**< if \p get is NULL, add an attach callback request to the pt for
170*1c60b9acSAndroid Build Coastguard Worker 	 * \p cb with arg \p opaque, that should be called when we're at or past
171*1c60b9acSAndroid Build Coastguard Worker 	 * system state \p state.
172*1c60b9acSAndroid Build Coastguard Worker 	 *
173*1c60b9acSAndroid Build Coastguard Worker 	 * If \p get is non-NULL, look for the first listed item on the pt whose
174*1c60b9acSAndroid Build Coastguard Worker 	 * state situation is ready, and set *get to point to it.  If no items,
175*1c60b9acSAndroid Build Coastguard Worker 	 * or none where the system state is right, set *get to NULL.
176*1c60b9acSAndroid Build Coastguard Worker 	 *
177*1c60b9acSAndroid Build Coastguard Worker 	 * It's done like this so (*attach) can perform system-specific
178*1c60b9acSAndroid Build Coastguard Worker 	 * locking outside of lws core, for both getting and adding items the
179*1c60b9acSAndroid Build Coastguard Worker 	 * same so it is thread-safe.  A non-threadsafe helper
180*1c60b9acSAndroid Build Coastguard Worker 	 * __lws_system_attach() is provided to do the actual work inside the
181*1c60b9acSAndroid Build Coastguard Worker 	 * system-specific locking.
182*1c60b9acSAndroid Build Coastguard Worker 	 */
183*1c60b9acSAndroid Build Coastguard Worker 	int (*captive_portal_detect_request)(struct lws_context *context);
184*1c60b9acSAndroid Build Coastguard Worker 	/**< Check if we can go out on the internet cleanly, or if we are being
185*1c60b9acSAndroid Build Coastguard Worker 	 * redirected or intercepted by a captive portal.
186*1c60b9acSAndroid Build Coastguard Worker 	 * Start the check that proceeds asynchronously, and report the results
187*1c60b9acSAndroid Build Coastguard Worker 	 * by calling lws_captive_portal_detect_result() api
188*1c60b9acSAndroid Build Coastguard Worker 	 */
189*1c60b9acSAndroid Build Coastguard Worker 
190*1c60b9acSAndroid Build Coastguard Worker 	int (*metric_report)(lws_metric_pub_t *mdata);
191*1c60b9acSAndroid Build Coastguard Worker 	/**< metric \p item is reporting an event of kind \p rpt,
192*1c60b9acSAndroid Build Coastguard Worker 	 * held in \p mdata... return 0 to leave the metric object as it is,
193*1c60b9acSAndroid Build Coastguard Worker 	 * or nonzero to reset it. */
194*1c60b9acSAndroid Build Coastguard Worker 
195*1c60b9acSAndroid Build Coastguard Worker 	int (*jit_trust_query)(struct lws_context *cx, const uint8_t *skid,
196*1c60b9acSAndroid Build Coastguard Worker 			       size_t skid_len, void *got_opaque);
197*1c60b9acSAndroid Build Coastguard Worker 	/**< user defined trust store search, if we do trust a cert with SKID
198*1c60b9acSAndroid Build Coastguard Worker 	 * matching skid / skid_len, then it should get hold of the DER for the
199*1c60b9acSAndroid Build Coastguard Worker 	 * matching root CA and call
200*1c60b9acSAndroid Build Coastguard Worker 	 * lws_tls_jit_trust_got_cert_cb(..., got_opaque) before cleaning up and
201*1c60b9acSAndroid Build Coastguard Worker 	 * returning.  The DER should be destroyed if in heap before returning.
202*1c60b9acSAndroid Build Coastguard Worker 	 */
203*1c60b9acSAndroid Build Coastguard Worker 
204*1c60b9acSAndroid Build Coastguard Worker 	uint32_t	wake_latency_us;
205*1c60b9acSAndroid Build Coastguard Worker 	/**< time taken for this device to wake from suspend, in us
206*1c60b9acSAndroid Build Coastguard Worker 	 */
207*1c60b9acSAndroid Build Coastguard Worker } lws_system_ops_t;
208*1c60b9acSAndroid Build Coastguard Worker 
209*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_STATE)
210*1c60b9acSAndroid Build Coastguard Worker 
211*1c60b9acSAndroid Build Coastguard Worker /**
212*1c60b9acSAndroid Build Coastguard Worker  * lws_system_get_state_manager() - return the state mgr object for system state
213*1c60b9acSAndroid Build Coastguard Worker  *
214*1c60b9acSAndroid Build Coastguard Worker  * \param context: the lws_context
215*1c60b9acSAndroid Build Coastguard Worker  *
216*1c60b9acSAndroid Build Coastguard Worker  * The returned pointer can be used with the lws_state_ apis
217*1c60b9acSAndroid Build Coastguard Worker  */
218*1c60b9acSAndroid Build Coastguard Worker 
219*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE lws_state_manager_t *
220*1c60b9acSAndroid Build Coastguard Worker lws_system_get_state_manager(struct lws_context *context);
221*1c60b9acSAndroid Build Coastguard Worker 
222*1c60b9acSAndroid Build Coastguard Worker #endif
223*1c60b9acSAndroid Build Coastguard Worker 
224*1c60b9acSAndroid Build Coastguard Worker /* wrappers handle NULL members or no ops struct set at all cleanly */
225*1c60b9acSAndroid Build Coastguard Worker 
226*1c60b9acSAndroid Build Coastguard Worker #define LWSSYSGAUTH_HEX (1 << 0)
227*1c60b9acSAndroid Build Coastguard Worker 
228*1c60b9acSAndroid Build Coastguard Worker /**
229*1c60b9acSAndroid Build Coastguard Worker  * lws_system_get_ops() - get ahold of the system ops struct from the context
230*1c60b9acSAndroid Build Coastguard Worker  *
231*1c60b9acSAndroid Build Coastguard Worker  * \param context: the lws_context
232*1c60b9acSAndroid Build Coastguard Worker  *
233*1c60b9acSAndroid Build Coastguard Worker  * Returns the system ops struct.  It may return NULL and if not, anything in
234*1c60b9acSAndroid Build Coastguard Worker  * there may be NULL.
235*1c60b9acSAndroid Build Coastguard Worker  */
236*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE const lws_system_ops_t *
237*1c60b9acSAndroid Build Coastguard Worker lws_system_get_ops(struct lws_context *context);
238*1c60b9acSAndroid Build Coastguard Worker 
239*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_STATE)
240*1c60b9acSAndroid Build Coastguard Worker 
241*1c60b9acSAndroid Build Coastguard Worker /**
242*1c60b9acSAndroid Build Coastguard Worker  * lws_system_context_from_system_mgr() - return context from system state mgr
243*1c60b9acSAndroid Build Coastguard Worker  *
244*1c60b9acSAndroid Build Coastguard Worker  * \param mgr: pointer to specifically the system state mgr
245*1c60b9acSAndroid Build Coastguard Worker  *
246*1c60b9acSAndroid Build Coastguard Worker  * Returns the context from the system state mgr.  Helper since the lws_context
247*1c60b9acSAndroid Build Coastguard Worker  * is opaque.
248*1c60b9acSAndroid Build Coastguard Worker  */
249*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE struct lws_context *
250*1c60b9acSAndroid Build Coastguard Worker lws_system_context_from_system_mgr(lws_state_manager_t *mgr);
251*1c60b9acSAndroid Build Coastguard Worker 
252*1c60b9acSAndroid Build Coastguard Worker #endif
253*1c60b9acSAndroid Build Coastguard Worker 
254*1c60b9acSAndroid Build Coastguard Worker /**
255*1c60b9acSAndroid Build Coastguard Worker  * __lws_system_attach() - get and set items on context attach list
256*1c60b9acSAndroid Build Coastguard Worker  *
257*1c60b9acSAndroid Build Coastguard Worker  * \param context: context to get or set attach items to
258*1c60b9acSAndroid Build Coastguard Worker  * \param tsi: thread service index (normally 0)
259*1c60b9acSAndroid Build Coastguard Worker  * \param cb: callback to call from context event loop thread
260*1c60b9acSAndroid Build Coastguard Worker  * \param state: the lws_system state we have to be in or have passed through
261*1c60b9acSAndroid Build Coastguard Worker  * \param opaque: optional pointer to user specific info given to callback
262*1c60b9acSAndroid Build Coastguard Worker  * \param get: NULL, or pointer to pointer to take detached tail item on exit
263*1c60b9acSAndroid Build Coastguard Worker  *
264*1c60b9acSAndroid Build Coastguard Worker  * This allows other threads to enqueue callback requests to happen from a pt's
265*1c60b9acSAndroid Build Coastguard Worker  * event loop thread safely.  The callback gets the context pointer and a user
266*1c60b9acSAndroid Build Coastguard Worker  * opaque pointer that can be optionally given when the item is added to the
267*1c60b9acSAndroid Build Coastguard Worker  * attach list.
268*1c60b9acSAndroid Build Coastguard Worker  *
269*1c60b9acSAndroid Build Coastguard Worker  * This api is the no-locking core function for getting and setting items on the
270*1c60b9acSAndroid Build Coastguard Worker  * pt's attach list.  The lws_system operation (*attach) is the actual
271*1c60b9acSAndroid Build Coastguard Worker  * api that user and internal code calls for this feature, it should perform
272*1c60b9acSAndroid Build Coastguard Worker  * system-specific locking, call this helper, release the locking and then
273*1c60b9acSAndroid Build Coastguard Worker  * return the result.  This api is public only so it can be used in the locked
274*1c60b9acSAndroid Build Coastguard Worker  * implementation of (*attach).
275*1c60b9acSAndroid Build Coastguard Worker  *
276*1c60b9acSAndroid Build Coastguard Worker  * If get is NULL, then the call adds to the head of the pt attach list using
277*1c60b9acSAndroid Build Coastguard Worker  * cb, state, and opaque; if get is non-NULL, then *get is set to the first
278*1c60b9acSAndroid Build Coastguard Worker  * waiting attached item that meets the state criteria and that item is removed
279*1c60b9acSAndroid Build Coastguard Worker  * from the list.
280*1c60b9acSAndroid Build Coastguard Worker  *
281*1c60b9acSAndroid Build Coastguard Worker  * This is a non-threadsafe helper only designed to be called from
282*1c60b9acSAndroid Build Coastguard Worker  * implementations of struct lws_system's (*attach) operation where system-
283*1c60b9acSAndroid Build Coastguard Worker  * specific locking has been applied around it, making it threadsafe.
284*1c60b9acSAndroid Build Coastguard Worker  */
285*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
286*1c60b9acSAndroid Build Coastguard Worker __lws_system_attach(struct lws_context *context, int tsi, lws_attach_cb_t cb,
287*1c60b9acSAndroid Build Coastguard Worker 		    lws_system_states_t state, void *opaque,
288*1c60b9acSAndroid Build Coastguard Worker 		    struct lws_attach_item **get);
289*1c60b9acSAndroid Build Coastguard Worker 
290*1c60b9acSAndroid Build Coastguard Worker 
291*1c60b9acSAndroid Build Coastguard Worker enum {
292*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_IPV4_SUBNET_MASK		= 0,
293*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_IPV4_BROADCAST,
294*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_LEASE_SECS,
295*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_REBINDING_SECS,
296*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_RENEWAL_SECS,
297*1c60b9acSAndroid Build Coastguard Worker 
298*1c60b9acSAndroid Build Coastguard Worker 	_LWSDH_NUMS_COUNT,
299*1c60b9acSAndroid Build Coastguard Worker 
300*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_IP			= 0,
301*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_DNS_SRV_1,
302*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_DNS_SRV_2,
303*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_DNS_SRV_3,
304*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_DNS_SRV_4,
305*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_IPV4_ROUTER,
306*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_NTP_SERVER,
307*1c60b9acSAndroid Build Coastguard Worker 	LWSDH_SA46_DHCP_SERVER,
308*1c60b9acSAndroid Build Coastguard Worker 
309*1c60b9acSAndroid Build Coastguard Worker 	_LWSDH_SA46_COUNT,
310*1c60b9acSAndroid Build Coastguard Worker };
311*1c60b9acSAndroid Build Coastguard Worker 
312*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_dhcpc_ifstate {
313*1c60b9acSAndroid Build Coastguard Worker 	char				ifname[16];
314*1c60b9acSAndroid Build Coastguard Worker 	char				domain[64];
315*1c60b9acSAndroid Build Coastguard Worker 	uint8_t				mac[6];
316*1c60b9acSAndroid Build Coastguard Worker 	uint32_t			nums[_LWSDH_NUMS_COUNT];
317*1c60b9acSAndroid Build Coastguard Worker 	lws_sockaddr46			sa46[_LWSDH_SA46_COUNT];
318*1c60b9acSAndroid Build Coastguard Worker } lws_dhcpc_ifstate_t;
319*1c60b9acSAndroid Build Coastguard Worker 
320*1c60b9acSAndroid Build Coastguard Worker typedef int (*dhcpc_cb_t)(void *opaque, lws_dhcpc_ifstate_t *is);
321*1c60b9acSAndroid Build Coastguard Worker 
322*1c60b9acSAndroid Build Coastguard Worker /**
323*1c60b9acSAndroid Build Coastguard Worker  * lws_dhcpc_request() - add a network interface to dhcpc management
324*1c60b9acSAndroid Build Coastguard Worker  *
325*1c60b9acSAndroid Build Coastguard Worker  * \param c: the lws_context
326*1c60b9acSAndroid Build Coastguard Worker  * \param i: the interface name, like "eth0"
327*1c60b9acSAndroid Build Coastguard Worker  * \param af: address family
328*1c60b9acSAndroid Build Coastguard Worker  * \param cb: the change callback
329*1c60b9acSAndroid Build Coastguard Worker  * \param opaque: opaque pointer given to the callback
330*1c60b9acSAndroid Build Coastguard Worker  *
331*1c60b9acSAndroid Build Coastguard Worker  * Register a network interface as being managed by DHCP.  lws will proceed to
332*1c60b9acSAndroid Build Coastguard Worker  * try to acquire an IP.  Requires LWS_WITH_SYS_DHCP_CLIENT at cmake.
333*1c60b9acSAndroid Build Coastguard Worker  */
334*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
335*1c60b9acSAndroid Build Coastguard Worker lws_dhcpc_request(struct lws_context *c, const char *i, int af, dhcpc_cb_t cb,
336*1c60b9acSAndroid Build Coastguard Worker 		void *opaque);
337*1c60b9acSAndroid Build Coastguard Worker 
338*1c60b9acSAndroid Build Coastguard Worker /**
339*1c60b9acSAndroid Build Coastguard Worker  * lws_dhcpc_remove() - remove a network interface to dhcpc management
340*1c60b9acSAndroid Build Coastguard Worker  *
341*1c60b9acSAndroid Build Coastguard Worker  * \param context: the lws_context
342*1c60b9acSAndroid Build Coastguard Worker  * \param iface: the interface name, like "eth0"
343*1c60b9acSAndroid Build Coastguard Worker  *
344*1c60b9acSAndroid Build Coastguard Worker  * Remove handling of the network interface from dhcp.
345*1c60b9acSAndroid Build Coastguard Worker  */
346*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
347*1c60b9acSAndroid Build Coastguard Worker lws_dhcpc_remove(struct lws_context *context, const char *iface);
348*1c60b9acSAndroid Build Coastguard Worker 
349*1c60b9acSAndroid Build Coastguard Worker /**
350*1c60b9acSAndroid Build Coastguard Worker  * lws_dhcpc_status() - has any interface reached BOUND state
351*1c60b9acSAndroid Build Coastguard Worker  *
352*1c60b9acSAndroid Build Coastguard Worker  * \param context: the lws_context
353*1c60b9acSAndroid Build Coastguard Worker  * \param sa46: set to a DNS server from a bound interface, or NULL
354*1c60b9acSAndroid Build Coastguard Worker  *
355*1c60b9acSAndroid Build Coastguard Worker  * Returns 1 if any network interface managed by dhcpc has reached the BOUND
356*1c60b9acSAndroid Build Coastguard Worker  * state (has acquired an IP, gateway and DNS server), otherwise 0.
357*1c60b9acSAndroid Build Coastguard Worker  */
358*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
359*1c60b9acSAndroid Build Coastguard Worker lws_dhcpc_status(struct lws_context *context, lws_sockaddr46 *sa46);
360*1c60b9acSAndroid Build Coastguard Worker 
361*1c60b9acSAndroid Build Coastguard Worker /**
362*1c60b9acSAndroid Build Coastguard Worker  * lws_system_cpd_start() - helper to initiate captive portal detection
363*1c60b9acSAndroid Build Coastguard Worker  *
364*1c60b9acSAndroid Build Coastguard Worker  * \param context: the lws_context
365*1c60b9acSAndroid Build Coastguard Worker  *
366*1c60b9acSAndroid Build Coastguard Worker  * Resets the context's captive portal state to LWS_CPD_UNKNOWN and calls the
367*1c60b9acSAndroid Build Coastguard Worker  * lws_system_ops_t captive_portal_detect_request() implementation to begin
368*1c60b9acSAndroid Build Coastguard Worker  * testing the captive portal state.
369*1c60b9acSAndroid Build Coastguard Worker  */
370*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE int
371*1c60b9acSAndroid Build Coastguard Worker lws_system_cpd_start(struct lws_context *context);
372*1c60b9acSAndroid Build Coastguard Worker 
373*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE void
374*1c60b9acSAndroid Build Coastguard Worker lws_system_cpd_start_defer(struct lws_context *cx, lws_usec_t defer_us);
375*1c60b9acSAndroid Build Coastguard Worker 
376*1c60b9acSAndroid Build Coastguard Worker 
377*1c60b9acSAndroid Build Coastguard Worker /**
378*1c60b9acSAndroid Build Coastguard Worker  * lws_system_cpd_set() - report the result of the captive portal detection
379*1c60b9acSAndroid Build Coastguard Worker  *
380*1c60b9acSAndroid Build Coastguard Worker  * \param context: the lws_context
381*1c60b9acSAndroid Build Coastguard Worker  * \param result: one of the LWS_CPD_ constants representing captive portal state
382*1c60b9acSAndroid Build Coastguard Worker  *
383*1c60b9acSAndroid Build Coastguard Worker  * Sets the context's captive portal detection state to result.  User captive
384*1c60b9acSAndroid Build Coastguard Worker  * portal detection code would call this once it had a result from its test.
385*1c60b9acSAndroid Build Coastguard Worker  */
386*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE void
387*1c60b9acSAndroid Build Coastguard Worker lws_system_cpd_set(struct lws_context *context, lws_cpd_result_t result);
388*1c60b9acSAndroid Build Coastguard Worker 
389*1c60b9acSAndroid Build Coastguard Worker 
390*1c60b9acSAndroid Build Coastguard Worker /**
391*1c60b9acSAndroid Build Coastguard Worker  * lws_system_cpd_state_get() - returns the last tested captive portal state
392*1c60b9acSAndroid Build Coastguard Worker  *
393*1c60b9acSAndroid Build Coastguard Worker  * \param context: the lws_context
394*1c60b9acSAndroid Build Coastguard Worker  *
395*1c60b9acSAndroid Build Coastguard Worker  * Returns one of the LWS_CPD_ constants indicating the system's understanding
396*1c60b9acSAndroid Build Coastguard Worker  * of the current captive portal situation.
397*1c60b9acSAndroid Build Coastguard Worker  */
398*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN LWS_VISIBLE lws_cpd_result_t
399*1c60b9acSAndroid Build Coastguard Worker lws_system_cpd_state_get(struct lws_context *context);
400