优化代码,性能暴涨

This commit is contained in:
Administrator
2025-01-29 14:01:11 +08:00
parent e243203535
commit 6de65562be
130 changed files with 9138 additions and 1020 deletions
@@ -2,23 +2,22 @@ package org.kne.cloud.network.klalb;
import java.io.IOException;
import java.net.BindException;
import java.net.ConnectException;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.time.Clock;
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.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -29,46 +28,58 @@ import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
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 java.util.function.Supplier;
import javax.management.openmbean.ArrayType;
import javax.net.ServerSocketFactory;
import javax.net.SocketFactory;
import org.kne.cloud.clock.AdjustedNanoClock;
import org.kne.cloud.network.IPMulticastDiscovery;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.NetworkService;
import org.kne.cloud.network.Proxy;
import org.kne.cloud.network.PortPair;
import org.kne.cloud.network.SocketType;
import org.kne.cloud.network.ThreadTool;
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.Inet6AddressGroup;
import org.kne.cloud.network.monitor.MonitorData;
import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl;
import org.kne.debug.TimeDebugger;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.bytecode.Bytecode;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.CodeIterator;
import org.kne.cloud.network.srv6.PacketConsumer;
import org.kne.cloud.network.srv6.SRv6Router;
import org.kne.cloud.network.te.BandwidthDistributer;
import org.kne.cloud.network.te.DWRRLoadingBalanceAlgorithm;
import org.kne.concurrent.HighPerformanceExecutor;
import org.kne.io.KNEChannels;
import org.pcap4j.packet.IpV6Packet.IpV6Header;
public class KLALBController {
private SpeedAndTrafficMonitorDataImpl linkMonitor=new SpeedAndTrafficMonitorDataImpl();
private SpeedAndTrafficMonitorDataImpl datatMonitor=new SpeedAndTrafficMonitorDataImpl();
private List<MultipurposeSocketAddress>selflineTable=new ArrayList<>();
private static final boolean showpacket = false;
private static final int PREFIX = 112;
private static final int DISCOVERY_PORT=4569;
private static List<IPMulticastDiscovery> ipmd=new ArrayList<>();
private Timer twk=new Timer("网卡检测扫描计时器", true);
{
@@ -76,16 +87,23 @@ public class KLALBController {
@Override
public void run() {
try {
Enumeration<NetworkInterface>eu= NetworkInterface.getNetworkInterfaces();
while (eu.hasMoreElements()) {
NetworkInterface networkInterface = (NetworkInterface) eu.nextElement();
if(networkInterface.getDisplayName().startsWith(IPv6TUNLoopbackNetworkLink.KLALB_DECENTRALIZED_S_RV6_NETWORK)) {
continue;
}
if(networkInterface.isUp()) {
//System.out.println(networkInterface+" "+networkInterface.isUp());
Enumeration<InetAddress>ei= networkInterface.getInetAddresses();
while (ei.hasMoreElements()) {
InetAddress inetAddress = (InetAddress) ei.nextElement();
if(!inetAddress.isLoopbackAddress())
for (Iterator<MultipurposeSocketAddress> iterator = listens.iterator(); iterator.hasNext();) {
MultipurposeSocketAddress tcpl = (MultipurposeSocketAddress) iterator.next();
@@ -107,11 +125,15 @@ public class KLALBController {
}
}
}
}
} catch (SocketException e) {
}
lineslock.writeLock().lock();
try {
List<MultipurposeSocketAddress>localaddress=new ArrayList<>();
Enumeration<NetworkInterface>eu= NetworkInterface.getNetworkInterfaces();
while (eu.hasMoreElements()) {
@@ -169,7 +191,82 @@ public class KLALBController {
}
}
for (Iterator<IPMulticastDiscovery> iterator = ipmd.iterator(); iterator.hasNext();) {
IPMulticastDiscovery ipMulticastDiscovery = (IPMulticastDiscovery) iterator.next();
if(ipMulticastDiscovery.isClosed()||(!ipMulticastDiscovery.getNinterface().isUp())) {
iterator.remove();
try {
ipMulticastDiscovery.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("移除网卡:"+ipMulticastDiscovery.getNinterface());
}
}
Enumeration<NetworkInterface>eu2= NetworkInterface.getNetworkInterfaces();
while (eu2.hasMoreElements()) {
NetworkInterface networkInterface = (NetworkInterface) eu2.nextElement();
if(networkInterface.getDisplayName().startsWith(IPv6TUNLoopbackNetworkLink.KLALB_DECENTRALIZED_S_RV6_NETWORK)) {
continue;
}
if(networkInterface.isUp()) {
boolean b=true;
for (Iterator<IPMulticastDiscovery> iterator = ipmd.iterator(); iterator.hasNext();) {
IPMulticastDiscovery ipMulticastDiscovery = (IPMulticastDiscovery) iterator.next();
if(networkInterface.equals(ipMulticastDiscovery.getNinterface())) {
b=false;
break;
}
}
if(b) {
/*InetAddress bidr=null;
Enumeration<InetAddress>ei= networkInterface.getInetAddresses();
while (ei.hasMoreElements()) {
InetAddress inetAddress = (InetAddress) ei.nextElement();
if(inetAddress instanceof Inet6Address) {
Inet6Address i6=(Inet6Address) inetAddress;
if(i6.getHostAddress().startsWith("fe80")) {
bidr=i6;
break;
}
}
}
if(bidr!=null)*/
try {
InetAddress bidr=InetAddress.getByName("::0");
IPMulticastDiscovery ipd=new IPMulticastDiscovery(new InetSocketAddress(bidr,DISCOVERY_PORT), new InetSocketAddress(InetAddress.getByName("ff02::2486"),DISCOVERY_PORT), networkInterface,selflineTable);
ipd.setCon((mpa)->{
//System.out.println("添加本地IPv6链路:"+mpa);
addRemoteLines(mpa);
});
ipd.start();
ipmd.add(ipd);
bidr=InetAddress.getByName("0.0.0.0");
IPMulticastDiscovery ipd2=new IPMulticastDiscovery(new InetSocketAddress(bidr,DISCOVERY_PORT), new InetSocketAddress(InetAddress.getByName("224.0.0.86"),DISCOVERY_PORT), networkInterface,selflineTable);
ipd2.setCon((mpa)->{
//System.out.println("添加本地IPv4链路:"+mpa);
addRemoteLines(mpa);
});
ipd2.start();
ipmd.add(ipd2);
System.out.println("添加网卡:"+networkInterface);
}catch(BindException e) {
//e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
} catch (SocketException e) {
}finally {
lineslock.writeLock().unlock();
}
}
@@ -229,13 +326,13 @@ public class KLALBController {
}
private Inet6Address self;
private Inet6AddressGroup self;
public Inet6Address getSelf() {
return self;
return self.getAddress();
}
private List<KLALBRemoteLine> lines=new CopyOnWriteArrayList<>();
//private ReadWriteLock lineslock=new ReentrantReadWriteLock();
private ReadWriteLock lineslock=new ReentrantReadWriteLock();
public List<KLALBRemoteLine> getLines() {
return lines;
@@ -256,50 +353,35 @@ public class KLALBController {
}
private PacketReceiver prc=new PacketReceiver();
private class PacketReceiver implements KLALBPacketConsumer{
private class PacketReceiver implements Consumer<KLALBPacket>{
@Override
public void accept(KLALBRemoteLine krs, KLALBPacket rec) {
try {
if(rec instanceof PortPacket&&krs.getRemoteVaddr()!=null) {
PortPacket pt=(PortPacket) rec;
if(!streamPortBinder.distributePacketToConsumer(krs, pt)) {
if(!(pt instanceof RSTPacket))
sendPacketToAddress(krs.getRemoteVaddr(), new RSTPacket(pt.getDport(), pt.getSport()),2);
}
}else {
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);
try {
addRemoteLines(msa);
} catch (SocketTimeoutException e) {
} catch (SocketException e) {
}
}
}).start();
break;
default:
break;
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);
}
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}).start();
break;
default:
break;
}
}
}
public void addRemoteLines(MultipurposeSocketAddress target) throws SocketTimeoutException, SocketException {
public List<KLALBRemoteLine> addRemoteLines(MultipurposeSocketAddress target) {
List<KLALBRemoteLine>added=new ArrayList<>();
try {
Enumeration<NetworkInterface>eu= NetworkInterface.getNetworkInterfaces();
while (eu.hasMoreElements()) {
@@ -320,19 +402,35 @@ public class KLALBController {
} catch (UnknownHostException e) {
}
if(!checkContainsTargetAndBind(target,bind)) {
//System.out.println(target+" "+bind);
addRemoteLine( new KLALBRemoteLine(target,bind));
KLALBRemoteLine line=new KLALBRemoteLine(target,bind);
addRemoteLine(line );
added.add(line);
}
}
}
}
} catch (SocketException e) {
if(!checkContainsTarget(target))
addRemoteLine( new KLALBRemoteLine(target));
if(!checkContainsTarget(target)) {
KLALBRemoteLine line= new KLALBRemoteLine(target);
addRemoteLine(line);
added.add(line);
}
//throw e;
}
return added;
}
public List<KLALBRemoteLine> removeRemoteLines(MultipurposeSocketAddress mpsa) {
List<KLALBRemoteLine>rmved=new ArrayList<>();
for (Iterator<KLALBRemoteLine> iterator = lines.iterator(); iterator.hasNext();) {
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
if(mpsa.equals( klalbRemoteLine.getSocketAddress())){
klalbRemoteLine.close();
rmved.add(klalbRemoteLine);
}
}
return rmved;
}
public Inet6Address getRemoteVaddrBySocketAddress(MultipurposeSocketAddress target) throws SocketTimeoutException {
KLALBRemoteLine kr=null;
@@ -352,7 +450,7 @@ public class KLALBController {
kr.reconnectImmediately();
kr.waitForRemoteVaddrAvaliable(20000);
}
return kr.getRemoteVaddr();
return kr.getRemoteVaddr().getAddress();
}
private boolean checkContainsTargetAndBind(MultipurposeSocketAddress target,MultipurposeSocketAddress bind) {
boolean b=false;
@@ -386,7 +484,12 @@ public class KLALBController {
String selflineTable=generateSelfLineTable();
if(selflineTable!=null&&!selflineTable.equals(""))
krs.sendPacket(new ADDLINESPacket(selflineTable));
lineslock.writeLock().lock();
try {
lines.add(krs);
}finally {
lineslock.writeLock().unlock();
}
}
@@ -401,11 +504,77 @@ public class KLALBController {
}
public KLALBController(Inet6Address self) {
this.self = self;
this.self =new Inet6AddressGroup(self, PREFIX);
loadSRv6ProtocolStack();
}
private class KLALBProtocolPacketConsumer implements PacketConsumer{
@Override
public void accept(IPv6Packet packx) throws IOException {
HighPerformanceExecutor.defaultExecutor.execute(()->{
/*System.out.println("RCV:"+packx.getPayload().getData());
byte[]b=new byte[packx.getPayload().getData().limit()];
packx.getPayload().getData().get(0, b);
System.out.println(Arrays.toString(b));*/
IPv6Payload pl=packx.getPayload();
packx.putTimePassport("unpacked");
packx.printPassport();
if(pl instanceof KLALBPacket) {
KLALBPacket rec=(KLALBPacket) pl;
//KLALBPacket rec=KLALBPacket.createByBuffer(packx.getPayload().getData());
if(showpacket)
System.out.println("KLALB_RX:"+rec);
if(rec instanceof PortPacket) {
rec.setCE(packx.isCE());
Inet6Address srcA=packx.getSourceAddress();
PortPacket pt=(PortPacket) rec;
if(!streamPortBinder.distributePacketToConsumer( srcA,pt)) {
if(!(pt instanceof RSTPacket))
try {
sendPacketToAddress(srcA,0, new RSTPacket(pt.getDport(), pt.getSport()),2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
packx.dispose();
});
}
}
private void loadSRv6ProtocolStack() {
srv6Router=new SRv6Router(self);
try {
IPv6TUNLoopbackNetworkLink tunlink=new IPv6TUNLoopbackNetworkLink(new Inet6AddressGroup( srv6Router.getLocator().getAddress(),32),SRv6Router.MTU);
tunlink.setMonitor(datatMonitor);
srv6Router.getLinkTabel().add(tunlink);
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
srv6Router.runKLALBRouteProtocol();
srv6Router.getProtocolNumberRegister().put(KLALBPacket.KLALB_PROTOCOL_NUMBER,new KLALBProtocolPacketConsumer());
System.out.println("SRv6协议栈已加载");
}
public KLALBController() {
this.self=KLALBUtils.uuidToIP(UUID.randomUUID());
SecureRandom sc=new SecureRandom();
byte[]v=new byte[16];
sc.nextBytes(v);
v[0]=(byte)0x24;
v[1]=(byte) 0x86;
v[2]=0;
v[3]=1;
v[14]=0;
v[15]=1;
try {
this.self=new Inet6AddressGroup( (Inet6Address) InetAddress.getByAddress(v),PREFIX);
} catch (UnknownHostException e) {
e.printStackTrace();
}
loadSRv6ProtocolStack();
}
protected KLALBVirtualSocketImpl createVirtualImpl() {
@@ -416,9 +585,16 @@ public class KLALBController {
protected void sendPacketToAddress(Inet6Address addr, KLALBPacket packet)
protected void sendPacketToLinkAddress(Inet6Address addr, KLALBPacket packet)
throws IOException {
sendPacketToAddress(addr, packet, 1);
sendPacketToLinkAddress(addr, packet, 1);
}
private SRv6Router srv6Router;
public SRv6Router getIpv6Router() {
return srv6Router;
}
private Timer trtr=new Timer("路由表刷新计时器", true);
@@ -427,35 +603,55 @@ private Timer trtr=new Timer("路由表刷新计时器", true);
@Override
public void run() {
Map<Inet6Address,List<KLALBRemoteLine>> lines2 =new ConcurrentHashMap<>();
Map<Inet6Address,DWRRLoadingBalanceAlgorithm<KLALBRemoteLine>> lines2 =new ConcurrentHashMap<>();
for (Iterator<KLALBRemoteLine> iterator = lines.iterator(); iterator.hasNext();) {
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
if(klalbRemoteLine.isClosed()) {
lineslock.writeLock().lock();
try {
lines.remove(klalbRemoteLine);
}finally{
lineslock.writeLock().unlock();
}
}else {
if(klalbRemoteLine.getRemoteVaddr()!=null&&klalbRemoteLine.getMonitor().getState()==MonitorData.ONLINE) {
if(lines2.containsKey(klalbRemoteLine.getRemoteVaddr())) {
lines2.get(klalbRemoteLine.getRemoteVaddr()).add(klalbRemoteLine);
lines2.get(klalbRemoteLine.getRemoteVaddr()).getEntries().add(klalbRemoteLine);
}else {
ArrayList<KLALBRemoteLine>al1=new ArrayList<>();
al1.add(klalbRemoteLine);
lines2.put(klalbRemoteLine.getRemoteVaddr(), al1);
lines2.put(klalbRemoteLine.getRemoteVaddr().getAddress(), new DWRRLoadingBalanceAlgorithm<>(al1));
}
if(!srv6Router.getLinkTabel().contains(klalbRemoteLine)) {
srv6Router.getLinkTabel().add(klalbRemoteLine);
}
}
}
}
for (Iterator<Entry<Inet6Address, List<KLALBRemoteLine>>> iterator = lines2.entrySet().iterator(); iterator.hasNext();) {
Entry<Inet6Address, List<KLALBRemoteLine>> klalbRemoteLine = (Entry<Inet6Address, List<KLALBRemoteLine>>) iterator.next();
klalbRemoteLine.getValue().forEach((r)->{
for (Iterator<Entry<Inet6Address, DWRRLoadingBalanceAlgorithm<KLALBRemoteLine>>> iterator = lines2.entrySet().iterator(); iterator.hasNext();) {
Entry<Inet6Address, DWRRLoadingBalanceAlgorithm<KLALBRemoteLine>> klalbRemoteLine = (Entry<Inet6Address, DWRRLoadingBalanceAlgorithm<KLALBRemoteLine>>) iterator.next();
List<KLALBRemoteLine> lineList=klalbRemoteLine.getValue().getEntries();
lineList.forEach((r)->{
r.runPredict();
});
Collections.sort(klalbRemoteLine.getValue());
Collections.sort(lineList);
for (int i = 0; i < lineList.size(); i++) {
KLALBRemoteLine krl=lineList.get(i);
krl.noticeRank(i);
}
}
KLALBController.this.lines2=lines2;
if(srv6Router!=null) {
srv6Router.getLinkTabel().removeIf((v)->{
return (v instanceof KLALBRemoteLine)&&(!v.isUp());
});
srv6Router.updateRouteTabel();
}
}
}, 5, 5);
}, 1, 1);
}
private void updateLines2(Inet6Address addr) throws SocketTimeoutException {
/*private void updateLines2(Inet6Address addr) throws SocketTimeoutException {
List<KLALBRemoteLine> l=new ArrayList();
for (int i = 0; i < lines.size(); i++) {
KLALBRemoteLine klalbRemoteLine = lines.get(i);
@@ -478,11 +674,11 @@ private Timer trtr=new Timer("路由表刷新计时器", true);
Collections.sort(l);
lines2.put(addr, l);
}
}
private Map<Inet6Address,List<KLALBRemoteLine>> lines2 = new ConcurrentHashMap<>();
}*/
private Map<Inet6Address, DWRRLoadingBalanceAlgorithm<KLALBRemoteLine>> lines2 = new ConcurrentHashMap<>();
protected void sendPacketToAddress(Inet6Address addr, KLALBPacket packet, int count)
protected void sendPacketToLinkAddress(Inet6Address addr, KLALBPacket packet, int count)
throws IOException {
if(packet==null)
throw new NullPointerException("packet is null!");
@@ -491,7 +687,7 @@ private Timer trtr=new Timer("路由表刷新计时器", true);
//tdb.putTime("start");
packet.genseq();
loop:while(true) {
/*loop:while(true) {
if(packet.isDisposed())
return;
List<KLALBRemoteLine> lines2x;
@@ -508,8 +704,9 @@ private Timer trtr=new Timer("路由表刷新计时器", true);
KLALBRemoteLine krst =lines2x.get(i);
if(krst.getMonitor().getState()==MonitorData.ONLINE)
if(!packet.getSendRecord().contains(krst)) {
if(krst.getQueue().size()<3) {
if(krst.getQueue().size()<10) {
packet.getSendRecord().add(krst);
//System.out.println(krst);
krst.sendPacket(packet);
count0--;
if (count0 <= 0)
@@ -521,8 +718,9 @@ private Timer trtr=new Timer("路由表刷新计时器", true);
KLALBRemoteLine krst =lines2x.get(i);
if(krst.getMonitor().getState()==MonitorData.ONLINE)
if(packet.getSendRecord().contains(krst)) {
if(krst.getQueue().size()<3) {
if(krst.getQueue().size()<10) {
packet.getSendRecord().add(krst);
//System.out.println(krst);
krst.sendPacket(packet);
count0--;
if (count0 <= 0)
@@ -532,7 +730,7 @@ private Timer trtr=new Timer("路由表刷新计时器", true);
}
LockSupport.parkNanos(50000);
//tdb.putTime("sendfailed");
}
}*/
//tdb.putTime("sendsuccess");
//tdb.print();
@@ -545,17 +743,160 @@ private Timer trtr=new Timer("路由表刷新计时器", true);
KLALBRemoteLine kr= lines2x.get(0);
kr.sendPacket(packet);
packet.getSendRecord().add(kr);*/
/*loop:while(true) {
if(packet.isDisposed())
return;
DWRRLoadingBalanceAlgorithm<KLALBRemoteLine> dwrlines2x;
dwrlines2x=lines2.get(addr);
if (dwrlines2x == null || dwrlines2x.getEntries().isEmpty()) {
throw new NoRouteToHostException("address unreachable: " + addr);
}
List<KLALBRemoteLine>lines2x=dwrlines2x.roundEntriesList();
int count0 = Math.min(count, lines2x.size());
for (int i = 0; i < lines2x.size(); i++) {
KLALBRemoteLine krst =lines2x.get(i);
if(krst.getMonitor().getState()==MonitorData.ONLINE)
if(!packet.getSendRecord().contains(krst)) {
if(krst.getQueue().size()<5) {
packet.getSendRecord().add(krst);
//System.out.println(krst);
krst.sendPacket(packet);
count0--;
if (count0 <= 0)
break loop;
}
}
}
for (int i = 0; i < lines2x.size(); i++) {
KLALBRemoteLine krst =lines2x.get(i);
if(krst.getMonitor().getState()==MonitorData.ONLINE)
if(packet.getSendRecord().contains(krst)) {
if(krst.getQueue().size()<5) {
packet.getSendRecord().add(krst);
//System.out.println(krst);
krst.sendPacket(packet);
count0--;
if (count0 <= 0)
break loop;
}
}
}
LockSupport.parkNanos(50000);
//tdb.putTime("sendfailed");
}*/
}
/*protected void removeFromSend(Inet6Address addr,KLALBPacket klalbPacket) {
for (Iterator iterator = lines.iterator(); iterator.hasNext();) {
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
klalbRemoteLine.remoeFromSendQueue(klalbPacket);
protected void sendPacketToAddress(Inet6Address addr,int flowlabel, KLALBPacket packet)
throws IOException {
sendPacketToAddress(addr,flowlabel, packet, 1);
}
protected void sendPacketToAddress(Inet6Address addr, int flowlabel,KLALBPacket packet, int count)
throws IOException {
HighPerformanceExecutor.defaultExecutor.execute(()->{
IPv6Packet ipv=new IPv6Packet();
packet.getDisposeLock().lock();
try {
if(packet.isDisposed()) {
return;
}
if(showpacket)
System.out.println("KLALB_TX:"+packet);
ipv.setVersion(6);
ipv.setTrafficClass(0);
ipv.setFlowLabel(flowlabel);
ipv.setHopLimit(255);
ipv.setSourceAddress(self.getAddress());
ipv.setDestinationAddress(addr);
ipv.setPriority(packet.getPriority());
ipv.enableECN();
ipv.setPayload(packet);
//System.out.println(ipv.getPayload().getProtocolNumber());
/*System.out.println("SND:"+ipv.getPayload().getData());
byte[]b=new byte[ipv.getPayload().getData().limit()];
ipv.getPayload().getData().get(0, b);
System.out.println(Arrays.toString(b));*/
//packet.getSendRecord().add(null);
packet.incSendCounter();
}finally {
packet.getDisposeLock().unlock();
}
packet.putTimePassport("packedInIPv6");
packet.printPassport();
ipv.putTimePassport("packed");
srv6Router.putProtocolNumberPacketAndInsertSRH(ipv);
});
}
private Map<Inet6Address,BandwidthDistributer<PortPair>> bandwidthDistrmap=new ConcurrentHashMap<>();
private Lock bdmLock=new ReentrantLock();
protected Map<Inet6Address, BandwidthDistributer<PortPair>> getBandwidthDistrmap() {
return bandwidthDistrmap;
}
protected void registerDistUpdateConsumer(Inet6Address targetaAddress,PortPair portp, Consumer<Long> updateConsumer) {
if(updateConsumer==null) {
System.out.println("连接"+targetaAddress.getHostAddress()+" "+portp+" 释放带宽!");
bdmLock.lock();
try {
BandwidthDistributer<PortPair> bdr= bandwidthDistrmap.get(targetaAddress);
if(bdr!=null) {
bdr.setDistrUpdateConsumer(portp, updateConsumer);
bdr.setBandwidthRequest(portp, 0L);
if(bdr.getDistrUpdateConsumerMap().isEmpty()) {
bandwidthDistrmap.remove(targetaAddress);
}
}
}finally {
bdmLock.unlock();
}
}else {
System.out.println("连接"+targetaAddress.getHostAddress()+" "+portp+" 申请带宽!");
bdmLock.lock();
try {
BandwidthDistributer<PortPair> bdr= bandwidthDistrmap.get(targetaAddress);
if(bdr==null) {
bandwidthDistrmap.put(targetaAddress, bdr=new BandwidthDistributer<>(1024*20000L*1024));
}
}*/
bdr.setDistrUpdateConsumer(portp, updateConsumer);
}finally {
bdmLock.unlock();
}
}
}
protected void updateBandwidthRequest(Inet6Address targetaAddress,PortPair portp,long bandwidth) {
if(bandwidth<0) {
throw new IllegalArgumentException(bandwidth+"<0");
}
//System.out.println("连接"+targetaAddress.getHostAddress()+" "+portp+" 调整带宽到"+bandwidth/1024 +"KB/s!");
BandwidthDistributer<PortPair> bdr= bandwidthDistrmap.get(targetaAddress);
if(bdr!=null) {
bdr.setBandwidthRequest(portp, bandwidth);
}else {
throw new NullPointerException("连接"+targetaAddress.getHostAddress()+" "+portp+" 未申请带宽!");
}
}
private Timer t=new Timer("数据包重传计时器", true);
public Timer getResendTimer() {
protected Timer getResendTimer() {
return t;
}
private Timer t2=new Timer("数据包粘包计时器", true);