summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
Diffstat (limited to 'proto')
-rw-r--r--proto/wireguard/wireguard.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/proto/wireguard/wireguard.c b/proto/wireguard/wireguard.c
index 2c2e6796..9896b53a 100644
--- a/proto/wireguard/wireguard.c
+++ b/proto/wireguard/wireguard.c
@@ -156,7 +156,7 @@ dump(void *ptr, size_t len)
}
static wg_peer *
-add_peer(wg_device *dev, wg_key pubkey)
+add_peer(wg_device *dev, const wg_key pubkey)
{
struct wg_peer *peer = malloc(sizeof(struct wg_peer));
memset(peer, 0, sizeof(struct wg_peer));
@@ -254,21 +254,18 @@ wg_rt_notify(struct proto *P, struct channel *CH, struct network *n,
debug("WG: notify new %d %N\n",
new->attrs->dest, n->n.addr);
- wg_key pubkey;
- size_t pubkey_size = sizeof(wg_key);
- memset(pubkey, 0, pubkey_size);
- u32 tunnel_ep_as4 = 0;
- ip_addr tunnel_ep_addr = IPA_NONE;
- u16 udp_dest_port = 0;
- u32 color = 0;
- u16 flags = 0;
+ struct tunnel_encap encap;
+ memset(&encap, 0, sizeof(encap));
+ encap.ep.ip = IPA_NONE;
t = ea_find(new->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_TUNNEL_ENCAP));
if (!t && he && he->src) {
t = ea_find(he->src->eattrs, EA_CODE(PROTOCOL_BGP, BA_TUNNEL_ENCAP));
}
- if (t && t->u.ptr && decode_tunnel_encap(t, c->tunnel_type, &pubkey, &pubkey_size, &tunnel_ep_as4, &tunnel_ep_addr, &color, &udp_dest_port, &flags) == 0 && pubkey_size == sizeof(wg_key)) {
- log(L_TRACE "WG: Attr %x %x %d %04x", t->flags, t->type, t->u.ptr->length, flags);
+ if (t && t->u.ptr && decode_tunnel_encap(t, &encap, P->pool) == 0 && encap.type == c->tunnel_type && encap.encap_len == sizeof(wg_key)) {
+ const wg_key *pubkey = encap.encap;
+
+ log(L_TRACE "WG: Attr %x %x %d %04x", t->flags, t->type, t->u.ptr->length, encap.flags);
struct wg_device *dev = p->dev;
@@ -288,7 +285,7 @@ wg_rt_notify(struct proto *P, struct channel *CH, struct network *n,
log(L_TRACE "WG: Found");
found = true;
- set_peer_tunnel_ep(peer, tunnel_ep_addr, udp_dest_port);
+ set_peer_tunnel_ep(peer, encap.ep.ip, encap.udp_dest_port);
add_allowed_ips(ch->c.net_type, n, peer);
dirty = true;
@@ -297,7 +294,7 @@ wg_rt_notify(struct proto *P, struct channel *CH, struct network *n,
if (!found) {
wg_peer *peer = add_peer(dev, pubkey);
- set_peer_tunnel_ep(peer, tunnel_ep_addr, udp_dest_port);
+ set_peer_tunnel_ep(peer, encap.ep.ip, encap.udp_dest_port);
add_allowed_ips(ch->c.net_type, n, peer);
dirty = true;
}
@@ -351,6 +348,9 @@ wg_rt_notify(struct proto *P, struct channel *CH, struct network *n,
log(L_TRACE "WG: No Attr");
}
+ mb_free(encap.encap);
+ encap.encap = NULL;
+
// old_metric = en->valid ? en->metric : -1;
// en->valid = RIP_ENTRY_VALID;