aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/config.c13
-rw-r--r--src/tools/config.c6
-rw-r--r--src/tools/show.c18
-rw-r--r--src/tools/showconf.c10
-rw-r--r--src/uapi.h6
5 files changed, 27 insertions, 26 deletions
diff --git a/src/config.c b/src/config.c
index 6158cc8..5d2b825 100644
--- a/src/config.c
+++ b/src/config.c
@@ -74,12 +74,9 @@ static int set_peer(struct wireguard_device *wg, void __user *user_peer, size_t
goto out;
}
- if (in_peer.endpoint.ss_family == AF_INET || in_peer.endpoint.ss_family == AF_INET6) {
- struct endpoint endpoint = { { { 0 } } };
- if (in_peer.endpoint.ss_family == AF_INET)
- endpoint.addr4 = *(struct sockaddr_in *)&in_peer.endpoint;
- else if (in_peer.endpoint.ss_family == AF_INET6)
- endpoint.addr6 = *(struct sockaddr_in6 *)&in_peer.endpoint;
+ if (in_peer.endpoint.addr.sa_family == AF_INET || in_peer.endpoint.addr.sa_family == AF_INET6) {
+ struct endpoint endpoint = { 0 };
+ memcpy(&endpoint, &in_peer.endpoint, sizeof(in_peer.endpoint));
socket_set_peer_endpoint(peer, &endpoint);
}
@@ -242,9 +239,9 @@ static int populate_peer(struct wireguard_peer *peer, void *ctx)
memcpy(out_peer.public_key, peer->handshake.remote_static, NOISE_PUBLIC_KEY_LEN);
read_lock_bh(&peer->endpoint_lock);
if (peer->endpoint.addr.sa_family == AF_INET)
- *(struct sockaddr_in *)&out_peer.endpoint = peer->endpoint.addr4;
+ out_peer.endpoint.addr4 = peer->endpoint.addr4;
else if (peer->endpoint.addr.sa_family == AF_INET6)
- *(struct sockaddr_in6 *)&out_peer.endpoint = peer->endpoint.addr6;
+ out_peer.endpoint.addr6 = peer->endpoint.addr6;
read_unlock_bh(&peer->endpoint_lock);
out_peer.last_handshake_time = peer->walltime_last_handshake;
out_peer.tx_bytes = peer->tx_bytes;
diff --git a/src/tools/config.c b/src/tools/config.c
index f326389..83c7db1 100644
--- a/src/tools/config.c
+++ b/src/tools/config.c
@@ -119,7 +119,7 @@ static inline bool parse_ip(struct wgipmask *ipmask, const char *value)
return true;
}
-static inline bool parse_endpoint(struct sockaddr_storage *endpoint, const char *value)
+static inline bool parse_endpoint(struct sockaddr *endpoint, const char *value)
{
char *mutable = strdup(value);
char *begin, *end;
@@ -293,7 +293,7 @@ static bool process_line(struct config_ctx *ctx, const char *line)
goto error;
} else if (ctx->is_peer_section) {
if (key_match("Endpoint"))
- ret = parse_endpoint(&peer_from_offset(ctx->buf.dev, ctx->peer_offset)->endpoint, value);
+ ret = parse_endpoint(&peer_from_offset(ctx->buf.dev, ctx->peer_offset)->endpoint.addr, value);
else if (key_match("PublicKey"))
ret = parse_key(peer_from_offset(ctx->buf.dev, ctx->peer_offset)->public_key, value);
else if (key_match("AllowedIPs"))
@@ -500,7 +500,7 @@ bool config_read_cmd(struct wgdevice **device, char *argv[], int argc)
argv += 1;
argc -= 1;
} else if (!strcmp(argv[0], "endpoint") && argc >= 2 && buf.dev->num_peers) {
- if (!parse_endpoint(&peer_from_offset(buf.dev, peer_offset)->endpoint, argv[1]))
+ if (!parse_endpoint(&peer_from_offset(buf.dev, peer_offset)->endpoint.addr, argv[1]))
goto error;
argv += 2;
argc -= 2;
diff --git a/src/tools/show.c b/src/tools/show.c
index 5257d43..04a634c 100644
--- a/src/tools/show.c
+++ b/src/tools/show.c
@@ -107,7 +107,7 @@ static char *ip(const struct wgipmask *ip)
return buf;
}
-static char *endpoint(const struct sockaddr_storage *addr)
+static char *endpoint(const struct sockaddr *addr)
{
char host[4096 + 1];
char service[512 + 1];
@@ -116,16 +116,16 @@ static char *endpoint(const struct sockaddr_storage *addr)
socklen_t addr_len = 0;
memset(buf, 0, sizeof(buf));
- if (addr->ss_family == AF_INET)
+ if (addr->sa_family == AF_INET)
addr_len = sizeof(struct sockaddr_in);
- else if (addr->ss_family == AF_INET6)
+ else if (addr->sa_family == AF_INET6)
addr_len = sizeof(struct sockaddr_in6);
- ret = getnameinfo((struct sockaddr *)addr, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST);
+ ret = getnameinfo(addr, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST);
if (ret)
strncpy(buf, gai_strerror(ret), sizeof(buf) - 1);
else
- snprintf(buf, sizeof(buf) - 1, (addr->ss_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service);
+ snprintf(buf, sizeof(buf) - 1, (addr->sa_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service);
return buf;
}
@@ -228,8 +228,8 @@ static void pretty_print(struct wgdevice *device)
}
for_each_wgpeer(device, peer, i) {
terminal_printf(TERMINAL_FG_YELLOW TERMINAL_BOLD "peer" TERMINAL_RESET ": " TERMINAL_FG_YELLOW "%s" TERMINAL_RESET "\n", key(peer->public_key));
- if (peer->endpoint.ss_family == AF_INET || peer->endpoint.ss_family == AF_INET6)
- terminal_printf(" " TERMINAL_BOLD "endpoint" TERMINAL_RESET ": %s\n", endpoint(&peer->endpoint));
+ if (peer->endpoint.addr.sa_family == AF_INET || peer->endpoint.addr.sa_family == AF_INET6)
+ terminal_printf(" " TERMINAL_BOLD "endpoint" TERMINAL_RESET ": %s\n", endpoint(&peer->endpoint.addr));
terminal_printf(" " TERMINAL_BOLD "allowed ips" TERMINAL_RESET ": ");
if (peer->num_ipmasks) {
for_each_wgipmask(peer, ipmask, j)
@@ -276,8 +276,8 @@ static bool ugly_print(struct wgdevice *device, const char *param, bool with_int
printf("%s\t", device->interface);
for_each_wgpeer(device, peer, i) {
printf("%s\t", key(peer->public_key));
- if (peer->endpoint.ss_family == AF_INET || peer->endpoint.ss_family == AF_INET6)
- printf("%s\n", endpoint(&peer->endpoint));
+ if (peer->endpoint.addr.sa_family == AF_INET || peer->endpoint.addr.sa_family == AF_INET6)
+ printf("%s\n", endpoint(&peer->endpoint.addr));
else
printf("(none)\n");
}
diff --git a/src/tools/showconf.c b/src/tools/showconf.c
index f04caa1..fe811e6 100644
--- a/src/tools/showconf.c
+++ b/src/tools/showconf.c
@@ -75,18 +75,18 @@ int showconf_main(int argc, char *argv[])
if (peer->num_ipmasks)
printf("\n");
- if (peer->endpoint.ss_family == AF_INET || peer->endpoint.ss_family == AF_INET6) {
+ if (peer->endpoint.addr.sa_family == AF_INET || peer->endpoint.addr.sa_family == AF_INET6) {
char host[4096 + 1];
char service[512 + 1];
static char buf[sizeof(host) + sizeof(service) + 4];
socklen_t addr_len = 0;
memset(buf, 0, sizeof(buf));
- if (peer->endpoint.ss_family == AF_INET)
+ if (peer->endpoint.addr.sa_family == AF_INET)
addr_len = sizeof(struct sockaddr_in);
- else if (peer->endpoint.ss_family == AF_INET6)
+ else if (peer->endpoint.addr.sa_family == AF_INET6)
addr_len = sizeof(struct sockaddr_in6);
- if (!getnameinfo((struct sockaddr *)&peer->endpoint, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST)) {
- snprintf(buf, sizeof(buf) - 1, (peer->endpoint.ss_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service);
+ if (!getnameinfo(&peer->endpoint.addr, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST)) {
+ snprintf(buf, sizeof(buf) - 1, (peer->endpoint.addr.sa_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service);
printf("Endpoint = %s\n", buf);
}
}
diff --git a/src/uapi.h b/src/uapi.h
index e5d7368..df45c96 100644
--- a/src/uapi.h
+++ b/src/uapi.h
@@ -105,7 +105,11 @@ struct wgpeer {
__u8 public_key[WG_KEY_LEN]; /* Get/Set */
__u32 flags; /* Set */
- struct sockaddr_storage endpoint; /* Get/Set */
+ union {
+ struct sockaddr addr;
+ struct sockaddr_in addr4;
+ struct sockaddr_in6 addr6;
+ } endpoint; /* Get/Set */
struct timeval last_handshake_time; /* Get */
__u64 rx_bytes, tx_bytes; /* Get */