KLALB3.2
This commit is contained in:
@@ -2,6 +2,7 @@ package org.kne.cloud.network.ipv6;
|
||||
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.io.StreamCorruptedException;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
@@ -11,9 +12,12 @@ import java.nio.channels.WritableByteChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
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.srv6.IPv6SegmentRoutingTLV;
|
||||
import org.kne.cloud.network.srv6.IpV6RoutingSRHData;
|
||||
@@ -24,6 +28,29 @@ import org.kne.cloud.network.srv6.SRv6TLV;
|
||||
import org.pcap4j.packet.namednumber.IpNumber;
|
||||
|
||||
public class IPv6Packet extends NetworkPacket {
|
||||
|
||||
private long flowSeqMark=-1;
|
||||
|
||||
|
||||
|
||||
public long getFlowSeqMark() {
|
||||
return flowSeqMark;
|
||||
}
|
||||
|
||||
public void setFlowSeqMark(long flowSeqMark) {
|
||||
this.flowSeqMark = flowSeqMark;
|
||||
}
|
||||
|
||||
|
||||
private boolean TTLdecreased=false;
|
||||
|
||||
public boolean isTTLdecreased() {
|
||||
return TTLdecreased;
|
||||
}
|
||||
|
||||
public void setTTLdecreased(boolean tTLdecreased) {
|
||||
TTLdecreased = tTLdecreased;
|
||||
}
|
||||
private volatile ByteBuffer IPv6header ;
|
||||
|
||||
private volatile List<IPv6ExtHeader> headers = new ArrayList<>();
|
||||
@@ -41,7 +68,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
}
|
||||
|
||||
public IPv6Packet() {
|
||||
IPv6header = NetworkPacket.databufferpool_40.borrow();
|
||||
IPv6header = NetworkPacket.bufferAllocator.allocate(40);
|
||||
IPv6header.limit(IPv6_HEADER_LENGTH);
|
||||
}
|
||||
|
||||
@@ -76,6 +103,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
|
||||
public void markCE() {
|
||||
IPv6header.put(1,(byte) (IPv6header.get(1)|0b00110000));
|
||||
//new Exception().printStackTrace();
|
||||
}
|
||||
|
||||
public boolean isCE() {
|
||||
@@ -114,7 +142,24 @@ public class IPv6Packet extends NetworkPacket {
|
||||
public void setHopLimit(int hopLimit) {
|
||||
IPv6header.put(7, (byte) hopLimit);
|
||||
}
|
||||
|
||||
public void getRawSourceAddress(byte[] sourceAddress) {
|
||||
IPv6header.get(8, sourceAddress, 0, sourceAddress.length);
|
||||
}
|
||||
|
||||
public void setRawSourceAddress(byte[] sourceAddress) {
|
||||
IPv6header.put(8, sourceAddress, 0, sourceAddress.length);
|
||||
}
|
||||
|
||||
public void getRawDestinationAddress(byte[] destinationAddress) {
|
||||
IPv6header.get(24, destinationAddress, 0,destinationAddress.length);
|
||||
|
||||
}
|
||||
|
||||
public void setRawDestinationAddress(byte[] destinationAddress) {
|
||||
IPv6header.put(24, destinationAddress, 0, destinationAddress.length);
|
||||
}
|
||||
|
||||
public Inet6Address getSourceAddress() {
|
||||
byte[] b = new byte[16];
|
||||
IPv6header.get(8, b, 0, b.length);
|
||||
@@ -163,29 +208,6 @@ public class IPv6Packet extends NetworkPacket {
|
||||
return calcPayloadLength()+IPv6_HEADER_LENGTH;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doDisposeAfterSend() {
|
||||
super.doDisposeAfterSend();
|
||||
payload.doDisposeAfterSend();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
super.dispose();
|
||||
/*ByteBuffer headerx = IPv6header;
|
||||
IPv6header = null;
|
||||
if(headerx!=null)
|
||||
NetworkPacket.databufferpool_40.back(headerx);*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disposeAll() {
|
||||
super.disposeAll();
|
||||
for (int i = 0; i < headers.size(); i++) {
|
||||
headers.get(i).disposeAll();
|
||||
}
|
||||
payload.disposeAll();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@@ -241,7 +263,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
headers.add(ext);
|
||||
break;
|
||||
case 43:
|
||||
ByteBuffer bbf=NetworkPacket.databufferpool_2048.borrow();
|
||||
ByteBuffer bbf=NetworkPacket.bufferAllocator.allocate(2048);
|
||||
bbf.limit(4);
|
||||
while (bbf.hasRemaining()) {
|
||||
if (din.read(bbf) == -1) {
|
||||
@@ -296,7 +318,11 @@ public class IPv6Packet extends NetworkPacket {
|
||||
KLALBPacket kp=KLALBPacket.readKLALBPacketFromChannel(din);
|
||||
this.payload=kp;
|
||||
break loop;
|
||||
|
||||
case 253:
|
||||
IPv6Payload epld=new IPv6EmptyPayload();
|
||||
epld.readFromChannel(din, payloadlength);
|
||||
this.payload=epld;
|
||||
break loop;
|
||||
default:
|
||||
IPv6Payload pld=new IPv6Payload(nextheader);
|
||||
pld.readFromChannel(din, payloadlength);
|
||||
@@ -376,35 +402,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
//System.out.println(payload);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public void lockAll() {
|
||||
super.lockAll();
|
||||
for (int i = 0; i < headers.size(); i++) {
|
||||
headers.get(i).lockAll();
|
||||
}
|
||||
payload.lockAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSomeDisposed() {
|
||||
if(super.isSomeDisposed()||payload.isSomeDisposed())
|
||||
return true;
|
||||
for (Iterator<IPv6ExtHeader> iterator = headers.iterator(); iterator.hasNext();) {
|
||||
IPv6ExtHeader iPv6ExtHeader = (IPv6ExtHeader) iterator.next();
|
||||
if(iPv6ExtHeader.isSomeDisposed())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unlockAll() {
|
||||
payload.unlockAll();
|
||||
for (int i = 0; i < headers.size(); i++) {
|
||||
headers.get(i).unlockAll();
|
||||
}
|
||||
super.unlockAll();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
@@ -434,7 +432,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
this.protocolNumber = protocolNumber;
|
||||
this.onDefault=isonDefault;
|
||||
if(onDefault)
|
||||
this.data=NetworkPacket.databufferpool_65535.borrow();
|
||||
this.data=NetworkPacket.bufferAllocator.allocate(65535);
|
||||
}
|
||||
|
||||
public int getProtocolNumber() {
|
||||
@@ -446,13 +444,13 @@ public class IPv6Packet extends NetworkPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
public void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
if(onDefault)
|
||||
dto.write(data.slice(0,data.limit()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readFromChannel(ReadableByteChannel din, long length) throws IOException {
|
||||
public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
|
||||
if(onDefault) {
|
||||
data.limit((int) length);
|
||||
while (data.hasRemaining()) {
|
||||
@@ -463,15 +461,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
super.dispose();
|
||||
/*if(onDefault) {
|
||||
ByteBuffer datax = data;
|
||||
data = null;
|
||||
NetworkPacket.databufferpool_65535.back(datax);
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean needEndPosition() {
|
||||
@@ -480,6 +470,28 @@ public class IPv6Packet extends NetworkPacket {
|
||||
|
||||
}
|
||||
|
||||
public static class IPv6EmptyPayload extends IPv6Payload{
|
||||
|
||||
public IPv6EmptyPayload() {
|
||||
super(253, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLength() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static class IPv6ExtHeader extends NetworkPacket{
|
||||
private ByteBuffer data ;
|
||||
|
||||
@@ -505,9 +517,9 @@ public class IPv6Packet extends NetworkPacket {
|
||||
this.protocolNumber = protocolNumber;
|
||||
this.onDefault=isonDefault;
|
||||
if(onDefault) {
|
||||
this.data=NetworkPacket.databufferpool_2048.borrow();
|
||||
this.data=NetworkPacket.bufferAllocator.allocate(2048);
|
||||
}else {
|
||||
this.data=NetworkPacket.databufferpool_40.borrow();
|
||||
this.data=NetworkPacket.bufferAllocator.allocate(8);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -542,7 +554,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
public void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
if(onDefault) {
|
||||
int ext=(data.limit()-8)/8;
|
||||
setExtLength(ext);
|
||||
@@ -553,7 +565,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readFromChannel(ReadableByteChannel din, long length) throws IOException {
|
||||
public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
|
||||
data.limit(8);
|
||||
while (data.hasRemaining()) {
|
||||
if (din.read(data) == -1) {
|
||||
@@ -576,19 +588,7 @@ public class IPv6Packet extends NetworkPacket {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
super.dispose();
|
||||
/*ByteBuffer bbft=data;
|
||||
data=null;
|
||||
if(bbft!=null) {
|
||||
if(bbft.capacity()==40) {
|
||||
NetworkPacket.databufferpool_40.back(bbft);
|
||||
}else {
|
||||
NetworkPacket.databufferpool_2048.back(bbft);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -678,27 +678,37 @@ public class IPv6Packet extends NetworkPacket {
|
||||
public List<Inet6Address> getAddresses() {
|
||||
return addresses;
|
||||
}
|
||||
|
||||
public List<IPv6SegmentRoutingTLV> getTlvs() {
|
||||
return tlvs;
|
||||
}
|
||||
@Override
|
||||
protected void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
setExtLength(calcExtLength()/8);
|
||||
public void writeToChannel(WritableByteChannel dto) throws IOException {
|
||||
int exl=calcExtLength();
|
||||
if(exl%8!=0) {
|
||||
throw new StreamCorruptedException("extLength % 8 !=0");
|
||||
}
|
||||
|
||||
setExtLength(exl/8);
|
||||
setLastEntry(addresses.size()-1);
|
||||
super.writeToChannel(dto);
|
||||
for (Iterator<Inet6Address> iterator = addresses.iterator(); iterator.hasNext();) {
|
||||
Inet6Address inet6Address = (Inet6Address) iterator.next();
|
||||
|
||||
for(Inet6Address inet6Address:addresses) {
|
||||
dto.write(ByteBuffer.wrap(inet6Address.getAddress()));
|
||||
}
|
||||
|
||||
for(IPv6SegmentRoutingTLV tlv:tlvs) {
|
||||
IPv6SegmentRoutingTLV.writeIPv6SegmentRoutingTLVToChannel(dto, tlv);
|
||||
}
|
||||
}
|
||||
private int calcExtLength() {
|
||||
int tlvsl=0;
|
||||
for (Iterator<IPv6SegmentRoutingTLV> iterator = tlvs.iterator(); iterator.hasNext();) {
|
||||
IPv6SegmentRoutingTLV tlve = (IPv6SegmentRoutingTLV) iterator.next();
|
||||
for(IPv6SegmentRoutingTLV tlve:tlvs) {
|
||||
tlvsl+=tlve.getLength();
|
||||
}
|
||||
return addresses.size()*16+tlvsl;
|
||||
}
|
||||
@Override
|
||||
protected void readFromChannel(ReadableByteChannel din, long length) throws IOException {
|
||||
public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
|
||||
super.readFromChannel(din, length);
|
||||
int extl=getExtLength();
|
||||
int laste=getLastEntry();
|
||||
@@ -722,6 +732,13 @@ public class IPv6Packet extends NetworkPacket {
|
||||
//System.out.println("SR:"+addr);
|
||||
addresses.add(addr);
|
||||
}
|
||||
tlvs.clear();
|
||||
while(usdl<rl) {
|
||||
IPv6SegmentRoutingTLV tlv=IPv6SegmentRoutingTLV.readIPv6SegmentRoutingTLVFromChannel(din);
|
||||
usdl+=tlv.getLength();
|
||||
tlvs.add(tlv);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
@@ -761,7 +778,20 @@ public class IPv6Packet extends NetworkPacket {
|
||||
public List<IPv6ExtHeader> getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
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() == 4) {
|
||||
srhh = (IPv6SegmentRoutingHeader) exh;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return srhh;
|
||||
}
|
||||
/*public IPv6DestinationHeader insertDestinationHeader(int index,int extLength) {
|
||||
long ptr;
|
||||
long lth=extLength*8+8;
|
||||
@@ -831,6 +861,18 @@ public class IPv6Packet extends NetworkPacket {
|
||||
protected boolean needEndPosition() {
|
||||
return false;
|
||||
}
|
||||
private AtomicInteger rerouteCounter=new AtomicInteger(0);
|
||||
public AtomicInteger getRerouteCounter() {
|
||||
return rerouteCounter;
|
||||
}
|
||||
private volatile boolean promise=false;
|
||||
public void setPromise(boolean b) {
|
||||
promise=b;
|
||||
}
|
||||
|
||||
public boolean isPromise() {
|
||||
return promise;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user