3 static const struct wg_ops
*wg_get_ops(struct network
*net
)
8 if (wg_user_ops
.check(net
))
18 int wg_init_network(struct network
*net
)
20 net
->wg
.ops
= wg_get_ops(net
);
25 return net
->wg
.ops
->init(net
);
28 void wg_cleanup_network(struct network
*net
)
31 net
->wg
.ops
->cleanup(net
);
34 struct network_peer
*wg_peer_update_start(struct network
*net
, const uint8_t *key
)
36 struct network_peer
*peer
;
38 peer
= vlist_find(&net
->peers
, key
, peer
, node
);
42 peer
->state
.handshake
= false;
44 if (peer
->state
.idle
>= 2 * net
->net_config
.keepalive
)
45 peer
->state
.connected
= false;
46 if (peer
->state
.idle
> net
->net_config
.keepalive
)
47 network_pex_event(net
, peer
, PEX_EV_PING
);
52 void wg_peer_update_done(struct network
*net
, struct network_peer
*peer
)
54 if (peer
->state
.handshake
)
55 network_pex_event(net
, peer
, PEX_EV_HANDSHAKE
);
58 void wg_peer_set_last_handshake(struct network
*net
, struct network_peer
*peer
,
59 uint64_t now
, uint64_t sec
)
61 if (sec
== peer
->state
.last_handshake
)
64 peer
->state
.handshake
= true;
65 peer
->state
.last_handshake
= sec
;
67 if (sec
<= net
->net_config
.keepalive
) {
68 peer
->state
.connected
= true;
69 if (peer
->state
.idle
> sec
)
70 peer
->state
.idle
= sec
;
74 void wg_peer_set_rx_bytes(struct network
*net
, struct network_peer
*peer
,
77 int64_t diff
= bytes
- peer
->state
.rx_bytes
;
79 peer
->state
.rx_bytes
= bytes
;
82 peer
->state
.connected
= true;
86 void wg_peer_set_endpoint(struct network
*net
, struct network_peer
*peer
,
87 void *data
, size_t len
)
89 if (len
> sizeof(peer
->state
.endpoint
))
92 if (!memcmp(&peer
->state
.endpoint
, data
, len
))
95 memset(&peer
->state
.endpoint
, 0, sizeof(peer
->state
.endpoint
));
96 memcpy(&peer
->state
.endpoint
, data
, len
);
97 network_pex_event(net
, peer
, PEX_EV_ENDPOINT_CHANGE
);