Skip to content

Commit

Permalink
Add socket address initialization functions to tst_net library
Browse files Browse the repository at this point in the history
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
  • Loading branch information
mdoucha authored and pevik committed Mar 20, 2020
1 parent c715812 commit 5705dd2
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
21 changes: 21 additions & 0 deletions include/tst_net.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,28 @@
* Copyright (c) 2017-2019 Petr Vorel <pvorel@suse.cz>
*/

#ifndef TST_NET_H_
#define TST_NET_H_

#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>

void tst_get_in_addr(const char *ip_str, struct in_addr *ip);
void tst_get_in6_addr(const char *ip_str, struct in6_addr *ip6);

/*
* Find valid connection address for a given bound socket
*/
socklen_t tst_get_connect_address(int sock, struct sockaddr_storage *addr);

/*
* Initialize AF_INET/AF_INET6 socket address structure with address and port
*/
void tst_init_sockaddr_inet(struct sockaddr_in *sa, const char *ip_str, uint16_t port);
void tst_init_sockaddr_inet_bin(struct sockaddr_in *sa, uint32_t ip_val, uint16_t port);
void tst_init_sockaddr_inet6(struct sockaddr_in6 *sa, const char *ip_str, uint16_t port);
void tst_init_sockaddr_inet6_bin(struct sockaddr_in6 *sa, const struct in6_addr *ip_val, uint16_t port);

#endif
71 changes: 71 additions & 0 deletions lib/tst_net.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2017-2019 Petr Vorel <pvorel@suse.cz>
* Copyright (c) 2019 Martin Doucha <mdoucha@suse.cz>
*/

#include <errno.h>
Expand Down Expand Up @@ -133,3 +134,73 @@ void tst_get_in6_addr(const char *ip_str, struct in6_addr *ip6)
if (inet_pton(AF_INET6, ip_str, ip6) <= 0)
tst_brk_comment("bad IPv6 address: '%s'", ip_str);
}

socklen_t tst_get_connect_address(int sock, struct sockaddr_storage *addr)
{
struct sockaddr_in *inet_ptr;
struct sockaddr_in6 *inet6_ptr;
size_t tmp_size;
socklen_t ret = sizeof(*addr);

SAFE_GETSOCKNAME(sock, (struct sockaddr*)addr, &ret);

/* Sanitize wildcard addresses */
switch (addr->ss_family) {
case AF_INET:
inet_ptr = (struct sockaddr_in*)addr;

switch (ntohl(inet_ptr->sin_addr.s_addr)) {
case INADDR_ANY:
case INADDR_BROADCAST:
inet_ptr->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
break;
}

break;

case AF_INET6:
inet6_ptr = (struct sockaddr_in6*)addr;
tmp_size = sizeof(struct in6_addr);

if (!memcmp(&inet6_ptr->sin6_addr, &in6addr_any, tmp_size)) {
memcpy(&inet6_ptr->sin6_addr, &in6addr_loopback,
tmp_size);
}

break;
}

return ret;
}

void tst_init_sockaddr_inet(struct sockaddr_in *sa, const char *ip_str, uint16_t port)
{
memset(sa, 0, sizeof(struct sockaddr_in));
sa->sin_family = AF_INET;
sa->sin_port = htons(port);
tst_get_in_addr(ip_str, &sa->sin_addr);
}

void tst_init_sockaddr_inet_bin(struct sockaddr_in *sa, uint32_t ip_val, uint16_t port)
{
memset(sa, 0, sizeof(struct sockaddr_in));
sa->sin_family = AF_INET;
sa->sin_port = htons(port);
sa->sin_addr.s_addr = htonl(ip_val);
}

void tst_init_sockaddr_inet6(struct sockaddr_in6 *sa, const char *ip_str, uint16_t port)
{
memset(sa, 0, sizeof(struct sockaddr_in6));
sa->sin6_family = AF_INET6;
sa->sin6_port = htons(port);
tst_get_in6_addr(ip_str, &sa->sin6_addr);
}

void tst_init_sockaddr_inet6_bin(struct sockaddr_in6 *sa, const struct in6_addr *ip_val, uint16_t port)
{
memset(sa, 0, sizeof(struct sockaddr_in6));
sa->sin6_family = AF_INET6;
sa->sin6_port = htons(port);
memcpy(&sa->sin6_addr, ip_val, sizeof(struct in6_addr));
}

0 comments on commit 5705dd2

Please sign in to comment.