diff --git a/pkg/lwip/contrib/sock/ip/lwip_sock_ip.c b/pkg/lwip/contrib/sock/ip/lwip_sock_ip.c index 0a8d6b32f6dbe830783e3497480b29fae48978a8..fde43b4d434e24ebb03659350a9887afbefef301 100644 --- a/pkg/lwip/contrib/sock/ip/lwip_sock_ip.c +++ b/pkg/lwip/contrib/sock/ip/lwip_sock_ip.c @@ -92,7 +92,7 @@ static uint16_t _ip6_addr_to_netif(const ip6_addr_p_t *_addr) ip6_addr_t addr; assert(_addr != NULL); - ip6_addr_copy(addr, *_addr); + ip6_addr_copy_from_packed(addr, *_addr); if (!ip6_addr_isany_val(addr)) { for (struct netif *netif = netif_list; netif != NULL; netif = netif->next) { if (netif_get_ip6_addr_match(netif, &addr) >= 0) { diff --git a/pkg/lwip/contrib/sock/lwip_sock.c b/pkg/lwip/contrib/sock/lwip_sock.c index dba775c17d9375a8676fe9afd24a5199d7faa1dd..40b4a10305f0d546948af450417053174531f5d9 100644 --- a/pkg/lwip/contrib/sock/lwip_sock.c +++ b/pkg/lwip/contrib/sock/lwip_sock.c @@ -151,6 +151,23 @@ static bool _addr_on_netif(int family, int netif_num, const ip_addr_t *addr) p = (ep)->port; #endif +static void _convert_ip_addr(ip_addr_t *lwip_addr, int family, + const void *sock_addr, size_t sock_addr_size) +{ + memcpy(lwip_addr, sock_addr, sock_addr_size); +#if LWIP_IPV6 && LWIP_IPV4 + if (family == AF_INET6) { + ip6_addr_clear_zone(&lwip_addr->u_addr.ip6); + } + lwip_addr->type = lwip_af_to_ip_addr_type(family); +#elif LWIP_IPV6 + (void)family; + ip6_addr_clear_zone(lwip_addr); +#else + (void)family; +#endif +} + static int _sock_ep_to_netconn_pars(const struct _sock_tl_ep *local, const struct _sock_tl_ep *remote, ip_addr_t *local_addr, u16_t *local_port, @@ -193,10 +210,8 @@ static int _sock_ep_to_netconn_pars(const struct _sock_tl_ep *local, netif = remote->netif; } family = remote->family; - memcpy(remote_addr, &remote->addr, sizeof(remote->addr)); -#if LWIP_IPV6 && LWIP_IPV4 - remote_addr->type = lwip_af_to_ip_addr_type(family); -#endif + _convert_ip_addr(remote_addr, family, &remote->addr, + sizeof(remote->addr)); if (ip_addr_isany(remote_addr)) { return -EINVAL; } @@ -224,7 +239,8 @@ static int _sock_ep_to_netconn_pars(const struct _sock_tl_ep *local, /* case (local == NULL) is included in _ep_isany() */ /* cast to ip_addr_t alright, since type field is never used */ else if (_addr_on_netif(family, netif, (ip_addr_t *)&local->addr)) { - memcpy(local_addr, &local->addr, sizeof(local->addr)); + _convert_ip_addr(local_addr, family, &local->addr, + sizeof(local->addr)); res = 1; } else { @@ -232,14 +248,9 @@ static int _sock_ep_to_netconn_pars(const struct _sock_tl_ep *local, } } else if (local != NULL) { - memcpy(local_addr, &local->addr, sizeof(local->addr)); + _convert_ip_addr(local_addr, family, &local->addr, sizeof(local->addr)); res = 1; } -#if LWIP_IPV6 && LWIP_IPV4 - if (local_addr != NULL) { - local_addr->type = lwip_af_to_ip_addr_type(family); - } -#endif return res; }