1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
7 static const struct wg_ops
*wg_get_ops(struct network
*net
)
12 if (wg_user_ops
.check(net
))
22 int wg_init_network(struct network
*net
)
24 net
->wg
.ops
= wg_get_ops(net
);
29 return net
->wg
.ops
->init(net
);
32 void wg_cleanup_network(struct network
*net
)
35 net
->wg
.ops
->cleanup(net
);
38 struct network_peer
*wg_peer_update_start(struct network
*net
, const uint8_t *key
)
40 struct network_peer
*peer
;
42 peer
= vlist_find(&net
->peers
, key
, peer
, node
);
46 peer
->state
.handshake
= false;
48 if (peer
->state
.idle
>= 2 * net
->net_config
.keepalive
)
49 peer
->state
.connected
= false;
50 if (peer
->state
.idle
> net
->net_config
.keepalive
)
51 network_pex_event(net
, peer
, PEX_EV_PING
);
56 void wg_peer_update_done(struct network
*net
, struct network_peer
*peer
)
58 if (peer
->state
.handshake
)
59 network_pex_event(net
, peer
, PEX_EV_HANDSHAKE
);
62 void wg_peer_set_last_handshake(struct network
*net
, struct network_peer
*peer
,
63 uint64_t now
, uint64_t sec
)
65 if (sec
== peer
->state
.last_handshake
)
68 peer
->state
.handshake
= true;
69 peer
->state
.last_handshake
= sec
;
71 if (sec
<= net
->net_config
.keepalive
) {
72 peer
->state
.connected
= true;
73 if (peer
->state
.idle
> sec
)
74 peer
->state
.idle
= sec
;
78 void wg_peer_set_rx_bytes(struct network
*net
, struct network_peer
*peer
,
81 int64_t diff
= bytes
- peer
->state
.rx_bytes
;
83 peer
->state
.rx_bytes
= bytes
;
86 peer
->state
.connected
= true;
90 void wg_peer_set_endpoint(struct network
*net
, struct network_peer
*peer
,
91 void *data
, size_t len
)
93 if (len
> sizeof(peer
->state
.endpoint
))
96 if (!memcmp(&peer
->state
.endpoint
, data
, len
))
99 memset(&peer
->state
.endpoint
, 0, sizeof(peer
->state
.endpoint
));
100 memcpy(&peer
->state
.endpoint
, data
, len
);
101 network_pex_event(net
, peer
, PEX_EV_ENDPOINT_CHANGE
);