1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
9 wg_dummy_init(struct network
*net
)
11 char key
[B64_ENCODE_LEN(CURVE25519_KEY_SIZE
)];
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");
24 wg_dummy_cleanup(struct network
*net
)
26 fprintf(stderr
, "Remove wireguard interface %s\n", network_name(net
));
30 wg_dummy_init_local(struct network
*net
, struct network_peer
*peer
)
32 char addr
[INET6_ADDRSTRLEN
];
34 fprintf(stderr
, "local node %s, port: %d\n", network_peer_name(peer
), peer
->port
);
36 fprintf(stderr
, "default addr: %s\n",
37 inet_ntop(AF_INET6
, &peer
->local_addr
.in6
, addr
, sizeof(addr
)));
39 fprintf(stderr
, "\n");
45 wg_dummy_peer_update(struct network
*net
, struct network_peer
*peer
, enum wg_update_cmd cmd
)
47 static const char * const cmds
[] = {
48 [WG_PEER_CREATE
] = "create",
49 [WG_PEER_UPDATE
] = "update",
50 [WG_PEER_DELETE
] = "delete",
52 char key
[B64_ENCODE_LEN(CURVE25519_KEY_SIZE
)];
53 char addr
[INET6_ADDRSTRLEN
];
54 struct blob_attr
*cur
;
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
);
60 if (cmd
== WG_PEER_DELETE
)
63 fprintf(stderr
, "default addr: %s\n",
64 inet_ntop(AF_INET6
, &peer
->local_addr
.in6
, addr
, sizeof(addr
)));
66 blobmsg_for_each_attr(cur
, peer
->ipaddr
, rem
) {
67 fprintf(stderr
, "peer addr: %s\n", blobmsg_get_string(cur
));
69 blobmsg_for_each_attr(cur
, peer
->subnet
, rem
) {
70 fprintf(stderr
, "peer subnet: %s\n", blobmsg_get_string(cur
));
72 fprintf(stderr
, "\n");
77 wg_dummy_peer_refresh(struct network
*net
)
79 struct network_host
*host
;
81 avl_for_each_element(&net
->hosts
, host
, node
) {
82 struct network_peer
*peer
= &host
->peer
;
84 if (peer
->state
.endpoint
.in
.sin_family
)
85 peer
->state
.connected
= true;
92 wg_dummy_peer_connect(struct network
*net
, struct network_peer
*peer
,
93 union network_endpoint
*ep
)
95 char addr
[INET6_ADDRSTRLEN
];
98 if (ep
->in
.sin_family
== AF_INET6
)
99 ip
= &ep
->in6
.sin6_addr
;
101 ip
= &ep
->in
.sin_addr
;
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
));
110 const struct wg_ops wg_dummy_ops
= {
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
,