@@ -348,20 +348,32 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
348348// TODO: ipv6
349349size_t common_hal_socketpool_socket_bind (socketpool_socket_obj_t * self ,
350350 const char * host , size_t hostlen , uint32_t port ) {
351- struct sockaddr_in bind_addr ;
351+ struct sockaddr_storage bind_addr ;
352352 const char * broadcast = "<broadcast>" ;
353- uint32_t ip ;
354- if (hostlen == 0 ) {
355- ip = IPADDR_ANY ;
356- } else if (hostlen == strlen (broadcast ) &&
357- memcmp (host , broadcast , strlen (broadcast )) == 0 ) {
358- ip = IPADDR_BROADCAST ;
353+
354+ bind_addr .ss_family = self -> family ;
355+
356+ if (self -> family == AF_INET6 ) {
357+ struct sockaddr_in6 * addr6 = (void * )& bind_addr ;
358+ addr6 -> sin6_port = htons (port );
359+ // no ipv6 broadcast
360+ if (hostlen == 0 ) {
361+ memset (& addr6 -> sin6_addr , 0 , sizeof (addr6 -> sin6_addr ));
362+ } else {
363+ socketpool_resolve_host_or_throw (self -> family , self -> type , host , & bind_addr , port );
364+ }
359365 } else {
360- ip = inet_addr (host );
366+ struct sockaddr_in * addr4 = (void * )& bind_addr ;
367+ addr4 -> sin_port = htons (port );
368+ if (hostlen == 0 ) {
369+ addr4 -> sin_addr .s_addr = IPADDR_ANY ;
370+ } else if (hostlen == strlen (broadcast ) &&
371+ memcmp (host , broadcast , strlen (broadcast )) == 0 ) {
372+ addr4 -> sin_addr .s_addr = IPADDR_BROADCAST ;
373+ } else {
374+ socketpool_resolve_host_or_throw (self -> family , self -> type , host , & bind_addr , port );
375+ }
361376 }
362- bind_addr .sin_addr .s_addr = ip ;
363- bind_addr .sin_family = self -> family ;
364- bind_addr .sin_port = htons (port );
365377
366378 int result = lwip_bind (self -> num , (struct sockaddr * )& bind_addr , sizeof (bind_addr ));
367379 if (result == 0 ) {
0 commit comments