unet-cli: add DHT support
[project/unetd.git] / wg.c
diff --git a/wg.c b/wg.c
index be8e0cb123a59daca34b92d35781752af2a009aa..64687f181983c351e32d44a1aa587c3db844c2f5 100644 (file)
--- a/wg.c
+++ b/wg.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0+
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
  */
@@ -6,9 +6,6 @@
 
 static const struct wg_ops *wg_get_ops(struct network *net)
 {
-       if (dummy_mode)
-               return &wg_dummy_ops;
-
        if (wg_user_ops.check(net))
                return &wg_user_ops;
 
@@ -35,6 +32,16 @@ void wg_cleanup_network(struct network *net)
                net->wg.ops->cleanup(net);
 }
 
+static void
+wg_peer_set_connected(struct network *net, struct network_peer *peer, bool val)
+{
+       if (peer->state.connected == val)
+               return;
+
+       peer->state.connected = val;
+       network_services_peer_update(net, peer);
+}
+
 struct network_peer *wg_peer_update_start(struct network *net, const uint8_t *key)
 {
        struct network_peer *peer;
@@ -46,7 +53,7 @@ struct network_peer *wg_peer_update_start(struct network *net, const uint8_t *ke
        peer->state.handshake = false;
        peer->state.idle++;
        if (peer->state.idle >= 2 * net->net_config.keepalive)
-               peer->state.connected = false;
+               wg_peer_set_connected(net, peer, false);
        if (peer->state.idle > net->net_config.keepalive)
                network_pex_event(net, peer, PEX_EV_PING);
 
@@ -69,9 +76,10 @@ void wg_peer_set_last_handshake(struct network *net, struct network_peer *peer,
        peer->state.last_handshake = sec;
        sec = now - sec;
        if (sec <= net->net_config.keepalive) {
-               peer->state.connected = true;
                if (peer->state.idle > sec)
                        peer->state.idle = sec;
+               wg_peer_set_connected(net, peer, true);
+               peer->state.pinged = false;
        }
 }
 
@@ -83,7 +91,7 @@ void wg_peer_set_rx_bytes(struct network *net, struct network_peer *peer,
        peer->state.rx_bytes = bytes;
        if (diff > 0) {
                peer->state.idle = 0;
-               peer->state.connected = true;
+               wg_peer_set_connected(net, peer, true);
        }
 }