KLALB 3.6.0开发一半的状态
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user