STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) { socket_obj_t *self = MP_OBJ_TO_PTR(arg0); struct addrinfo *res; _socket_getaddrinfo(arg1, &res); int r = lwip_bind_r(self->fd, res->ai_addr, res->ai_addrlen); lwip_freeaddrinfo(res); if (r < 0) exception_from_errno(errno); return mp_const_none; }
// returns IPAddress(0, 0, 0, 0) on fail IPAddress MTD_FLASHMEM NSLookup::lookup(char const *hostname) { APtr<char> memHostName(f_strdup(hostname)); addrinfo *addrinfo; if (lwip_getaddrinfo(memHostName.get(), NULL, NULL, &addrinfo) == 0 && addrinfo) { // according to lwip documentation uses only first item of "addrinfo" sockaddr_in *sa = (sockaddr_in *)(addrinfo->ai_addr); in_addr_t addr = sa->sin_addr.s_addr; lwip_freeaddrinfo(addrinfo); return IPAddress(addr); } return IPAddress(0, 0, 0, 0); // fail! }
void curl_dofreeaddrinfo(struct addrinfo *freethis, int line, const char *source) { #ifdef USE_LWIPSOCK lwip_freeaddrinfo(freethis); #else (freeaddrinfo)(freethis); #endif curl_memlog("ADDR %s:%d freeaddrinfo(%p)\n", source, line, (void *)freethis); }
STATIC mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) { socket_obj_t *self = MP_OBJ_TO_PTR(arg0); struct addrinfo *res; _socket_getaddrinfo(arg1, &res); MP_THREAD_GIL_EXIT(); int r = lwip_connect_r(self->fd, res->ai_addr, res->ai_addrlen); MP_THREAD_GIL_ENTER(); lwip_freeaddrinfo(res); if (r != 0) { exception_from_errno(errno); } return mp_const_none; }
int LWIP_SOCKETS_Driver::GetAddrInfo(const char* nodename, char* servname, const SOCK_addrinfo* hints, SOCK_addrinfo** res) { #if LWIP_DNS NATIVE_PROFILE_PAL_NETWORK(); SOCK_addrinfo *ai; SOCK_sockaddr_in *sa = NULL; int total_size = sizeof(SOCK_addrinfo) + sizeof(SOCK_sockaddr_in); struct addrinfo *lwipAddrinfo = NULL; if(res == NULL) return -1; *res = NULL; // if the nodename == "" then return the IP address of this device if(nodename[0] == 0 && servname == NULL) { struct netif *pNetIf = netif_find_interface(g_LWIP_SOCKETS_Driver.m_interfaces[0].m_interfaceNumber); if(pNetIf == NULL) return -1; ai = (SOCK_addrinfo*)mem_malloc(total_size); if (ai == NULL) { return -1; } memset(ai, 0, total_size); sa = (SOCK_sockaddr_in*)((u8_t*)ai + sizeof(SOCK_addrinfo)); /* set up sockaddr */ sa->sin_addr.S_un.S_addr = pNetIf->ip_addr.addr; sa->sin_family = AF_INET; sa->sin_port = 0; /* set up addrinfo */ ai->ai_family = AF_INET; if (hints != NULL) { /* copy socktype & protocol from hints if specified */ ai->ai_socktype = hints->ai_socktype; ai->ai_protocol = hints->ai_protocol; } ai->ai_addrlen = sizeof(SOCK_sockaddr_in); ai->ai_addr = (SOCK_sockaddr*)sa; *res = ai; return 0; } int err = lwip_getaddrinfo(nodename, servname, (addrinfo*)hints, &lwipAddrinfo); if(err == 0) { /// /// Marshal addrinfo data /// struct sockaddr_in* lwip_sockaddr_in; ai = (SOCK_addrinfo*)mem_malloc(total_size); if (ai == NULL) { lwip_freeaddrinfo(lwipAddrinfo); return -1; } memset(ai, 0, total_size); lwip_sockaddr_in = ((struct sockaddr_in*)lwipAddrinfo->ai_addr); sa = (SOCK_sockaddr_in*)((u8_t*)ai + sizeof(SOCK_addrinfo)); /* set up sockaddr */ sa->sin_addr.S_un.S_addr = lwip_sockaddr_in->sin_addr.s_addr; sa->sin_family = lwip_sockaddr_in->sin_family; sa->sin_port = lwip_sockaddr_in->sin_port; /* set up addrinfo */ ai->ai_family = lwipAddrinfo->ai_family; if (hints != NULL) { /* copy socktype & protocol from hints if specified */ ai->ai_socktype = hints->ai_socktype; ai->ai_protocol = hints->ai_protocol; } ai->ai_addrlen = sizeof(SOCK_sockaddr_in); ai->ai_addr = (SOCK_sockaddr*)sa; *res = ai; // free marshalled addrinfo lwip_freeaddrinfo(lwipAddrinfo); } else { err = -1; } return err; #else return -1; #endif }
STATIC mp_obj_t esp_socket_getaddrinfo(size_t n_args, const mp_obj_t *args) { // TODO support additional args beyond the first two struct addrinfo *res = NULL; _socket_getaddrinfo2(args[0], args[1], &res); mp_obj_t ret_list = mp_obj_new_list(0, NULL); for (struct addrinfo *resi = res; resi; resi = resi->ai_next) { mp_obj_t addrinfo_objs[5] = { mp_obj_new_int(resi->ai_family), mp_obj_new_int(resi->ai_socktype), mp_obj_new_int(resi->ai_protocol), mp_obj_new_str(resi->ai_canonname, strlen(resi->ai_canonname)), mp_const_none }; if (resi->ai_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in *)resi->ai_addr; // This looks odd, but it's really just a u32_t ip4_addr_t ip4_addr = { .addr = addr->sin_addr.s_addr }; char buf[16]; ip4addr_ntoa_r(&ip4_addr, buf, sizeof(buf)); mp_obj_t inaddr_objs[2] = { mp_obj_new_str(buf, strlen(buf)), mp_obj_new_int(ntohs(addr->sin_port)) }; addrinfo_objs[4] = mp_obj_new_tuple(2, inaddr_objs); } mp_obj_list_append(ret_list, mp_obj_new_tuple(5, addrinfo_objs)); } if (res) lwip_freeaddrinfo(res); return ret_list; } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_socket_getaddrinfo_obj, 2, 6, esp_socket_getaddrinfo); STATIC mp_obj_t esp_socket_initialize() { static int initialized = 0; if (!initialized) { ESP_LOGI("modsocket", "Initializing"); tcpip_adapter_init(); initialized = 1; } return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_0(esp_socket_initialize_obj, esp_socket_initialize); STATIC const mp_map_elem_t mp_module_socket_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_usocket) }, { MP_OBJ_NEW_QSTR(MP_QSTR___init__), (mp_obj_t)&esp_socket_initialize_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_socket), (mp_obj_t)&get_socket_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_getaddrinfo), (mp_obj_t)&esp_socket_getaddrinfo_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_AF_INET), MP_OBJ_NEW_SMALL_INT(AF_INET) }, { MP_OBJ_NEW_QSTR(MP_QSTR_AF_INET6), MP_OBJ_NEW_SMALL_INT(AF_INET6) }, { MP_OBJ_NEW_QSTR(MP_QSTR_SOCK_STREAM), MP_OBJ_NEW_SMALL_INT(SOCK_STREAM) }, { MP_OBJ_NEW_QSTR(MP_QSTR_SOCK_DGRAM), MP_OBJ_NEW_SMALL_INT(SOCK_DGRAM) }, { MP_OBJ_NEW_QSTR(MP_QSTR_SOCK_RAW), MP_OBJ_NEW_SMALL_INT(SOCK_RAW) }, { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_TCP), MP_OBJ_NEW_SMALL_INT(IPPROTO_TCP) }, { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_UDP), MP_OBJ_NEW_SMALL_INT(IPPROTO_UDP) }, { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_IP), MP_OBJ_NEW_SMALL_INT(IPPROTO_IP) }, { MP_OBJ_NEW_QSTR(MP_QSTR_SOL_SOCKET), MP_OBJ_NEW_SMALL_INT(SOL_SOCKET) }, { MP_OBJ_NEW_QSTR(MP_QSTR_SO_REUSEADDR), MP_OBJ_NEW_SMALL_INT(SO_REUSEADDR) }, { MP_OBJ_NEW_QSTR(MP_QSTR_IP_ADD_MEMBERSHIP), MP_OBJ_NEW_SMALL_INT(IP_ADD_MEMBERSHIP) }, }; STATIC MP_DEFINE_CONST_DICT(mp_module_socket_globals, mp_module_socket_globals_table); const mp_obj_module_t mp_module_usocket = { .base = { &mp_type_module }, .globals = (mp_obj_dict_t*)&mp_module_socket_globals, };