forked from KNEMC/KLALB
KLALB 3.6.0开发一半的状态
This commit is contained in:
@@ -1,16 +1,9 @@
|
||||
package org.kne.cloud.network.ipv6;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Inet6Address;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.kne.cloud.network.klalb.KLALBRemoteLine;
|
||||
import org.kne.cloud.network.srv6.SRv6Router;
|
||||
|
||||
public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink {
|
||||
|
||||
@@ -6,11 +6,10 @@ import java.util.function.Consumer;
|
||||
|
||||
public interface ControlledIPv6NetworkLink extends IPv6NetworkLink {
|
||||
|
||||
public boolean isCongress(IPv6Packet iPv6Packet,double scale);
|
||||
public boolean isCongestion(IPv6Packet iPv6Packet,double scale);
|
||||
public default boolean isCongress(IPv6Packet iPv6Packet) {
|
||||
return isCongress(iPv6Packet, 1.0);
|
||||
return isCongestion(iPv6Packet, 1.0);
|
||||
}
|
||||
void setRerouteConsumer(Consumer<IPv6Packet> rerouteConsumer);
|
||||
public boolean isReachSpeedLimit(IPv6Packet iPv6Packet);
|
||||
public void setCongressCondition(Lock lock,Condition condition);
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ public class ICMPv6Packet extends IPv6Payload {
|
||||
private boolean isDefault;
|
||||
|
||||
protected ICMPv6Packet(ByteBuffer header,boolean isDefault) {
|
||||
super(ICMPv6_PROTOCOL_NUMBER, false);
|
||||
super(ICMPv6_PROTOCOL_NUMBER);
|
||||
this.header=header;
|
||||
this.isDefault=isDefault;
|
||||
|
||||
@@ -45,7 +45,7 @@ public class ICMPv6Packet extends IPv6Payload {
|
||||
}
|
||||
|
||||
protected ICMPv6Packet(int type, int code,boolean isDefault) {
|
||||
super(ICMPv6_PROTOCOL_NUMBER, false);
|
||||
super(ICMPv6_PROTOCOL_NUMBER);
|
||||
header = NetworkPacket.bufferAllocator.allocate(ICMPv6_HEADER_LENGTH);
|
||||
getHeader().put((byte) type);
|
||||
getHeader().put((byte) code);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
@@ -22,12 +21,7 @@ import org.kne.cloud.network.klalb.CONST;
|
||||
import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl;
|
||||
import org.kne.cloud.network.srv6.DetNetSRv6TLV;
|
||||
import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV;
|
||||
import org.kne.cloud.network.srv6.IpV6RoutingSRHData;
|
||||
import org.kne.cloud.network.srv6.PacketConsumer;
|
||||
import org.kne.cloud.network.srv6.SRv6PacketReorder;
|
||||
import org.kne.cloud.network.srv6.SRv6Router;
|
||||
import org.kne.cloud.network.srv6.SRv6StreamSequenceTLV;
|
||||
import org.kne.cloud.network.srv6.SRv6TLV;
|
||||
import org.kne.cloud.network.tun.InetAddressRow;
|
||||
import org.kne.cloud.network.tun.TUNChannel;
|
||||
import org.kne.cloud.network.tun.TUNNetworkDevice;
|
||||
@@ -94,7 +88,7 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
|
||||
con.accept(IPv6TUNLoopbackNetworkLink.this, () -> {
|
||||
UUID pid = ipp.getPacketID();
|
||||
if (pid != null) {
|
||||
monitor.getUploadBandwidth().recordPacket(pid, (int) ipp.getTotalLength());
|
||||
monitor.getUploadBandwidth().recordPacket(pid,1, (int) ipp.getTotalLength());
|
||||
}
|
||||
// ipp.setDisposeAfterSend(true);
|
||||
// ipp.getPayload().setDisposeAfterSend(true);
|
||||
@@ -203,23 +197,14 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
|
||||
pack.writeToChannel(KNEChannels.newWritableChannel(tmp));
|
||||
UUID pid = pack.getPacketID();
|
||||
if (pid != null) {
|
||||
monitor.getUploadBandwidth().recordPacket(pid, (int) pack.getTotalLength());
|
||||
monitor.getUploadBandwidth().recordPacket(pid, 1,(int) pack.getTotalLength());
|
||||
}
|
||||
tmp.flip();
|
||||
sendQueue.add(tmp);
|
||||
LockSupport.unpark(tr);
|
||||
}
|
||||
|
||||
private SRv6StreamSequenceTLV getStreamSequenceTLV(IpV6RoutingSRHData srh) {
|
||||
List<SRv6TLV> stv = srh.getTlvs();
|
||||
for (Iterator iterator = stv.iterator(); iterator.hasNext();) {
|
||||
SRv6TLV sRv6TLV = (SRv6TLV) iterator.next();
|
||||
if (sRv6TLV.getType() == SRv6TLV.SEQS) {
|
||||
return (SRv6StreamSequenceTLV) sRv6TLV;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isLoopBack() {
|
||||
@@ -282,11 +267,11 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
|
||||
for (Iterator<Neighbor> iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) {
|
||||
Neighbor addresses = (Neighbor) iteratorx.next();
|
||||
RouteItem ri = new RouteItem(new IPv6AddressGroup(addresses.getAddress().getAddress(), 128),
|
||||
addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D", false);
|
||||
addresses.getAddress().getAddress(), this, "Direct", 0, 128, null, "D", false);
|
||||
rlist.add(ri);
|
||||
|
||||
RouteItem ris = new RouteItem(addresses.getLocator(), addresses.getLocator().getAddress(), this,
|
||||
"KLALB SRv6", 13, 128, addresses.getMonitor(), "D", false);
|
||||
"KLALB SRv6", 13, 128, null, "D", false);
|
||||
rlist.add(ris);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,19 +1,13 @@
|
||||
package org.kne.cloud.network.ipv6;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Inet6Address;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.kne.cloud.network.srv6.PacketConsumer;
|
||||
import org.kne.cloud.network.srv6.SRv6Router;
|
||||
|
||||
public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements IPv6NetworkLink {
|
||||
@@ -28,9 +22,9 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
|
||||
this.fallbackLink = fallbackLink;
|
||||
}
|
||||
|
||||
private Map<Integer, PacketConsumer> protocolNumberRegister = new ConcurrentHashMap<>(256 * 2);
|
||||
private IPv6ProtocolRegister[] protocolNumberRegister = new IPv6ProtocolRegister[256];
|
||||
|
||||
public Map<Integer, PacketConsumer> getProtocolNumberRegister() {
|
||||
public IPv6ProtocolRegister[] getProtocolNumberRegister() {
|
||||
return protocolNumberRegister;
|
||||
}
|
||||
|
||||
@@ -46,9 +40,9 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
|
||||
|
||||
@Override
|
||||
public void sendPacket(IPv6Packet pack, IPv6Address next) throws IOException {
|
||||
PacketConsumer pcm= protocolNumberRegister.get(pack.getPayload().getProtocolNumber());
|
||||
IPv6ProtocolRegister pcm= protocolNumberRegister[pack.getPayload().getProtocolNumber()];
|
||||
if (pcm != null) {
|
||||
if(!pcm.accept(pack)) {
|
||||
if(!pcm.onaccept(pack)) {
|
||||
if(fallbackLink!=null) {
|
||||
fallbackLink.sendPacket(pack, next);
|
||||
}
|
||||
@@ -110,13 +104,13 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
|
||||
for (Iterator<Neighbor> iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) {
|
||||
Neighbor addresses = (Neighbor) iteratorx.next();
|
||||
RouteItem ri = new RouteItem(new IPv6AddressGroup(addresses.getAddress().getAddress(), 128),
|
||||
addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D",
|
||||
addresses.getAddress().getAddress(), this, "Direct", 0, 128, null, "D",
|
||||
false);
|
||||
rlist.add(ri);
|
||||
|
||||
RouteItem ris = new RouteItem(addresses.getLocator(),
|
||||
addresses.getLocator().getAddress(), this, "KLALB SRv6", 13, 128,
|
||||
addresses.getMonitor(), "D", false);
|
||||
null, "D", false);
|
||||
rlist.add(ris);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,14 +1,7 @@
|
||||
package org.kne.cloud.network.ipv6;
|
||||
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.monitor.DelayMonitorData;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class RouteItem implements Comparable<RouteItem>,Cloneable{
|
||||
private IPv6AddressGroup destination;
|
||||
@@ -18,14 +11,11 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
|
||||
private int pre;
|
||||
private long cost;
|
||||
private String flag;
|
||||
private MonitorData monitor;
|
||||
private Supplier<Long> costSupplier;
|
||||
private boolean isLoopback;
|
||||
public String getFlag() {
|
||||
return flag;
|
||||
}
|
||||
public MonitorData getMonitor() {
|
||||
return monitor;
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(cost, destination, destlink, flag, nexthop, pre, proto);
|
||||
@@ -56,7 +46,7 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
|
||||
this.isLoopback=isLoopback;
|
||||
}
|
||||
public RouteItem(IPv6AddressGroup destination, IPv6Address nexthop, IPv6NetworkLink destlink, String proto, int pre,
|
||||
long cost,MonitorData monitor,String flag,boolean isLoopback) {
|
||||
long cost,Supplier<Long> costSupplier,String flag,boolean isLoopback) {
|
||||
super();
|
||||
this.destination = destination;
|
||||
this.nexthop = nexthop;
|
||||
@@ -64,7 +54,7 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
|
||||
this.proto = proto;
|
||||
this.pre = pre;
|
||||
this.cost = cost;
|
||||
this.monitor=monitor;
|
||||
this.costSupplier=costSupplier;
|
||||
this.flag=flag;
|
||||
this.isLoopback=isLoopback;
|
||||
}
|
||||
@@ -99,6 +89,7 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
|
||||
public boolean checkMatch(byte[] ia) {
|
||||
return destination.checkMatch(ia);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public int compareTo(RouteItem o) {
|
||||
int v1=destination.compareTo(o.destination);
|
||||
@@ -110,22 +101,23 @@ public class RouteItem implements Comparable<RouteItem>,Cloneable{
|
||||
int v3=Long.compare(cost, o.cost);
|
||||
return v3;
|
||||
}
|
||||
public Supplier<Long> getCostSupplier() {
|
||||
return costSupplier;
|
||||
}
|
||||
@Override
|
||||
public Object clone() {
|
||||
try {
|
||||
RouteItem ri=(RouteItem) super.clone();
|
||||
if(monitor!=null)
|
||||
ri.monitor=(MonitorData) monitor.clone();
|
||||
return ri;
|
||||
} catch (CloneNotSupportedException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void preSort() {
|
||||
if(monitor!=null) {
|
||||
cost=((DelayMonitorData)monitor).getOutDelay();
|
||||
//在排序前调用,计算cost
|
||||
public void updateCost() {
|
||||
if(costSupplier!=null) {
|
||||
cost=costSupplier.get();
|
||||
}
|
||||
}
|
||||
public boolean ECMPequals(RouteItem prevr) {
|
||||
|
||||
@@ -43,7 +43,7 @@ public static final int PAD1=0;
|
||||
|
||||
private boolean isDefault;
|
||||
|
||||
protected volatile ByteBuffer header;
|
||||
protected ByteBuffer header;
|
||||
|
||||
private ByteBuffer data;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user