diff --git a/sys/net/gnrc/sock/include/gnrc_sock_internal.h b/sys/net/gnrc/sock/include/gnrc_sock_internal.h index 32e8812ee60bd73a5a178006e57b8cc12b2f3a1b..be7bd91fa259d7630f3501517a2fbc7df02030b8 100644 --- a/sys/net/gnrc/sock/include/gnrc_sock_internal.h +++ b/sys/net/gnrc/sock/include/gnrc_sock_internal.h @@ -24,6 +24,7 @@ #include <stdbool.h> #include <stdint.h> +#include <string.h> #include "mbox.h" #include "net/af.h" #include "net/gnrc.h" @@ -96,6 +97,25 @@ static inline bool gnrc_ep_addr_any(const sock_ip_ep_t *ep) return true; } +/** + * @brief Initializes a sock end-point from a given and sets the network + * interface implicitly if there is only one potential interface. + * @internal + */ +static inline void gnrc_ep_set(sock_ip_ep_t *out, const sock_ip_ep_t *in, + size_t in_size) +{ + memcpy(out, in, in_size); +#if GNRC_NETIF_NUMOF == 1 + /* set interface implicitly */ + gnrc_netif_t *netif = gnrc_netif_iter(NULL); + + if (netif != NULL) { + out->netif = netif->pid; + } +#endif +} + /** * @brief Create a sock internally * @internal diff --git a/sys/net/gnrc/sock/ip/gnrc_sock_ip.c b/sys/net/gnrc/sock/ip/gnrc_sock_ip.c index 9e6b015b7829d94a4c0b56d177b0ad78598ad286..fa73bdcfe100a85d2bdd8d46395ea4bbb4cbce6b 100644 --- a/sys/net/gnrc/sock/ip/gnrc_sock_ip.c +++ b/sys/net/gnrc/sock/ip/gnrc_sock_ip.c @@ -51,7 +51,7 @@ int sock_ip_create(sock_ip_t *sock, const sock_ip_ep_t *local, if (gnrc_ep_addr_any(remote)) { return -EINVAL; } - memcpy(&sock->remote, remote, sizeof(sock_ip_ep_t)); + gnrc_ep_set(&sock->remote, remote, sizeof(sock_ip_ep_t)); } gnrc_sock_create(&sock->reg, GNRC_NETTYPE_IPV6, proto); @@ -140,7 +140,8 @@ ssize_t sock_ip_send(sock_ip_t *sock, const void *data, size_t len, return -EINVAL; } if ((remote == NULL) && - /* sock can't be NULL as per assertion above */ + /* cppcheck-suppress nullPointerRedundantCheck + * (reason: sock can't be NULL as per the check above) */ (sock->remote.family == AF_UNSPEC)) { return -ENOTCONN; } @@ -165,7 +166,7 @@ ssize_t sock_ip_send(sock_ip_t *sock, const void *data, size_t len, memcpy(&rem, &sock->remote, sizeof(rem)); } else { - memcpy(&rem, remote, sizeof(rem)); + gnrc_ep_set(&rem, remote, sizeof(rem)); } if ((remote != NULL) && (remote->family == AF_UNSPEC) && (sock->remote.family != AF_UNSPEC)) { diff --git a/sys/net/gnrc/sock/udp/gnrc_sock_udp.c b/sys/net/gnrc/sock/udp/gnrc_sock_udp.c index aa3650cf7841b42f935775df062971f1a6860985..27168242173190cbd2f26f6b6d1d561598cd8841 100644 --- a/sys/net/gnrc/sock/udp/gnrc_sock_udp.c +++ b/sys/net/gnrc/sock/udp/gnrc_sock_udp.c @@ -123,7 +123,8 @@ int sock_udp_create(sock_udp_t *sock, const sock_udp_ep_t *local, if (gnrc_ep_addr_any((const sock_ip_ep_t *)remote)) { return -EINVAL; } - memcpy(&sock->remote, remote, sizeof(sock_udp_ep_t)); + gnrc_ep_set((sock_ip_ep_t *)&sock->remote, + (sock_ip_ep_t *)remote, sizeof(sock_udp_ep_t)); } if (local != NULL) { /* listen only with local given */ @@ -216,6 +217,7 @@ ssize_t sock_udp_send(sock_udp_t *sock, const void *data, size_t len, gnrc_pktsnip_t *payload, *pkt; uint16_t src_port = 0, dst_port; sock_ip_ep_t local; + sock_udp_ep_t remote_cpy; sock_ip_ep_t *rem; assert((sock != NULL) || (remote != NULL)); @@ -250,6 +252,9 @@ ssize_t sock_udp_send(sock_udp_t *sock, const void *data, size_t len, if ((src_port = _get_dyn_port(sock)) == GNRC_SOCK_DYN_PORTRANGE_ERR) { return -EINVAL; } + /* cppcheck-suppress nullPointer + * (reason: sock *can* be NULL at this place, cppcheck is weird here as + * well, see above) */ if (sock != NULL) { /* bind sock object implicitly */ sock->local.port = src_port; @@ -277,7 +282,8 @@ ssize_t sock_udp_send(sock_udp_t *sock, const void *data, size_t len, dst_port = sock->remote.port; } else { - rem = (sock_ip_ep_t *)remote; + rem = (sock_ip_ep_t *)&remote_cpy; + gnrc_ep_set(rem, (sock_ip_ep_t *)remote, sizeof(sock_udp_ep_t)); dst_port = remote->port; } /* check for matching address families in local and remote */