KLALB V3.6.0 写了一半
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user