1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
7 static const struct wg_ops
*wg_get_ops(struct network
*net
)
9 if (wg_user_ops
.check(net
))
19 int wg_init_network(struct network
*net
)
21 net
->wg
.ops
= wg_get_ops(net
);
26 return net
->wg
.ops
->init(net
);
29 void wg_cleanup_network(struct network
*net
)
32 net
->wg
.ops
->cleanup(net
);
36 wg_peer_set_connected(struct network
*net
, struct network_peer
*peer
, bool val
)
38 if (peer
->state
.connected
== val
)
41 peer
->state
.connected
= val
;
42 network_services_peer_update(net
, peer
);
45 struct network_peer
*wg_peer_update_start(struct network
*net
, const uint8_t *key
)
47 struct network_peer
*peer
;
49 peer
= vlist_find(&net
->peers
, key
, peer
, node
);
53 peer
->state
.handshake
= false;
55 if (peer
->state
.idle
>= 2 * net
->net_config
.keepalive
)
56 wg_peer_set_connected(net
, peer
, false);
57 if (peer
->state
.idle
> net
->net_config
.keepalive
)
58 network_pex_event(net
, peer
, PEX_EV_PING
);
63 void wg_peer_update_done(struct network
*net
, struct network_peer
*peer
)
65 if (peer
->state
.handshake
)
66 network_pex_event(net
, peer
, PEX_EV_HANDSHAKE
);
69 void wg_peer_set_last_handshake(struct network
*net
, struct network_peer
*peer
,
70 uint64_t now
, uint64_t sec
)
72 if (sec
== peer
->state
.last_handshake
)
75 peer
->state
.handshake
= true;
76 peer
->state
.last_handshake
= sec
;
78 if (sec
<= net
->net_config
.keepalive
) {
79 if (peer
->state
.idle
> sec
)
80 peer
->state
.idle
= sec
;
81 wg_peer_set_connected(net
, peer
, true);
82 peer
->state
.pinged
= false;
86 void wg_peer_set_rx_bytes(struct network
*net
, struct network_peer
*peer
,
89 int64_t diff
= bytes
- peer
->state
.rx_bytes
;
91 peer
->state
.rx_bytes
= bytes
;
94 wg_peer_set_connected(net
, peer
, true);
98 void wg_peer_set_endpoint(struct network
*net
, struct network_peer
*peer
,
99 void *data
, size_t len
)
101 if (len
> sizeof(peer
->state
.endpoint
))
104 if (!memcmp(&peer
->state
.endpoint
, data
, len
))
107 memset(&peer
->state
.endpoint
, 0, sizeof(peer
->state
.endpoint
));
108 memcpy(&peer
->state
.endpoint
, data
, len
);
109 network_pex_event(net
, peer
, PEX_EV_ENDPOINT_CHANGE
);