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