diff options
author | Trumeet <17158086+Trumeet@users.noreply.github.com> | 2021-01-16 16:04:50 -0800 |
---|---|---|
committer | Trumeet <17158086+Trumeet@users.noreply.github.com> | 2021-01-16 16:04:50 -0800 |
commit | 8c71583e0633714c01def657228af9b0d47c68df (patch) | |
tree | 480489cdd737af1c4cdc7aee4931063640b5c18f /central | |
parent | 5dd680f20f286f243427c39d432e4cc67e194445 (diff) | |
download | dn42peering-8c71583e0633714c01def657228af9b0d47c68df.tar dn42peering-8c71583e0633714c01def657228af9b0d47c68df.tar.gz dn42peering-8c71583e0633714c01def657228af9b0d47c68df.tar.bz2 dn42peering-8c71583e0633714c01def657228af9b0d47c68df.zip |
fix(central/agent/rpc): fix non-link local IPv6 support
Diffstat (limited to 'central')
3 files changed, 43 insertions, 4 deletions
diff --git a/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java b/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java index d00ccfa..0c5b6b1 100644 --- a/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java +++ b/central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java @@ -898,7 +898,15 @@ public class ManageHandler implements ISubRouter { root.put("endpoint", "This node is currently down! Edit the peer to choose another one."); } else { root.put("ipv4", node.getDn42Ip4()); - root.put("ipv6", node.getDn42Ip6()); + try { + if(peer.isIPv6LinkLocal()) { + root.put("ipv6", node.getDn42Ip6()); + } else { + root.put("ipv6", node.getDn42Ip6NonLL()); + } + } catch (IOException e) { + return Future.failedFuture(e); + } root.put("asn", node.getAsn()); root.put("endpoint", node.getPublicIp()); } @@ -915,8 +923,24 @@ public class ManageHandler implements ISubRouter { // Check if we can reload on the fly. // Otherwise, we can only deprovision and provision. // This will cause unnecessary wastes. - final boolean canReload = inPeer.getType() == existingPeer.getType() && + boolean canReload = inPeer.getType() == existingPeer.getType() && inPeer.getNode() == existingPeer.getNode(); + // wg-quick does not support switching local IP addresses. + // However, switch between link local addresses and real IPv6 addresses require the change of + // local v6 address. Therefore, in such cases, we have to do a full re-provision. + if(canReload && // Only check if no other factors prevent us from reloading. + inPeer.getType() == Peer.VPNType.WIREGUARD && + existingPeer.getType() == Peer.VPNType.WIREGUARD) { + try { + final boolean existingLL = existingPeer.isIPv6LinkLocal(); + final boolean newLL = inPeer.isIPv6LinkLocal(); + if(existingLL != newLL) { + canReload = false; + } + } catch (IOException e) { + return Future.failedFuture(e); + } + } Future<Void> future; if (canReload) { future = Future.<Node>future(f -> nodeService.getNode(inPeer.getNode(), f)) diff --git a/central/src/main/java/moe/yuuta/dn42peering/node/Node.java b/central/src/main/java/moe/yuuta/dn42peering/node/Node.java index 31c0be2..5135947 100644 --- a/central/src/main/java/moe/yuuta/dn42peering/node/Node.java +++ b/central/src/main/java/moe/yuuta/dn42peering/node/Node.java @@ -37,6 +37,10 @@ public class Node { @TemplateParameter(name = "dn42_ip6") private String dn42Ip6; + @Column(name = "dn42_ip6_nonll") + @TemplateParameter(name = "dn42_ip6_nonll") + private String dn42Ip6NonLL; + @Column(name = "asn") @TemplateParameter(name = "asn") private String asn; @@ -68,6 +72,7 @@ public class Node { this.publicIp = object.getString("public_ip"); this.dn42Ip4 = object.getString("dn42_ip4"); this.dn42Ip6 = object.getString("dn42_ip6"); + this.dn42Ip6NonLL = object.getString("dn42_ip6_nonll"); this.asn = object.getString("asn"); this.internalIp = object.getString("internal_ip"); this.internalPort = object.getInteger("internal_port"); @@ -83,6 +88,7 @@ public class Node { .put("public_ip", publicIp) .put("dn42_ip4", dn42Ip4) .put("dn42_ip6", dn42Ip6) + .put("dn42_ip6_nonll", dn42Ip6NonLL) .put("asn", asn) .put("internal_ip", internalIp) .put("internal_port", internalPort) @@ -106,6 +112,7 @@ public class Node { .setId(id) .setIpv4(dn42Ip4) .setIpv6(dn42Ip6) + .setIpv6NonLL(dn42Ip6NonLL) .build(); } @@ -151,6 +158,14 @@ public class Node { this.dn42Ip6 = dn42Ip6; } + public String getDn42Ip6NonLL() { + return dn42Ip6NonLL; + } + + public void setDn42Ip6NonLL(String dn42Ip6NonLL) { + this.dn42Ip6NonLL = dn42Ip6NonLL; + } + public String getAsn() { return asn; } diff --git a/central/src/main/java/moe/yuuta/dn42peering/node/NodeServiceImpl.java b/central/src/main/java/moe/yuuta/dn42peering/node/NodeServiceImpl.java index 37d3036..cdcabf3 100644 --- a/central/src/main/java/moe/yuuta/dn42peering/node/NodeServiceImpl.java +++ b/central/src/main/java/moe/yuuta/dn42peering/node/NodeServiceImpl.java @@ -25,7 +25,7 @@ class NodeServiceImpl implements INodeService { @Override public INodeService listNodes(@Nonnull Handler<AsyncResult<List<Node>>> handler) { SqlTemplate - .forQuery(pool, "SELECT id, public_ip, dn42_ip4, dn42_ip6, asn, " + + .forQuery(pool, "SELECT id, public_ip, dn42_ip4, dn42_ip6, dn42_ip6_nonll, asn, " + "internal_ip, internal_port, name, notice, vpn_type_wg " + "FROM node") .mapTo(NodeRowMapper.INSTANCE) @@ -45,7 +45,7 @@ class NodeServiceImpl implements INodeService { public INodeService getNode(int id, @Nonnull Handler<AsyncResult<Node>> handler) { SqlTemplate .forQuery(pool, "SELECT id, public_ip, asn, " + - "dn42_ip4, dn42_ip6, " + + "dn42_ip4, dn42_ip6, dn42_ip6_nonll, " + "internal_ip, internal_port, name, notice, vpn_type_wg " + "FROM node " + "WHERE id = #{id}") |