aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/socket.c b/src/socket.c
index 1ce74cd..57ab61e 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -248,12 +248,17 @@ void socket_set_peer_endpoint(struct wireguard_peer *peer, const struct endpoint
return;
write_lock_bh(&peer->endpoint_lock);
if (endpoint->addr.sa_family == AF_INET) {
- peer->endpoint.addr4 = endpoint->addr4;
- peer->endpoint.src4 = endpoint->src4;
- peer->endpoint.src_if4 = endpoint->src_if4;
+ if (!peer->endpoint.fixed)
+ peer->endpoint.addr4 = endpoint->addr4;
+ if (!peer->endpoint.fixed || peer->endpoint.addr.sa_family == AF_INET) {
+ peer->endpoint.src4 = endpoint->src4;
+ peer->endpoint.src_if4 = endpoint->src_if4;
+ }
} else if (endpoint->addr.sa_family == AF_INET6) {
- peer->endpoint.addr6 = endpoint->addr6;
- peer->endpoint.src6 = endpoint->src6;
+ if (!peer->endpoint.fixed)
+ peer->endpoint.addr6 = endpoint->addr6;
+ if (!peer->endpoint.fixed || peer->endpoint.addr.sa_family == AF_INET6)
+ peer->endpoint.src6 = endpoint->src6;
} else
goto out;
dst_cache_reset(&peer->endpoint_cache);