KLALB V3.6.0 写了一半

This commit is contained in:
Administrator
2026-02-27 08:32:03 +08:00
parent 816e672843
commit 620afef715
164 changed files with 8381 additions and 13495 deletions
+156 -85
View File
@@ -12,6 +12,7 @@ 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;
@@ -35,6 +36,8 @@ import org.pcap4j.packet.namednumber.IpNumber;
*/
public class IPv6Packet extends NetworkPacket {
private static final boolean debug=false;
// ==================== IPv6扩展头类型 ====================
/** 逐跳选项头 - RFC 8200 */
@@ -238,17 +241,6 @@ public class IPv6Packet extends NetworkPacket {
this.previousLink = previousLink;
}
// 流序列标记,用于标识数据包在流中的顺序
private long flowSeqMark = -1;
public long getFlowSeqMark() {
return flowSeqMark;
}
public void setFlowSeqMark(long flowSeqMark) {
this.flowSeqMark = flowSeqMark;
}
// TTL是否已减少的标志
private boolean TTLdecreased = false;
@@ -261,14 +253,19 @@ public class IPv6Packet extends NetworkPacket {
}
// IPv6头部数据缓冲区
private volatile ByteBuffer IPv6header;
private ByteBuffer IPv6header;
private IPv6HopByHopHeader hopByHopHeader;
private IPv6RoutingHeader routingHeader;
// IPv6扩展头部列表
private volatile List<IPv6ExtHeader> headers = new ArrayList<>();
private List<IPv6ExtHeader> headers = new ArrayList<>();
// IPv6负载数据
private IPv6Payload payload;
// IPv6头部固定长度
public static final int IPv6_HEADER_LENGTH = 40;
@@ -289,7 +286,6 @@ public class IPv6Packet extends NetworkPacket {
*/
public IPv6Packet() {
IPv6header = NetworkPacket.bufferAllocator.allocate(IPv6_HEADER_LENGTH);
IPv6header.limit(IPv6_HEADER_LENGTH);
}
/**
@@ -354,7 +350,7 @@ public class IPv6Packet extends NetworkPacket {
*/
public void markCE() {
IPv6header.put(1, (byte) (IPv6header.get(1) | 0b00110000));
// new Exception().printStackTrace();
// new Exception().printStackTrace();
}
/**
@@ -434,7 +430,7 @@ public class IPv6Packet extends NetworkPacket {
* 获取原始源地址字节数组
* @param sourceAddress 用于存储源地址的字节数组
*/
public void getRawSourceAddress(byte[] sourceAddress) {
public void getRawSourceAddressArray(byte[] sourceAddress) {
IPv6header.get(SOURCE_ADDRESS_OFFSET, sourceAddress, 0, sourceAddress.length);
}
@@ -442,21 +438,15 @@ public class IPv6Packet extends NetworkPacket {
* 设置原始源地址字节数组
* @param sourceAddress 源地址字节数组
*/
public void setRawSourceAddress(byte[] sourceAddress) {
public void setRawSourceAddressArray(byte[] sourceAddress) {
IPv6header.put(SOURCE_ADDRESS_OFFSET, sourceAddress, 0, sourceAddress.length);
}
public IPv6RouteTableKey getSourceRouteTableKey() {
long most=IPv6header.getLong(SOURCE_ADDRESS_OFFSET);
long least=IPv6header.getLong(SOURCE_ADDRESS_OFFSET+8);
return new IPv6RouteTableKey(most, least);
}
/**
* 获取原始目标地址字节数组
* @param destinationAddress 用于存储目标地址的字节数组
*/
public void getRawDestinationAddress(byte[] destinationAddress) {
public void getRawDestinationAddressArray(byte[] destinationAddress) {
IPv6header.get(DESTINATION_ADDRESS_OFFSET, destinationAddress, 0, destinationAddress.length);
}
@@ -465,22 +455,49 @@ public class IPv6Packet extends NetworkPacket {
* 设置原始目标地址字节数组
* @param destinationAddress 目标地址字节数组
*/
public void setRawDestinationAddress(byte[] destinationAddress) {
public void setRawDestinationAddressArray(byte[] destinationAddress) {
IPv6header.put(DESTINATION_ADDRESS_OFFSET, destinationAddress, 0, destinationAddress.length);
}
/**
* 获取原始源地址字节数组
* @param sourceAddress 用于存储源地址的字节数组
* @return
*/
public IPv6Address getSourceAddress() {
return IPv6Address.valueOf(SOURCE_ADDRESS_OFFSET,IPv6header);
}
/**
* 设置原始源地址字节数组
* @param sourceAddress 源地址字节数组
*/
public void setSourceAddress(IPv6Address sourceAddress) {
sourceAddress.writeTo(SOURCE_ADDRESS_OFFSET,IPv6header);
}
public IPv6RouteTableKey getDestinationRouteTableKey() {
long most=IPv6header.getLong(DESTINATION_ADDRESS_OFFSET);
long least=IPv6header.getLong(DESTINATION_ADDRESS_OFFSET+8);
return new IPv6RouteTableKey(most, least);
}
/**
* 获取原始目标地址字节数组
* @param destinationAddress 用于存储目标地址的字节数组
*/
public IPv6Address getDestinationAddress() {
return IPv6Address.valueOf(DESTINATION_ADDRESS_OFFSET,IPv6header);
}
/**
* 设置原始目标地址字节数组
* @param destinationAddress 目标地址字节数组
*/
public void setDestinationAddress(IPv6Address destinationAddress) {
destinationAddress.writeTo(DESTINATION_ADDRESS_OFFSET,IPv6header);
}
/**
* 获取源地址
* @return 源地址
*/
public Inet6Address getSourceAddress() {
public Inet6Address getSourceAddress2() {
byte[] b = new byte[IPV6_ADDRESS_LENGTH];
IPv6header.get(SOURCE_ADDRESS_OFFSET, b, 0, b.length);
try {
@@ -494,7 +511,7 @@ public class IPv6Packet extends NetworkPacket {
* 设置源地址
* @param sourceAddress 源地址
*/
public void setSourceAddress(Inet6Address sourceAddress) {
public void setSourceAddress2(Inet6Address sourceAddress) {
byte[] b = sourceAddress.getAddress();
IPv6header.put(SOURCE_ADDRESS_OFFSET, b, 0, b.length);
}
@@ -503,7 +520,7 @@ public class IPv6Packet extends NetworkPacket {
* 获取目标地址
* @return 目标地址
*/
public Inet6Address getDestinationAddress() {
public Inet6Address getDestinationAddress2() {
byte[] b = new byte[IPV6_ADDRESS_LENGTH];
IPv6header.get(DESTINATION_ADDRESS_OFFSET, b, 0, b.length);
try {
@@ -517,7 +534,7 @@ public class IPv6Packet extends NetworkPacket {
* 设置目标地址
* @param destinationAddress 目标地址
*/
public void setDestinationAddress(Inet6Address destinationAddress) {
public void setDestinationAddress2(Inet6Address destinationAddress) {
byte[] b = destinationAddress.getAddress();
IPv6header.put(DESTINATION_ADDRESS_OFFSET, b, 0, b.length);
}
@@ -539,7 +556,11 @@ public class IPv6Packet extends NetworkPacket {
private int calcPayloadLength() {
int lth = 0;
for (int i = 0; i < headers.size(); i++) {
lth += headers.get(i).getTotalLength();
int extHeaderLength=(int) headers.get(i).getTotalLength();
if(extHeaderLength<=0) {
throw new IllegalArgumentException("extHeaderLength:"+extHeaderLength+"<0");
}
lth += extHeaderLength;
}
lth += payload.getTotalLength();
return lth;
@@ -578,6 +599,9 @@ public class IPv6Packet extends NetworkPacket {
exth.writeToChannel(dto);
}
payload.writeToChannel(dto);
if(debug)
debug("send");
}
/**
@@ -607,6 +631,7 @@ public class IPv6Packet extends NetworkPacket {
nextheader = ext.getNextHeader();
payloadlength -= ext.getTotalLength();
headers.add(ext);
hopByHopHeader=(IPv6HopByHopHeader) ext;
break;
case DESTINATION_OPTIONS: // 目标选项头部
ext = new IPv6DestinationHeader();
@@ -637,6 +662,7 @@ public class IPv6Packet extends NetworkPacket {
nextheader = ext.getNextHeader();
payloadlength -= ext.getTotalLength();
headers.add(ext);
routingHeader=(IPv6RoutingHeader) ext;
break;
case FRAGMENT: // 分段头部
ext = new IPv6ExtHeader(nextheader);
@@ -666,12 +692,16 @@ public class IPv6Packet extends NetworkPacket {
payloadlength -= ext.getTotalLength();
headers.add(ext);
break;
case ICMPv6:
ICMPv6Packet icmp=ICMPv6Packet.readICMPv6PacketFromChannel(din,payloadlength);
icmp.setParent(this);
this.payload=icmp;
break loop;
case UDP: // UDP协议
UDPPacket up=new UDPPacket();
up.setParent(this);
up.readFromChannel(din,payloadlength);
this.payload=up;
UDPPacket udp=new UDPPacket();
udp.setParent(this);
udp.readFromChannel(din,payloadlength);
this.payload=udp;
break loop;
case KLALBPacket.KLALB_PROTOCOL_NUMBER: // KLALB协议
KLALBPacket kp = KLALBPacket.readKLALBPacketFromChannel(din);
@@ -689,9 +719,24 @@ public class IPv6Packet extends NetworkPacket {
break loop;
}
}
if(debug)
debug("recv");
}
private void debug(String description) {
StringBuilder sb=new StringBuilder();
sb.append(description);
sb.append(" total:");
sb.append(getPayloadLength());
sb.append(" ");
for (IPv6ExtHeader iPv6ExtHeader : headers) {
sb.append(iPv6ExtHeader.getTotalLength());
sb.append(' ');
}
if(payload!=null)
sb.append(payload.getTotalLength());
System.out.println(sb);
}
/**
* 转换为字符串表示
@@ -1062,7 +1107,7 @@ public class IPv6Packet extends NetworkPacket {
*/
public static class IPv6SegmentRoutingHeader extends IPv6RoutingHeader {
private final List<Inet6Address> addresses = new ArrayList<Inet6Address>();
private final List<IPv6Address> addresses = new ArrayList<IPv6Address>();
private final List<IPv6SegmentRoutingTLV> tlvs = new ArrayList<IPv6SegmentRoutingTLV>();
@Override
@@ -1083,7 +1128,7 @@ public class IPv6Packet extends NetworkPacket {
super(EXT_HEADER_ALIGNMENT, bbf);
}
public IPv6SegmentRoutingHeader(List<Inet6Address> segs) {
public IPv6SegmentRoutingHeader(List<IPv6Address> segs) {
this();
this.addresses.addAll(segs);
int ln = addresses.size() - 1;
@@ -1115,7 +1160,7 @@ public class IPv6Packet extends NetworkPacket {
getData().putShort(6, (short) tag);
}
public List<Inet6Address> getAddresses() {
public List<IPv6Address> getAddresses() {
return addresses;
}
@@ -1134,9 +1179,12 @@ public class IPv6Packet extends NetworkPacket {
setLastEntry(addresses.size() - 1);
super.writeToChannel(dto);
for (Inet6Address inet6Address : addresses) {
dto.write(ByteBuffer.wrap(inet6Address.getAddress()));
ByteBuffer addr=NetworkPacket.bufferAllocator.allocateHeap(addresses.size() *IPV6_ADDRESS_LENGTH);
for (IPv6Address inet6Address : addresses) {
inet6Address.writeTo(addr);
}
addr.flip();
dto.write(addr);
for (IPv6SegmentRoutingTLV tlv : tlvs) {
IPv6SegmentRoutingTLV.writeIPv6SegmentRoutingTLVToChannel(dto, tlv);
}
@@ -1200,15 +1248,12 @@ public class IPv6Packet extends NetworkPacket {
}
addresses.clear();
bfr = NetworkPacket.bufferAllocator.allocateHeap(IPV6_ADDRESS_LENGTH);
for (int i = 0; i <= laste; i++) { // 注意:应该是 <= laste
bfr.clear();
KNEChannels.readFully(din, bfr);
bfr.flip();
bfr = NetworkPacket.bufferAllocator.allocateHeap(IPV6_ADDRESS_LENGTH*(laste+1));
KNEChannels.readFully(din, bfr);
bfr.flip();
usdl += bfr.limit();
Inet6Address addr = (Inet6Address) Inet6Address.getByAddress(bfr.array());
addresses.add(addr);
for (int i = 0; i <= laste; i++) { // 注意:应该是 <= laste
addresses.add(IPv6Address.valueOf(bfr));
}
tlvs.clear();
@@ -1290,38 +1335,59 @@ public class IPv6Packet extends NetworkPacket {
* @return IPv6段逐跳头部,如果不存在则返回null
*/
public IPv6HopByHopHeader getHopByHopHeader() {
IPv6HopByHopHeader hoph = null;
List<IPv6ExtHeader> exhs = headers;
for (int j = 0; j < exhs.size(); j++) {
IPv6ExtHeader exh = exhs.get(j);
if (exh instanceof IPv6HopByHopHeader) {
hoph=(IPv6HopByHopHeader) exh;
break;
}
}
return hoph;
return hopByHopHeader;
}
/**
* 获取路由头部
* @return 路由头部,如果不存在则返回null
*/
public IPv6RoutingHeader getRoutingHeader() {
return routingHeader;
}
/**
public void setHopByHopHeader(IPv6HopByHopHeader hopByHopHeader) {
this.hopByHopHeader = hopByHopHeader;
}
public void setRoutingHeader(IPv6RoutingHeader routingHeader) {
this.routingHeader = routingHeader;
}
/**
* 获取SRv6段路由头部
* @return SRv6段路由头部,如果不存在则返回null
*/
public IPv6SegmentRoutingHeader getSRHHeader() {
IPv6SegmentRoutingHeader srhh = null;
List<IPv6ExtHeader> exhs = headers;
for (int j = 0; j < exhs.size(); j++) {
IPv6ExtHeader exh = exhs.get(j);
if (exh instanceof IPv6SegmentRoutingHeader) {
if (((IPv6SegmentRoutingHeader) exh).getRoutingType() == SRV6_ROUTING_TYPE) {
srhh = (IPv6SegmentRoutingHeader) exh;
break;
public IPv6SegmentRoutingHeader getSegmentRoutingHeader() {
IPv6RoutingHeader rh=getRoutingHeader();
if(rh==null)
return null;
IPv6SegmentRoutingHeader srhh=null;
if (rh instanceof IPv6SegmentRoutingHeader) {
if (((IPv6SegmentRoutingHeader) rh).getRoutingType() == SRV6_ROUTING_TYPE) {
srhh = (IPv6SegmentRoutingHeader) rh;
}
}
}
return srhh;
}
public UUID getPacketID() {
IPv6HopByHopHeader hop=getHopByHopHeader();
if(hop==null)
return null;
List<IPv6HopByHopTLV> tlvs= hop.getTlvs();
for(IPv6HopByHopTLV tlv:tlvs) {
if(tlv instanceof KLALBOAMHopByHopTLV)
return ((KLALBOAMHopByHopTLV)tlv).getUUID();
}
return null;
}
@Override
protected boolean needEndPosition() {
return false;
@@ -1334,16 +1400,21 @@ public class IPv6Packet extends NetworkPacket {
return rerouteCounter;
}
// 承诺标志,用于某种状态跟踪
private volatile boolean promise = true;
public long calculateAddressChecksum() {
long sum=0;
ByteBuffer dataCopy = IPv6header.slice(SOURCE_ADDRESS_OFFSET,32);
while (dataCopy.remaining() >= 2) {
sum += dataCopy.getChar();
}
if (dataCopy.remaining() == 1) {
sum += (dataCopy.get() & 0xFF) << 8;
}
return sum;
}
public void setPromise(boolean b) {
promise = b;
}
public boolean isPromise() {
return promise;
}