KLALB 3.6.0开发一半的状态

This commit is contained in:
2026-07-06 17:03:27 +08:00
parent 620afef715
commit c8b183da71
90 changed files with 1963 additions and 3757 deletions
@@ -1,16 +1,9 @@
package org.kne.cloud.network.ipv6;
import java.io.IOException;
import java.net.Inet6Address;
import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.kne.cloud.network.klalb.KLALBRemoteLine;
import org.kne.cloud.network.srv6.SRv6Router;
public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink {
@@ -6,11 +6,10 @@ import java.util.function.Consumer;
public interface ControlledIPv6NetworkLink extends IPv6NetworkLink {
public boolean isCongress(IPv6Packet iPv6Packet,double scale);
public boolean isCongestion(IPv6Packet iPv6Packet,double scale);
public default boolean isCongress(IPv6Packet iPv6Packet) {
return isCongress(iPv6Packet, 1.0);
return isCongestion(iPv6Packet, 1.0);
}
void setRerouteConsumer(Consumer<IPv6Packet> rerouteConsumer);
public boolean isReachSpeedLimit(IPv6Packet iPv6Packet);
public void setCongressCondition(Lock lock,Condition condition);
}
@@ -34,7 +34,7 @@ public class ICMPv6Packet extends IPv6Payload {
private boolean isDefault;
protected ICMPv6Packet(ByteBuffer header,boolean isDefault) {
super(ICMPv6_PROTOCOL_NUMBER, false);
super(ICMPv6_PROTOCOL_NUMBER);
this.header=header;
this.isDefault=isDefault;
@@ -45,7 +45,7 @@ public class ICMPv6Packet extends IPv6Payload {
}
protected ICMPv6Packet(int type, int code,boolean isDefault) {
super(ICMPv6_PROTOCOL_NUMBER, false);
super(ICMPv6_PROTOCOL_NUMBER);
header = NetworkPacket.bufferAllocator.allocate(ICMPv6_HEADER_LENGTH);
getHeader().put((byte) type);
getHeader().put((byte) code);
+67 -85
View File
@@ -4,32 +4,21 @@ import java.io.EOFException;
import java.io.IOException;
import java.io.StreamCorruptedException;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.kne.cloud.network.ByteBufferAllocator;
import org.kne.cloud.network.NetworkPacket;
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6ExtHeader;
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6SegmentRoutingHeader;
import org.kne.cloud.network.klalb.KLALBPacket;
import org.kne.cloud.network.kltp.KLTPPacket;
import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV;
import org.kne.cloud.network.srv6.IpV6RoutingSRHData;
import org.kne.cloud.network.srv6.SRv6Pad1TLV;
import org.kne.cloud.network.srv6.SRv6PadNTLV;
import org.kne.cloud.network.srv6.SRv6StreamSequenceTLV;
import org.kne.cloud.network.srv6.SRv6TLV;
import org.kne.cloud.network.tcp.UDPPacket;
import org.kne.io.KNEChannels;
import org.pcap4j.packet.namednumber.IpNumber;
/**
* IPv6数据包类,继承自NetworkPacket,用于处理IPv6网络数据包
@@ -231,15 +220,7 @@ public class IPv6Packet extends NetworkPacket {
nextHeader == ICMPv6;
}
private IPv6NetworkLink previousLink;
public IPv6NetworkLink getPreviousLink() {
return previousLink;
}
public void setPreviousLink(IPv6NetworkLink previousLink) {
this.previousLink = previousLink;
}
// TTL是否已减少的标志
private boolean TTLdecreased = false;
@@ -318,7 +299,10 @@ public class IPv6Packet extends NetworkPacket {
* @return 流量类别
*/
public int getTrafficClass() {
return (IPv6header.get(0) << 4) & (IPv6header.get(1) >>> 4) & BIT_MASK_LOW_8_BITS;
// 读取字节 0 和字节 1 组成一个 short(16 位)
short firstTwoBytes = IPv6header.getShort(0);
// 提取 Traffic Class:高 4 位(Version)去掉,剩下就是 8 位 Traffic Class
return (firstTwoBytes & 0x0FF0) >>> 4;
}
/**
@@ -326,8 +310,14 @@ public class IPv6Packet extends NetworkPacket {
* @param trafficClass 流量类别
*/
public void setTrafficClass(int trafficClass) {
IPv6header.put(0, (byte) (IPv6header.get(0) & BIT_MASK_HIGH_4_BITS | (trafficClass >>> 4)));
IPv6header.put(1, (byte) (IPv6header.get(1) & BIT_MASK_LOW_4_BITS | ((trafficClass & BIT_MASK_LOW_4_BITS) << 4)));
// 读取当前的两个字节
short firstTwoBytes = IPv6header.getShort(0);
// 清除原来的 Traffic Class 位(将中间 8 位清零)
short cleared = (short) (firstTwoBytes & 0xF00F); // 保留高 4 位和低 4 位
// 组合新的 Traffic Class
short newValue = (short) (cleared | ((trafficClass & 0xFF) << 4));
// 一次性写回
IPv6header.putShort(0, newValue);
}
/**
@@ -349,7 +339,11 @@ public class IPv6Packet extends NetworkPacket {
* 标记CE(拥塞经历)
*/
public void markCE() {
IPv6header.put(1, (byte) (IPv6header.get(1) | 0b00110000));
byte g=IPv6header.get(1);
if((g& 0b00110000) != 0) {
// 启用ECN
IPv6header.put(1, (byte) ( g| 0b00110000));
}
// new Exception().printStackTrace();
}
@@ -366,7 +360,10 @@ public class IPv6Packet extends NetworkPacket {
* @return 流标签
*/
public int getFlowLabel() {
return ((IPv6header.get(1) & BIT_MASK_LOW_4_BITS) << 16) | (IPv6header.getShort(2) & BIT_MASK_LOW_16_BITS);
// 读取前 4 个字节(32 位)
int firstWord = IPv6header.getInt(0);
// 提取 Flow Label:高 12 位(Version + Traffic Class)去掉,剩下低 20 位
return firstWord & 0x000FFFFF;
}
/**
@@ -374,8 +371,14 @@ public class IPv6Packet extends NetworkPacket {
* @param flowLabel 流标签
*/
public void setFlowLabel(int flowLabel) {
IPv6header.put(1, (byte) (IPv6header.get(1) & BIT_MASK_HIGH_4_BITS | (flowLabel >>> 16)));
IPv6header.putShort(2, (short) flowLabel);
// 读取当前前 4 个字节
int firstWord = IPv6header.getInt(0);
// 清除原来的 Flow Label(将低 20 位清零)
int cleared = firstWord & 0xFFF00000; // 保留高 12 位
// 组合新的 Flow Label(只取低 20 位)
int newWord = cleared | (flowLabel & 0x000FFFFF);
// 一次性写回
IPv6header.putInt(0, newWord);
}
/**
@@ -461,7 +464,6 @@ public class IPv6Packet extends NetworkPacket {
/**
* 获取原始源地址字节数组
* @param sourceAddress 用于存储源地址的字节数组
* @return
*/
public IPv6Address getSourceAddress() {
@@ -479,7 +481,6 @@ public class IPv6Packet extends NetworkPacket {
/**
* 获取原始目标地址字节数组
* @param destinationAddress 用于存储目标地址的字节数组
*/
public IPv6Address getDestinationAddress() {
return IPv6Address.valueOf(DESTINATION_ADDRESS_OFFSET,IPv6header);
@@ -707,13 +708,12 @@ public class IPv6Packet extends NetworkPacket {
KLALBPacket kp = KLALBPacket.readKLALBPacketFromChannel(din);
this.payload = kp;
break loop;
case EXPERIMENTAL_1: // 空负载
IPv6Payload epld = new IPv6EmptyPayload();
epld.readFromChannel(din, payloadlength);
case KLTPPacket.KLTP_PROTOCOL_NUMBER: //KLTP协议
IPv6Payload epld = KLTPPacket.readKLTPPacketFromChannel(din);
this.payload = epld;
break loop;
default: // 其他协议类型
IPv6Payload pld = new IPv6Payload(nextheader);
IPv6Payload pld = new IPv6DefaultPayload(nextheader);
pld.readFromChannel(din, payloadlength);
this.payload = pld;
break loop;
@@ -754,56 +754,28 @@ public class IPv6Packet extends NetworkPacket {
/**
* IPv6负载数据类
*/
public static class IPv6Payload extends NetworkPacket {
private ByteBuffer data;
public static abstract class IPv6Payload extends NetworkPacket {
private boolean onDefault = true;
private IPv6Packet parent;
public ByteBuffer getData() {
return data;
}
private int protocolNumber;
public IPv6Payload(int protocolNumber) {
this(protocolNumber, true);
this.protocolNumber=protocolNumber;
}
protected IPv6Payload(int protocolNumber, boolean isonDefault) {
this.protocolNumber = protocolNumber;
this.onDefault = isonDefault;
if (onDefault)
this.data = NetworkPacket.bufferAllocator.allocate(65535);
}
public int getProtocolNumber() {
return protocolNumber;
}
public long getTotalLength() {
return data.limit();
}
@Override
public void writeToChannel(WritableByteChannel dto) throws IOException {
if (onDefault)
dto.write(data.slice(0, data.limit()));
}
@Override
public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
if (onDefault) {
data.limit((int) length);
while (data.hasRemaining()) {
if (din.read(data) == -1) {
throw new EOFException();
}
}
}
}
@Override
protected boolean needEndPosition() {
@@ -817,31 +789,37 @@ public class IPv6Packet extends NetworkPacket {
return parent;
}
}
public static class IPv6DefaultPayload extends IPv6Payload{
/**
* 空IPv6负载数据类
*/
public static class IPv6EmptyPayload extends IPv6Payload {
public IPv6EmptyPayload() {
super(EXPERIMENTAL_1, false);
private ByteBuffer data;
public ByteBuffer getData() {
return data;
}
@Override
public IPv6DefaultPayload(int protocolNumber) {
super(protocolNumber);
this.data = NetworkPacket.bufferAllocator.allocate(65535);
}
public long getTotalLength() {
return 0;
return data.limit();
}
@Override
public void writeToChannel(WritableByteChannel dto) throws IOException {
dto.write(data.slice(0, data.limit()));
}
@Override
public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
data.limit((int) length);
while (data.hasRemaining()) {
if (din.read(data) == -1) {
throw new EOFException();
}
}
}
}
/**
* IPv6扩展头部基类
@@ -1131,12 +1109,16 @@ public class IPv6Packet extends NetworkPacket {
public IPv6SegmentRoutingHeader(List<IPv6Address> segs) {
this();
this.addresses.addAll(segs);
int ln = addresses.size() - 1;
setLastEntry(ln);
setSegmentsLeft(ln);
resetSegmentPos();
}
public int getLastEntry() {
public void resetSegmentPos() {
int ln = addresses.size() - 1;
setLastEntry(ln);
setSegmentsLeft(ln);
}
public int getLastEntry() {
return getData().get(4) & BIT_MASK_LOW_8_BITS;
}
@@ -8,7 +8,6 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
@@ -22,12 +21,7 @@ import org.kne.cloud.network.klalb.CONST;
import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl;
import org.kne.cloud.network.srv6.DetNetSRv6TLV;
import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV;
import org.kne.cloud.network.srv6.IpV6RoutingSRHData;
import org.kne.cloud.network.srv6.PacketConsumer;
import org.kne.cloud.network.srv6.SRv6PacketReorder;
import org.kne.cloud.network.srv6.SRv6Router;
import org.kne.cloud.network.srv6.SRv6StreamSequenceTLV;
import org.kne.cloud.network.srv6.SRv6TLV;
import org.kne.cloud.network.tun.InetAddressRow;
import org.kne.cloud.network.tun.TUNChannel;
import org.kne.cloud.network.tun.TUNNetworkDevice;
@@ -94,7 +88,7 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
con.accept(IPv6TUNLoopbackNetworkLink.this, () -> {
UUID pid = ipp.getPacketID();
if (pid != null) {
monitor.getUploadBandwidth().recordPacket(pid, (int) ipp.getTotalLength());
monitor.getUploadBandwidth().recordPacket(pid,1, (int) ipp.getTotalLength());
}
// ipp.setDisposeAfterSend(true);
// ipp.getPayload().setDisposeAfterSend(true);
@@ -203,23 +197,14 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
pack.writeToChannel(KNEChannels.newWritableChannel(tmp));
UUID pid = pack.getPacketID();
if (pid != null) {
monitor.getUploadBandwidth().recordPacket(pid, (int) pack.getTotalLength());
monitor.getUploadBandwidth().recordPacket(pid, 1,(int) pack.getTotalLength());
}
tmp.flip();
sendQueue.add(tmp);
LockSupport.unpark(tr);
}
private SRv6StreamSequenceTLV getStreamSequenceTLV(IpV6RoutingSRHData srh) {
List<SRv6TLV> stv = srh.getTlvs();
for (Iterator iterator = stv.iterator(); iterator.hasNext();) {
SRv6TLV sRv6TLV = (SRv6TLV) iterator.next();
if (sRv6TLV.getType() == SRv6TLV.SEQS) {
return (SRv6StreamSequenceTLV) sRv6TLV;
}
}
return null;
}
@Override
public boolean isLoopBack() {
@@ -282,11 +267,11 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
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, null, "D", false);
rlist.add(ri);
RouteItem ris = new RouteItem(addresses.getLocator(), addresses.getLocator().getAddress(), this,
"KLALB SRv6", 13, 128, addresses.getMonitor(), "D", false);
"KLALB SRv6", 13, 128, null, "D", false);
rlist.add(ris);
}
@@ -1,19 +1,13 @@
package org.kne.cloud.network.ipv6;
import java.io.IOException;
import java.net.Inet6Address;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.kne.cloud.network.srv6.PacketConsumer;
import org.kne.cloud.network.srv6.SRv6Router;
public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements IPv6NetworkLink {
@@ -28,9 +22,9 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
this.fallbackLink = fallbackLink;
}
private Map<Integer, PacketConsumer> protocolNumberRegister = new ConcurrentHashMap<>(256 * 2);
private IPv6ProtocolRegister[] protocolNumberRegister = new IPv6ProtocolRegister[256];
public Map<Integer, PacketConsumer> getProtocolNumberRegister() {
public IPv6ProtocolRegister[] getProtocolNumberRegister() {
return protocolNumberRegister;
}
@@ -46,9 +40,9 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
@Override
public void sendPacket(IPv6Packet pack, IPv6Address next) throws IOException {
PacketConsumer pcm= protocolNumberRegister.get(pack.getPayload().getProtocolNumber());
IPv6ProtocolRegister pcm= protocolNumberRegister[pack.getPayload().getProtocolNumber()];
if (pcm != null) {
if(!pcm.accept(pack)) {
if(!pcm.onaccept(pack)) {
if(fallbackLink!=null) {
fallbackLink.sendPacket(pack, next);
}
@@ -110,13 +104,13 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
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",
addresses.getAddress().getAddress(), this, "Direct", 0, 128, null, "D",
false);
rlist.add(ri);
RouteItem ris = new RouteItem(addresses.getLocator(),
addresses.getLocator().getAddress(), this, "KLALB SRv6", 13, 128,
addresses.getMonitor(), "D", false);
null, "D", false);
rlist.add(ris);
}
+12 -20
View File
@@ -1,14 +1,7 @@
package org.kne.cloud.network.ipv6;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.Objects;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.monitor.DelayMonitorData;
import org.kne.cloud.network.monitor.MonitorData;
import java.util.function.Supplier;
public class RouteItem implements Comparable<RouteItem>,Cloneable{
private IPv6AddressGroup destination;
@@ -18,14 +11,11 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
private int pre;
private long cost;
private String flag;
private MonitorData monitor;
private Supplier<Long> costSupplier;
private boolean isLoopback;
public String getFlag() {
return flag;
}
public MonitorData getMonitor() {
return monitor;
}
@Override
public int hashCode() {
return Objects.hash(cost, destination, destlink, flag, nexthop, pre, proto);
@@ -56,7 +46,7 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
this.isLoopback=isLoopback;
}
public RouteItem(IPv6AddressGroup destination, IPv6Address nexthop, IPv6NetworkLink destlink, String proto, int pre,
long cost,MonitorData monitor,String flag,boolean isLoopback) {
long cost,Supplier<Long> costSupplier,String flag,boolean isLoopback) {
super();
this.destination = destination;
this.nexthop = nexthop;
@@ -64,7 +54,7 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
this.proto = proto;
this.pre = pre;
this.cost = cost;
this.monitor=monitor;
this.costSupplier=costSupplier;
this.flag=flag;
this.isLoopback=isLoopback;
}
@@ -99,6 +89,7 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
public boolean checkMatch(byte[] ia) {
return destination.checkMatch(ia);
}*/
@Override
public int compareTo(RouteItem o) {
int v1=destination.compareTo(o.destination);
@@ -110,22 +101,23 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
int v3=Long.compare(cost, o.cost);
return v3;
}
public Supplier<Long> getCostSupplier() {
return costSupplier;
}
@Override
public Object clone() {
try {
RouteItem ri=(RouteItem) super.clone();
if(monitor!=null)
ri.monitor=(MonitorData) monitor.clone();
return ri;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
public void preSort() {
if(monitor!=null) {
cost=((DelayMonitorData)monitor).getOutDelay();
//在排序前调用,计算cost
public void updateCost() {
if(costSupplier!=null) {
cost=costSupplier.get();
}
}
public boolean ECMPequals(RouteItem prevr) {
+1 -1
View File
@@ -43,7 +43,7 @@ public static final int PAD1=0;
private boolean isDefault;
protected volatile ByteBuffer header;
protected ByteBuffer header;
private ByteBuffer data;