forked from KNEMC/KLALB
KLALB 3.6.0开发一半的状态
This commit is contained in:
+2
-2
@@ -1,9 +1,9 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public interface BindableKLALBPacketConsumer extends PacketConsumer {
|
||||
public interface BindableConsumer<T> extends Consumer<T> {
|
||||
public InetAddress getRemoteInetAddress() ;
|
||||
public InetAddress getLocalInetAddress() ;
|
||||
public int getPort() ;
|
||||
@@ -18,4 +18,6 @@ public class CONST {
|
||||
public static final int linepanelheight = 41;
|
||||
public static final int settingheight = 30;
|
||||
public static final int dialwidth = 150;
|
||||
public static final int windowwidth = 1200;
|
||||
public static final int windowheight = 800;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.nio.ByteBuffer;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.kne.cloud.network.NetworkPacket;
|
||||
|
||||
@@ -101,7 +102,16 @@ public class DATATPacket extends KLALBPacket implements PortPacket{
|
||||
public int getSize() {
|
||||
return dataBuffer.limit();
|
||||
}
|
||||
private int sendCounter=0;
|
||||
|
||||
public int getSendCounter() {
|
||||
return sendCounter;
|
||||
}
|
||||
|
||||
public void incSendCounter() {
|
||||
sendCounter++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
klalbHeader.put(17, (byte) getSendCounter());
|
||||
@@ -126,6 +136,6 @@ public class DATATPacket extends KLALBPacket implements PortPacket{
|
||||
}
|
||||
dataBuffer.flip();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -7,42 +7,30 @@ import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.NoRouteToHostException;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.kne.cloud.clock.AdjustedNanoClock;
|
||||
import org.kne.cloud.clock.HighAccuracyClock;
|
||||
import org.kne.cloud.network.IPMulticastDiscovery;
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
@@ -50,41 +38,27 @@ import org.kne.cloud.network.PortPair;
|
||||
import org.kne.cloud.network.SocketType;
|
||||
import org.kne.cloud.network.ThreadTool;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6ExtHeader;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload;
|
||||
import org.kne.cloud.network.ipv6.IPv6TUNLoopbackNetworkLink;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink;
|
||||
import org.kne.cloud.network.ipv6.Neighbor;
|
||||
import org.kne.cloud.network.ipv6.PacketID;
|
||||
import org.kne.cloud.network.kltp.KLTPPacket;
|
||||
import org.kne.cloud.network.kltp.KLTPProtocolRegister;
|
||||
import org.kne.cloud.network.monitor.HashMapTimestampMonitor;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl;
|
||||
import org.kne.cloud.network.monitor.TimestampMonitor;
|
||||
import org.kne.cloud.network.ntp.NTPContext;
|
||||
import org.kne.cloud.network.ntp.NTPv4Packet;
|
||||
import org.kne.cloud.network.ntp.NTPv4Protocol;
|
||||
import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer;
|
||||
import org.kne.cloud.network.srv6.JsonDataPacket;
|
||||
import org.kne.cloud.network.srv6.KLALBRoutingProtocol;
|
||||
import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIClient;
|
||||
import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIServer;
|
||||
import org.kne.cloud.network.srv6.KLALBRoutingProtocolJsonData;
|
||||
import org.kne.cloud.network.srv6.PacketConsumer;
|
||||
import org.kne.cloud.network.srv6.SRv6Router;
|
||||
import org.kne.cloud.network.srv6.SRv6RouterListener;
|
||||
import org.kne.cloud.network.tcp.UDPPacket;
|
||||
import org.kne.cloud.network.tcp.UDPProtocolRegister;
|
||||
import org.kne.cloud.network.te.BandwidthDistributer;
|
||||
import org.kne.cloud.network.te.DWRRLoadingBalanceAlgorithm;
|
||||
import org.kne.concurrent.DisruptorExecutor;
|
||||
import org.kne.concurrent.HighPerformanceExecutor;
|
||||
import org.kne.io.KNEChannels;
|
||||
import org.pcap4j.packet.IpV6Packet.IpV6Header;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
|
||||
public class KLALBController {
|
||||
private UUID nodeuuid=UUID.randomUUID();
|
||||
@@ -93,14 +67,14 @@ public class KLALBController {
|
||||
public HighAccuracyClock getClock() {
|
||||
return clock;
|
||||
}
|
||||
|
||||
private final long TIME_WINDOW=5000000000L;
|
||||
private SpeedAndTrafficMonitorDataImpl linkMonitor = new SpeedAndTrafficMonitorDataImpl(
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "up", 100, 500000000L),
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, 500000000L));
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "up", 100,TIME_WINDOW ),
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, TIME_WINDOW));
|
||||
|
||||
private SpeedAndTrafficMonitorDataImpl datatMonitor = new SpeedAndTrafficMonitorDataImpl(
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "up", 100, 500000000L),
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, 500000000L));
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "up", 100, TIME_WINDOW),
|
||||
new HashMapTimestampMonitor<UUID>(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, TIME_WINDOW));
|
||||
|
||||
private List<MultipurposeSocketAddress> selflineTable = new ArrayList<>();
|
||||
|
||||
@@ -123,6 +97,17 @@ public class KLALBController {
|
||||
public List<InetAddress> getDnsAddresses() {
|
||||
return dnsAddresses;
|
||||
}
|
||||
private ScheduledExecutorService scheduleTimer=Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(),new ThreadFactory() {
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return ThreadTool.makeVDaemonThreadIfSupport("计时器线程", r);
|
||||
}
|
||||
});
|
||||
|
||||
public ScheduledExecutorService getScheduleTimer() {
|
||||
return scheduleTimer;
|
||||
}
|
||||
|
||||
private Timer twk = new Timer("网卡检测扫描计时器", true);
|
||||
|
||||
@@ -193,8 +178,8 @@ public class KLALBController {
|
||||
Set<MultipurposeSocketAddress> st = new HashSet<>();
|
||||
for (Iterator<IPv6NetworkLink> iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link = iterator.next();
|
||||
if (link instanceof KLALBRemoteLine) {
|
||||
KLALBRemoteLine multipurposeSocketAddress = (KLALBRemoteLine) link;
|
||||
if (link instanceof KLALBRemoteLink) {
|
||||
KLALBRemoteLink multipurposeSocketAddress = (KLALBRemoteLink) link;
|
||||
if (multipurposeSocketAddress.getSocketAddress() != null)
|
||||
st.add(multipurposeSocketAddress.getSocketAddress());
|
||||
}
|
||||
@@ -206,8 +191,8 @@ public class KLALBController {
|
||||
}
|
||||
for (Iterator<IPv6NetworkLink> iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link = iterator.next();
|
||||
if (link instanceof KLALBRemoteLine) {
|
||||
KLALBRemoteLine reml = (KLALBRemoteLine) link;
|
||||
if (link instanceof KLALBRemoteLink) {
|
||||
KLALBRemoteLink reml = (KLALBRemoteLink) link;
|
||||
if (reml.getSocketAddress() != null) {
|
||||
if (reml.getBindAddress() != null || reml.getRemoteVaddr() != null)
|
||||
try {
|
||||
@@ -237,6 +222,8 @@ public class KLALBController {
|
||||
|
||||
updateBroadcastNetworkInterface();
|
||||
} catch (SocketException e) {
|
||||
}catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -448,21 +435,11 @@ public class KLALBController {
|
||||
return datagramSocketType;
|
||||
}
|
||||
|
||||
// private Supplier<String> selflineTableSupplier=()->{return null;};
|
||||
|
||||
/*
|
||||
* public Supplier<String> getSelflineTableSupplier() { return
|
||||
* selflineTableSupplier; }
|
||||
*
|
||||
* public void setSelflineTableSupplier(Supplier<String> selflineTableSupplier)
|
||||
* { this.selflineTableSupplier = selflineTableSupplier; }
|
||||
*/
|
||||
|
||||
public List<MultipurposeSocketAddress> getSelflineTable() {
|
||||
return selflineTable;
|
||||
}
|
||||
|
||||
// private Inet6AddressGroup self;
|
||||
|
||||
public IPv6AddressGroup getSelf() {
|
||||
return srv6Router.getLocator();
|
||||
@@ -474,30 +451,14 @@ public class KLALBController {
|
||||
return srv6Router.getLinkTabel();
|
||||
}
|
||||
|
||||
private PortBinder streamPortBinder = new PortBinder(this);
|
||||
|
||||
private PortBinder datagramPortBinder = new PortBinder(this);
|
||||
|
||||
private PortBinder rawPortBinder = new PortBinder(this);
|
||||
|
||||
protected PortBinder getStreamPortBinder() {
|
||||
return streamPortBinder;
|
||||
}
|
||||
|
||||
protected PortBinder getDatagramPortBinder() {
|
||||
return datagramPortBinder;
|
||||
}
|
||||
|
||||
protected PortBinder getRawPortBinder() {
|
||||
return rawPortBinder;
|
||||
}
|
||||
|
||||
public void reconnectImmediately() {
|
||||
for (Iterator<IPv6NetworkLink> iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink val = iterator.next();
|
||||
if (val instanceof KLALBRemoteLine) {
|
||||
if (val instanceof KLALBRemoteLink) {
|
||||
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) val;
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) val;
|
||||
klalbRemoteLine.reconnectImmediately();
|
||||
}
|
||||
}
|
||||
@@ -510,34 +471,17 @@ public class KLALBController {
|
||||
private KLALBRoutingProtocolAPIClient apiClient;
|
||||
|
||||
private KLALBControllerConfigItem configItem;
|
||||
|
||||
/*
|
||||
* private PacketReceiver prc = new PacketReceiver(); private class
|
||||
* PacketReceiver implements Consumer<KLALBPacket> {
|
||||
*
|
||||
* @Override public void accept(KLALBPacket rec) { switch (rec.getType()) { case
|
||||
* KLALBPacket.ADDLINES: ADDLINESPacket lpt = (ADDLINESPacket) rec; String s =
|
||||
* lpt.getLines(); ThreadTool.makeVDaemonThreadIfSupport("线路添加任务", () -> {
|
||||
* Scanner scn = new Scanner(s); while (scn.hasNext()) { String sn =
|
||||
* scn.nextLine(); MultipurposeSocketAddress msa = new
|
||||
* MultipurposeSocketAddress(sn); addRemoteLines(msa);
|
||||
*
|
||||
* } }).start(); break; default: break;
|
||||
*
|
||||
* } }
|
||||
*
|
||||
* }
|
||||
*/
|
||||
|
||||
public void addRemoteLines(List<MultipurposeSocketAddress> select) {
|
||||
for (MultipurposeSocketAddress target : select) {
|
||||
addRemoteLines(target);
|
||||
}
|
||||
}
|
||||
|
||||
public List<KLALBRemoteLine> addRemoteLines(MultipurposeSocketAddress target) {
|
||||
public List<KLALBRemoteLink> addRemoteLines(MultipurposeSocketAddress target) {
|
||||
lineslock.writeLock().lock();
|
||||
try {
|
||||
List<KLALBRemoteLine> added = new ArrayList<>();
|
||||
List<KLALBRemoteLink> added = new ArrayList<>();
|
||||
try {
|
||||
Enumeration<NetworkInterface> eu = NetworkInterface.getNetworkInterfaces();
|
||||
while (eu.hasMoreElements()) {
|
||||
@@ -583,7 +527,7 @@ public class KLALBController {
|
||||
count=1;
|
||||
}
|
||||
for(int i=0;i<count;i++) {
|
||||
KLALBRemoteLine line = new KLALBRemoteLine(this, target, bind);
|
||||
KLALBRemoteLink line = new KLALBRemoteLink(this, target, bind);
|
||||
addRemoteLine(line);
|
||||
added.add(line);
|
||||
}
|
||||
@@ -596,7 +540,7 @@ public class KLALBController {
|
||||
}
|
||||
} catch (SocketException e) {
|
||||
if (!checkContainsTarget(target)) {
|
||||
KLALBRemoteLine line = new KLALBRemoteLine(this, target);
|
||||
KLALBRemoteLink line = new KLALBRemoteLink(this, target);
|
||||
addRemoteLine(line);
|
||||
added.add(line);
|
||||
}
|
||||
@@ -609,13 +553,13 @@ public class KLALBController {
|
||||
}
|
||||
}
|
||||
|
||||
public List<KLALBRemoteLine> removeRemoteLines(MultipurposeSocketAddress mpsa) {
|
||||
public List<KLALBRemoteLink> removeRemoteLines(MultipurposeSocketAddress mpsa) {
|
||||
|
||||
List<KLALBRemoteLine> rmved = new ArrayList<>();
|
||||
List<KLALBRemoteLink> rmved = new ArrayList<>();
|
||||
for (Iterator<IPv6NetworkLink> iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link = iterator.next();
|
||||
if (link instanceof KLALBRemoteLine) {
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
|
||||
if (link instanceof KLALBRemoteLink) {
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
|
||||
if (mpsa.equals(klalbRemoteLine.getSocketAddress())) {
|
||||
klalbRemoteLine.close();
|
||||
rmved.add(klalbRemoteLine);
|
||||
@@ -626,11 +570,11 @@ public class KLALBController {
|
||||
}
|
||||
|
||||
public Inet6Address getRemoteVaddrBySocketAddress(MultipurposeSocketAddress target) throws SocketTimeoutException {
|
||||
KLALBRemoteLine kr = null;
|
||||
KLALBRemoteLink kr = null;
|
||||
for (Iterator<IPv6NetworkLink> iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link = iterator.next();
|
||||
if (link instanceof KLALBRemoteLine) {
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
|
||||
if (link instanceof KLALBRemoteLink) {
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
|
||||
if (target.equals(klalbRemoteLine.getSocketAddress()) && klalbRemoteLine.getBindAddress() == null) {
|
||||
kr = klalbRemoteLine;
|
||||
break;
|
||||
@@ -639,7 +583,7 @@ public class KLALBController {
|
||||
}
|
||||
|
||||
if (kr == null) {
|
||||
kr = new KLALBRemoteLine(this, target);
|
||||
kr = new KLALBRemoteLink(this, target);
|
||||
addRemoteLine(kr);
|
||||
kr.waitForRemoteVaddrAvaliable(20000);
|
||||
} else {
|
||||
@@ -653,8 +597,8 @@ public class KLALBController {
|
||||
boolean b = false;
|
||||
for (Iterator<IPv6NetworkLink> iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link = iterator.next();
|
||||
if (link instanceof KLALBRemoteLine) {
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
|
||||
if (link instanceof KLALBRemoteLink) {
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
|
||||
if (bind.equals2(klalbRemoteLine.getBindAddress())
|
||||
&& target.equals2(klalbRemoteLine.getSocketAddress())) {
|
||||
b = true;
|
||||
@@ -669,8 +613,8 @@ public class KLALBController {
|
||||
boolean b = false;
|
||||
for (Iterator<IPv6NetworkLink> iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link = iterator.next();
|
||||
if (link instanceof KLALBRemoteLine) {
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
|
||||
if (link instanceof KLALBRemoteLink) {
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
|
||||
if (target.equals(klalbRemoteLine.getSocketAddress())) {
|
||||
b = true;
|
||||
break;
|
||||
@@ -680,12 +624,9 @@ public class KLALBController {
|
||||
return b;
|
||||
}
|
||||
|
||||
public void addRemoteLine(KLALBRemoteLine krs) {
|
||||
public void addRemoteLine(KLALBRemoteLink krs) {
|
||||
lineslock.writeLock().lock();
|
||||
try {
|
||||
krs.setLocalVaddrSupplier(() -> {
|
||||
return getSelf();
|
||||
});
|
||||
krs.startIO();
|
||||
String selflineTable = generateSelfLineTable();
|
||||
if (selflineTable != null && !selflineTable.equals(""))
|
||||
@@ -706,63 +647,26 @@ public class KLALBController {
|
||||
return sbd.toString();
|
||||
}
|
||||
|
||||
private class UDPProtocolPacketConsumer implements PacketConsumer {
|
||||
|
||||
@Override
|
||||
public boolean accept(IPv6Packet packx) throws IOException {
|
||||
|
||||
IPv6Payload pl = packx.getPayload();
|
||||
packx.putTimePassport("unpacked");
|
||||
packx.printPassport();
|
||||
if (pl instanceof UDPPacket) {
|
||||
UDPPacket rec = (UDPPacket) pl;
|
||||
if (showpacket)
|
||||
System.out.println("UDP_RX:" + rec);
|
||||
IPv6Address srcA = packx.getSourceAddress();
|
||||
PortPacket pt = (PortPacket) rec;
|
||||
if (datagramPortBinder.distributePacketToConsumer(srcA, pt)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
// packx.dispose();
|
||||
// });
|
||||
}
|
||||
|
||||
|
||||
|
||||
private UDPProtocolRegister udpr;
|
||||
public UDPProtocolRegister getUDPregister() {
|
||||
return udpr;
|
||||
}
|
||||
|
||||
private KLTPProtocolRegister kltpr;
|
||||
public KLTPProtocolRegister getKLTPregister() {
|
||||
return kltpr;
|
||||
}
|
||||
|
||||
private class KLALBProtocolPacketConsumer implements PacketConsumer {
|
||||
|
||||
@Override
|
||||
public boolean accept(IPv6Packet packx) throws IOException {
|
||||
IPv6Payload pl = packx.getPayload();
|
||||
packx.putTimePassport("unpacked");
|
||||
packx.printPassport();
|
||||
if (pl instanceof KLALBPacket) {
|
||||
KLALBPacket rec = (KLALBPacket) pl;
|
||||
if (showpacket)
|
||||
System.out.println("KLALB_RX:" + rec);
|
||||
if (rec instanceof PortPacket) {
|
||||
rec.setCE(packx.isCE());
|
||||
IPv6Address srcA = packx.getSourceAddress();
|
||||
PortPacket pt = (PortPacket) rec;
|
||||
if (streamPortBinder.distributePacketToConsumer(srcA, pt)) {
|
||||
} else {
|
||||
if (!(pt instanceof RSTPacket)) {
|
||||
srv6Router.enqueuePacketSendTask(() -> {
|
||||
return createPacketToAddress(srcA, 0, new RSTPacket(pt.getDstPort(), pt.getSrcPort()),
|
||||
2);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
// packx.dispose();
|
||||
}
|
||||
private PortBinder rawPortBinder ;
|
||||
|
||||
protected PortBinder getRawPortBinder() {
|
||||
return rawPortBinder;
|
||||
}
|
||||
|
||||
|
||||
private void loadSRv6ProtocolStack(IPv6AddressGroup selfx, boolean enableVirtualAdapter) {
|
||||
srv6Router = new SRv6Router(selfx, clock);
|
||||
srv6Router.runKLALBRouteProtocol();
|
||||
@@ -770,11 +674,12 @@ public class KLALBController {
|
||||
routingProtocol.addReceiver((addr, packet) -> {
|
||||
|
||||
});
|
||||
|
||||
rawPortBinder= new PortBinder(this.getSelf().getAddress());
|
||||
System.out.println(" Loaded: SRv6 Stack");
|
||||
|
||||
String name=(configItem!=null)?configItem.getTUNName():CONST.KLALB_S_RV6;
|
||||
if (enableVirtualAdapter&&(name!=null)) {
|
||||
Thread t=new Thread(()->{
|
||||
try {
|
||||
IPv6TUNLoopbackNetworkLink tunlink = new IPv6TUNLoopbackNetworkLink(name,
|
||||
new IPv6AddressGroup(srv6Router.getLocator().getAddress(), 32), SRv6Router.MTU, dnsAddresses);
|
||||
@@ -787,18 +692,23 @@ public class KLALBController {
|
||||
System.err.println("挂载虚拟网卡失败,可能是无管理员权限?请尝试使用管理员权限运行软件");
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
t.start();
|
||||
}else {
|
||||
System.out.println(" Tun Adapter Disbaled");
|
||||
|
||||
}
|
||||
srv6Router.getinLoopback().getProtocolNumberRegister().put(UDPPacket.UDP_PROTOCOL_NUMBER,
|
||||
new UDPProtocolPacketConsumer());
|
||||
udpr=new UDPProtocolRegister(this);
|
||||
srv6Router.getinLoopback().getProtocolNumberRegister()[UDPPacket.UDP_PROTOCOL_NUMBER]=
|
||||
udpr;
|
||||
System.out.println(" Loaded: UDP Protocol");
|
||||
srv6Router.getinLoopback().getProtocolNumberRegister().put(KLALBPacket.KLALB_PROTOCOL_NUMBER,
|
||||
new KLALBProtocolPacketConsumer());
|
||||
System.out.println(" Loaded: KLALB Protocol");
|
||||
kltpr=new KLTPProtocolRegister(this);
|
||||
srv6Router.getinLoopback().getProtocolNumberRegister()[KLTPPacket.KLTP_PROTOCOL_NUMBER]=
|
||||
kltpr;
|
||||
System.out.println(" Loaded: KLTP Protocol");
|
||||
String iproxyname = "KLALB_" + UUID.randomUUID();
|
||||
registerToProxyTypeAs(iproxyname);
|
||||
System.out.println(" Loaded: KLALB Protocol");
|
||||
|
||||
NTPContext context = new NTPContext(clock);
|
||||
context.syncToSystem();
|
||||
@@ -812,7 +722,6 @@ public class KLALBController {
|
||||
public void onLinkChanged(SRv6Router router, IPv6NetworkLink link) {
|
||||
|
||||
List<Neighbor> nb = router.getNeighbors();
|
||||
// System.out.println("srv6 ip"+nb);
|
||||
Set<NTPPeer> sp = nvc.getPeers();
|
||||
for (Neighbor neighbor : nb) {
|
||||
if (neighbor.getLocator() != null)
|
||||
@@ -873,6 +782,17 @@ public class KLALBController {
|
||||
}
|
||||
|
||||
protected void initKLALB(boolean enableVirtualAdapter, IPv6AddressGroup selfg) {
|
||||
ThreadTool.makeVDaemonThread("线路性能采样线程", ()->{
|
||||
while(true) {
|
||||
linkMonitor.update();
|
||||
datatMonitor.update();
|
||||
try {
|
||||
Thread.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
loadSRv6ProtocolStack(selfg, enableVirtualAdapter);
|
||||
loadController();
|
||||
}
|
||||
@@ -973,7 +893,7 @@ public class KLALBController {
|
||||
public void run() {
|
||||
if (srv6Router != null) {
|
||||
srv6Router.getLinkTabel().removeIf((v) -> {
|
||||
return (v instanceof KLALBRemoteLine) && ((KLALBRemoteLine) v).isClosed();
|
||||
return (v instanceof KLALBRemoteLink) && ((KLALBRemoteLink) v).isClosed();
|
||||
});
|
||||
srv6Router.updateRouteTabel();
|
||||
}
|
||||
@@ -992,13 +912,12 @@ public class KLALBController {
|
||||
}, 10, 10);
|
||||
}
|
||||
|
||||
protected IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet) {
|
||||
public IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet) {
|
||||
return createPacketToAddress(addr, flowlabel, packet, 1);
|
||||
}
|
||||
|
||||
protected IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet,
|
||||
public IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet,
|
||||
int count) {
|
||||
// HighPerformanceExecutor.defaultExecutor.execute(() -> {
|
||||
|
||||
IPv6Packet ipv = new IPv6Packet();
|
||||
|
||||
@@ -1006,23 +925,17 @@ public class KLALBController {
|
||||
System.out.println("KLALB_TX:" + packet);
|
||||
|
||||
ipv.setVersion(6);
|
||||
ipv.setTrafficClass(0);
|
||||
ipv.setTrafficClass(0b10);
|
||||
ipv.setFlowLabel(flowlabel);
|
||||
ipv.setHopLimit(255);
|
||||
ipv.setSourceAddress(getSelf().getAddress());
|
||||
ipv.setDestinationAddress(addr);
|
||||
|
||||
ipv.enableECN();
|
||||
|
||||
ipv.setPayload(packet);
|
||||
packet.setParent(ipv);
|
||||
|
||||
if (packet instanceof KLALBPacket)
|
||||
((KLALBPacket) packet).incSendCounter();
|
||||
|
||||
|
||||
packet.putTimePassport("packedInIPv6");
|
||||
packet.printPassport();
|
||||
ipv.putTimePassport("packed");
|
||||
return ipv;
|
||||
}
|
||||
|
||||
@@ -1088,19 +1001,11 @@ public class KLALBController {
|
||||
|
||||
}
|
||||
|
||||
private Timer t = new Timer("数据包重传计时器", true);
|
||||
|
||||
|
||||
protected Timer getResendTimer() {
|
||||
return t;
|
||||
}
|
||||
|
||||
private Timer t2 = new Timer("数据包粘包计时器", true);
|
||||
|
||||
private List<MultipurposeSocketAddress> listens = new CopyOnWriteArrayList<>();
|
||||
|
||||
public Timer getNagleTimer() {
|
||||
return t2;
|
||||
}
|
||||
|
||||
public void registerToProxyTypeAs(String proxyname) {
|
||||
MultipurposeSocketAddress.getSocketTypeRegister().put(proxyname + "_Stream", streamSocketType);
|
||||
@@ -1117,34 +1022,15 @@ public class KLALBController {
|
||||
private KLALBRoutingProtocol routingProtocol;
|
||||
|
||||
public List<MultipurposeSocketAddress> getNTPTable() {
|
||||
return ntptable;// nvc2.getPeers().add(new NTPPeer("{UDP}106.55.184.199:123",
|
||||
// NTPv4Packet.NTP_CLIENT));
|
||||
return ntptable;
|
||||
}
|
||||
|
||||
public KLALBControllerConfigItem getConfigItem() {
|
||||
return configItem;
|
||||
}
|
||||
|
||||
/*
|
||||
* @Override public void listen(MultipurposeSocketAddress msa) { // TODO
|
||||
* 自动生成的方法存根
|
||||
*
|
||||
* }
|
||||
*
|
||||
* @Override public void unlisten(MultipurposeSocketAddress msc) { // TODO
|
||||
* 自动生成的方法存根
|
||||
*
|
||||
* }
|
||||
*
|
||||
* @Override public void connect(MultipurposeSocketAddress msa) { // TODO
|
||||
* 自动生成的方法存根
|
||||
*
|
||||
* }
|
||||
*
|
||||
* @Override public void unconnect(MultipurposeSocketAddress msc) { // TODO
|
||||
* 自动生成的方法存根
|
||||
*
|
||||
* }
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
public class KLALBControllerConfigItem extends KLALBConfigItem {
|
||||
private String language;
|
||||
private boolean nogui;
|
||||
@@ -26,6 +21,7 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
|
||||
private boolean denyLineTableQuery=false;
|
||||
private boolean denyLineTableBroadcast=false;
|
||||
private String congestionAlgorithm="BBR";
|
||||
private double burstLimit=1.20;
|
||||
private double delayUpperBound=1.20;
|
||||
private double delayLowerBound=1.15;
|
||||
private long nagleDelayTime=1000000L;
|
||||
@@ -205,6 +201,18 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public double getBurstLimit() {
|
||||
return burstLimit;
|
||||
}
|
||||
|
||||
|
||||
public void setBurstLimit(double burstLimit) {
|
||||
this.burstLimit = burstLimit;
|
||||
}
|
||||
|
||||
|
||||
public double getDelayUpperBound() {
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
import static org.kne.cloud.network.klalb.KLALBPacket.*;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.StreamCorruptedException;
|
||||
import java.net.Inet6Address;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
@@ -24,7 +20,7 @@ public class KLALBInputStream extends DataInputStream {
|
||||
readFully(b);
|
||||
String s=new String(b,"ascii");
|
||||
if(!s.equals("KLALB")) {
|
||||
throw new StreamCorruptedException("no KLALB format");
|
||||
throw new StreamCorruptedException("remote protocol is no KLALB format");
|
||||
}
|
||||
int bv=readInt();
|
||||
int mv=readInt();
|
||||
|
||||
@@ -4,7 +4,6 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.nio.channels.ServerSocketChannel;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
@@ -12,20 +11,17 @@ import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Scanner;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.SocketChannelListener;
|
||||
import org.kne.cloud.network.SocketListener;
|
||||
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
|
||||
import org.kne.cloud.network.ipv6.RouteItem;
|
||||
import org.kne.cloud.network.klalb.ui.KLALBStateGUI3;
|
||||
import org.kne.cloud.network.klalb.ui.UIEnv;
|
||||
import org.kne.cloud.network.perf.Kperf;
|
||||
import org.kne.cloud.network.perf.NodeBenchmark;
|
||||
import org.kne.debug.Debuger;
|
||||
import org.kne.debug.TimeDebugger;
|
||||
import org.kne.membandboost.MembandBenchmark;
|
||||
import org.kne.membandboost.ObjectPoolBandwidthTest;
|
||||
|
||||
public class KLALBMain {
|
||||
public static KLALBStateGUI3 ksg;
|
||||
@@ -90,8 +86,9 @@ public class KLALBMain {
|
||||
System.out.println(" links-add <addr:port>: add link");
|
||||
System.out.println(" links-remove <addr:port>: remove link");
|
||||
System.out.println(" links-reconnect: reconnect all link");
|
||||
System.out.println(" kltp-state: query kltp states");
|
||||
System.out.println(" route: display internal route table");
|
||||
System.out.println(" kperf <addr:port>: Porformance benchmark");
|
||||
System.out.println(" kperf <addr:port>: performance benchmark");
|
||||
System.out.println(" exit: Exit");
|
||||
break;
|
||||
|
||||
@@ -104,12 +101,13 @@ public class KLALBMain {
|
||||
break;
|
||||
case "links-state":
|
||||
System.out.println("links state:");
|
||||
System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动");
|
||||
//System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动");
|
||||
System.out.println("state\tspd↑\tspd↓\tPPS↑\tPPS↓\tdelay↑\tdelay↓\tjitter↑\tjitter↓");
|
||||
synchronized (kpcje.getKlalbController().getLines()) {
|
||||
for (Iterator<IPv6NetworkLink> iterator = kpcje.getKlalbController().getLines().iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link=iterator.next();
|
||||
if(link instanceof KLALBRemoteLine) {
|
||||
KLALBRemoteLine hostPort = (KLALBRemoteLine) link;
|
||||
if(link instanceof KLALBRemoteLink) {
|
||||
KLALBRemoteLink hostPort = (KLALBRemoteLink) link;
|
||||
System.out.println(hostPort .toString());
|
||||
}
|
||||
}
|
||||
@@ -118,31 +116,34 @@ public class KLALBMain {
|
||||
case "links-add":
|
||||
if(sc.length>=2) {
|
||||
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
|
||||
List<KLALBRemoteLine>addl=kpcje.getKlalbController().addRemoteLines(mpsa);
|
||||
List<KLALBRemoteLink>addl=kpcje.getKlalbController().addRemoteLines(mpsa);
|
||||
if(addl.isEmpty()) {
|
||||
System.out.println("添加失败,线路已存在!");
|
||||
//System.out.println("添加失败,线路已存在!");
|
||||
System.out.println("link already exist!");
|
||||
}else {
|
||||
for (Iterator<KLALBRemoteLine> iterator = addl.iterator(); iterator.hasNext();) {
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
|
||||
for (Iterator<KLALBRemoteLink> iterator = addl.iterator(); iterator.hasNext();) {
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) iterator.next();
|
||||
|
||||
System.out.println("添加成功:"+klalbRemoteLine.getMonitor().getName());
|
||||
//System.out.println("添加成功:"+klalbRemoteLine.getMonitor().getName());
|
||||
System.out.println("Successfully added: "+klalbRemoteLine.getName());
|
||||
}
|
||||
}
|
||||
}else {
|
||||
System.out.println("请输入要添加地址:端口!");
|
||||
// System.out.println("请输入要添加地址:端口!");
|
||||
System.out.println("Input Address:port");
|
||||
}
|
||||
break;
|
||||
case "links-remove":
|
||||
if(sc.length>=2) {
|
||||
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
|
||||
List<KLALBRemoteLine>rmvl=kpcje.getKlalbController().removeRemoteLines(mpsa);
|
||||
List<KLALBRemoteLink>rmvl=kpcje.getKlalbController().removeRemoteLines(mpsa);
|
||||
if(rmvl.isEmpty()) {
|
||||
System.out.println("No matched link has been found.");
|
||||
}else {
|
||||
for (Iterator iterator = rmvl.iterator(); iterator.hasNext();) {
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) iterator.next();
|
||||
|
||||
System.out.println("Successfully removed: "+klalbRemoteLine.getMonitor().getName());
|
||||
System.out.println("Successfully removed: "+klalbRemoteLine.getName());
|
||||
}
|
||||
}
|
||||
}else {
|
||||
@@ -157,6 +158,9 @@ public class KLALBMain {
|
||||
System.out.println("Trying to reconnect all links.");
|
||||
kpcje.getKlalbController().reconnectImmediately();
|
||||
break;
|
||||
case "kltp-state":
|
||||
System.out.println(kpcje.getKlalbController().getKLTPregister().toString());
|
||||
break;
|
||||
case "route":
|
||||
List<RouteItem> lri=new ArrayList<>( kpcje.getKlalbController().getIpv6Router().getCurrentRouteTabel());
|
||||
Collections.sort(lri);
|
||||
@@ -178,9 +182,13 @@ public class KLALBMain {
|
||||
}
|
||||
|
||||
break;
|
||||
case "memcpy":
|
||||
case "membandbenchmark":
|
||||
MembandBenchmark.main(args);
|
||||
break;
|
||||
case "memqueuebenchmark":
|
||||
|
||||
ObjectPoolBandwidthTest.main(args);
|
||||
break;
|
||||
//case "$$SYSTEM:":
|
||||
//System.out.println();
|
||||
//break;
|
||||
|
||||
@@ -9,10 +9,6 @@ import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.kne.cloud.network.NetworkPacket;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet;
|
||||
@@ -52,13 +48,13 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload {
|
||||
protected ByteBuffer klalbHeader;
|
||||
|
||||
protected KLALBPacket(ByteBuffer klalbHeader,int headerLength) {
|
||||
super(KLALB_PROTOCOL_NUMBER,false);
|
||||
super(KLALB_PROTOCOL_NUMBER);
|
||||
this.klalbHeader = klalbHeader;
|
||||
this.headerLength=headerLength;
|
||||
}
|
||||
|
||||
public KLALBPacket(int type,int headerLength) {
|
||||
super(KLALB_PROTOCOL_NUMBER,false);
|
||||
super(KLALB_PROTOCOL_NUMBER);
|
||||
klalbHeader=NetworkPacket.bufferAllocator.allocate(headerLength);
|
||||
klalbHeader.put((byte) type);
|
||||
this.headerLength=headerLength;
|
||||
@@ -113,24 +109,6 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload {
|
||||
return headerLength;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//private List<KLALBRemoteLine> sendRecord=new ArrayList<>(2);
|
||||
|
||||
private AtomicInteger sendCounter=new AtomicInteger(0);
|
||||
|
||||
public int getSendCounter() {
|
||||
return sendCounter.get();
|
||||
}
|
||||
|
||||
public void incSendCounter() {
|
||||
sendCounter.incrementAndGet();
|
||||
}
|
||||
/*public List<KLALBRemoteLine> getSendRecord() {
|
||||
return sendRecord;
|
||||
}*/
|
||||
|
||||
|
||||
protected ByteBuffer getKLALBHeader() {
|
||||
return klalbHeader;
|
||||
}
|
||||
|
||||
@@ -44,9 +44,9 @@ public class KLALBProtocolDetectSocketListener extends SocketListener {
|
||||
super.setCon((soc)->{
|
||||
ProtocolDetectorSocket pds=(ProtocolDetectorSocket) soc;
|
||||
if(!pds.getProtocolStack().isEmpty()&&pds.getProtocolStack().pop().getName().equals("KLALB")) {
|
||||
KLALBRemoteLine krs=null;
|
||||
KLALBRemoteLink krs=null;
|
||||
try {
|
||||
krs = new KLALBRemoteLine(klalbController,new StreamKLALBPacketLink(pds));
|
||||
krs = new KLALBRemoteLink(klalbController,new StreamKLALBPacketLink(pds));
|
||||
klalbController.addRemoteLine(krs);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -5,39 +5,20 @@ import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.kne.cloud.network.*;
|
||||
import org.kne.cloud.network.klalb.ui.KLALBStateGUI3;
|
||||
import org.kne.cloud.network.klalb.ui.Language;
|
||||
import org.kne.cloud.network.klalb.ui.UIEnv;
|
||||
import org.kne.cloud.network.minecraft.MinecraftSocketBridge;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
|
||||
public class KLALBProxySystem {
|
||||
private Set<Proxy> proxys=new HashSet<>();
|
||||
@@ -158,9 +139,9 @@ public class KLALBProxySystem {
|
||||
|
||||
tcpl.setCon((soc)->{
|
||||
|
||||
KLALBRemoteLine krs=null;
|
||||
KLALBRemoteLink krs=null;
|
||||
try {
|
||||
krs = new KLALBRemoteLine(klalbController,new StreamChannelKLALBPacketLink(soc));
|
||||
krs = new KLALBRemoteLink(klalbController,new StreamChannelKLALBPacketLink(soc));
|
||||
klalbController.addRemoteLine(krs);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
@@ -181,9 +162,9 @@ public class KLALBProxySystem {
|
||||
|
||||
udpl.setCon((soc)->{
|
||||
|
||||
KLALBRemoteLine krs=null;
|
||||
KLALBRemoteLink krs=null;
|
||||
try {
|
||||
krs = new KLALBRemoteLine(klalbController,new SplitedDatagramKLALBPacketLink(soc));
|
||||
krs = new KLALBRemoteLink(klalbController,new SplitedDatagramKLALBPacketLink(soc));
|
||||
klalbController.addRemoteLine(krs);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
|
||||
+192
-152
@@ -1,80 +1,55 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
import java.io.StreamCorruptedException;
|
||||
import java.lang.ModuleLayer.Controller;
|
||||
import java.math.BigInteger;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.nio.channels.UnresolvedAddressException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.PriorityBlockingQueue;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.LongAdder;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.jctools.queues.MpscArrayQueue;
|
||||
import org.kne.cloud.clock.HighAccuracyClock;
|
||||
import org.kne.cloud.clock.NTPTimestamps;
|
||||
import org.kne.cloud.clock.ReliabilityBackoffTimeClock;
|
||||
import org.kne.cloud.clock.WatchDogTimer;
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.SpeedLimiter;
|
||||
import org.kne.cloud.network.ThreadTool;
|
||||
import org.kne.cloud.network.congestion.BBRCongestionAlgorithm;
|
||||
import org.kne.cloud.network.congestion.CongestionAlgorithm;
|
||||
import org.kne.cloud.network.congestion.CongestionAlgorithms;
|
||||
import org.kne.cloud.network.congestion.DetnetCongestionAlgorithm;
|
||||
import org.kne.cloud.network.congestion.SendPacketSlidingWindow;
|
||||
import org.kne.cloud.network.congestion.Vegas2CongestionAlgorithm;
|
||||
import org.kne.cloud.network.ipv6.ControlledIPv6NetworkLink;
|
||||
import org.kne.cloud.network.ipv6.ICMPv6PostcardPacket;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
import org.kne.cloud.network.ipv6.IPv6HopByHopTLV;
|
||||
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6EmptyPayload;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6HopByHopHeader;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6SegmentRoutingHeader;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.ipv6.KLALBOAMHopByHopTLV;
|
||||
import org.kne.cloud.network.ipv6.KLALBPassportHopByHopTLV;
|
||||
import org.kne.cloud.network.ipv6.Neighbor;
|
||||
import org.kne.cloud.network.ipv6.PacketID;
|
||||
import org.kne.cloud.network.ipv6.PacketIDGenerator;
|
||||
import org.kne.cloud.network.ipv6.PostcardEntry;
|
||||
import org.kne.cloud.network.ipv6.RouteItem;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import org.kne.cloud.network.monitor.CostSupplierFactory;
|
||||
import org.kne.cloud.network.monitor.DelayMonitorData;
|
||||
import org.kne.cloud.network.monitor.LinkStatus;
|
||||
import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl;
|
||||
import org.kne.cloud.network.perf.TESTNPacket;
|
||||
import org.kne.cloud.network.srv6.ACKSEQSSegmentRoutingTLV;
|
||||
import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV;
|
||||
import org.kne.cloud.network.srv6.SRv6Router;
|
||||
import org.kne.cloud.network.te.BandwidthDistributer;
|
||||
import org.kne.concurrent.HighPerformanceExecutor;
|
||||
import org.kne.concurrent.SpinLock;
|
||||
import org.kne.concurrent.ThreadParker;
|
||||
import org.kne.math.Long128;
|
||||
|
||||
import com.github.f4b6a3.uuid.UuidCreator;
|
||||
|
||||
public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implements ControlledIPv6NetworkLink {
|
||||
public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implements ControlledIPv6NetworkLink {
|
||||
|
||||
private static final int HEADER_CALIBRATE = 40;
|
||||
|
||||
@@ -84,8 +59,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
private volatile boolean closed = false;
|
||||
|
||||
private volatile Supplier<IPv6AddressGroup> localVaddrSupplier;
|
||||
|
||||
private volatile KLALBController klalbController;
|
||||
|
||||
public KLALBController getKlalbController() {
|
||||
@@ -93,14 +66,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
|
||||
|
||||
public Supplier<IPv6AddressGroup> getLocalVaddrSupplier() {
|
||||
return localVaddrSupplier;
|
||||
}
|
||||
|
||||
public void setLocalVaddrSupplier(Supplier<IPv6AddressGroup> localVaddrSupplier) {
|
||||
this.localVaddrSupplier = localVaddrSupplier;
|
||||
}
|
||||
|
||||
private volatile IPv6AddressGroup remoteVaddr;
|
||||
|
||||
public IPv6AddressGroup getRemoteVaddr() {
|
||||
@@ -128,9 +93,11 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return remoteVaddr + "\t" + monitor.toString();
|
||||
return remoteVaddr + "\t" +name+"\n" +status+"\t"+monitor.toString();
|
||||
}
|
||||
|
||||
private String name;
|
||||
private LinkStatus status=new LinkStatus();
|
||||
private SpeedAndTrafficAndDelayMonitorDataImpl monitor;
|
||||
private volatile KLALBPacketLink kplink;
|
||||
private MultipurposeSocketAddress bindAddress;
|
||||
@@ -167,20 +134,20 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
return peerAddress;
|
||||
}
|
||||
|
||||
public KLALBRemoteLine(KLALBController controller, MultipurposeSocketAddress mpa, IPv6AddressGroup address) {
|
||||
public KLALBRemoteLink(KLALBController controller, MultipurposeSocketAddress mpa, IPv6AddressGroup address) {
|
||||
this(controller,mpa, null,address);
|
||||
}
|
||||
|
||||
public KLALBRemoteLine(KLALBController controller,KLALBPacketLink kpl, IPv6AddressGroup address) {
|
||||
public KLALBRemoteLink(KLALBController controller,KLALBPacketLink kpl, IPv6AddressGroup address) {
|
||||
this.klalbController=controller;
|
||||
sysclk = klalbController.getClock();
|
||||
this.kplink = kpl;
|
||||
this.addressGroup = address;
|
||||
monitor=new SpeedAndTrafficAndDelayMonitorDataImpl(sysclk);
|
||||
monitor.setName(kpl.toString());
|
||||
name=kpl.toString();
|
||||
}
|
||||
|
||||
private KLALBRemoteLine(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bindaddr, IPv6AddressGroup address) {
|
||||
private KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bindaddr, IPv6AddressGroup address) {
|
||||
this.klalbController=controller;
|
||||
sysclk = klalbController.getClock();
|
||||
this.socketAddress = mpa;
|
||||
@@ -188,22 +155,22 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
this.addressGroup = address;
|
||||
monitor=new SpeedAndTrafficAndDelayMonitorDataImpl(sysclk);
|
||||
if (bindaddr == null) {
|
||||
monitor.setName("→" + mpa.toString());
|
||||
name="→" + mpa.toString();
|
||||
} else {
|
||||
monitor.setName(bindaddr.toString() + "→" + mpa.toString());
|
||||
name=bindaddr.toString() + "→" + mpa.toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public KLALBRemoteLine(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bind) {
|
||||
public KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bind) {
|
||||
this(controller,mpa, bind, null);
|
||||
}
|
||||
|
||||
public KLALBRemoteLine(KLALBController controller,MultipurposeSocketAddress mpa) {
|
||||
public KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa) {
|
||||
this(controller,mpa, (IPv6AddressGroup) null);
|
||||
}
|
||||
|
||||
public KLALBRemoteLine(KLALBController controller,KLALBPacketLink link) {
|
||||
public KLALBRemoteLink(KLALBController controller,KLALBPacketLink link) {
|
||||
this(controller,link, (IPv6AddressGroup) null);
|
||||
}
|
||||
|
||||
@@ -216,10 +183,8 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
|
||||
private class RemoteSender implements Runnable {
|
||||
|
||||
private SpeedLimiter speedLimit = new SpeedLimiter(256 * 1024L, 10 * 1000000L);// 50*1000000L
|
||||
|
||||
private ConcurrentLinkedQueue<KLALBPacket> sendQueue = new ConcurrentLinkedQueue<KLALBPacket>();
|
||||
private MpscArrayQueue<KLALBPacket> sendQueue = new MpscArrayQueue<KLALBPacket>(8192);
|
||||
private WatchDogTimer watchdog = new WatchDogTimer(400000000L);
|
||||
|
||||
private ThreadParker tlock = new ThreadParker();
|
||||
@@ -227,6 +192,8 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
private volatile long time = System.nanoTime();
|
||||
private volatile long pingInterval = 100000000L;
|
||||
|
||||
private Lock sendLock=new SpinLock();
|
||||
|
||||
private boolean checkPingTime() {
|
||||
long cu = System.nanoTime();
|
||||
if (cu - time > pingInterval) {
|
||||
@@ -239,7 +206,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
|
||||
|
||||
public ConcurrentLinkedQueue<KLALBPacket> getSendQueue() {
|
||||
public Queue<KLALBPacket> getSendQueue() {
|
||||
return sendQueue;
|
||||
}
|
||||
|
||||
@@ -275,8 +242,8 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
writeKLALBPacketToKPL(new VADDRREQPacket());
|
||||
writeKLALBPacketToKPL(new VADDRREQPacket());
|
||||
writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get()));
|
||||
writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get()));
|
||||
writeKLALBPacketToKPL(new VADDRPacket(klalbController.getSelf()));
|
||||
writeKLALBPacketToKPL(new VADDRPacket(klalbController.getSelf()));
|
||||
kplink.flush();
|
||||
while ((!kplink.isClosed()) && (!closed)) {
|
||||
if (checkPingTime()) {
|
||||
@@ -286,22 +253,38 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
if (peerAddress == null)
|
||||
sendPacket(new ADDRREQPacket());
|
||||
|
||||
}
|
||||
KLALBPacket tkpp = sendQueue.poll();
|
||||
|
||||
if (tkpp != null) {
|
||||
kplink.writeKLALBPacket(tkpp);
|
||||
watchdog.feed();
|
||||
}/*sendLock.lock();
|
||||
int n;
|
||||
try {
|
||||
n = sendQueue.drain((tkpp)->{
|
||||
|
||||
try {
|
||||
kplink.writeKLALBPacket(tkpp);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
},100);
|
||||
}finally {
|
||||
sendLock.unlock();
|
||||
}
|
||||
if (n>0) {
|
||||
watchdog.feed();
|
||||
} else {
|
||||
tlock.parkNanos(1000000L);
|
||||
}
|
||||
}*/
|
||||
long curr=System.nanoTime();
|
||||
if(curr-flushTime>=flushInterval) {
|
||||
flushTime=curr;
|
||||
sendLock.lock();
|
||||
try {
|
||||
kplink.flush();
|
||||
watchdog.feed();
|
||||
}finally {
|
||||
sendLock.unlock();
|
||||
}
|
||||
}
|
||||
Thread.yield();
|
||||
tlock.parkNanos(1000000L);
|
||||
|
||||
}
|
||||
} catch (StreamCorruptedException sce) {
|
||||
sce.printStackTrace();
|
||||
@@ -323,10 +306,39 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
boolean b=sendQueue.add(blk);
|
||||
if(b) {
|
||||
tlock.unpark();
|
||||
speedLimit.forceTransmit(blk.getTotalLength());
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
public void sendDirect(KLALBPacket blk) {
|
||||
sendLock.lock();
|
||||
try {
|
||||
writeKLALBPacketToKPL(blk);
|
||||
} catch (IOException | UnresolvedAddressException e) {
|
||||
if (debug)
|
||||
e.printStackTrace();
|
||||
try {
|
||||
kplink.close();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
tpk.unpark();
|
||||
}finally {
|
||||
sendLock.unlock();
|
||||
}
|
||||
watchdog.feed();
|
||||
tlock.unpark();
|
||||
}
|
||||
|
||||
|
||||
public long getQueueUsed() {
|
||||
long used=0;
|
||||
for(KLALBPacket pack:sendQueue) {
|
||||
used+=pack.getTotalLength();
|
||||
}
|
||||
return used;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -334,6 +346,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
private WatchDogTimer watchdog = new WatchDogTimer(400000000L);
|
||||
private long rtt=Long.MAX_VALUE/1024;
|
||||
private long rttMin=Long.MAX_VALUE/1024;
|
||||
AtomicBoolean fst = new AtomicBoolean(true);
|
||||
//ReentrantLock readLock = new ReentrantLock();
|
||||
|
||||
@@ -348,7 +361,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
watchdog.feed();
|
||||
KLALBPacket kpp = kppb;
|
||||
SRv6Router.getDefaultExecutor().execute(() -> {
|
||||
//SRv6Router.getDefaultExecutor().execute(() -> {
|
||||
debugShowPacket("RX", kpp);
|
||||
UUID val = null;
|
||||
long delay = Long.MAX_VALUE / 1024;
|
||||
@@ -402,19 +415,25 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
long DsndDelay = prcv.subtract(psnd).longValue();
|
||||
long DrcvDelay = local.subtract(posnd).longValue();
|
||||
// System.out.println(DsndDelayFactor+" "+DrcvDelayFactor);
|
||||
// System.out.println(DsndDelay+" "+DrcvDelay);
|
||||
|
||||
rtt = DsndDelay + DrcvDelay;
|
||||
if(rtt<rttMin) {
|
||||
rttMin=rtt;
|
||||
}else {
|
||||
rttMin=(rttMin*99+rtt)/100;
|
||||
}
|
||||
if (DsndDelay >= 0 && DrcvDelay >= 0) {
|
||||
delay = DrcvDelay;
|
||||
monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), psnd, 0, DsndDelay);
|
||||
// System.out.println(local);
|
||||
monitor.recordUploadDelay(DsndDelay);
|
||||
//sysclk.adjustClock(Long128.valueOf( DsndDelay-DrcvDelay), 0.001);
|
||||
} else {
|
||||
long Dfallback = rtt / 2;
|
||||
if (Dfallback >= 0) {
|
||||
delay = Dfallback;
|
||||
monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), psnd, 0, Dfallback);
|
||||
monitor.recordUploadDelay(Dfallback);
|
||||
}
|
||||
sysclk.adjustClock(Long128.valueOf( DsndDelay-DrcvDelay), 0.1);
|
||||
}
|
||||
|
||||
algorithm.setCurrentBandwidth(png.getDownSpeed());
|
||||
@@ -437,11 +456,11 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
if (ardg2 != null)
|
||||
addressGroup = ardg2;
|
||||
}
|
||||
KLALBRemoteLine.this.onAddressUpdate();
|
||||
KLALBRemoteLink.this.onAddressUpdate();
|
||||
|
||||
break;
|
||||
case KLALBPacket.VADDRREQ:
|
||||
sendPacket(new VADDRPacket(localVaddrSupplier.get()));
|
||||
sendPacket(new VADDRPacket(klalbController.getSelf()));
|
||||
break;
|
||||
case KLALBPacket.VADDR:
|
||||
IPv6AddressGroup vdr = ((VADDRPacket) kpp).getVaddr();
|
||||
@@ -450,10 +469,10 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
sendPacket(new VADDRACKPacket());
|
||||
if (fst.compareAndSet(true, false)) {
|
||||
// coll.resetCoolingTime();
|
||||
monitor.setState(MonitorData.UP);
|
||||
KLALBRemoteLine.this.onOnlineStateUpdate();
|
||||
status.setState(LinkStatus.UP);
|
||||
KLALBRemoteLink.this.onOnlineStateUpdate();
|
||||
}
|
||||
KLALBRemoteLine.this.onLocatorUpdate();
|
||||
KLALBRemoteLink.this.onLocatorUpdate();
|
||||
|
||||
break;
|
||||
case KLALBPacket.VADDRACK:
|
||||
@@ -464,19 +483,16 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
IPv6OverKLALBPacket ivk = (IPv6OverKLALBPacket) kpp;
|
||||
IPv6Packet iv6 = ivk.getIPv6Packet();
|
||||
ivk.putTimePassport("unpacked");
|
||||
ivk.printPassport();
|
||||
iv6.putTimePassport("unpackFromLink");
|
||||
if (getSrv6Router() != null) {
|
||||
getSrv6Router().onReceive(KLALBRemoteLine.this, iv6);
|
||||
getSrv6Router().onReceive(KLALBRemoteLink.this, iv6);
|
||||
}
|
||||
|
||||
KLALBOAMHopByHopTLV ktlv = null;
|
||||
List<Long> ptlv = new ArrayList<>();
|
||||
|
||||
long btimes = 0;
|
||||
IPv6HopByHopHeader hop = iv6.getHopByHopHeader();
|
||||
if (hop != null) {
|
||||
List<Long> ptlv = new ArrayList<>();
|
||||
List<IPv6HopByHopTLV> tlvs = hop.getTlvs();
|
||||
for (IPv6HopByHopTLV tlv : tlvs) {
|
||||
if (tlv instanceof KLALBOAMHopByHopTLV) {
|
||||
@@ -488,14 +504,13 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
ptlv.add(btimes + ((KLALBPassportHopByHopTLV) tlv).getTimestampOffsetLong());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ptlv.size() >= 2) {
|
||||
long delta = ptlv.get(ptlv.size() - 1) - ptlv.get(ptlv.size() - 2);
|
||||
long deltaxnanos = (long) (delta * 1000000000.0 / (1L << 32));
|
||||
if (deltaxnanos > 0)
|
||||
//System.out.println(deltaxnanos);
|
||||
delay = deltaxnanos;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
@@ -503,12 +518,17 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
long length = kpp.getTotalLength();
|
||||
UUID pid = val == null ? KLALBUtils.createGlobalUUID() : val;
|
||||
monitor.getDownloadBandwidth().recordPacket(pid, (int) length, delay);
|
||||
if (klalbController != null) {
|
||||
klalbController.getLinkMonitor().getDownloadBandwidth().recordPacket(pid, (int) length,
|
||||
delay);
|
||||
//monitor.getDownloadBandwidth().recordPacket(pid,0,1, delay);
|
||||
if(delay!=Long.MAX_VALUE / 1024) {
|
||||
monitor.recordDownloadDelay(delay);
|
||||
//System.out.println(name+" "+delay);
|
||||
}
|
||||
});
|
||||
monitor.recordDownloadPacket((int)length);
|
||||
if (klalbController != null) {
|
||||
//klalbController.getLinkMonitor().getDownloadBandwidth().recordPacket(pid, (int) length,delay);
|
||||
klalbController.getLinkMonitor().recordDownloadPacket((int)length);
|
||||
}
|
||||
//});
|
||||
}
|
||||
} catch (StreamCorruptedException sce) {
|
||||
sce.printStackTrace();
|
||||
@@ -533,16 +553,37 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
public long getRTT() {
|
||||
return rtt;
|
||||
}
|
||||
public long getRTTMin() {
|
||||
return rttMin;
|
||||
}
|
||||
|
||||
}
|
||||
private ThreadParker tpk=new ThreadParker();
|
||||
|
||||
private StateManager stateManager;
|
||||
private MonitorUpdater monitorUpdater;
|
||||
private class MonitorUpdater implements Runnable{
|
||||
@Override
|
||||
public void run() {
|
||||
while (!closed) {
|
||||
status.updateReliability();
|
||||
monitor.update();
|
||||
try {
|
||||
Thread.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
private RemoteSender sender;
|
||||
private RemoteReceiver receiver;
|
||||
private class StateManager implements Runnable {
|
||||
|
||||
private Thread currThread;
|
||||
private RemoteSender sender;
|
||||
private RemoteReceiver receiver;
|
||||
@Override
|
||||
public void run() {
|
||||
currThread = Thread.currentThread();
|
||||
@@ -580,10 +621,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
sender = new RemoteSender();
|
||||
receiver = new RemoteReceiver();
|
||||
|
||||
algorithm.setSpeedControlConsumer((speed, bursttime) -> {
|
||||
sender.speedLimit.setLimitspeed(speed);
|
||||
sender.speedLimit.setBrustTime(bursttime);
|
||||
});
|
||||
|
||||
|
||||
sendWindow = new SendPacketSlidingWindow<UUID, IPv6Packet>(algorithm, 65535, HEADER_CALIBRATE);
|
||||
sendWindow.setResendConsumer(rerouteConsumer);
|
||||
@@ -604,6 +642,10 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
if(klalbController!=null&& klalbController.getConfigItem()!=null) {
|
||||
KLALBControllerConfigItem config=klalbController.getConfigItem();
|
||||
if(algorithm instanceof DetnetCongestionAlgorithm) {
|
||||
double v0=config.getBurstLimit();
|
||||
if(v0!=0) {
|
||||
((DetnetCongestionAlgorithm)algorithm).setBurstLimit(v0);
|
||||
}
|
||||
double v1=config.getDelayUpperBound();
|
||||
if(v1!=0) {
|
||||
((DetnetCongestionAlgorithm)algorithm).setUpperDelayBound(v1);
|
||||
@@ -619,8 +661,13 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
boolean b = sender.getWatchdog().isBarking()
|
||||
|| receiver.getWatchdog().isBarking();
|
||||
boolean isup= (!b)&&(receiver.getRTT()<1000000000L);
|
||||
monitor.setState(isup?MonitorData.UP:MonitorData.UNSTABLE);
|
||||
boolean isup= (!b)&&(receiver.getRTT()<1000000000L);//&&(receiver.getRTT()<receiver.getRTTMin()*5+50000000L)
|
||||
int oldstate=status.getState();
|
||||
int newstate=isup?LinkStatus.UP:LinkStatus.UNSTABLE;
|
||||
status.setState(newstate);
|
||||
if(oldstate!=newstate) {
|
||||
onOnlineStateUpdate();
|
||||
}
|
||||
tpk.parkNanos(10000000L);
|
||||
}
|
||||
} catch (StreamCorruptedException sce) {
|
||||
@@ -631,7 +678,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
monitor.setState(MonitorData.DOWN);
|
||||
status.setState(LinkStatus.DOWN);
|
||||
try {
|
||||
if (kplink != null)
|
||||
kplink.close();
|
||||
@@ -646,7 +693,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
if (closed) {
|
||||
break;
|
||||
}
|
||||
LockSupport.parkNanos(coll.getCoolingTime(monitor.getReliability()));
|
||||
LockSupport.parkNanos(coll.getCoolingTime(status.getReliability()));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -655,14 +702,11 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
KLALBControllerConfigItem config=klalbController.getConfigItem();
|
||||
String cong=config.getCongestionAlgorithm();
|
||||
if(cong!=null) {
|
||||
switch(cong) {
|
||||
case "BBR":
|
||||
return new BBRCongestionAlgorithm();
|
||||
case "Vegas2":
|
||||
return new Vegas2CongestionAlgorithm();
|
||||
default:
|
||||
return new BBRCongestionAlgorithm();
|
||||
CongestionAlgorithm alg=CongestionAlgorithms.get(cong);
|
||||
if(alg==null) {
|
||||
alg=new BBRCongestionAlgorithm();
|
||||
}
|
||||
return alg;
|
||||
}else {
|
||||
return new BBRCongestionAlgorithm();
|
||||
}
|
||||
@@ -684,8 +728,10 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
protected void startIO() {
|
||||
stateManager=new StateManager();
|
||||
monitorUpdater=new MonitorUpdater();
|
||||
ThreadTool.makeVDaemonThread("线路性能采样线程", monitorUpdater).start();
|
||||
ThreadTool.makeVDaemonThread("远程线路状态线程", stateManager).start();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void ping() throws IOException {
|
||||
@@ -706,7 +752,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
KLALBPacket packet = kplink.readKLALBPacket();
|
||||
debugShowPacket("RX", packet);
|
||||
if (packet != null) {
|
||||
packet.putTimePassport("received");
|
||||
|
||||
}
|
||||
return packet;
|
||||
@@ -716,8 +761,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
if (packet instanceof TESTNPacket)
|
||||
System.err.println(packet);
|
||||
kplink.writeKLALBPacket(packet);
|
||||
packet.putTimePassport("sended");
|
||||
packet.printPassport();
|
||||
|
||||
debugShowPacket("TX", packet);
|
||||
}
|
||||
@@ -733,7 +776,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
public void close() {
|
||||
closed = true;
|
||||
monitor.setState(MonitorData.DOWN);
|
||||
status.setState(LinkStatus.DOWN);
|
||||
try {
|
||||
if (kplink != null)
|
||||
kplink.close();
|
||||
@@ -763,11 +806,11 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
blk.markJoinqueuetime();
|
||||
long length = blk.getTotalLength();
|
||||
UUID pid = val == null ? KLALBUtils.createGlobalUUID() : val;
|
||||
monitor.getUploadBandwidth().recordPacket(pid, (int) length);
|
||||
monitor.recordUploadPacket((int) length);
|
||||
if (klalbController != null) {
|
||||
klalbController.getLinkMonitor().getUploadBandwidth().recordPacket(pid, (int) length);
|
||||
klalbController.getLinkMonitor().recordUploadPacket((int) length);
|
||||
}
|
||||
sender.send(blk);
|
||||
sender.sendDirect(blk);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -792,32 +835,24 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
public boolean isLoopBack() {
|
||||
return false;
|
||||
}
|
||||
|
||||
private BandwidthDistributer<Inet6Address> bandwidthDistributer = new BandwidthDistributer<Inet6Address>();
|
||||
|
||||
BandwidthDistributer bandwidthDistributer=new BandwidthDistributer<>();
|
||||
@Override
|
||||
public List<Neighbor> getNeighborsInfo() {
|
||||
List<Neighbor> hs = new ArrayList<>(1);
|
||||
if (peerAddress != null) {
|
||||
hs.add(new Neighbor(peerAddress, remoteVaddr, monitor, bandwidthDistributer));
|
||||
// System.out.println(peerAddress+" "+addressGroup);
|
||||
}
|
||||
return hs;
|
||||
}
|
||||
|
||||
private volatile int inputchachesize = 8192 * 4000;
|
||||
private volatile int outputchachesize = 8192 * 240;// 500
|
||||
|
||||
private Consumer<IPv6Packet> rerouteConsumer;
|
||||
|
||||
@Override
|
||||
public void sendPacket(IPv6Packet pack, IPv6Address inet6Address) throws IOException {
|
||||
// 只有已连接的链路才能传输数据
|
||||
if (monitor.getState() == MonitorData.UP) {
|
||||
if (status.getState() == LinkStatus.UP) {
|
||||
|
||||
// if(inet6Address.equals(remoteVaddr.getAddress())||inet6Address.equals(peerAddress.getAddress()))
|
||||
// {
|
||||
// 获得数据包的IPv6逐跳扩展头部
|
||||
IPv6HopByHopHeader hop = pack.getHopByHopHeader();
|
||||
|
||||
UUID val = null;
|
||||
@@ -835,20 +870,15 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
|
||||
if (val != null) {
|
||||
if (!(pack.getPayload() instanceof ICMPv6PostcardPacket)) {
|
||||
//if (!(pack.getPayload() instanceof ICMPv6PostcardPacket)) {
|
||||
// 放入滑动窗口中并记录缓冲区大小占用
|
||||
sendWindow.put(val, pack);
|
||||
}
|
||||
//}
|
||||
}
|
||||
}
|
||||
// 捎带发送反方向的ACK给对方发送过来的数据包,减小设备性能开销
|
||||
/*
|
||||
* if(srh!=null) { addACKSEQToSRH(srh,10); }
|
||||
*/
|
||||
// 发送数据包
|
||||
|
||||
|
||||
sendIPv6PacketToLink(pack, val);
|
||||
// }
|
||||
|
||||
|
||||
} else {
|
||||
if (rerouteConsumer != null) {
|
||||
@@ -864,8 +894,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
|
||||
private void sendIPv6PacketToLink(IPv6Packet pack, UUID val) {
|
||||
IPv6OverKLALBPacket kipv6 = new IPv6OverKLALBPacket(pack);
|
||||
pack.putTimePassport("packdInLink");
|
||||
pack.printPassport();
|
||||
sendPacketToLink(kipv6, val);
|
||||
}
|
||||
|
||||
@@ -874,34 +902,25 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCongress(IPv6Packet iPv6Packet, double scale) {
|
||||
public boolean isCongestion(IPv6Packet iPv6Packet, double scale) {
|
||||
SendPacketSlidingWindow<UUID, IPv6Packet> sw = sendWindow;
|
||||
if (sw != null) {
|
||||
boolean cong = (scale <= 1.0) && (monitor.getOutDelay() / (monitor.getOutDelayMin() + 1000000L) > 2);
|
||||
|
||||
return cong || sw.isCongress(iPv6Packet, scale);
|
||||
return sw.isCongestion( scale);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReachSpeedLimit(IPv6Packet iPv6Packet) {
|
||||
//boolean xcongress = !speedLimit.checkTransmit(iPv6Packet.getTotalLength());
|
||||
//return xcongress;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return monitor.getName();
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isUp() {
|
||||
return (!isClosed()) && (getMonitor().getState() == MonitorData.UP) ;
|
||||
return (!isClosed()) && (status.getState() == LinkStatus.UP) ;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -916,12 +935,12 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
for (Iterator<Neighbor> iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) {
|
||||
Neighbor addresses = (Neighbor) iteratorx.next();
|
||||
RouteItem ri = new RouteItem(new IPv6AddressGroup(addresses.getAddress().getAddress(), 128),
|
||||
addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D", false);
|
||||
addresses.getAddress().getAddress(), this, "Direct", 0, 128,CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(),status,algorithm::getRTO), "D", false);
|
||||
rlist.add(ri);
|
||||
|
||||
if (addresses.getLocator() != null) {
|
||||
RouteItem ris = new RouteItem(addresses.getLocator(), addresses.getLocator().getAddress(), this,
|
||||
"KLALB SRv6", 13, 128, addresses.getMonitor(), "D", false);
|
||||
"KLALB SRv6", 13, 128,CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(),status,algorithm::getRTO), "D", false);
|
||||
rlist.add(ris);
|
||||
}
|
||||
}
|
||||
@@ -939,9 +958,30 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
|
||||
if (deltaxnanos > 0) {
|
||||
Long128 psnd = NTPTimestamps.ntp128BitToNanosTimestamp(
|
||||
NTPTimestamps.inferNtp64To128(postcard.getTimestampBase(), sysclk.getCurrentTimeNTP128()));
|
||||
monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), psnd, 0, deltaxnanos);
|
||||
monitor.recordUploadDelay(deltaxnanos);
|
||||
}
|
||||
sendWindow.ack(postcard.getPacketUUID());
|
||||
sendWindow.ack(postcard.getPacketUUID(),false,deltaxnanos);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public int getState() {
|
||||
return status.getState();
|
||||
}
|
||||
|
||||
|
||||
public SendPacketSlidingWindow<UUID, IPv6Packet> getWindow() {
|
||||
return sendWindow;
|
||||
}
|
||||
|
||||
|
||||
public long getQueueUsed() {
|
||||
if(sender==null) {
|
||||
return 0;
|
||||
}
|
||||
return sender.getQueueUsed();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -1,21 +1,17 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.Proxy;
|
||||
import org.kne.cloud.network.SocketListener;
|
||||
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import org.kne.cloud.network.monitor.LinkStatus;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
@@ -69,15 +65,15 @@ public class KLALBRemoteManagement {
|
||||
synchronized (lineslist) {
|
||||
for (Iterator<IPv6NetworkLink> iterator = lineslist.iterator(); iterator.hasNext();) {
|
||||
IPv6NetworkLink link=iterator.next();
|
||||
if(!(link instanceof KLALBRemoteLine)) {
|
||||
if(!(link instanceof KLALBRemoteLink)) {
|
||||
continue;
|
||||
}
|
||||
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
|
||||
KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
|
||||
if(klalbRemoteLine.getSocketAddress()==null)
|
||||
continue;
|
||||
JsonObject jklbrl=new JsonObject();
|
||||
jklbrl.addProperty("ipport", klalbRemoteLine.getSocketAddress().toString());
|
||||
jklbrl.addProperty("state",MonitorData.parseStateToString( klalbRemoteLine.getMonitor().getState()));
|
||||
jklbrl.addProperty("state",LinkStatus.stateToString( klalbRemoteLine.getState()));
|
||||
|
||||
jklbrl.addProperty("Vaddr", klalbRemoteLine.getRemoteVaddr().getAddress().toString());
|
||||
|
||||
|
||||
@@ -10,10 +10,11 @@ import java.net.UnknownHostException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.jctools.counters.CountersFactory;
|
||||
import org.jctools.counters.FixedSizeStripedLongCounter;
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
|
||||
@@ -385,20 +386,17 @@ public static String parseAbbrIPv6(String IPv6Str) {
|
||||
|
||||
private final long id;
|
||||
private long counter=0;
|
||||
private UUID randUUID=UUID.randomUUID();
|
||||
private long time=System.nanoTime();
|
||||
private static final long INTERVAL=1000000L;
|
||||
private long randUUIDh;
|
||||
private long randUUIDl;
|
||||
private static SecureRandom sr=new SecureRandom();
|
||||
public UUIDGenarator(long threadId) {
|
||||
this.id=threadId;
|
||||
randUUIDh=sr.nextLong();
|
||||
randUUIDl=sr.nextLong();
|
||||
}
|
||||
public UUID genarateUUID() {
|
||||
long curr=System.nanoTime();
|
||||
if(curr-time>INTERVAL) {
|
||||
time=curr;
|
||||
randUUID=UUID.randomUUID();
|
||||
}
|
||||
long h=randUUID.getMostSignificantBits()^id;
|
||||
long l=randUUID.getLeastSignificantBits()^counter;
|
||||
long h=randUUIDh^id;
|
||||
long l=randUUIDl^counter;
|
||||
|
||||
UUID ret=new UUID(h, l);
|
||||
counter++;
|
||||
@@ -413,4 +411,9 @@ public static String parseAbbrIPv6(String IPv6Str) {
|
||||
//return UUID.randomUUID();
|
||||
return gens.get().genarateUUID();
|
||||
}
|
||||
|
||||
|
||||
public static FixedSizeStripedLongCounter createCounter() {
|
||||
return CountersFactory.createFixedSizeStripedCounter(Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ package org.kne.cloud.network.klalb;
|
||||
import java.io.IOException;
|
||||
import java.net.BindException;
|
||||
import java.net.DatagramPacket;
|
||||
import java.net.DatagramSocketImpl;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
@@ -18,15 +17,12 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
|
||||
import org.kne.cloud.network.NetworkPacket;
|
||||
import org.kne.cloud.network.VirtualDatagramSocketImpl;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet;
|
||||
import org.kne.cloud.network.tcp.UDPPacket;
|
||||
import org.kne.concurrent.HighPerformanceExecutor;
|
||||
import org.kne.io.KNEChannels;
|
||||
|
||||
public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl implements BindableKLALBPacketConsumer{
|
||||
public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl implements BindableConsumer<IPv6Packet>{
|
||||
|
||||
private KLALBController controller;
|
||||
|
||||
@@ -89,8 +85,8 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
|
||||
localaddr = (Inet6Address) host;
|
||||
localPort=port;
|
||||
if(!ignoreBindCheck)
|
||||
controller.getDatagramPortBinder().bind(this);
|
||||
controller.getDatagramPortBinder().listen(this);
|
||||
controller.getUDPregister().bind(this);
|
||||
controller.getUDPregister().listen(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -137,12 +133,10 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
|
||||
p.setLength(buffer.limit());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setTTL(byte ttl) throws IOException {
|
||||
this.ttl=ttl;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected byte getTTL() throws IOException {
|
||||
return (byte) ttl;
|
||||
}
|
||||
@@ -183,9 +177,9 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
|
||||
|
||||
@Override
|
||||
protected void close() {
|
||||
controller.getDatagramPortBinder().unlisten(this);
|
||||
controller.getUDPregister().unlisten(this);
|
||||
if(!ignoreBindCheck)
|
||||
controller.getDatagramPortBinder().unbind(this);
|
||||
controller.getUDPregister().unbind(this);
|
||||
closed=true;
|
||||
}
|
||||
|
||||
@@ -218,14 +212,16 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
|
||||
private Queue<UDPPacket> recvQueue = new ConcurrentLinkedQueue<UDPPacket>();
|
||||
private AtomicInteger recvQueueUsed=new AtomicInteger(0);
|
||||
@Override
|
||||
public void accept(IPv6Address t,NetworkPacket np) {
|
||||
UDPPacket u=(UDPPacket) np;
|
||||
public void accept(IPv6Packet t) {
|
||||
if(t.getPayload() instanceof UDPPacket) {
|
||||
UDPPacket u=(UDPPacket) t.getPayload();
|
||||
if(recvQueueUsed.get()<=inputchachesize) {
|
||||
if(recvQueue.offer(u)) {
|
||||
recvQueueUsed.addAndGet((int) u.getDataLength());
|
||||
LockSupport.unpark(parkThread);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,26 +16,19 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.kne.cloud.network.ByteBufferAllocator;
|
||||
import org.kne.cloud.network.NetworkPacket;
|
||||
import org.kne.cloud.network.RawSocketImpl;
|
||||
import org.kne.cloud.network.ThreadTool;
|
||||
import org.kne.cloud.network.VirtualRawSocketImpl;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6DefaultPayload;
|
||||
import org.kne.cloud.network.ipv6.IPv6ProtocolRegister;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
|
||||
import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink;
|
||||
import org.kne.cloud.network.srv6.PacketConsumer;
|
||||
import org.kne.cloud.network.srv6.SRv6Router;
|
||||
import org.kne.concurrent.HighPerformanceExecutor;
|
||||
import org.kne.io.KNEChannels;
|
||||
|
||||
public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements PacketConsumer{
|
||||
public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements IPv6ProtocolRegister{
|
||||
|
||||
private boolean ipHeaderInclude=false;
|
||||
|
||||
@@ -123,7 +116,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
|
||||
|
||||
@Override
|
||||
protected void close() {
|
||||
link.getProtocolNumberRegister().remove(bindProtocolNumber);
|
||||
link.getProtocolNumberRegister()[bindProtocolNumber]=null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,8 +149,10 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
|
||||
|
||||
localaddr=(Inet6Address) address;
|
||||
this.bindProtocolNumber=protocolNumber;
|
||||
if(link.getProtocolNumberRegister().putIfAbsent(protocolNumber, this)!=null) {
|
||||
if(link.getProtocolNumberRegister()[protocolNumber]!=null) {
|
||||
throw new BindException("protocol number already bind");
|
||||
}else {
|
||||
link.getProtocolNumberRegister()[protocolNumber]=this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,7 +186,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
|
||||
if(ipHeaderInclude) {
|
||||
|
||||
}else {
|
||||
IPv6Payload pl=new IPv6Payload(bindProtocolNumber);
|
||||
IPv6DefaultPayload pl=new IPv6DefaultPayload(bindProtocolNumber);
|
||||
pl.getData().put(buf);
|
||||
pl.getData().flip();
|
||||
BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>>cons=link.getReceiveConsumer();
|
||||
@@ -281,7 +276,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
|
||||
private AtomicInteger recvQueueUsed=new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public boolean accept(IPv6Packet packx) throws IOException {
|
||||
public boolean onaccept(IPv6Packet packx) throws IOException {
|
||||
if(recvQueueUsed.get()<=inputchachesize) {
|
||||
if(recvQueue.offer(packx)) {
|
||||
recvQueueUsed.addAndGet((int) packx.getPayload().getTotalLength());
|
||||
|
||||
@@ -7,11 +7,9 @@ import java.net.SocketException;
|
||||
import java.net.SocketOption;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.nio.channels.spi.SelectorProvider;
|
||||
import java.util.Set;
|
||||
|
||||
import org.kne.cloud.network.klalb.KLALBVirtualSocketImpl.KVSIInputStream;
|
||||
import org.kne.cloud.network.klalb.KLALBVirtualSocketImpl.KVSIOutputStream;
|
||||
import org.kne.cloud.network.kltp.KLTPInputStream;
|
||||
import org.kne.cloud.network.kltp.KLTPOutputStream;
|
||||
|
||||
public class KLALBVirtualSocketChannel extends SocketChannel{
|
||||
|
||||
@@ -110,22 +108,22 @@ public class KLALBVirtualSocketChannel extends SocketChannel{
|
||||
|
||||
@Override
|
||||
public int read(ByteBuffer dst) throws IOException {
|
||||
return ((KVSIInputStream)socket.getInputStream()).read(dst);
|
||||
return ((KLTPInputStream)socket.getInputStream()).read(dst);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long read(ByteBuffer[] dsts, int offset, int length) throws IOException {
|
||||
return ((KVSIInputStream)socket.getInputStream()).read(dsts,offset,length);
|
||||
return ((KLTPInputStream)socket.getInputStream()).read(dsts,offset,length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int write(ByteBuffer src) throws IOException {
|
||||
return ((KVSIOutputStream)socket.getOutputStream()).write(src);
|
||||
return ((KLTPOutputStream)socket.getOutputStream()).write(src);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long write(ByteBuffer[] srcs, int offset, int length) throws IOException {
|
||||
return ((KVSIOutputStream)socket.getOutputStream()).write(srcs,offset,length);
|
||||
return ((KLTPOutputStream)socket.getOutputStream()).write(srcs,offset,length);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -146,13 +144,13 @@ public class KLALBVirtualSocketChannel extends SocketChannel{
|
||||
}
|
||||
|
||||
public boolean isAutoFlush() throws IOException {
|
||||
return ((KVSIOutputStream)socket.getOutputStream()).isAutoFlush();
|
||||
return ((KLTPOutputStream)socket.getOutputStream()).isAutoFlush();
|
||||
}
|
||||
public void setAutoFlush(boolean b) throws IOException {
|
||||
((KVSIOutputStream)socket.getOutputStream()).setAutoFlush(b);
|
||||
((KLTPOutputStream)socket.getOutputStream()).setAutoFlush(b);
|
||||
}
|
||||
|
||||
public void flush() throws IOException {
|
||||
((KVSIOutputStream)socket.getOutputStream()).flush();
|
||||
((KLTPOutputStream)socket.getOutputStream()).flush();
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,18 +1,16 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.net.SocketException;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
public class LineDecitionComparator implements Comparator<KLALBRemoteLine> {
|
||||
private Map<KLALBRemoteLine,Long> predictedlatencys=new HashMap<>();
|
||||
public LineDecitionComparator (List<KLALBRemoteLine> krs,KLALBPacket curr,int priority) {
|
||||
for (Iterator<KLALBRemoteLine> iterator = krs.iterator(); iterator.hasNext();) {
|
||||
KLALBRemoteLine klalbRemoteSocket = (KLALBRemoteLine) iterator.next();
|
||||
public class LineDecitionComparator implements Comparator<KLALBRemoteLink> {
|
||||
private Map<KLALBRemoteLink,Long> predictedlatencys=new HashMap<>();
|
||||
public LineDecitionComparator (List<KLALBRemoteLink> krs,KLALBPacket curr,int priority) {
|
||||
for (Iterator<KLALBRemoteLink> iterator = krs.iterator(); iterator.hasNext();) {
|
||||
KLALBRemoteLink klalbRemoteSocket = (KLALBRemoteLink) iterator.next();
|
||||
long x=klalbRemoteSocket.getMonitor().getOutDelay();
|
||||
//long x=klalbRemoteSocket.getMonitor().getLatency()>>1;
|
||||
/*long al=0;
|
||||
@@ -32,12 +30,12 @@ public class LineDecitionComparator implements Comparator<KLALBRemoteLine> {
|
||||
predictedlatencys.put(klalbRemoteSocket, x);
|
||||
}
|
||||
}
|
||||
public Map<KLALBRemoteLine, Long> getPredictedlatencys() {
|
||||
public Map<KLALBRemoteLink, Long> getPredictedlatencys() {
|
||||
return predictedlatencys;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(KLALBRemoteLine o1, KLALBRemoteLine o2) {
|
||||
public int compare(KLALBRemoteLink o1, KLALBRemoteLink o2) {
|
||||
long t1=predictedlatencys.get(o1);
|
||||
long t2=predictedlatencys.get(o2);
|
||||
if(t1>t2) {
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.net.Inet6Address;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.kne.cloud.network.NetworkPacket;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
|
||||
public interface PacketConsumer extends BiConsumer<IPv6Address, NetworkPacket> {
|
||||
|
||||
}
|
||||
@@ -1,43 +1,34 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.net.BindException;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
import org.kne.cloud.network.IPv6SocketAddress;
|
||||
import org.kne.cloud.network.NetworkPacket;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
|
||||
import com.google.gson.internal.Pair;
|
||||
|
||||
public class PortBinder {
|
||||
private KLALBController controller;
|
||||
public PortBinder(KLALBController controller) {
|
||||
public class PortBinder<T> {
|
||||
private IPv6Address selfAddress;
|
||||
public PortBinder(IPv6Address selfAddress) {
|
||||
super();
|
||||
this.controller = controller;
|
||||
this.selfAddress = selfAddress;
|
||||
}
|
||||
private ReentrantReadWriteLock bindMaplock=new ReentrantReadWriteLock();
|
||||
private Map<IPv6SocketAddress,BindableKLALBPacketConsumer>bindMap=new ConcurrentHashMap<>(1024,0.2f);
|
||||
private Map<IPv6SocketAddress,BindableConsumer<T>>bindMap=new ConcurrentHashMap<>(2048);
|
||||
private ReentrantReadWriteLock listenMaplock=new ReentrantReadWriteLock();
|
||||
private Map<IPv6SocketAddress,BindableKLALBPacketConsumer>listenMap=new ConcurrentHashMap<>(1024,0.2f);
|
||||
private Map<IPv6SocketAddress,BindableConsumer<T>>listenMap=new ConcurrentHashMap<>(2048);
|
||||
private ReentrantReadWriteLock connectMaplock=new ReentrantReadWriteLock();
|
||||
private Map<Pair<IPv6SocketAddress,IPv6SocketAddress>,BindableKLALBPacketConsumer>connectMap=new ConcurrentHashMap<>(1024,0.2f);
|
||||
private Map<Pair<IPv6SocketAddress,IPv6SocketAddress>,BindableConsumer<T>>connectMap=new ConcurrentHashMap<>(2048);
|
||||
private volatile int portn=65535;
|
||||
public void bind(BindableKLALBPacketConsumer ks) throws BindException {
|
||||
public void bind(BindableConsumer<T> ks) throws BindException {
|
||||
bindMaplock.writeLock().lock();
|
||||
try {
|
||||
int pold=ks.getLocalPort();
|
||||
@@ -86,7 +77,7 @@ public class PortBinder {
|
||||
}
|
||||
}
|
||||
|
||||
public void unbind(BindableKLALBPacketConsumer ks) {
|
||||
public void unbind(BindableConsumer<T> ks) {
|
||||
bindMaplock.writeLock().lock();
|
||||
try {
|
||||
removeAsValue(bindMap, ks);
|
||||
@@ -94,7 +85,7 @@ public class PortBinder {
|
||||
bindMaplock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
public void connect(BindableKLALBPacketConsumer ks) throws BindException {
|
||||
public void connect(BindableConsumer<T> ks) throws BindException {
|
||||
connectMaplock.writeLock().lock();
|
||||
try {
|
||||
connectMap.put(new Pair<IPv6SocketAddress, IPv6SocketAddress>( new IPv6SocketAddress(IPv6Address.valueOf(ks.getLocalInetAddress()), ks.getLocalPort()), new IPv6SocketAddress(IPv6Address.valueOf(ks.getRemoteInetAddress()), ks.getPort())),ks);
|
||||
@@ -102,7 +93,7 @@ public class PortBinder {
|
||||
connectMaplock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
public void disconnect(BindableKLALBPacketConsumer ks) {
|
||||
public void disconnect(BindableConsumer<T> ks) {
|
||||
connectMaplock.writeLock().lock();
|
||||
try {
|
||||
removeAsValue(connectMap, ks);
|
||||
@@ -111,7 +102,7 @@ public class PortBinder {
|
||||
}
|
||||
}
|
||||
|
||||
public void listen(BindableKLALBPacketConsumer ks) throws BindException {
|
||||
public void listen(BindableConsumer<T> ks) throws BindException {
|
||||
listenMaplock.writeLock().lock();
|
||||
try {
|
||||
listenMap.put(new IPv6SocketAddress(IPv6Address.valueOf(ks.getLocalInetAddress()), ks.getLocalPort()),ks);
|
||||
@@ -119,7 +110,7 @@ public class PortBinder {
|
||||
listenMaplock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
public void unlisten(BindableKLALBPacketConsumer ks) {
|
||||
public void unlisten(BindableConsumer<T> ks) {
|
||||
/*System.out.println(listenMap);
|
||||
new RuntimeException("!").printStackTrace();*/
|
||||
listenMaplock.writeLock().lock();
|
||||
@@ -201,40 +192,68 @@ public class PortBinder {
|
||||
}
|
||||
return b;
|
||||
}*/
|
||||
public boolean distributePacketToConsumer(IPv6Address srcAddr,PortPacket packet) {
|
||||
IPv6SocketAddress local=new IPv6SocketAddress(controller.getSelf().getAddress(), packet.getDstPort());
|
||||
IPv6SocketAddress remote=new IPv6SocketAddress(srcAddr, packet.getSrcPort());
|
||||
BindableKLALBPacketConsumer bkc=connectMap.get(new Pair<IPv6SocketAddress, IPv6SocketAddress>(local, remote));
|
||||
public BindableConsumer<T> distributePacketToConsumer(IPv6Address srcAddr, PortPacket packet) {
|
||||
int dst=packet.getDstPort();
|
||||
int src=packet.getSrcPort();
|
||||
IPv6SocketAddress local=new IPv6SocketAddress( selfAddress,dst);
|
||||
IPv6SocketAddress remote=new IPv6SocketAddress(srcAddr, src);
|
||||
BindableConsumer<T> bkc=connectMap.get(new Pair<IPv6SocketAddress, IPv6SocketAddress>(local, remote));
|
||||
if(bkc!=null) {
|
||||
bkc.accept(srcAddr, (NetworkPacket) packet);
|
||||
return true;
|
||||
return bkc;
|
||||
}
|
||||
IPv6SocketAddress localany=new IPv6SocketAddress(IPv6Address.UNSPECIFIED, packet.getDstPort());
|
||||
IPv6SocketAddress localany=new IPv6SocketAddress(IPv6Address.UNSPECIFIED, dst);
|
||||
bkc=connectMap.get(new Pair<IPv6SocketAddress, IPv6SocketAddress>(localany, remote));
|
||||
if(bkc!=null) {
|
||||
bkc.accept(srcAddr, (NetworkPacket) packet);
|
||||
return true;
|
||||
return bkc;
|
||||
}
|
||||
|
||||
bkc=listenMap.get(local);
|
||||
if(bkc!=null) {
|
||||
bkc.accept(srcAddr, (NetworkPacket) packet);
|
||||
return true;
|
||||
return bkc;
|
||||
}
|
||||
bkc=listenMap.get(localany);
|
||||
if(bkc!=null) {
|
||||
bkc.accept(srcAddr, (NetworkPacket) packet);
|
||||
return true;
|
||||
return bkc;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
return null;
|
||||
}
|
||||
public boolean checkIsBind(BindableKLALBPacketConsumer klalbVirtualSocketImpl) {
|
||||
public boolean checkIsBind(BindableConsumer<T> klalbVirtualSocketImpl) {
|
||||
return bindMap.containsValue(klalbVirtualSocketImpl);
|
||||
}
|
||||
public boolean checkIsConnect(BindableKLALBPacketConsumer kservers,InetSocketAddress isaf) throws BindException {
|
||||
public boolean checkIsConnect(BindableConsumer<T> kservers,InetSocketAddress isaf) throws BindException {
|
||||
return connectMap.containsKey(new Pair<IPv6SocketAddress, IPv6SocketAddress>( new IPv6SocketAddress(IPv6Address.valueOf( kservers.getLocalInetAddress()), kservers.getLocalPort()),IPv6SocketAddress.valueOf( isaf)));
|
||||
}
|
||||
public String toString() {
|
||||
StringBuilder sb=new StringBuilder();
|
||||
sb.append("connectMap: Local<->Remote\n");
|
||||
for(Entry<Pair<IPv6SocketAddress, IPv6SocketAddress>, BindableConsumer<T>> p:connectMap.entrySet()) {
|
||||
sb.append(p.getKey().first);
|
||||
sb.append("<->");
|
||||
sb.append(p.getKey().second);
|
||||
sb.append(" ");
|
||||
sb.append(p.getValue());
|
||||
sb.append('\n');
|
||||
}
|
||||
|
||||
sb.append("bindMap: Local\n");
|
||||
for(Entry<IPv6SocketAddress, BindableConsumer<T>> p:bindMap.entrySet()) {
|
||||
sb.append(p);
|
||||
sb.append(" ");
|
||||
sb.append(p.getValue());
|
||||
sb.append('\n');
|
||||
}
|
||||
|
||||
sb.append("listenMap: Local\n");
|
||||
for(Entry<IPv6SocketAddress, BindableConsumer<T>> p:listenMap.entrySet()) {
|
||||
sb.append(p);
|
||||
sb.append(" ");
|
||||
sb.append(p.getValue());
|
||||
sb.append('\n');
|
||||
}
|
||||
return sb.toString();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -14,6 +14,11 @@ public class SendItem<T extends NetworkPacket> {
|
||||
this.packetLength=packet.getTotalLength();
|
||||
}
|
||||
|
||||
public SendItem(T packet,int headerCalibrate) {
|
||||
this.packet=packet;
|
||||
this.packetLength=packet.getTotalLength()+headerCalibrate;
|
||||
}
|
||||
|
||||
public T getPacket() {
|
||||
return packet;
|
||||
}
|
||||
@@ -29,5 +34,10 @@ public class SendItem<T extends NetworkPacket> {
|
||||
public void setSendtime(long sendtimex) {
|
||||
this.sendtime=sendtimex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SendItem [packetLength=" + packetLength + ", packet=" + packet + ", sendtime=" + sendtime + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,39 +1,21 @@
|
||||
package org.kne.cloud.network.klalb;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.io.StreamCorruptedException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ProtocolFamily;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketOption;
|
||||
import java.net.SocketOptions;
|
||||
import java.net.StandardProtocolFamily;
|
||||
import java.net.StandardSocketOptions;
|
||||
import java.nio.Buffer;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.AsynchronousSocketChannel;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.GatheringByteChannel;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.ScatteringByteChannel;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.util.List;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.kne.cloud.network.BufferedChannel;
|
||||
import org.kne.cloud.network.ByteBufferAllocator;
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.NetworkPacket;
|
||||
import org.kne.cloud.network.ThreadTool;
|
||||
import org.kne.cloud.network.TimeoutTimer;
|
||||
import org.kne.io.KNEChannels;
|
||||
|
||||
public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink {
|
||||
@@ -64,7 +46,8 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
|
||||
public String toString() {
|
||||
try {
|
||||
return new MultipurposeSocketAddress("TCP",(InetSocketAddress)connectSocket.getLocalAddress())+"←"+new MultipurposeSocketAddress("TCP",(InetSocketAddress)connectSocket.getRemoteAddress());
|
||||
} catch (IOException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return "?←?";
|
||||
}
|
||||
}
|
||||
@@ -184,19 +167,20 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
|
||||
@Override
|
||||
public void writeKLALBPacket(KLALBPacket kp) throws IOException {
|
||||
|
||||
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
|
||||
/*ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
|
||||
szeWrite.limit(4);
|
||||
//szeWrite.clear();
|
||||
int length=(int) kp.getTotalLength();
|
||||
szeWrite.putInt(length);
|
||||
szeWrite.putInt(0,length);
|
||||
szeWrite.flip();
|
||||
|
||||
|
||||
|
||||
writableChannel.write(szeWrite);
|
||||
writableChannel.write(szeWrite);*/
|
||||
|
||||
if(debug) {
|
||||
|
||||
int length=(int) kp.getTotalLength();
|
||||
AtomicLong al=new AtomicLong(0);
|
||||
KLALBPacket.writeKLALBPacketToChannel(new MonitoredChannel(writableChannel,null,new AtomicLong[] { al}), kp);
|
||||
if(length!=al.get()) {
|
||||
@@ -212,19 +196,23 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
|
||||
private void checkflush() throws IOException {
|
||||
if(writableChannel instanceof BufferedChannel) {
|
||||
((BufferedChannel) writableChannel).flush();
|
||||
}else if(writableChannel instanceof KLALBVirtualSocketChannel) {
|
||||
((KLALBVirtualSocketChannel) writableChannel).flush();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public KLALBPacket readKLALBPacket() throws IOException {
|
||||
|
||||
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
|
||||
/*ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
|
||||
szeWrite.limit(4);
|
||||
KNEChannels.readFully(readableChannel, szeWrite);
|
||||
szeWrite.flip();
|
||||
int readSize=szeWrite.getInt();
|
||||
int readSize=szeWrite.getInt();*/
|
||||
KLALBPacket kp=KLALBPacket.readKLALBPacketFromChannel(readableChannel);
|
||||
if(debug) {
|
||||
int readSize=0;
|
||||
long kpl=kp.getTotalLength();
|
||||
if(kpl!=readSize) {
|
||||
throw new StreamCorruptedException(kp+" packet length error:"+kpl+"!="+readSize);
|
||||
|
||||
@@ -3,8 +3,8 @@ package org.kne.cloud.network.klalb.ui;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
@@ -20,101 +20,114 @@ import org.jfree.chart.plot.dial.StandardDialRange;
|
||||
import org.jfree.chart.plot.dial.StandardDialScale;
|
||||
import org.jfree.chart.title.TextTitle;
|
||||
import org.jfree.data.general.DefaultValueDataset;
|
||||
import org.kne.ui.LinearGradientColor;
|
||||
|
||||
public class DialPanel extends JPanel {
|
||||
|
||||
private DialTextAnnotation textAnnotation;
|
||||
private DialPlot plot;
|
||||
private static final int SEGMENTS = 100; // 渐变色分段数,越高越平滑
|
||||
private static final double INNER_RADIUS = 0.85;
|
||||
private static final double OUTER_RADIUS = 0.90;
|
||||
|
||||
public DialPanel(int size,String title,DefaultValueDataset primary, DefaultValueDataset secondary,
|
||||
Color pointerColor, Color outlineColor) {
|
||||
plot=createDialPlot(primary,secondary,pointerColor,outlineColor);
|
||||
private DialTextAnnotation textAnnotation;
|
||||
private DialPlot plot;
|
||||
|
||||
public DialPanel(int size, String title, DefaultValueDataset primary,
|
||||
DefaultValueDataset secondary, Color pointerColor, Color outlineColor) {
|
||||
JPanel jp = new JPanel();
|
||||
jp.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1));
|
||||
plot = createDialPlot(primary, secondary, pointerColor, outlineColor);
|
||||
textAnnotation = new DialTextAnnotation("");
|
||||
textAnnotation.setFont(UIEnv.getFont().deriveFont(20.0f));
|
||||
plot.addLayer(textAnnotation);
|
||||
setLayout(new BorderLayout());
|
||||
add(createChartPanel (createChart(plot),new Dimension(size, size)),BorderLayout.CENTER);
|
||||
JLabel jlb=new JLabel(title);
|
||||
jlb.setFont(UIEnv.getFont().deriveFont(16.0f));
|
||||
jlb.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
add(jlb,BorderLayout.SOUTH);
|
||||
}
|
||||
|
||||
public DialTextAnnotation getTextAnnotation() {
|
||||
return textAnnotation;
|
||||
}
|
||||
jp.setLayout(new BorderLayout());
|
||||
Dimension dim = new Dimension(size, size);
|
||||
jp.add(createChartPanel(createChart(plot), dim), BorderLayout.CENTER);
|
||||
JLabel jlb = new JLabel(title);
|
||||
jlb.setFont(UIEnv.getFont().deriveFont(16.0f));
|
||||
jlb.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
jp.add(jlb, BorderLayout.SOUTH);
|
||||
add(jp);
|
||||
}
|
||||
|
||||
/**
|
||||
public DialTextAnnotation getTextAnnotation() {
|
||||
return textAnnotation;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建图表面板
|
||||
* @param dashSize
|
||||
*/
|
||||
private ChartPanel createChartPanel(JFreeChart chart, Dimension dashSize) {
|
||||
ChartPanel panel = new ChartPanel(chart);
|
||||
panel.setPreferredSize(dashSize);
|
||||
panel.setSize(panel.getPreferredSize());
|
||||
panel.setSize(dashSize);
|
||||
panel.setBackground(Color.WHITE);
|
||||
panel.setBorder(new LineBorder(Color.LIGHT_GRAY));
|
||||
return panel;
|
||||
}
|
||||
/**
|
||||
|
||||
/**
|
||||
* 创建图表
|
||||
*/
|
||||
private JFreeChart createChart(DialPlot plot) {
|
||||
JFreeChart chart = new JFreeChart(plot);
|
||||
chart.setBorderPaint(Color.WHITE);
|
||||
chart.setTitle((TextTitle)null);
|
||||
chart.setTitle((TextTitle) null);
|
||||
plot.setView(0, 0, 1, 1);
|
||||
return chart;
|
||||
}
|
||||
/**
|
||||
|
||||
/**
|
||||
* 创建仪表盘图表
|
||||
*/
|
||||
private DialPlot createDialPlot(DefaultValueDataset primary, DefaultValueDataset secondary,
|
||||
Color pointerColor, Color outlineColor) {
|
||||
private DialPlot createDialPlot(DefaultValueDataset primary, DefaultValueDataset secondary,
|
||||
Color pointerColor, Color outlineColor) {
|
||||
DialPlot plot = new DialPlot();
|
||||
plot.setDataset(1, primary);
|
||||
plot.setDataset(0, secondary);
|
||||
|
||||
|
||||
StandardDialFrame frame = new StandardDialFrame();
|
||||
frame.setVisible(false);
|
||||
plot.setDialFrame(frame);
|
||||
|
||||
|
||||
// 添加刻度
|
||||
StandardDialScale scale = new StandardDialScale(0, 100, -120, -300, 10, 5);
|
||||
scale.setTickRadius(0.80);
|
||||
scale.setTickLabelsVisible(false);
|
||||
plot.addScale(0, scale);
|
||||
|
||||
|
||||
|
||||
|
||||
// 添加指针
|
||||
addDialPointers(plot, pointerColor, outlineColor);
|
||||
|
||||
|
||||
return plot;
|
||||
}
|
||||
|
||||
/**
|
||||
* 为仪表盘添加颜色范围
|
||||
* 添加渐变色范围(平滑过渡)
|
||||
* 从绿色 → 黄色 → 红色,基于 KLALBUtils.getColorByLoadPercentage()
|
||||
*/
|
||||
public void addDefaultDialRanges() {
|
||||
// 绿色范围: 0-70%
|
||||
StandardDialRange greenRange = new StandardDialRange(0, 70, Color.GREEN);
|
||||
addDialRange( greenRange);
|
||||
|
||||
// 黄色范围: 70-90%
|
||||
StandardDialRange yellowRange = new StandardDialRange(70, 90, Color.YELLOW);
|
||||
addDialRange( yellowRange);
|
||||
|
||||
// 红色范围: 90-100%
|
||||
StandardDialRange redRange = new StandardDialRange(90, 100, Color.RED);
|
||||
addDialRange( redRange);
|
||||
public void addGradientRanges(LinearGradientColor lgc) {
|
||||
double segmentAngle = 100.0 / SEGMENTS; // 每个分段的角度跨度
|
||||
|
||||
for (int i = 0; i < SEGMENTS; i++) {
|
||||
double start = i * segmentAngle;
|
||||
double end = (i + 1) * segmentAngle;
|
||||
// 计算当前分段对应的负载百分比(取分段的中点)
|
||||
float loadPercent = (float) (start + segmentAngle / 2);
|
||||
Color color = lgc.getColor(loadPercent/100);
|
||||
|
||||
StandardDialRange range = new StandardDialRange(start, end, color);
|
||||
addDialRange(range);
|
||||
}
|
||||
}
|
||||
|
||||
private static final double INNER=0.85;
|
||||
private static final double OUTER=0.90;
|
||||
public void addDialRange( StandardDialRange greenRange) {
|
||||
greenRange.setInnerRadius(INNER);
|
||||
greenRange.setOuterRadius(OUTER);
|
||||
plot.addLayer(greenRange);
|
||||
}
|
||||
|
||||
|
||||
public void addDialRange(StandardDialRange range) {
|
||||
range.setInnerRadius(INNER_RADIUS);
|
||||
range.setOuterRadius(OUTER_RADIUS);
|
||||
plot.addLayer(range);
|
||||
}
|
||||
|
||||
/**
|
||||
* 为仪表盘添加指针
|
||||
@@ -123,12 +136,12 @@ public class DialPanel extends JPanel {
|
||||
// 次要指针(透明)
|
||||
DialPointer.Pointer secondaryPointer = new DialPointer.Pointer();
|
||||
secondaryPointer.setRadius(0.8);
|
||||
secondaryPointer.setFillPaint(new Color(secondaryColor.getRed(), secondaryColor.getGreen(),
|
||||
secondaryColor.getBlue(), 0));
|
||||
secondaryPointer.setFillPaint(new Color(secondaryColor.getRed(), secondaryColor.getGreen(),
|
||||
secondaryColor.getBlue(), 0));
|
||||
secondaryPointer.setOutlinePaint(secondaryColor);
|
||||
secondaryPointer.setDatasetIndex(0);
|
||||
plot.addLayer(secondaryPointer);
|
||||
|
||||
|
||||
// 主要指针
|
||||
DialPointer.Pointer primaryPointer = new DialPointer.Pointer();
|
||||
primaryPointer.setRadius(0.8);
|
||||
@@ -137,4 +150,4 @@ public class DialPanel extends JPanel {
|
||||
primaryPointer.setDatasetIndex(1);
|
||||
plot.addLayer(primaryPointer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,11 +16,7 @@ import javax.swing.border.LineBorder;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
|
||||
import org.jfree.chart.ChartPanel;
|
||||
import org.jfree.chart.JFreeChart;
|
||||
import org.jfree.chart.plot.dial.*;
|
||||
import org.jfree.chart.title.TextTitle;
|
||||
import org.jfree.chart.ui.RectangleEdge;
|
||||
import org.jfree.data.general.DefaultValueDataset;
|
||||
import org.kne.cloud.clock.HighAccuracyClock;
|
||||
import org.kne.cloud.klalb.uitool.*;
|
||||
@@ -29,7 +25,8 @@ import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
|
||||
import org.kne.cloud.network.klalb.*;
|
||||
import org.kne.cloud.network.klalb.ui.GraphPanel.GraphNode;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import org.kne.cloud.network.monitor.LinkStatus;
|
||||
import org.kne.cloud.network.srv6.SRv6Router;
|
||||
import org.kne.ui.XFrame;
|
||||
import org.kne.ui.YScrollPane;
|
||||
|
||||
@@ -58,6 +55,8 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
private DefaultValueDataset downDataPPS; // 下行数据包速率
|
||||
private DefaultValueDataset backplaneDelay;
|
||||
private DefaultValueDataset backplanePPS;
|
||||
private DefaultValueDataset backplaneECNRate;
|
||||
private DefaultValueDataset backplaneLossRate;
|
||||
|
||||
// ==================== 仪表盘文本标注 ====================
|
||||
private DialTextAnnotation upSpeedText; // 上行速度文本标注
|
||||
@@ -66,6 +65,8 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
private DialTextAnnotation downPPSText; // 下行包速率文本标注
|
||||
private DialTextAnnotation backplaneDelayText;
|
||||
private DialTextAnnotation backplanePPSText;
|
||||
private DialTextAnnotation backplaneECNRateText;
|
||||
private DialTextAnnotation backplaneLossRateText;
|
||||
|
||||
// ==================== UI组件 ====================
|
||||
private YScrollPane ysp, yspc; // 可垂直滚动的面板
|
||||
@@ -79,7 +80,8 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
private JTextField textFieldLocate; // 定位地址输入框
|
||||
private JTextField asnField2; // ASN显示框
|
||||
private JTextArea dnsAreaSet; // DNS服务器设置区域
|
||||
private JComboBox comboCongress; // 拥塞控制算法选择框
|
||||
private JComboBox comboPerformance; // 性能策略选择框
|
||||
private JComboBox comboCongestion; // 拥塞控制算法选择框
|
||||
private JTextField tcpListeningSet; // TCP监听设置
|
||||
private JTextField udpListeningSet; // UDP监听设置
|
||||
private JTextArea openLineTabelSet; // 开放线路表设置
|
||||
@@ -105,8 +107,10 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
private SliderSettingItem linkConnectionsCount;
|
||||
private SliderSettingItem nagleDelayTime;
|
||||
private SliderSettingItem linkNagleDelayTime;
|
||||
private SliderSettingItem burstLimit;
|
||||
private SliderSettingItem delayHbound;
|
||||
private SliderSettingItem delayLbound;
|
||||
private ComboSettingItem performanceStrategy;
|
||||
private ComboSettingItem congestions;
|
||||
|
||||
// ==================== 构造方法 ====================
|
||||
@@ -345,7 +349,7 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
upSpeed = new DefaultValueDataset(0);
|
||||
upDataSpeed = new DefaultValueDataset(0);
|
||||
DialPanel dialup=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadspeed"), upSpeed, upDataSpeed, Color.RED, new Color(127, 0, 0));
|
||||
dialup.addDefaultDialRanges();
|
||||
dialup.addGradientRanges(UIEnv.RANGE_1);
|
||||
upSpeedText =dialup.getTextAnnotation();
|
||||
|
||||
|
||||
@@ -355,7 +359,7 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
downSpeed = new DefaultValueDataset(0);
|
||||
downDataSpeed = new DefaultValueDataset(0);
|
||||
DialPanel dialdown=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadspeed"), downSpeed, downDataSpeed, Color.GREEN, new Color(0, 127, 0));
|
||||
dialdown.addDefaultDialRanges();
|
||||
dialdown.addGradientRanges(UIEnv.RANGE_1);
|
||||
downSpeedText =dialdown.getTextAnnotation();
|
||||
|
||||
dashs.add(dialdown);
|
||||
@@ -369,7 +373,7 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
upPPS = new DefaultValueDataset(0);
|
||||
upDataPPS = new DefaultValueDataset(0);
|
||||
DialPanel dialupPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadpps"), upPPS, upDataPPS, Color.RED, new Color(127, 0, 0));
|
||||
dialupPPS.addDefaultDialRanges();
|
||||
dialupPPS.addGradientRanges(UIEnv.RANGE_1);
|
||||
upPPSText = dialupPPS.getTextAnnotation();
|
||||
|
||||
dashs.add(dialupPPS);
|
||||
@@ -378,7 +382,7 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
downPPS = new DefaultValueDataset(0);
|
||||
downDataPPS = new DefaultValueDataset(0);
|
||||
DialPanel dialdownPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadpps"), downPPS, downDataPPS, Color.GREEN, new Color(0, 127, 0));
|
||||
dialdownPPS.addDefaultDialRanges();
|
||||
dialdownPPS.addGradientRanges(UIEnv.RANGE_1);
|
||||
downPPSText = dialdownPPS.getTextAnnotation();
|
||||
|
||||
dashs.add(dialdownPPS);
|
||||
@@ -391,21 +395,8 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
// 背板转发延迟仪表盘
|
||||
backplaneDelay = new DefaultValueDataset(0);
|
||||
DialPanel dialupPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("backplanedelay"), backplaneDelay, null, Color.BLUE, new Color(0, 0, 127));
|
||||
// 绿色范围: 0-1%
|
||||
StandardDialRange greenRange = new StandardDialRange(0, 1, Color.GREEN);
|
||||
dialupPPS.addDialRange( greenRange);
|
||||
|
||||
// 黄色范围: 1-10%
|
||||
StandardDialRange yellowRange = new StandardDialRange(1, 10, Color.YELLOW);
|
||||
dialupPPS.addDialRange( yellowRange);
|
||||
|
||||
// 红色范围: 10-50%
|
||||
StandardDialRange redRange = new StandardDialRange(10, 50, Color.RED);
|
||||
dialupPPS.addDialRange( redRange);
|
||||
|
||||
|
||||
StandardDialRange redblackRange = new StandardDialRange(50, 100, new Color(128, 0, 0));
|
||||
dialupPPS.addDialRange( redblackRange);
|
||||
dialupPPS.addGradientRanges(UIEnv.RANGE_2);
|
||||
backplaneDelayText = dialupPPS.getTextAnnotation();
|
||||
|
||||
dashs.add(dialupPPS);
|
||||
@@ -413,10 +404,28 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
// 背板PPS仪表盘
|
||||
backplanePPS = new DefaultValueDataset(0);
|
||||
DialPanel backPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("backplanepps"), backplanePPS, null, Color.BLUE, new Color(0, 0, 127));
|
||||
backPPS.addDefaultDialRanges();
|
||||
backPPS.addGradientRanges(UIEnv.RANGE_1);
|
||||
backplanePPSText = backPPS.getTextAnnotation();
|
||||
|
||||
dashs.add(backPPS);
|
||||
|
||||
|
||||
backplaneECNRate = new DefaultValueDataset(0);
|
||||
DialPanel ecnRate=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("backplaneecnrate"), backplaneECNRate, null, Color.BLUE, new Color(0, 0, 127));
|
||||
|
||||
ecnRate.addGradientRanges(UIEnv.RANGE_3);
|
||||
|
||||
backplaneECNRateText = ecnRate.getTextAnnotation();
|
||||
dashs.add(ecnRate);
|
||||
|
||||
|
||||
backplaneLossRate = new DefaultValueDataset(0);
|
||||
DialPanel lossRate1=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("backplanelossrate"), backplaneLossRate, null, Color.BLUE, new Color(0, 0, 127));
|
||||
|
||||
lossRate1.addGradientRanges(UIEnv.RANGE_4);
|
||||
backplaneLossRateText = lossRate1.getTextAnnotation();
|
||||
|
||||
dashs.add(lossRate1);
|
||||
}
|
||||
|
||||
|
||||
@@ -869,6 +878,21 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
denyBroadcast=denyBroadcastc.getCheckBox();
|
||||
settings.getView().add(denyBroadcastc);
|
||||
|
||||
//性能设置标题
|
||||
|
||||
SettingItem pshi = new SettingItem(UIEnv.getRsb().getString("performancesettings"),
|
||||
UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), CONST.itemwidth, CONST.settingheight);
|
||||
settings.getView().add(pshi);
|
||||
|
||||
|
||||
performanceStrategy = new ComboSettingItem(UIEnv.getRsb().getString("performancestrategy"),
|
||||
CONST.itemwidth, CONST.settingheight);
|
||||
comboPerformance = performanceStrategy.getComboBox();
|
||||
comboPerformance.addItem("BBR");
|
||||
comboPerformance.addItem("Vegas2");
|
||||
settings.getView().add(performanceStrategy);
|
||||
|
||||
|
||||
// 高级设置标题
|
||||
SettingItem hi = new SettingItem(UIEnv.getRsb().getString("advancedsettings"),
|
||||
UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), CONST.itemwidth, CONST.settingheight);
|
||||
@@ -909,27 +933,42 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
|
||||
congestions = new ComboSettingItem(UIEnv.getRsb().getString("congresscontrolalgorithm"),
|
||||
CONST.itemwidth, CONST.settingheight);
|
||||
comboCongress = congestions.getComboBox();
|
||||
comboCongress.addItem("BBR");
|
||||
comboCongress.addItem("Vegas2");
|
||||
comboCongestion = congestions.getComboBox();
|
||||
comboCongestion.addItem("BBR");
|
||||
comboCongestion.addItem("Vegas2");
|
||||
settings.getView().add(congestions);
|
||||
settings.updateScrool();
|
||||
|
||||
|
||||
burstLimit= new SliderSettingItem(UIEnv.getRsb().getString("burstlimit"),
|
||||
CONST.itemwidth, CONST.settingheight);
|
||||
burstLimit.getSlider().setMaximum(1000);
|
||||
burstLimit.getSlider().setValue(200);
|
||||
settings.getView().add(burstLimit);
|
||||
|
||||
delayHbound = new SliderSettingItem(UIEnv.getRsb().getString("delayupperbound"),
|
||||
CONST.itemwidth, CONST.settingheight);
|
||||
delayHbound.getSlider().setMaximum(1000);
|
||||
delayHbound.getSlider().setMaximum(300);
|
||||
delayHbound.getSlider().setValue(200);
|
||||
settings.getView().add(delayHbound);
|
||||
|
||||
|
||||
delayLbound = new SliderSettingItem(UIEnv.getRsb().getString("delaylowerbound"),
|
||||
CONST.itemwidth, CONST.settingheight);
|
||||
delayLbound.getSlider().setMaximum(500);
|
||||
delayLbound.getSlider().setMaximum(300);
|
||||
delayLbound.getSlider().setValue(150);
|
||||
settings.getView().add(delayLbound);
|
||||
|
||||
ChangeListener clb= new ChangeListener() {
|
||||
|
||||
@Override
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
int val=burstLimit.getSlider().getValue();
|
||||
burstLimit.getLabelx().setText(String.format("%.3f",1.0+val/1000.0));
|
||||
}
|
||||
};
|
||||
clb.stateChanged(null);
|
||||
burstLimit.getSlider().addChangeListener(clb);
|
||||
|
||||
ChangeListener clh= new ChangeListener() {
|
||||
|
||||
@Override
|
||||
@@ -1142,6 +1181,8 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
kck.setDenyLineTableBroadcast(denyBroadcast.isSelected());
|
||||
|
||||
kck.setCongestionAlgorithm((String) congestions.getComboBox().getSelectedItem());
|
||||
|
||||
kck.setBurstLimit(1.0+burstLimit.getSlider().getValue()/1000.0);
|
||||
|
||||
kck.setDelayUpperBound(1.0+delayHbound.getSlider().getValue()/1000.0);
|
||||
|
||||
@@ -1177,10 +1218,10 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
// 遍历所有线路,更新或添加TPanel2
|
||||
for (Object obj : kll) {
|
||||
IPv6NetworkLink link = (IPv6NetworkLink) obj;
|
||||
if (!(link instanceof KLALBRemoteLine)) {
|
||||
if (!(link instanceof KLALBRemoteLink)) {
|
||||
continue;
|
||||
}
|
||||
KLALBRemoteLine ent = (KLALBRemoteLine) link;
|
||||
KLALBRemoteLink ent = (KLALBRemoteLink) link;
|
||||
|
||||
Component[] count = ysp.getView().getComponents();
|
||||
boolean found = false;
|
||||
@@ -1190,7 +1231,7 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
if (tp instanceof TPanel2) {
|
||||
if (((TPanel2) tp).getTunnel().equals(ent)) {
|
||||
tp.setVisible(showoffline.isSelected() || (
|
||||
ent.getMonitor().getState() != MonitorData.DOWN));
|
||||
ent.getState() != LinkStatus.DOWN));
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
@@ -1201,7 +1242,7 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
if (!found) {
|
||||
TPanel2 tp = new TPanel2(ent, kc);
|
||||
tp.setVisible(showoffline.isSelected() || (
|
||||
ent.getMonitor().getState()!= MonitorData.DOWN));
|
||||
ent.getState()!= LinkStatus.DOWN));
|
||||
ysp.getView().add(tp);
|
||||
}
|
||||
}
|
||||
@@ -1318,6 +1359,37 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
downDataPPS.setValue(Math.min(downDataPPS.getValue().doubleValue() * 0.98 + inPPSload1 * 0.02, 101.0));
|
||||
}
|
||||
|
||||
SRv6Router router= kc.getIpv6Router();
|
||||
if(router!=null) {
|
||||
// 更新背板延迟
|
||||
double backplaneTimev = router.getBackplaneTime()* 100.0/100000.0;
|
||||
if (Double.isFinite(backplaneTimev)) {
|
||||
backplaneDelayText.setLabel(KLALBUtils.convertUintNanoDefalut(router.getBackplaneTime()) + "s");
|
||||
backplaneDelay.setValue(Math.min(backplaneDelay.getValue().doubleValue() * 0.98 + backplaneTimev * 0.02, 101.0));
|
||||
}
|
||||
|
||||
// 更新背板转发率
|
||||
double backplanePPSv = router.getBackplanePPS() * 100.0 / router.getBackplanePPSMax();
|
||||
if (Double.isFinite(backplanePPSv)) {
|
||||
backplanePPSText.setLabel(KLALBUtils.convertUintDefalut(router.getBackplanePPS()) + "PPS");
|
||||
backplanePPS.setValue(Math.min(backplanePPS.getValue().doubleValue() * 0.98 + backplanePPSv * 0.02, 101.0));
|
||||
}
|
||||
|
||||
// 更新背板ECN率
|
||||
double backplaneECNv = router.getECNRate() * 100.0 ;
|
||||
if (Double.isFinite(backplaneECNv)) {
|
||||
backplaneECNRateText.setLabel(String.format("%.1f",backplaneECNv) + "%");
|
||||
backplaneECNRate.setValue(Math.min(backplaneECNRate.getValue().doubleValue() * 0.98 + backplaneECNv * 0.02, 101.0));
|
||||
}
|
||||
|
||||
// 更新背板ECN率
|
||||
double backplaneLossv = router.getLossRate() * 100.0 ;
|
||||
if (Double.isFinite(backplaneLossv)) {
|
||||
backplaneLossRateText.setLabel(String.format("%.1f",backplaneLossv) + "%");
|
||||
backplaneLossRate.setValue(Math.min(backplaneLossRate.getValue().doubleValue() * 0.98 + backplaneLossv * 0.02, 101.0));
|
||||
}
|
||||
}
|
||||
|
||||
// 更新在线设备数
|
||||
String contt = Long.toString(kc.getIpv6Router().getKlalbRouteProtol().getDevicesFound());
|
||||
if (!contt.equals(devicesOnline.getText())) {
|
||||
@@ -1431,6 +1503,10 @@ public class KLALBStateGUI3 extends XFrame {
|
||||
}else {
|
||||
congestions.getComboBox().setSelectedItem(con);
|
||||
}
|
||||
double ubb=kck.getBurstLimit();
|
||||
if(ubb!=0)
|
||||
burstLimit.getSlider().setValue((int) Math.round((ubb-1.0)*1000));
|
||||
|
||||
double ub=kck.getDelayUpperBound();
|
||||
if(ub!=0)
|
||||
delayHbound.getSlider().setValue((int) Math.round((ub-1.0)*1000));
|
||||
|
||||
@@ -6,17 +6,10 @@ import java.awt.Dimension;
|
||||
|
||||
import javax.swing.border.LineBorder;
|
||||
|
||||
import org.jfree.chart.ChartPanel;
|
||||
import org.jfree.chart.JFreeChart;
|
||||
import org.jfree.chart.plot.dial.DialPlot;
|
||||
import org.jfree.chart.plot.dial.DialPointer;
|
||||
import org.jfree.chart.plot.dial.DialTextAnnotation;
|
||||
import org.jfree.chart.plot.dial.StandardDialFrame;
|
||||
import org.jfree.chart.plot.dial.StandardDialRange;
|
||||
import org.jfree.chart.plot.dial.StandardDialScale;
|
||||
import org.jfree.chart.ui.RectangleEdge;
|
||||
import org.jfree.data.general.DefaultValueDataset;
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.klalb.CONST;
|
||||
import org.kne.cloud.network.klalb.KLALBUtils;
|
||||
import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl;
|
||||
import org.kne.cloud.network.perf.Kperf;
|
||||
@@ -24,12 +17,10 @@ import org.kne.cloud.network.perf.KperfReports;
|
||||
import org.kne.ui.XFrame;
|
||||
import javax.swing.JTabbedPane;
|
||||
import java.awt.BorderLayout;
|
||||
import javax.swing.JMenuBar;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JMenu;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.Image;
|
||||
|
||||
@@ -43,7 +34,6 @@ import java.util.TimerTask;
|
||||
import java.awt.event.ActionEvent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.BoxLayout;
|
||||
import java.awt.Font;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.ImageIcon;
|
||||
@@ -59,7 +49,6 @@ public class KperfGUI extends XFrame{
|
||||
private DefaultValueDataset upSpeed;
|
||||
private DefaultValueDataset upDataSpeed;
|
||||
private DialTextAnnotation upSpeedText;
|
||||
private Dimension dashSize=new Dimension((int) (145 * 0.7), (int) (165 * 0.7));
|
||||
private DefaultValueDataset downSpeed;
|
||||
private DefaultValueDataset downDataSpeed;
|
||||
private DialTextAnnotation downSpeedText;
|
||||
@@ -227,6 +216,8 @@ public class KperfGUI extends XFrame{
|
||||
panel_6.add(downPPSLabel, BorderLayout.EAST);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
{
|
||||
upSpeed = new DefaultValueDataset(0);
|
||||
upDataSpeed = new DefaultValueDataset(0);
|
||||
@@ -466,7 +457,48 @@ public class KperfGUI extends XFrame{
|
||||
cpup1.setBackground(Color.WHITE);
|
||||
cpup1.setBorder(new LineBorder(Color.LIGHT_GRAY));
|
||||
panel_6.add(cpup1, BorderLayout.WEST);
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
// 上行速度仪表盘
|
||||
upSpeed = new DefaultValueDataset(0);
|
||||
upDataSpeed = new DefaultValueDataset(0);
|
||||
DialPanel dialup=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadspeed"), upSpeed, upDataSpeed, Color.RED, new Color(127, 0, 0));
|
||||
dialup.addGradientRanges(UIEnv.RANGE_1);
|
||||
upSpeedText =dialup.getTextAnnotation();
|
||||
|
||||
|
||||
panel_3.add(dialup, BorderLayout.WEST);
|
||||
|
||||
|
||||
// 下行速度仪表盘
|
||||
downSpeed = new DefaultValueDataset(0);
|
||||
downDataSpeed = new DefaultValueDataset(0);
|
||||
DialPanel dialdown=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadspeed"), downSpeed, downDataSpeed, Color.GREEN, new Color(0, 127, 0));
|
||||
dialdown.addGradientRanges(UIEnv.RANGE_1);
|
||||
downSpeedText =dialdown.getTextAnnotation();
|
||||
|
||||
panel_4.add(dialdown, BorderLayout.WEST);
|
||||
|
||||
|
||||
// 上行包速率仪表盘
|
||||
upPPS = new DefaultValueDataset(0);
|
||||
upDataPPS = new DefaultValueDataset(0);
|
||||
DialPanel dialupPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("uploadpps"), upPPS, upDataPPS, Color.RED, new Color(127, 0, 0));
|
||||
dialupPPS.addGradientRanges(UIEnv.RANGE_1);
|
||||
upPPSText = dialupPPS.getTextAnnotation();
|
||||
|
||||
panel_5.add(dialupPPS, BorderLayout.WEST);
|
||||
|
||||
// 下行包速率仪表盘
|
||||
downPPS = new DefaultValueDataset(0);
|
||||
downDataPPS = new DefaultValueDataset(0);
|
||||
DialPanel dialdownPPS=new DialPanel(CONST.dialwidth, UIEnv.getRsb().getString("downloadpps"), downPPS, downDataPPS, Color.GREEN, new Color(0, 127, 0));
|
||||
dialdownPPS.addGradientRanges(UIEnv.RANGE_1);
|
||||
downPPSText = dialdownPPS.getTextAnnotation();
|
||||
|
||||
panel_6.add(dialdownPPS, BorderLayout.WEST);
|
||||
|
||||
JPanel panel_top = new JPanel();
|
||||
panel_1.add(panel_top, BorderLayout.NORTH);
|
||||
panel_top.setLayout(new GridLayout(0, 2, 0, 0));
|
||||
@@ -497,7 +529,8 @@ public class KperfGUI extends XFrame{
|
||||
getTitlelabel().setForeground(Color.WHITE);
|
||||
|
||||
setTitle(UIEnv.getRsb().getString("klalbperf"));
|
||||
setSize((int)(1200*0.7),(int)( 800*0.7));
|
||||
setSize(CONST.windowwidth,CONST.windowheight );
|
||||
setResizable(false);
|
||||
setLocationRelativeTo(comp);
|
||||
tsk=new TimerTask() {
|
||||
|
||||
@@ -576,6 +609,9 @@ public class KperfGUI extends XFrame{
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
private Image icon2;
|
||||
private Image getIcon2() {
|
||||
if(icon2==null)
|
||||
|
||||
@@ -1,37 +1,29 @@
|
||||
package org.kne.cloud.network.klalb.ui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.Image;
|
||||
import java.awt.Stroke;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.net.Inet6Address;
|
||||
import java.util.Date;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.border.LineBorder;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
|
||||
import org.jfree.chart.ChartFactory;
|
||||
import org.jfree.chart.ChartPanel;
|
||||
import org.jfree.chart.ChartRenderingInfo;
|
||||
import org.jfree.chart.JFreeChart;
|
||||
import org.jfree.data.time.Millisecond;
|
||||
import org.jfree.data.time.RegularTimePeriod;
|
||||
import org.jfree.data.time.TimePeriod;
|
||||
import org.jfree.data.time.TimeSeries;
|
||||
import org.jfree.data.time.TimeSeriesCollection;
|
||||
import org.kne.cloud.network.congestion.SendPacketSlidingWindow;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.klalb.KLALBRemoteLine;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet;
|
||||
import org.kne.cloud.network.klalb.KLALBRemoteLink;
|
||||
import org.kne.cloud.network.monitor.LinkStatus;
|
||||
import org.kne.cloud.network.monitor.TimestampMonitorValue;
|
||||
import org.kne.math.Long128;
|
||||
import org.kne.ui.XFrame;
|
||||
@@ -41,39 +33,42 @@ import java.awt.BorderLayout;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.JButton;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.event.WindowListener;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.Font;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.JSlider;
|
||||
|
||||
public class LineMonitorGUI extends XFrame {
|
||||
private Timer timer;
|
||||
private Timer timer1;
|
||||
private Timer timer2;
|
||||
private Timer timer3;
|
||||
private TimerTask tsk3;
|
||||
|
||||
private TimerTask tsk4, tsk5;
|
||||
private TimerTask tsk4, tsk5,tsk6;
|
||||
private TimerTask d1;
|
||||
private TimerTask d2;
|
||||
private TimerTask d3;
|
||||
|
||||
private TimeSeries spdup = new TimeSeries(UIEnv.getRsb().getString("uploadspeed"));
|
||||
private TimeSeries spddown = new TimeSeries(UIEnv.getRsb().getString("downloadspeed"));
|
||||
|
||||
private TimeSeries delayup = new TimeSeries(UIEnv.getRsb().getString("uploaddelay"));
|
||||
private TimeSeries delaydown = new TimeSeries(UIEnv.getRsb().getString("downloaddelay"));
|
||||
// private TimeSeries delayupmin=new TimeSeries("Upload delay minimum");
|
||||
// private TimeSeries delaydownmin=new TimeSeries("Download delay minimum");
|
||||
private TimeSeries delayupmin=new TimeSeries(UIEnv.getRsb().getString("uploadbasedelay"));
|
||||
private TimeSeries delaydownmin=new TimeSeries(UIEnv.getRsb().getString("downloadbasedelay"));
|
||||
|
||||
|
||||
private KLALBRemoteLine tr;
|
||||
private TimeSeries bufferused = new TimeSeries(UIEnv.getRsb().getString("usedbuffer"));
|
||||
private TimeSeries queueused = new TimeSeries(UIEnv.getRsb().getString("queueused"));
|
||||
private TimeSeries buffermax = new TimeSeries(UIEnv.getRsb().getString("maxbuffer"));
|
||||
|
||||
private KLALBRemoteLink tr;
|
||||
private JFreeChart jfc;
|
||||
private JFreeChart jfce;
|
||||
private JFreeChart jbfc;
|
||||
private JLabel spdp;
|
||||
private JLabel delp;
|
||||
private JLabel sbpdp;
|
||||
private long timeRange = 5000;
|
||||
private long[] values = new long[] { 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000 };
|
||||
private JPanel panel_1;
|
||||
@@ -81,20 +76,20 @@ public class LineMonitorGUI extends XFrame {
|
||||
|
||||
// private ChartPanel delp;
|
||||
// private ChartPanel spdp;
|
||||
public LineMonitorGUI(KLALBRemoteLine t) {
|
||||
public LineMonitorGUI(KLALBRemoteLink t) {
|
||||
this.tr = t;
|
||||
setSize(1200, 780);
|
||||
setLocationRelativeTo(null);
|
||||
|
||||
setIconImage(UIEnv.getIcon());
|
||||
setTitle("Line Monitor:" + t.getMonitor().getName());
|
||||
setTitle("Line Monitor:" + t.getName());
|
||||
setTitleColor(UIEnv.getDefaultTitleColor());
|
||||
getContentPane().setBackground(UIEnv.getDefaultBackgroundColor());
|
||||
getTitlelabel().setFont(UIEnv.getFont().deriveFont(17.0f));
|
||||
getTitlepanel().setBorder(new LineBorder(Color.LIGHT_GRAY));
|
||||
|
||||
JPanel jp = new JPanel();
|
||||
jp.setLayout(new GridLayout(2, 1));
|
||||
jp.setLayout(new GridLayout(2, 2));
|
||||
getContentPane().add(jp);
|
||||
|
||||
TimeSeriesCollection tsc = new TimeSeriesCollection();
|
||||
@@ -110,12 +105,17 @@ public class LineMonitorGUI extends XFrame {
|
||||
spdp.setBorder(new LineBorder(Color.DARK_GRAY));
|
||||
jp.add(spdp);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TimeSeriesCollection tsce = new TimeSeriesCollection();
|
||||
tsce.addSeries(delayup);
|
||||
tsce.addSeries(delaydown);
|
||||
|
||||
// tsce.addSeries(delayupmin);
|
||||
// tsce.addSeries(delaydownmin);
|
||||
tsce.addSeries(delayupmin);
|
||||
tsce.addSeries(delaydownmin);
|
||||
|
||||
jfce = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("delaymonitor"),
|
||||
UIEnv.getRsb().getString("time") + "(s)", UIEnv.getRsb().getString("delay") + "(ms)", tsce);
|
||||
jfce.getXYPlot().setBackgroundPaint(Color.BLACK);
|
||||
@@ -124,17 +124,40 @@ public class LineMonitorGUI extends XFrame {
|
||||
|
||||
BasicStroke dotted = new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0,
|
||||
new float[] { 0, 6, 0, 6 }, 0);
|
||||
/*
|
||||
* jfce.getXYPlot().getRenderer().setSeriesPaint(2,Color.RED);
|
||||
* jfce.getXYPlot().getRenderer().setSeriesStroke(2, dotted);
|
||||
* jfce.getXYPlot().getRenderer().setSeriesPaint(3,Color.GREEN);
|
||||
* jfce.getXYPlot().getRenderer().setSeriesStroke(3, dotted);
|
||||
*/
|
||||
|
||||
jfce.getXYPlot().getRenderer().setSeriesPaint(2,Color.RED);
|
||||
jfce.getXYPlot().getRenderer().setSeriesStroke(2, dotted);
|
||||
jfce.getXYPlot().getRenderer().setSeriesPaint(3,Color.GREEN);
|
||||
jfce.getXYPlot().getRenderer().setSeriesStroke(3, dotted);
|
||||
|
||||
changeFont(jfce);
|
||||
delp = new JLabel();
|
||||
delp.setBorder(new LineBorder(Color.DARK_GRAY));
|
||||
jp.add(delp);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TimeSeriesCollection tbsc = new TimeSeriesCollection();
|
||||
tbsc.addSeries(bufferused);
|
||||
tbsc.addSeries(queueused);
|
||||
tbsc.addSeries(buffermax);
|
||||
jbfc = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("bufferusagemonitor"),
|
||||
UIEnv.getRsb().getString("time") + "(s)", UIEnv.getRsb().getString("buffer") + "(KB)", tbsc);
|
||||
jbfc.getXYPlot().setBackgroundPaint(Color.BLACK);
|
||||
jbfc.getXYPlot().getRenderer().setSeriesPaint(0, Color.BLUE);
|
||||
jbfc.getXYPlot().getRenderer().setSeriesPaint(1, Color.MAGENTA);
|
||||
jbfc.getXYPlot().getRenderer().setSeriesPaint(2, Color.CYAN);
|
||||
changeFont(jbfc);
|
||||
sbpdp = new JLabel();
|
||||
sbpdp.setBorder(new LineBorder(Color.DARK_GRAY));
|
||||
jp.add(sbpdp);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
JPanel panel = new JPanel();
|
||||
panel.setOpaque(false);
|
||||
getContentPane().add(panel, BorderLayout.NORTH);
|
||||
@@ -219,14 +242,25 @@ public class LineMonitorGUI extends XFrame {
|
||||
synchronized (jfc) {
|
||||
|
||||
jfc.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange);
|
||||
spdup.setMaximumItemCount((int) timeRange);
|
||||
spddown.setMaximumItemCount((int) timeRange);
|
||||
spdup.setMaximumItemCount((int) timeRange/5);
|
||||
spddown.setMaximumItemCount((int) timeRange/5);
|
||||
}
|
||||
synchronized (jfce) {
|
||||
|
||||
jfce.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange);
|
||||
delayup.setMaximumItemCount((int) timeRange);
|
||||
delaydown.setMaximumItemCount((int) timeRange);
|
||||
delayup.setMaximumItemCount((int) timeRange/5);
|
||||
delaydown.setMaximumItemCount((int) timeRange/5);
|
||||
delayupmin.setMaximumItemCount((int) timeRange/5);
|
||||
delaydownmin.setMaximumItemCount((int) timeRange/5);
|
||||
}
|
||||
|
||||
|
||||
synchronized (jbfc) {
|
||||
|
||||
jbfc.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange);
|
||||
bufferused.setMaximumItemCount((int) timeRange/5);
|
||||
buffermax.setMaximumItemCount((int) timeRange/5);
|
||||
queueused.setMaximumItemCount((int) timeRange/5);
|
||||
}
|
||||
windowSelect.setText(timeRange / 1000 + "s");
|
||||
}
|
||||
@@ -269,11 +303,31 @@ public class LineMonitorGUI extends XFrame {
|
||||
new Date(valdown.getTimestamp().divide(new Long128(1000000L)).longValue()));
|
||||
delaydown.addOrUpdate(ms2, valdown.getDelay() / 1000000.0);
|
||||
}
|
||||
|
||||
Millisecond ms = new Millisecond(
|
||||
new Date(tr.getMonitor().getClock().getCurrentTimeMillis()));
|
||||
delayupmin.addOrUpdate(ms, tr.getMonitor().getOutDelayMin() / 1000000.0);
|
||||
delaydownmin.addOrUpdate(ms, tr.getMonitor().getInDelayMin() / 1000000.0);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void recordBufferData() {
|
||||
if (isVisible()) {
|
||||
Millisecond ms = new Millisecond(
|
||||
new Date(tr.getMonitor().getClock().getCurrentTimeMillis()));
|
||||
synchronized (jbfc) {
|
||||
SendPacketSlidingWindow<UUID, IPv6Packet> window=tr.getWindow();
|
||||
if(window !=null) {
|
||||
bufferused.addOrUpdate(ms, window.getSendWindowUsed() / 1024.0);
|
||||
//queueused.addOrUpdate(ms, tr.getQueueUsed() / 1024.0);
|
||||
buffermax.addOrUpdate(ms, window.getWindowSize() / 1024.0);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void setVisible(boolean b) {
|
||||
if (b) {
|
||||
@@ -281,6 +335,7 @@ public class LineMonitorGUI extends XFrame {
|
||||
timer = new Timer();
|
||||
timer1 = new Timer();
|
||||
timer2 = new Timer();
|
||||
timer3 = new Timer();
|
||||
tsk3 = new TimerTask() {
|
||||
|
||||
@Override
|
||||
@@ -303,6 +358,13 @@ public class LineMonitorGUI extends XFrame {
|
||||
recordDelayData();
|
||||
}
|
||||
};
|
||||
tsk6 = new TimerTask() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
recordBufferData();
|
||||
}
|
||||
};
|
||||
d1 = new TimerTask() {
|
||||
|
||||
@Override
|
||||
@@ -330,11 +392,27 @@ public class LineMonitorGUI extends XFrame {
|
||||
}
|
||||
}
|
||||
};
|
||||
d3 = new TimerTask() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (isVisible()) {
|
||||
synchronized (jbfc) {
|
||||
ImageIcon i3 = new ImageIcon(
|
||||
jbfc.createBufferedImage(sbpdp.getWidth(), sbpdp.getHeight()));
|
||||
sbpdp.setIcon(i3);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
timer.scheduleAtFixedRate(tsk3, 25, 25);
|
||||
timer1.scheduleAtFixedRate(tsk4, 5, 5);
|
||||
timer1.scheduleAtFixedRate(tsk4, 10, 10);
|
||||
timer1.scheduleAtFixedRate(d1, 25, 25);
|
||||
timer2.scheduleAtFixedRate(tsk5, 1, 1);
|
||||
timer2.scheduleAtFixedRate(tsk5, 10, 10);
|
||||
timer2.scheduleAtFixedRate(d2, 25, 25);
|
||||
timer3.scheduleAtFixedRate(tsk6, 10, 10);
|
||||
timer3.scheduleAtFixedRate(d3, 25, 25);
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -348,6 +426,8 @@ public class LineMonitorGUI extends XFrame {
|
||||
d1.cancel();
|
||||
if (d2 != null)
|
||||
d2.cancel();
|
||||
if (d3 != null)
|
||||
d3.cancel();
|
||||
if (timer != null)
|
||||
timer.cancel();
|
||||
if (timer1 != null)
|
||||
@@ -355,20 +435,23 @@ public class LineMonitorGUI extends XFrame {
|
||||
|
||||
if (timer2 != null)
|
||||
timer2.cancel();
|
||||
|
||||
if (timer3 != null)
|
||||
timer3.cancel();
|
||||
timer = null;
|
||||
}
|
||||
super.setVisible(b);
|
||||
}
|
||||
|
||||
public void updateTraffic() {
|
||||
switch (tr.getMonitor().getState()) {
|
||||
case MonitorData.DOWN:
|
||||
switch (tr.getState()) {
|
||||
case LinkStatus.DOWN:
|
||||
getTitlelabel().setForeground(Color.RED);
|
||||
break;
|
||||
case MonitorData.UNSTABLE:
|
||||
case LinkStatus.UNSTABLE:
|
||||
getTitlelabel().setForeground(Color.YELLOW);
|
||||
break;
|
||||
case MonitorData.UP:
|
||||
case LinkStatus.UP:
|
||||
getTitlelabel().setForeground(Color.GREEN);
|
||||
|
||||
break;
|
||||
|
||||
@@ -3,7 +3,6 @@ package org.kne.cloud.network.klalb.ui;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JLabel;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Button;
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
|
||||
@@ -11,27 +10,22 @@ import javax.swing.SwingConstants;
|
||||
import javax.swing.border.LineBorder;
|
||||
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.ipv6.IPv6Address;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.klalb.CONST;
|
||||
import org.kne.cloud.network.klalb.KLALBController;
|
||||
import org.kne.cloud.network.klalb.KLALBRemoteLine;
|
||||
import org.kne.cloud.network.klalb.KLALBRemoteLink;
|
||||
import org.kne.cloud.network.klalb.KLALBUtils;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import org.kne.cloud.network.monitor.LinkStatus;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.Image;
|
||||
import java.awt.MenuItem;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
@@ -42,7 +36,7 @@ import javax.swing.JMenuItem;
|
||||
public class TPanel2 extends JPanel {
|
||||
private JLabel tname;
|
||||
private JLabel targup;
|
||||
private KLALBRemoteLine tunnel;
|
||||
private KLALBRemoteLink tunnel;
|
||||
private LineMonitorGUI mdg;
|
||||
private JMenuItem mntmNewMenuItem2;
|
||||
private JMenuItem mntmNewMenuItem3;
|
||||
@@ -75,14 +69,14 @@ public class TPanel2 extends JPanel {
|
||||
/**
|
||||
* @wbp.parser.constructor
|
||||
*/
|
||||
public TPanel2(KLALBRemoteLine t,KLALBController kc) {
|
||||
public TPanel2(KLALBRemoteLink t,KLALBController kc) {
|
||||
this.tunnel = t;
|
||||
//setOpaque(false);
|
||||
setBackground(Color.WHITE);
|
||||
setLayout(new BorderLayout(0, 0));
|
||||
|
||||
tname = new JLabel();
|
||||
tname.setText(t.getMonitor().getName());
|
||||
tname.setText(t.getName());
|
||||
tname.setFont(new Font("宋体", Font.BOLD, 14));
|
||||
|
||||
targup = new JLabel();
|
||||
@@ -311,8 +305,8 @@ public class TPanel2 extends JPanel {
|
||||
|
||||
|
||||
private void updateText() {
|
||||
targup.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getOutTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getOutSpeed()) + "/s "+ KLALBUtils.convertUintNanoDefalut(tunnel.getMonitor().getOutDelay()) + "s");
|
||||
targdown.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getInTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getInSpeed()) + "/s " + KLALBUtils.convertUintNanoDefalut( tunnel.getMonitor().getInDelay()) + "s");
|
||||
targup.setText( KLALBUtils. convertIBUint(tunnel.getMonitor().getOutSpeed()) + "/s "+KLALBUtils. convertUintDefalut(tunnel.getMonitor().getOutPPS()) + "PPS "+ KLALBUtils.convertUintNanoDefalut(tunnel.getMonitor().getOutDelay()) + "s");
|
||||
targdown.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getInSpeed()) + "/s "+KLALBUtils. convertUintDefalut(tunnel.getMonitor().getInPPS()) + "PPS " + KLALBUtils.convertUintNanoDefalut( tunnel.getMonitor().getInDelay()) + "s");
|
||||
|
||||
if(tunnel.getMonitor().getOutSpeed()>4096||tunnel.getMonitor().getInSpeed()>4096) {
|
||||
lblNewLabel_2.setBackground(Color.ORANGE);
|
||||
@@ -321,22 +315,22 @@ public class TPanel2 extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
public KLALBRemoteLine getTunnel() {
|
||||
public KLALBRemoteLink getTunnel() {
|
||||
return tunnel;
|
||||
}
|
||||
|
||||
|
||||
public void updateTraffic() {
|
||||
switch (tunnel.getMonitor().getState()) {
|
||||
case MonitorData.DOWN:
|
||||
switch (tunnel.getState()) {
|
||||
case LinkStatus.DOWN:
|
||||
tname.setForeground(Color.RED);
|
||||
lblNewLabel_1.setBackground(Color.LIGHT_GRAY);
|
||||
break;
|
||||
case MonitorData.UNSTABLE:
|
||||
case LinkStatus.UNSTABLE:
|
||||
tname.setForeground(Color.YELLOW);
|
||||
lblNewLabel_1.setBackground(Color.LIGHT_GRAY);
|
||||
break;
|
||||
case MonitorData.UP:
|
||||
case LinkStatus.UP:
|
||||
tname.setForeground(Color.GREEN);
|
||||
lblNewLabel_1.setBackground(Color.GREEN);
|
||||
|
||||
@@ -344,7 +338,7 @@ public class TPanel2 extends JPanel {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(tunnel.getMonitor().getState()!=MonitorData.DOWN) {
|
||||
if(tunnel.getState()!=LinkStatus.DOWN) {
|
||||
|
||||
|
||||
IPv6AddressGroup unvar=tunnel.getRemoteVaddr();
|
||||
|
||||
@@ -1,32 +1,29 @@
|
||||
package org.kne.cloud.network.klalb.ui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Font;
|
||||
import java.awt.FontFormatException;
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.PropertyResourceBundle;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JColorChooser;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
import javax.swing.plaf.ColorChooserUI;
|
||||
|
||||
import org.kne.ui.LinearGradientColor;
|
||||
public class UIEnv {
|
||||
private static Font font;
|
||||
private static Image icon ;
|
||||
private static Color defaultcolor=new Color(207,218,223);//new Color(207,218,223)
|
||||
private static Color selectedcolor=new Color(207/2,218/2,223/2);
|
||||
|
||||
static final LinearGradientColor RANGE_1=new LinearGradientColor(new float[] {0.0f,0.5f,0.8f,1.0f},new Color[] {Color.GREEN,Color.GREEN,Color.YELLOW,Color.RED});
|
||||
static final LinearGradientColor RANGE_2=new LinearGradientColor(new float[] {0.0f,0.05f,0.3f,0.6f,1.0f},new Color[] {Color.GREEN,Color.GREEN,Color.YELLOW,Color.RED,Color.BLACK});
|
||||
static final LinearGradientColor RANGE_3=new LinearGradientColor(new float[] {0.0f,0.02f,0.15f,0.5f,1.0f},new Color[] {Color.GREEN,Color.GREEN,Color.YELLOW,Color.RED,Color.BLACK});
|
||||
static final LinearGradientColor RANGE_4=new LinearGradientColor(new float[] {0.0f,0.01f,0.1f,1.0f},new Color[] {Color.GREEN,Color.YELLOW,Color.RED,Color.BLACK});
|
||||
|
||||
|
||||
private static ResourceBundle rsb;
|
||||
public static void setRsb(String xrsb) throws IOException {
|
||||
rsb=new PropertyResourceBundle(UIEnv.class.getResourceAsStream("/klalb_"+xrsb+".properties"));
|
||||
|
||||
Reference in New Issue
Block a user