static nsapi_error_t mbed_lwip_socket_accept(nsapi_stack_t *stack, nsapi_socket_t server, nsapi_socket_t *handle, nsapi_addr_t *addr, uint16_t *port) { struct lwip_socket *s = (struct lwip_socket *)server; struct lwip_socket *ns = mbed_lwip_arena_alloc(); if (!ns) { return NSAPI_ERROR_NO_SOCKET; } if (s->conn->pcb.tcp->state != LISTEN) { return NSAPI_ERROR_PARAMETER; } err_t err = netconn_accept(s->conn, &ns->conn); if (err != ERR_OK) { mbed_lwip_arena_dealloc(ns); return mbed_lwip_err_remap(err); } netconn_set_recvtimeout(ns->conn, 1); *(struct lwip_socket **)handle = ns; ip_addr_t peer_addr; (void) netconn_peer(ns->conn, &peer_addr, port); convert_lwip_addr_to_mbed(addr, &peer_addr); netconn_set_nonblocking(ns->conn, true); return 0; }
/* LWIP network stack implementation */ static nsapi_error_t mbed_lwip_gethostbyname(nsapi_stack_t *stack, const char *host, nsapi_addr_t *addr, nsapi_version_t version) { ip_addr_t lwip_addr; #if LWIP_IPV4 && LWIP_IPV6 u8_t addr_type; if (version == NSAPI_UNSPEC) { const ip_addr_t *ip_addr; ip_addr = mbed_lwip_get_ip_addr(true, &lwip_netif); // Prefer IPv6 if (IP_IS_V6(ip_addr)) { // If IPv4 is available use it as backup if (mbed_lwip_get_ipv4_addr(&lwip_netif)) { addr_type = NETCONN_DNS_IPV6_IPV4; } else { addr_type = NETCONN_DNS_IPV6; } // Prefer IPv4 } else { // If IPv6 is available use it as backup if (mbed_lwip_get_ipv6_addr(&lwip_netif)) { addr_type = NETCONN_DNS_IPV4_IPV6; } else { addr_type = NETCONN_DNS_IPV4; } } } else if (version == NSAPI_IPv4) { addr_type = NETCONN_DNS_IPV4; } else if (version == NSAPI_IPv6) { addr_type = NETCONN_DNS_IPV6; } else { return NSAPI_ERROR_DNS_FAILURE; } err_t err = netconn_gethostbyname_addrtype(host, &lwip_addr, addr_type); #elif LWIP_IPV4 if (version != NSAPI_IPv4 && version != NSAPI_UNSPEC) { return NSAPI_ERROR_DNS_FAILURE; } err_t err = netconn_gethostbyname(host, &lwip_addr); #elif LWIP_IPV6 if (version != NSAPI_IPv6 && version != NSAPI_UNSPEC) { return NSAPI_ERROR_DNS_FAILURE; } err_t err = netconn_gethostbyname(host, &lwip_addr); #endif if (err != ERR_OK) { return NSAPI_ERROR_DNS_FAILURE; } convert_lwip_addr_to_mbed(addr, &lwip_addr); return 0; }
static nsapi_size_or_error_t mbed_lwip_socket_recvfrom(nsapi_stack_t *stack, nsapi_socket_t handle, nsapi_addr_t *addr, uint16_t *port, void *data, nsapi_size_t size) { struct lwip_socket *s = (struct lwip_socket *)handle; struct netbuf *buf; err_t err = netconn_recv(s->conn, &buf); if (err != ERR_OK) { return mbed_lwip_err_remap(err); } convert_lwip_addr_to_mbed(addr, netbuf_fromaddr(buf)); *port = netbuf_fromport(buf); u16_t recv = netbuf_copy(buf, data, (u16_t)size); netbuf_delete(buf); return recv; }
nsapi_error_t LWIP::get_dns_server(int index, SocketAddress *address, const char *interface_name) { int dns_entries = 0; for (int i = 0; i < DNS_MAX_SERVERS; i++) { const ip_addr_t *ip_addr = dns_getserver(i, interface_name); if (!ip_addr_isany(ip_addr)) { if (index == dns_entries) { nsapi_addr_t addr; convert_lwip_addr_to_mbed(&addr, ip_addr); address->set_addr(addr); return NSAPI_ERROR_OK; } dns_entries++; } } return NSAPI_ERROR_NO_ADDRESS; }
nsapi_error_t LWIP::socket_accept(nsapi_socket_t server, nsapi_socket_t *handle, SocketAddress *address) { #if LWIP_TCP struct mbed_lwip_socket *s = (struct mbed_lwip_socket *)server; struct mbed_lwip_socket *ns = arena_alloc(); if (!ns) { return NSAPI_ERROR_NO_SOCKET; } if (s->conn->pcb.tcp->state != LISTEN) { return NSAPI_ERROR_PARAMETER; } err_t err = netconn_accept(s->conn, &ns->conn); if (err != ERR_OK) { arena_dealloc(ns); return err_remap(err); } netconn_set_recvtimeout(ns->conn, 1); *(struct mbed_lwip_socket **)handle = ns; ip_addr_t peer_addr; nsapi_addr_t addr; u16_t port; (void) netconn_peer(ns->conn, &peer_addr, &port); convert_lwip_addr_to_mbed(&addr, &peer_addr); if (address) { address->set_addr(addr); address->set_port(port); } netconn_set_nonblocking(ns->conn, true); return 0; #else return NSAPI_ERROR_UNSUPPORTED; #endif }
nsapi_size_or_error_t LWIP::socket_recvfrom(nsapi_socket_t handle, SocketAddress *address, void *data, nsapi_size_t size) { struct mbed_lwip_socket *s = (struct mbed_lwip_socket *)handle; struct netbuf *buf; err_t err = netconn_recv(s->conn, &buf); if (err != ERR_OK) { return err_remap(err); } if (address) { nsapi_addr_t addr; convert_lwip_addr_to_mbed(&addr, netbuf_fromaddr(buf)); address->set_addr(addr); address->set_port(netbuf_fromport(buf)); } u16_t recv = netbuf_copy(buf, data, (u16_t)size); netbuf_delete(buf); return recv; }