service: filter out duplicate members
[project/unetd.git] / wg-dummy.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
4 */
5 #include <arpa/inet.h>
6 #include "unetd.h"
7
8 static int
9 wg_dummy_init(struct network *net)
10 {
11 char key[B64_ENCODE_LEN(CURVE25519_KEY_SIZE)];
12
13 fprintf(stderr, "Create wireguard interface %s\n", network_name(net));
14 b64_encode(net->config.key, sizeof(net->config.key), key, sizeof(key));
15 fprintf(stderr, "key=%s\n", key);
16 b64_encode(net->config.pubkey, sizeof(net->config.pubkey), key, sizeof(key));
17 fprintf(stderr, "pubkey=%s\n", key);
18 fprintf(stderr, "\n");
19
20 return 0;
21 }
22
23 static void
24 wg_dummy_cleanup(struct network *net)
25 {
26 fprintf(stderr, "Remove wireguard interface %s\n", network_name(net));
27 }
28
29 static int
30 wg_dummy_init_local(struct network *net, struct network_peer *peer)
31 {
32 char addr[INET6_ADDRSTRLEN];
33
34 fprintf(stderr, "local node %s, port: %d\n", network_peer_name(peer), peer->port);
35
36 fprintf(stderr, "default addr: %s\n",
37 inet_ntop(AF_INET6, &peer->local_addr.in6, addr, sizeof(addr)));
38
39 fprintf(stderr, "\n");
40
41 return 0;
42 }
43
44 static int
45 wg_dummy_peer_update(struct network *net, struct network_peer *peer, enum wg_update_cmd cmd)
46 {
47 static const char * const cmds[] = {
48 [WG_PEER_CREATE] = "create",
49 [WG_PEER_UPDATE] = "update",
50 [WG_PEER_DELETE] = "delete",
51 };
52 char key[B64_ENCODE_LEN(CURVE25519_KEY_SIZE)];
53 char addr[INET6_ADDRSTRLEN];
54 struct blob_attr *cur;
55 int rem;
56
57 b64_encode(peer->key, sizeof(peer->key), key, sizeof(key));
58 fprintf(stderr, "%s peer %s: %s\n", cmds[cmd], network_peer_name(peer), key);
59
60 if (cmd == WG_PEER_DELETE)
61 return 0;
62
63 fprintf(stderr, "default addr: %s\n",
64 inet_ntop(AF_INET6, &peer->local_addr.in6, addr, sizeof(addr)));
65
66 blobmsg_for_each_attr(cur, peer->ipaddr, rem) {
67 fprintf(stderr, "peer addr: %s\n", blobmsg_get_string(cur));
68 }
69 blobmsg_for_each_attr(cur, peer->subnet, rem) {
70 fprintf(stderr, "peer subnet: %s\n", blobmsg_get_string(cur));
71 }
72 fprintf(stderr, "\n");
73 return 0;
74 }
75
76 static int
77 wg_dummy_peer_refresh(struct network *net)
78 {
79 struct network_host *host;
80
81 avl_for_each_element(&net->hosts, host, node) {
82 struct network_peer *peer = &host->peer;
83
84 if (peer->state.endpoint.in.sin_family)
85 peer->state.connected = true;
86 }
87
88 return 0;
89 }
90
91 static int
92 wg_dummy_peer_connect(struct network *net, struct network_peer *peer,
93 union network_endpoint *ep)
94 {
95 char addr[INET6_ADDRSTRLEN];
96 void *ip;
97
98 if (ep->in.sin_family == AF_INET6)
99 ip = &ep->in6.sin6_addr;
100 else
101 ip = &ep->in.sin_addr;
102
103 fprintf(stderr, "connect to host %s at %s:%d\n", network_peer_name(peer),
104 inet_ntop(ep->in.sin_family, ip, addr, sizeof(addr)), ntohs(ep->in.sin_port));
105 memcpy(&peer->state.endpoint, ep, sizeof(peer->state.endpoint));
106
107 return 0;
108 }
109
110 const struct wg_ops wg_dummy_ops = {
111 .name = "dummy",
112 .init = wg_dummy_init,
113 .cleanup = wg_dummy_cleanup,
114 .init_local = wg_dummy_init_local,
115 .peer_update = wg_dummy_peer_update,
116 .peer_refresh = wg_dummy_peer_refresh,
117 .peer_connect = wg_dummy_peer_connect,
118 };