[mio] 适配新版vnt,增加jni java端代码
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
package top.wherewego.vnt.jni;
|
||||
|
||||
import top.wherewego.vnt.jni.param.*;
|
||||
|
||||
/**
|
||||
* 回调
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public interface CallBack {
|
||||
/**
|
||||
* 创建虚拟网卡成功的回调方法
|
||||
*
|
||||
* @param info 网卡信息
|
||||
*/
|
||||
void createTun(DeviceInfo info);
|
||||
|
||||
/**
|
||||
* 连接服务端
|
||||
*
|
||||
* @param info 将要连接的服务端信息
|
||||
*/
|
||||
void connect(ConnectInfo info);
|
||||
|
||||
/**
|
||||
* 和服务端握手
|
||||
*
|
||||
* @param info 握手信息
|
||||
* @return 是否确认握手
|
||||
*/
|
||||
boolean handshake(HandshakeInfo info);
|
||||
|
||||
/**
|
||||
* 注册成功回调
|
||||
*
|
||||
* @param info 注册信息
|
||||
* @return 是否确认注册信息
|
||||
*/
|
||||
boolean register(RegisterInfo info);
|
||||
|
||||
/**
|
||||
* 异常回调
|
||||
*
|
||||
* @param info 错误信息
|
||||
*/
|
||||
void error(ErrorInfo info);
|
||||
|
||||
/**
|
||||
* 服务停止
|
||||
*/
|
||||
void stop();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,264 @@
|
||||
package top.wherewego.vnt.jni;
|
||||
|
||||
/**
|
||||
* 启动配置
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class Config {
|
||||
/**
|
||||
* 是否是tap模式,仅支持windows和linux
|
||||
*/
|
||||
private boolean tap;
|
||||
/**
|
||||
* 组网标识
|
||||
*/
|
||||
private String token;
|
||||
/**
|
||||
* 设备名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 客户端间加密的密码
|
||||
*/
|
||||
private String password;
|
||||
/**
|
||||
* 客户端间加密模式 aes_gcm/aes_cbc/aes_ecb/sm4_cbc
|
||||
*/
|
||||
private String cipherModel;
|
||||
/**
|
||||
* 打洞模式 ipv4/ipv6/all
|
||||
*/
|
||||
private String punchModel;
|
||||
/**
|
||||
* mtu 默认自动计算
|
||||
*/
|
||||
private Integer mtu;
|
||||
/**
|
||||
* 是否开启服务端加密
|
||||
*/
|
||||
private boolean serverEncrypt;
|
||||
/**
|
||||
* 仅使用中继转发
|
||||
*/
|
||||
private boolean relay;
|
||||
/**
|
||||
* 设备id,请使用唯一值
|
||||
*/
|
||||
private String deviceId;
|
||||
/**
|
||||
* 服务端地址
|
||||
*/
|
||||
private String server;
|
||||
/**
|
||||
* stun服务地址
|
||||
*/
|
||||
private String[] stunServer;
|
||||
/**
|
||||
* 和服务端使用tcp通信,默认使用udp
|
||||
*/
|
||||
private boolean tcp;
|
||||
/**
|
||||
* 指定组网IP
|
||||
*/
|
||||
private String ip;
|
||||
/**
|
||||
* 开启加密指纹校验
|
||||
*/
|
||||
private boolean finger;
|
||||
/**
|
||||
* 延迟优先,默认p2p优先
|
||||
*/
|
||||
private boolean firstLatency;
|
||||
/**
|
||||
* 点对网入口 格式 192.168.0.0/26,10.26.0.2
|
||||
*/
|
||||
private String[] inIps;
|
||||
/**
|
||||
* 点对网出口 格式 192.168.0.0/26
|
||||
*/
|
||||
private String[] outIps;
|
||||
/**
|
||||
* 端口组,udp会监听一组端口,tcp监听ports[0]端口
|
||||
*/
|
||||
private int[] ports;
|
||||
/**
|
||||
* 虚拟网卡名称 仅在linux、windows、macos上支持
|
||||
*/
|
||||
private String deviceName;
|
||||
/**
|
||||
* 虚拟网卡fd 仅在android上支持
|
||||
*/
|
||||
private int deviceFd;
|
||||
|
||||
public Config() {
|
||||
}
|
||||
|
||||
public boolean isTap() {
|
||||
return tap;
|
||||
}
|
||||
|
||||
public void setTap(boolean tap) {
|
||||
this.tap = tap;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public void setToken(String token) {
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public String getCipherModel() {
|
||||
return cipherModel;
|
||||
}
|
||||
|
||||
public void setCipherModel(String cipherModel) {
|
||||
this.cipherModel = cipherModel;
|
||||
}
|
||||
|
||||
public String getPunchModel() {
|
||||
return punchModel;
|
||||
}
|
||||
|
||||
public void setPunchModel(String punchModel) {
|
||||
this.punchModel = punchModel;
|
||||
}
|
||||
|
||||
public Integer getMtu() {
|
||||
return mtu;
|
||||
}
|
||||
|
||||
public void setMtu(Integer mtu) {
|
||||
this.mtu = mtu;
|
||||
}
|
||||
|
||||
public boolean isServerEncrypt() {
|
||||
return serverEncrypt;
|
||||
}
|
||||
|
||||
public void setServerEncrypt(boolean serverEncrypt) {
|
||||
this.serverEncrypt = serverEncrypt;
|
||||
}
|
||||
|
||||
public boolean isRelay() {
|
||||
return relay;
|
||||
}
|
||||
|
||||
public void setRelay(boolean relay) {
|
||||
this.relay = relay;
|
||||
}
|
||||
|
||||
public String getDeviceId() {
|
||||
return deviceId;
|
||||
}
|
||||
|
||||
public void setDeviceId(String deviceId) {
|
||||
this.deviceId = deviceId;
|
||||
}
|
||||
|
||||
public String getServer() {
|
||||
return server;
|
||||
}
|
||||
|
||||
public void setServer(String server) {
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
public String[] getStunServer() {
|
||||
return stunServer;
|
||||
}
|
||||
|
||||
public void setStunServer(String[] stunServer) {
|
||||
this.stunServer = stunServer;
|
||||
}
|
||||
|
||||
public boolean isTcp() {
|
||||
return tcp;
|
||||
}
|
||||
|
||||
public void setTcp(boolean tcp) {
|
||||
this.tcp = tcp;
|
||||
}
|
||||
|
||||
public String getIp() {
|
||||
return ip;
|
||||
}
|
||||
|
||||
public void setIp(String ip) {
|
||||
this.ip = ip;
|
||||
}
|
||||
|
||||
public boolean isFinger() {
|
||||
return finger;
|
||||
}
|
||||
|
||||
public void setFinger(boolean finger) {
|
||||
this.finger = finger;
|
||||
}
|
||||
|
||||
public boolean isFirstLatency() {
|
||||
return firstLatency;
|
||||
}
|
||||
|
||||
public void setFirstLatency(boolean firstLatency) {
|
||||
this.firstLatency = firstLatency;
|
||||
}
|
||||
|
||||
public String[] getInIps() {
|
||||
return inIps;
|
||||
}
|
||||
|
||||
public void setInIps(String[] inIps) {
|
||||
this.inIps = inIps;
|
||||
}
|
||||
|
||||
public String[] getOutIps() {
|
||||
return outIps;
|
||||
}
|
||||
|
||||
public void setOutIps(String[] outIps) {
|
||||
this.outIps = outIps;
|
||||
}
|
||||
|
||||
public int[] getPorts() {
|
||||
return ports;
|
||||
}
|
||||
|
||||
public void setPorts(int[] ports) {
|
||||
this.ports = ports;
|
||||
}
|
||||
|
||||
public String getDeviceName() {
|
||||
return deviceName;
|
||||
}
|
||||
|
||||
public void setDeviceName(String deviceName) {
|
||||
this.deviceName = deviceName;
|
||||
}
|
||||
|
||||
public int getDeviceFd() {
|
||||
return deviceFd;
|
||||
}
|
||||
|
||||
public void setDeviceFd(int deviceFd) {
|
||||
this.deviceFd = deviceFd;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package top.wherewego.vnt.jni;
|
||||
|
||||
/**
|
||||
* @author lubeilin
|
||||
* @date: 2024/02/27 18:31
|
||||
*/
|
||||
public class IpUtils {
|
||||
public static String intToIpAddress(int ipAddress) {
|
||||
|
||||
return ((ipAddress & 0xFF000000) >>> 24) + "." +
|
||||
((ipAddress & 0x00FF0000) >>> 16) + "." +
|
||||
((ipAddress & 0x0000FF00) >>> 8) + "." +
|
||||
(ipAddress & 0x000000FF);
|
||||
}
|
||||
public static int subnetMaskToPrefixLength(int subnetMask) {
|
||||
int prefixLength = 0;
|
||||
int bit = 1 << 31;
|
||||
|
||||
while (subnetMask != 0) {
|
||||
if ((subnetMask & bit) != bit) {
|
||||
break;
|
||||
}
|
||||
prefixLength++;
|
||||
subnetMask <<= 1;
|
||||
}
|
||||
|
||||
return prefixLength;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package top.wherewego.vnt.jni;
|
||||
|
||||
/**
|
||||
* 对端设备信息
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class PeerDeviceInfo {
|
||||
private final int virtualIp;
|
||||
private final String name;
|
||||
private final String status;
|
||||
private final Route route;
|
||||
|
||||
public PeerDeviceInfo(int virtualIp, String name, String status, Route route) {
|
||||
this.virtualIp = virtualIp;
|
||||
this.name = name;
|
||||
this.status = status;
|
||||
this.route = route;
|
||||
}
|
||||
|
||||
public int getVirtualIp() {
|
||||
return virtualIp;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public Route getRoute() {
|
||||
return route;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PeerDeviceInfo{" +
|
||||
"virtualIp=" + IpUtils.intToIpAddress(virtualIp) +
|
||||
", name='" + name + '\'' +
|
||||
", status='" + status + '\'' +
|
||||
", route=" + route +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package top.wherewego.vnt.jni;
|
||||
|
||||
/**
|
||||
* 路由信息
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class Route {
|
||||
private final String address;
|
||||
private final byte metric;
|
||||
private final int rt;
|
||||
|
||||
public Route(String address, byte metric, int rt) {
|
||||
this.address = address;
|
||||
this.metric = metric;
|
||||
this.rt = rt;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public byte getMetric() {
|
||||
return metric;
|
||||
}
|
||||
|
||||
public int getRt() {
|
||||
return rt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Route{" +
|
||||
"address='" + address + '\'' +
|
||||
", metric=" + metric +
|
||||
", rt=" + rt +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package top.wherewego.vnt.jni;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* vnt的Java映射
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class Vnt implements Closeable {
|
||||
private final long raw;
|
||||
|
||||
public Vnt(Config config, CallBack callBack) {
|
||||
this.raw = new0(config, callBack);
|
||||
if(this.raw == 0){
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
stop0(raw);
|
||||
}
|
||||
|
||||
public void await() {
|
||||
wait0(raw);
|
||||
}
|
||||
|
||||
public PeerDeviceInfo[] list() {
|
||||
return list0(raw);
|
||||
}
|
||||
|
||||
private native long new0(Config config, CallBack callBack);
|
||||
|
||||
private native void stop0(long raw);
|
||||
|
||||
private native void wait0(long raw);
|
||||
|
||||
private native void drop0(long raw);
|
||||
|
||||
private native PeerDeviceInfo[] list0(long raw);
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
drop0(raw);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package top.wherewego.vnt.jni.param;
|
||||
|
||||
/**
|
||||
* 连接信息
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class ConnectInfo {
|
||||
private final long count;
|
||||
private final String address;
|
||||
|
||||
public ConnectInfo(long count, String address) {
|
||||
this.count = count;
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public long getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ConnectInfo{" +
|
||||
"count=" + count +
|
||||
", address='" + address + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package top.wherewego.vnt.jni.param;
|
||||
|
||||
/**
|
||||
* 网卡信息
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class DeviceInfo {
|
||||
/**
|
||||
* 虚拟网卡名称
|
||||
*/
|
||||
private final String name;
|
||||
/**
|
||||
* 虚拟网卡版本
|
||||
*/
|
||||
private final String version;
|
||||
|
||||
public DeviceInfo(String name, String version) {
|
||||
this.name = name;
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "DeviceInfo{" +
|
||||
"name='" + name + '\'' +
|
||||
", version='" + version + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package top.wherewego.vnt.jni.param;
|
||||
|
||||
/**
|
||||
* 异常回调信息
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class ErrorInfo {
|
||||
/**
|
||||
* 错误码
|
||||
*/
|
||||
public final ErrorCodeEnum code;
|
||||
/**
|
||||
* 错误信息,可能为空
|
||||
*/
|
||||
public final String msg;
|
||||
|
||||
public ErrorInfo(int code, String msg) {
|
||||
this.code = switch (code) {
|
||||
case 1 -> ErrorCodeEnum.TokenError;
|
||||
case 2 -> ErrorCodeEnum.Disconnect;
|
||||
case 3 -> ErrorCodeEnum.AddressExhausted;
|
||||
case 4 -> ErrorCodeEnum.IpAlreadyExists;
|
||||
case 5 -> ErrorCodeEnum.InvalidIp;
|
||||
case 6 -> ErrorCodeEnum.Unknown;
|
||||
default -> null;
|
||||
};
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public ErrorCodeEnum getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
public enum ErrorCodeEnum {
|
||||
TokenError,
|
||||
Disconnect,
|
||||
AddressExhausted,
|
||||
IpAlreadyExists,
|
||||
InvalidIp,
|
||||
Unknown,
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ErrorInfo{" +
|
||||
"code=" + code +
|
||||
", msg='" + msg + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package top.wherewego.vnt.jni.param;
|
||||
|
||||
/**
|
||||
* 握手回调信息
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class HandshakeInfo {
|
||||
/**
|
||||
* 公钥 pem格式 CRLF分隔,不加密时为空
|
||||
*/
|
||||
private final String publicKey;
|
||||
/**
|
||||
* 公钥签名,不加密时为空
|
||||
*/
|
||||
private final String finger;
|
||||
/**
|
||||
* 服务端版本
|
||||
*/
|
||||
private final String version;
|
||||
|
||||
public HandshakeInfo() {
|
||||
this.publicKey = "publicKey";
|
||||
this.finger = "finger";
|
||||
this.version = "version";
|
||||
}
|
||||
|
||||
public HandshakeInfo(String publicKey, String finger, String version) {
|
||||
this.publicKey = publicKey;
|
||||
this.finger = finger;
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getPublicKey() {
|
||||
return publicKey;
|
||||
}
|
||||
|
||||
public String getFinger() {
|
||||
return finger;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HandshakeInfo{" +
|
||||
"publicKey='" + publicKey + '\'' +
|
||||
", finger='" + finger + '\'' +
|
||||
", version='" + version + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package top.wherewego.vnt.jni.param;
|
||||
|
||||
/**
|
||||
* 注册回调信息
|
||||
*
|
||||
* @author https://github.com/lbl8603/vnt
|
||||
*/
|
||||
public class RegisterInfo {
|
||||
/**
|
||||
* 虚拟IP
|
||||
*/
|
||||
public final String virtualIp;
|
||||
/**
|
||||
* 掩码
|
||||
*/
|
||||
public final String virtualNetmask;
|
||||
/**
|
||||
* 网关
|
||||
*/
|
||||
public final String virtualGateway;
|
||||
|
||||
public RegisterInfo(String virtualIp, String virtualNetmask, String virtualGateway) {
|
||||
this.virtualIp = virtualIp;
|
||||
this.virtualNetmask = virtualNetmask;
|
||||
this.virtualGateway = virtualGateway;
|
||||
}
|
||||
|
||||
public String getVirtualIp() {
|
||||
return virtualIp;
|
||||
}
|
||||
|
||||
public String getVirtualNetmask() {
|
||||
return virtualNetmask;
|
||||
}
|
||||
|
||||
public String getVirtualGateway() {
|
||||
return virtualGateway;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "RegisterInfo{" +
|
||||
"virtualIp='" + virtualIp + '\'' +
|
||||
", virtualNetmask='" + virtualNetmask + '\'' +
|
||||
", virtualGateway='" + virtualGateway + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user