From f8524cb4c0d70836d7f3ecc0fcfb706561e9fa96 Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Wed, 20 Jun 2018 14:20:00 +0200 Subject: [PATCH] gnrc_sock_udp: provide port for #9376 API fix --- sys/net/gnrc/sock/udp/gnrc_sock_udp.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/sys/net/gnrc/sock/udp/gnrc_sock_udp.c b/sys/net/gnrc/sock/udp/gnrc_sock_udp.c index 2716824217..0544d6072d 100644 --- a/sys/net/gnrc/sock/udp/gnrc_sock_udp.c +++ b/sys/net/gnrc/sock/udp/gnrc_sock_udp.c @@ -87,7 +87,6 @@ int sock_udp_create(sock_udp_t *sock, const sock_udp_ep_t *local, const sock_udp_ep_t *remote, uint16_t flags) { assert(sock); - assert(local == NULL || local->port != 0); assert(remote == NULL || remote->port != 0); if ((local != NULL) && (remote != NULL) && (local->netif != SOCK_ADDR_ANY_NETIF) && @@ -97,8 +96,19 @@ int sock_udp_create(sock_udp_t *sock, const sock_udp_ep_t *local, } memset(&sock->local, 0, sizeof(sock_udp_ep_t)); if (local != NULL) { + uint16_t port = local->port; + + if (gnrc_af_not_supported(local->family)) { + return -EAFNOSUPPORT; + } + if (port == 0U) { + port = _get_dyn_port(sock); + if (port == GNRC_SOCK_DYN_PORTRANGE_ERR) { + return -EADDRINUSE; + } + } #ifdef MODULE_GNRC_SOCK_CHECK_REUSE - if (!(flags & SOCK_FLAGS_REUSE_EP)) { + else if (!(flags & SOCK_FLAGS_REUSE_EP)) { for (sock_udp_t *ptr = _udp_socks; ptr != NULL; ptr = (sock_udp_t *)ptr->reg.next) { if (memcmp(&ptr->local, local, sizeof(sock_udp_ep_t)) == 0) { @@ -110,10 +120,8 @@ int sock_udp_create(sock_udp_t *sock, const sock_udp_ep_t *local, sock->reg.next = (gnrc_sock_reg_t *)_udp_socks; _udp_socks = sock; #endif - if (gnrc_af_not_supported(local->family)) { - return -EAFNOSUPPORT; - } memcpy(&sock->local, local, sizeof(sock_udp_ep_t)); + sock->local.port = port; } memset(&sock->remote, 0, sizeof(sock_udp_ep_t)); if (remote != NULL) {