aboutsummaryrefslogtreecommitdiff
path: root/central
diff options
context:
space:
mode:
authorTrumeet <17158086+Trumeet@users.noreply.github.com>2021-01-16 16:04:50 -0800
committerTrumeet <17158086+Trumeet@users.noreply.github.com>2021-01-16 16:04:50 -0800
commit8c71583e0633714c01def657228af9b0d47c68df (patch)
tree480489cdd737af1c4cdc7aee4931063640b5c18f /central
parent5dd680f20f286f243427c39d432e4cc67e194445 (diff)
downloaddn42peering-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')
-rw-r--r--central/src/main/java/moe/yuuta/dn42peering/manage/ManageHandler.java28
-rw-r--r--central/src/main/java/moe/yuuta/dn42peering/node/Node.java15
-rw-r--r--central/src/main/java/moe/yuuta/dn42peering/node/NodeServiceImpl.java4
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}")