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 - 2020 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 25*1c60b9acSAndroid Build Coastguard Worker /** \defgroup net Network related helper APIs 26*1c60b9acSAndroid Build Coastguard Worker * ##Network related helper APIs 27*1c60b9acSAndroid Build Coastguard Worker * 28*1c60b9acSAndroid Build Coastguard Worker * These wrap miscellaneous useful network-related functions 29*1c60b9acSAndroid Build Coastguard Worker */ 30*1c60b9acSAndroid Build Coastguard Worker ///@{ 31*1c60b9acSAndroid Build Coastguard Worker 32*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ESP_PLATFORM) 33*1c60b9acSAndroid Build Coastguard Worker #include <lwip/sockets.h> 34*1c60b9acSAndroid Build Coastguard Worker #endif 35*1c60b9acSAndroid Build Coastguard Worker 36*1c60b9acSAndroid Build Coastguard Worker typedef uint8_t lws_route_uidx_t; 37*1c60b9acSAndroid Build Coastguard Worker 38*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_dns_score { 39*1c60b9acSAndroid Build Coastguard Worker uint8_t precedence; 40*1c60b9acSAndroid Build Coastguard Worker uint8_t label; 41*1c60b9acSAndroid Build Coastguard Worker } lws_dns_score_t; 42*1c60b9acSAndroid Build Coastguard Worker 43*1c60b9acSAndroid Build Coastguard Worker /* 44*1c60b9acSAndroid Build Coastguard Worker * This represents an entry in the system routing table 45*1c60b9acSAndroid Build Coastguard Worker */ 46*1c60b9acSAndroid Build Coastguard Worker 47*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_route { 48*1c60b9acSAndroid Build Coastguard Worker lws_dll2_t list; 49*1c60b9acSAndroid Build Coastguard Worker 50*1c60b9acSAndroid Build Coastguard Worker lws_sockaddr46 src; 51*1c60b9acSAndroid Build Coastguard Worker lws_sockaddr46 dest; 52*1c60b9acSAndroid Build Coastguard Worker lws_sockaddr46 gateway; 53*1c60b9acSAndroid Build Coastguard Worker 54*1c60b9acSAndroid Build Coastguard Worker struct lws_route *source; /* when used as lws_dns_sort_t */ 55*1c60b9acSAndroid Build Coastguard Worker lws_dns_score_t score; /* when used as lws_dns_sort_t */ 56*1c60b9acSAndroid Build Coastguard Worker 57*1c60b9acSAndroid Build Coastguard Worker int if_idx; 58*1c60b9acSAndroid Build Coastguard Worker int priority; 59*1c60b9acSAndroid Build Coastguard Worker int ifa_flags; /* if source_ads */ 60*1c60b9acSAndroid Build Coastguard Worker 61*1c60b9acSAndroid Build Coastguard Worker lws_route_uidx_t uidx; /* unique index for this route */ 62*1c60b9acSAndroid Build Coastguard Worker 63*1c60b9acSAndroid Build Coastguard Worker uint8_t proto; 64*1c60b9acSAndroid Build Coastguard Worker uint8_t dest_len; 65*1c60b9acSAndroid Build Coastguard Worker uint8_t src_len; 66*1c60b9acSAndroid Build Coastguard Worker uint8_t scope; /* if source_ads */ 67*1c60b9acSAndroid Build Coastguard Worker uint8_t af; /* if source_ads */ 68*1c60b9acSAndroid Build Coastguard Worker 69*1c60b9acSAndroid Build Coastguard Worker uint8_t source_ads:1; 70*1c60b9acSAndroid Build Coastguard Worker } lws_route_t; 71*1c60b9acSAndroid Build Coastguard Worker 72*1c60b9acSAndroid Build Coastguard Worker /* 73*1c60b9acSAndroid Build Coastguard Worker * We reuse the route object as the dns sort granule, so there's only one 74*1c60b9acSAndroid Build Coastguard Worker * struct needs to know all the gnarly ipv6 details 75*1c60b9acSAndroid Build Coastguard Worker */ 76*1c60b9acSAndroid Build Coastguard Worker 77*1c60b9acSAndroid Build Coastguard Worker typedef lws_route_t lws_dns_sort_t; 78*1c60b9acSAndroid Build Coastguard Worker 79*1c60b9acSAndroid Build Coastguard Worker /** 80*1c60b9acSAndroid Build Coastguard Worker * lws_canonical_hostname() - returns this host's hostname 81*1c60b9acSAndroid Build Coastguard Worker * 82*1c60b9acSAndroid Build Coastguard Worker * This is typically used by client code to fill in the host parameter 83*1c60b9acSAndroid Build Coastguard Worker * when making a client connection. You can only call it after the context 84*1c60b9acSAndroid Build Coastguard Worker * has been created. 85*1c60b9acSAndroid Build Coastguard Worker * 86*1c60b9acSAndroid Build Coastguard Worker * \param context: Websocket context 87*1c60b9acSAndroid Build Coastguard Worker */ 88*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT 89*1c60b9acSAndroid Build Coastguard Worker lws_canonical_hostname(struct lws_context *context); 90*1c60b9acSAndroid Build Coastguard Worker 91*1c60b9acSAndroid Build Coastguard Worker /** 92*1c60b9acSAndroid Build Coastguard Worker * lws_get_peer_addresses() - Get client address information 93*1c60b9acSAndroid Build Coastguard Worker * \param wsi: Local struct lws associated with 94*1c60b9acSAndroid Build Coastguard Worker * \param fd: Connection socket descriptor 95*1c60b9acSAndroid Build Coastguard Worker * \param name: Buffer to take client address name 96*1c60b9acSAndroid Build Coastguard Worker * \param name_len: Length of client address name buffer 97*1c60b9acSAndroid Build Coastguard Worker * \param rip: Buffer to take client address IP dotted quad 98*1c60b9acSAndroid Build Coastguard Worker * \param rip_len: Length of client address IP buffer 99*1c60b9acSAndroid Build Coastguard Worker * 100*1c60b9acSAndroid Build Coastguard Worker * This function fills in name and rip with the name and IP of 101*1c60b9acSAndroid Build Coastguard Worker * the client connected with socket descriptor fd. Names may be 102*1c60b9acSAndroid Build Coastguard Worker * truncated if there is not enough room. If either cannot be 103*1c60b9acSAndroid Build Coastguard Worker * determined, they will be returned as valid zero-length strings. 104*1c60b9acSAndroid Build Coastguard Worker */ 105*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN void 106*1c60b9acSAndroid Build Coastguard Worker lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name, 107*1c60b9acSAndroid Build Coastguard Worker int name_len, char *rip, int rip_len); 108*1c60b9acSAndroid Build Coastguard Worker 109*1c60b9acSAndroid Build Coastguard Worker /** 110*1c60b9acSAndroid Build Coastguard Worker * lws_get_peer_simple() - Get client address information without RDNS 111*1c60b9acSAndroid Build Coastguard Worker * 112*1c60b9acSAndroid Build Coastguard Worker * \param wsi: Local struct lws associated with 113*1c60b9acSAndroid Build Coastguard Worker * \param name: Buffer to take client address name 114*1c60b9acSAndroid Build Coastguard Worker * \param namelen: Length of client address name buffer 115*1c60b9acSAndroid Build Coastguard Worker * 116*1c60b9acSAndroid Build Coastguard Worker * This provides a 123.123.123.123 type IP address in name from the 117*1c60b9acSAndroid Build Coastguard Worker * peer that has connected to wsi 118*1c60b9acSAndroid Build Coastguard Worker */ 119*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN const char * 120*1c60b9acSAndroid Build Coastguard Worker lws_get_peer_simple(struct lws *wsi, char *name, size_t namelen); 121*1c60b9acSAndroid Build Coastguard Worker 122*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN const char * 123*1c60b9acSAndroid Build Coastguard Worker lws_get_peer_simple_fd(lws_sockfd_type fd, char *name, size_t namelen); 124*1c60b9acSAndroid Build Coastguard Worker 125*1c60b9acSAndroid Build Coastguard Worker #define LWS_ITOSA_USABLE 0 126*1c60b9acSAndroid Build Coastguard Worker #define LWS_ITOSA_NOT_EXIST -1 127*1c60b9acSAndroid Build Coastguard Worker #define LWS_ITOSA_NOT_USABLE -2 128*1c60b9acSAndroid Build Coastguard Worker #define LWS_ITOSA_BUSY -3 /* only returned by lws_socket_bind() on 129*1c60b9acSAndroid Build Coastguard Worker EADDRINUSE */ 130*1c60b9acSAndroid Build Coastguard Worker 131*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_PLAT_FREERTOS) && !defined(LWS_PLAT_OPTEE) 132*1c60b9acSAndroid Build Coastguard Worker /** 133*1c60b9acSAndroid Build Coastguard Worker * lws_interface_to_sa() - Convert interface name or IP to sockaddr struct 134*1c60b9acSAndroid Build Coastguard Worker * 135*1c60b9acSAndroid Build Coastguard Worker * \param ipv6: Allow IPV6 addresses 136*1c60b9acSAndroid Build Coastguard Worker * \param ifname: Interface name or IP 137*1c60b9acSAndroid Build Coastguard Worker * \param addr: struct sockaddr_in * to be written 138*1c60b9acSAndroid Build Coastguard Worker * \param addrlen: Length of addr 139*1c60b9acSAndroid Build Coastguard Worker * 140*1c60b9acSAndroid Build Coastguard Worker * This converts a textual network interface name to a sockaddr usable by 141*1c60b9acSAndroid Build Coastguard Worker * other network functions. 142*1c60b9acSAndroid Build Coastguard Worker * 143*1c60b9acSAndroid Build Coastguard Worker * If the network interface doesn't exist, it will return LWS_ITOSA_NOT_EXIST. 144*1c60b9acSAndroid Build Coastguard Worker * 145*1c60b9acSAndroid Build Coastguard Worker * If the network interface is not usable, eg ethernet cable is removed, it 146*1c60b9acSAndroid Build Coastguard Worker * may logically exist but not have any IP address. As such it will return 147*1c60b9acSAndroid Build Coastguard Worker * LWS_ITOSA_NOT_USABLE. 148*1c60b9acSAndroid Build Coastguard Worker * 149*1c60b9acSAndroid Build Coastguard Worker * If the network interface exists and is usable, it will return 150*1c60b9acSAndroid Build Coastguard Worker * LWS_ITOSA_USABLE. 151*1c60b9acSAndroid Build Coastguard Worker */ 152*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 153*1c60b9acSAndroid Build Coastguard Worker lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr, 154*1c60b9acSAndroid Build Coastguard Worker size_t addrlen); 155*1c60b9acSAndroid Build Coastguard Worker #endif 156*1c60b9acSAndroid Build Coastguard Worker 157*1c60b9acSAndroid Build Coastguard Worker /** 158*1c60b9acSAndroid Build Coastguard Worker * lws_sa46_compare_ads() - checks if two sa46 have the same address 159*1c60b9acSAndroid Build Coastguard Worker * 160*1c60b9acSAndroid Build Coastguard Worker * \param sa46a: first 161*1c60b9acSAndroid Build Coastguard Worker * \param sa46b: second 162*1c60b9acSAndroid Build Coastguard Worker * 163*1c60b9acSAndroid Build Coastguard Worker * Returns 0 if the address family is INET or INET6 and the address is the same, 164*1c60b9acSAndroid Build Coastguard Worker * or if the AF is the same but not INET or INET6, otherwise nonzero. 165*1c60b9acSAndroid Build Coastguard Worker */ 166*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 167*1c60b9acSAndroid Build Coastguard Worker lws_sa46_compare_ads(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46b); 168*1c60b9acSAndroid Build Coastguard Worker 169*1c60b9acSAndroid Build Coastguard Worker /** 170*1c60b9acSAndroid Build Coastguard Worker * lws_sa46_on_net() - checks if an sa46 is on the subnet represented by another 171*1c60b9acSAndroid Build Coastguard Worker * 172*1c60b9acSAndroid Build Coastguard Worker * \param sa46a: first 173*1c60b9acSAndroid Build Coastguard Worker * \param sa46_net: network 174*1c60b9acSAndroid Build Coastguard Worker * \param net_len: length of network non-mask 175*1c60b9acSAndroid Build Coastguard Worker * 176*1c60b9acSAndroid Build Coastguard Worker * Returns 0 if sa46a belongs on network sa46_net/net_len 177*1c60b9acSAndroid Build Coastguard Worker * 178*1c60b9acSAndroid Build Coastguard Worker * If there is an ipv4 / v6 mismatch between the ip and the net, the ipv4 179*1c60b9acSAndroid Build Coastguard Worker * address is promoted to ::ffff:x.x.x.x before the comparison. 180*1c60b9acSAndroid Build Coastguard Worker */ 181*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 182*1c60b9acSAndroid Build Coastguard Worker lws_sa46_on_net(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46_net, 183*1c60b9acSAndroid Build Coastguard Worker int net_len); 184*1c60b9acSAndroid Build Coastguard Worker 185*1c60b9acSAndroid Build Coastguard Worker /* 186*1c60b9acSAndroid Build Coastguard Worker * lws_parse_numeric_address() - converts numeric ipv4 or ipv6 to byte address 187*1c60b9acSAndroid Build Coastguard Worker * 188*1c60b9acSAndroid Build Coastguard Worker * \param ads: the numeric ipv4 or ipv6 address string 189*1c60b9acSAndroid Build Coastguard Worker * \param result: result array 190*1c60b9acSAndroid Build Coastguard Worker * \param max_len: max length of result array 191*1c60b9acSAndroid Build Coastguard Worker * 192*1c60b9acSAndroid Build Coastguard Worker * Converts a 1.2.3.4 or 2001:abcd:123:: or ::ffff:1.2.3.4 formatted numeric 193*1c60b9acSAndroid Build Coastguard Worker * address into an array of network ordered byte address elements. 194*1c60b9acSAndroid Build Coastguard Worker * 195*1c60b9acSAndroid Build Coastguard Worker * Returns < 0 on error, else length of result set, either 4 or 16 for ipv4 / 196*1c60b9acSAndroid Build Coastguard Worker * ipv6. 197*1c60b9acSAndroid Build Coastguard Worker */ 198*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 199*1c60b9acSAndroid Build Coastguard Worker lws_parse_numeric_address(const char *ads, uint8_t *result, size_t max_len); 200*1c60b9acSAndroid Build Coastguard Worker 201*1c60b9acSAndroid Build Coastguard Worker /* 202*1c60b9acSAndroid Build Coastguard Worker * lws_sa46_parse_numeric_address() - converts numeric ipv4 or ipv6 to sa46 203*1c60b9acSAndroid Build Coastguard Worker * 204*1c60b9acSAndroid Build Coastguard Worker * \param ads: the numeric ipv4 or ipv6 address string 205*1c60b9acSAndroid Build Coastguard Worker * \param sa46: pointer to sa46 to set 206*1c60b9acSAndroid Build Coastguard Worker * 207*1c60b9acSAndroid Build Coastguard Worker * Converts a 1.2.3.4 or 2001:abcd:123:: or ::ffff:1.2.3.4 formatted numeric 208*1c60b9acSAndroid Build Coastguard Worker * address into an sa46, a union of sockaddr_in or sockaddr_in6 depending on 209*1c60b9acSAndroid Build Coastguard Worker * what kind of address was found. sa46->sa4.sin_fmaily will be AF_INET if 210*1c60b9acSAndroid Build Coastguard Worker * ipv4, or AF_INET6 if ipv6. 211*1c60b9acSAndroid Build Coastguard Worker * 212*1c60b9acSAndroid Build Coastguard Worker * Returns 0 if the sa46 was set, else < 0 on error. 213*1c60b9acSAndroid Build Coastguard Worker */ 214*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 215*1c60b9acSAndroid Build Coastguard Worker lws_sa46_parse_numeric_address(const char *ads, lws_sockaddr46 *sa46); 216*1c60b9acSAndroid Build Coastguard Worker 217*1c60b9acSAndroid Build Coastguard Worker /** 218*1c60b9acSAndroid Build Coastguard Worker * lws_write_numeric_address() - convert network byte order ads to text 219*1c60b9acSAndroid Build Coastguard Worker * 220*1c60b9acSAndroid Build Coastguard Worker * \param ads: network byte order address array 221*1c60b9acSAndroid Build Coastguard Worker * \param size: number of bytes valid in ads 222*1c60b9acSAndroid Build Coastguard Worker * \param buf: result buffer to take text format 223*1c60b9acSAndroid Build Coastguard Worker * \param len: max size of text buffer 224*1c60b9acSAndroid Build Coastguard Worker * 225*1c60b9acSAndroid Build Coastguard Worker * Converts an array of network-ordered byte address elements to a textual 226*1c60b9acSAndroid Build Coastguard Worker * representation of the numeric address, like "1.2.3.4" or "::1". Returns the 227*1c60b9acSAndroid Build Coastguard Worker * number of chars written into buf, else < 0. ipv6 only supported with 228*1c60b9acSAndroid Build Coastguard Worker * LWS_IPV6=1 at cmake. 229*1c60b9acSAndroid Build Coastguard Worker */ 230*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 231*1c60b9acSAndroid Build Coastguard Worker lws_write_numeric_address(const uint8_t *ads, int size, char *buf, size_t len); 232*1c60b9acSAndroid Build Coastguard Worker 233*1c60b9acSAndroid Build Coastguard Worker /** 234*1c60b9acSAndroid Build Coastguard Worker * lws_sa46_write_numeric_address() - convert sa46 ads to textual numeric ads 235*1c60b9acSAndroid Build Coastguard Worker * 236*1c60b9acSAndroid Build Coastguard Worker * \param sa46: the sa46 whose address to show 237*1c60b9acSAndroid Build Coastguard Worker * \param buf: result buffer to take text format 238*1c60b9acSAndroid Build Coastguard Worker * \param len: max size of text buffer 239*1c60b9acSAndroid Build Coastguard Worker * 240*1c60b9acSAndroid Build Coastguard Worker * Converts the ipv4 or ipv6 address in an lws_sockaddr46 to a textual 241*1c60b9acSAndroid Build Coastguard Worker * representation of the numeric address, like "1.2.3.4" or "::1". Returns the 242*1c60b9acSAndroid Build Coastguard Worker * number of chars written into buf, else < 0. ipv6 only supported with 243*1c60b9acSAndroid Build Coastguard Worker * LWS_IPV6=1 at cmake. 244*1c60b9acSAndroid Build Coastguard Worker */ 245*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 246*1c60b9acSAndroid Build Coastguard Worker lws_sa46_write_numeric_address(lws_sockaddr46 *sa46, char *buf, size_t len); 247*1c60b9acSAndroid Build Coastguard Worker 248*1c60b9acSAndroid Build Coastguard Worker ///@} 249