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
+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;
}