整理SRv6Router代码,修bug,增加SRHInsert虚链路
This commit is contained in:
@@ -44,6 +44,7 @@ import org.kne.cloud.network.ipv6.Neighbor;
|
||||
import org.kne.cloud.network.ipv6.PadNHopByHopTLV;
|
||||
import org.kne.cloud.network.ipv6.PostcardEntry;
|
||||
import org.kne.cloud.network.ipv6.RouteItem;
|
||||
import org.kne.cloud.network.ipv6.SRHInsertNetworkLink;
|
||||
import org.kne.cloud.network.klalb.KLALBRemoteLink;
|
||||
import org.kne.cloud.network.klalb.KLALBUtils;
|
||||
import org.kne.cloud.network.klalb.PerformanceStrategy;
|
||||
@@ -60,7 +61,7 @@ public class SRv6Router {
|
||||
|
||||
// public static final int MTU = 16384;
|
||||
public static final int MTU = 16384; // 最大传输单元
|
||||
public static final int MAX_REROUTE_COUNT = 2;// 1 // 最大重路由次数
|
||||
public static final int MAX_REROUTE_COUNT = 2;// 最大重路由次数
|
||||
|
||||
private static final int IPv6_BITS = 128; // IPv6地址位数
|
||||
|
||||
@@ -104,7 +105,7 @@ public class SRv6Router {
|
||||
|
||||
// 环回网络链路
|
||||
private final LoopbackIPv6NetworkLink inLoopBack;
|
||||
|
||||
private final SRHInsertNetworkLink srhInserter;
|
||||
// 获取路由表
|
||||
public List<RouteItem> getRouteTabel() {
|
||||
return routeTabel;
|
||||
@@ -121,7 +122,7 @@ public class SRv6Router {
|
||||
@Override
|
||||
public void accept(IPv6Packet t) {
|
||||
// HighPerformanceExecutor.defaultExecutor.execute(() -> {
|
||||
routePacket(null, t, true); // 执行重路由
|
||||
routePacket(null, t); // 执行重路由
|
||||
// });
|
||||
}
|
||||
};
|
||||
@@ -142,21 +143,11 @@ public class SRv6Router {
|
||||
if (oamtlv == null)
|
||||
return true;
|
||||
boolean bool = unduplicateSet.add(oamtlv.getUUID());
|
||||
// System.out.println(bool);
|
||||
return bool;
|
||||
}
|
||||
// 默认接收处理器
|
||||
/*
|
||||
* private BiConsumer<IPv6NetworkLink,IPv6Packet> defaultReceive = new
|
||||
* BiConsumer<IPv6NetworkLink,IPv6Packet>() {
|
||||
*
|
||||
* @Override public void accept(IPv6NetworkLink link,IPv6Packet t) { //
|
||||
* HighPerformanceExecutor.defaultExecutor.execute(() -> { if(unduplicate(t)) {
|
||||
* routePacket(t); // 执行路由 t.putTimePassport("routed"); // 标记路由时间点 } // }); } };
|
||||
*/
|
||||
|
||||
// SRH接收处理器
|
||||
private BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>> srhReceive = new BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>>() {
|
||||
// 接收处理器
|
||||
private BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>> receiveConsumer = new BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>>() {
|
||||
|
||||
@Override
|
||||
public void accept(IPv6NetworkLink link, Supplier<IPv6Packet> pack) {
|
||||
@@ -255,7 +246,7 @@ public class SRv6Router {
|
||||
|
||||
nlink.setSRv6Router(this);
|
||||
nlink.addIPv6LinkStateListener(listener); // 添加链路状态监听器
|
||||
nlink.setReceiveConsumer(srhReceive); // 设置接收处理器
|
||||
nlink.setReceiveConsumer(receiveConsumer); // 设置接收处理器
|
||||
if (nlink instanceof ControlledIPv6NetworkLink) {
|
||||
((ControlledIPv6NetworkLink) nlink).setRerouteConsumer(defaultReroute); // 设置重路由处理器
|
||||
((ControlledIPv6NetworkLink) nlink).setCongressCondition(congressLock, congressCondition); // 设置拥塞条件
|
||||
@@ -323,9 +314,9 @@ public class SRv6Router {
|
||||
}
|
||||
|
||||
// 插入SRH并路由数据包
|
||||
public void insertSRHandRoutePacket(IPv6NetworkLink link, IPv6Packet ipp) {
|
||||
insertHopByHopHeader(ipp);
|
||||
insertSRHeader(ipp); // 插入段路由头
|
||||
public void insertHeaderAndRoutePacket(IPv6NetworkLink link, IPv6Packet ipp) {
|
||||
insertHopByHopHeader(ipp);//插入逐跳头
|
||||
//insertSRHeader(ipp); // 插入段路由头
|
||||
routePacket(link, ipp); // 路由数据包
|
||||
}
|
||||
|
||||
@@ -384,16 +375,13 @@ public class SRv6Router {
|
||||
}
|
||||
|
||||
private void routePacket(IPv6Packet iPv6Packet) {
|
||||
routePacket(null, iPv6Packet, false);
|
||||
routePacket(null, iPv6Packet);
|
||||
}
|
||||
|
||||
// 路由数据包(默认非重路由)
|
||||
private void routePacket(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet) {
|
||||
routePacket(linkfrom, iPv6Packet, false);
|
||||
}
|
||||
|
||||
|
||||
// 路由数据包主方法
|
||||
private void routePacket(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet, boolean reroute) {
|
||||
private void routePacket(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet) {
|
||||
StringBuilder dbg = null;
|
||||
if (debug) {
|
||||
dbg = new StringBuilder(); // 调试信息
|
||||
@@ -406,7 +394,7 @@ public class SRv6Router {
|
||||
List<RouteItem> searchResult = getTabelByAddress(dest);
|
||||
if (searchResult!=null&&(!searchResult.isEmpty())) {
|
||||
// 匹配到路由表,执行负载均衡路由
|
||||
routingLoadBalance(linkfrom, iPv6Packet, reroute, dbg, searchResult);
|
||||
routingLoadBalance(linkfrom, iPv6Packet, dbg, searchResult);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -441,7 +429,7 @@ public class SRv6Router {
|
||||
// 重新搜索路由表
|
||||
List<RouteItem> searchResult2 = getTabelByAddress(dest);
|
||||
if (searchResult2!=null&&(!searchResult2.isEmpty())) {
|
||||
routingLoadBalance(linkfrom, iPv6Packet, reroute, dbg, searchResult2);
|
||||
routingLoadBalance(linkfrom, iPv6Packet, dbg, searchResult2);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -508,7 +496,7 @@ public class SRv6Router {
|
||||
private Condition congressCondition = congressLock.newCondition(); // 拥塞条件
|
||||
|
||||
// 负载均衡路由
|
||||
private boolean routingLoadBalance(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet, boolean reroute,
|
||||
private boolean routingLoadBalance(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet,
|
||||
StringBuilder dbg, List<RouteItem> routes) throws IllegalRawDataException, IOException {
|
||||
|
||||
if(routes==null||routes.isEmpty()) {
|
||||
@@ -517,7 +505,7 @@ public class SRv6Router {
|
||||
}
|
||||
|
||||
for (double i = 1; i < 100; i += 0.1) {
|
||||
if (loadBalance(linkfrom, iPv6Packet, reroute, dbg, routes, i)) {
|
||||
if (loadBalance(linkfrom, iPv6Packet, dbg, routes, i)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -536,7 +524,7 @@ public class SRv6Router {
|
||||
return false; // 路由失败
|
||||
}
|
||||
|
||||
private boolean loadBalance(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet, boolean reroute, StringBuilder dbg,
|
||||
private boolean loadBalance(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet, StringBuilder dbg,
|
||||
List<RouteItem> routes, double cscale)
|
||||
throws IllegalRawDataException, IOException {
|
||||
// 遍历可用路由进行负载均衡
|
||||
@@ -564,31 +552,39 @@ public class SRv6Router {
|
||||
dbg.append("matched.\n");
|
||||
}
|
||||
// 找到可用链路,处理数据包
|
||||
processPacket(linkfrom, iPv6Packet, tri, reroute);
|
||||
processPacket(linkfrom, iPv6Packet, tri);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 处理数据包转发
|
||||
private void processPacket(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet, RouteItem ri, boolean reroute)
|
||||
private void processPacket(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet, RouteItem ri)
|
||||
throws IllegalRawDataException, IOException {
|
||||
int hop = iPv6Packet.getHopLimit();
|
||||
|
||||
if (ri.getDestlink().isLoopBack()) { // 环回链路处理
|
||||
IPv6HopByHopHeader iPv6HopByHopHeader=iPv6Packet.getHopByHopHeader();
|
||||
if(iPv6Packet.getRouteCounter().get()<=0) {
|
||||
if (iPv6HopByHopHeader != null&&linkfrom instanceof KLALBRemoteLink) {
|
||||
processKLALBOAM(iPv6Packet, linkfrom.getAddressGroups().get(0).getAddress(),
|
||||
((KLALBRemoteLink) linkfrom).getRemoteVaddr().getAddress(), iPv6HopByHopHeader);
|
||||
}
|
||||
}
|
||||
IPv6SegmentRoutingHeader srhh = iPv6Packet.getSegmentRoutingHeader();
|
||||
if (srhh != null) {
|
||||
processSRv6Packet(linkfrom, iPv6Packet, ri, srhh, iPv6Packet.getHopByHopHeader(), reroute); // SRv6特殊处理
|
||||
processSRv6Packet(linkfrom, iPv6Packet, ri, srhh); // SRv6特殊处理
|
||||
} else {
|
||||
sendPacketToRouteItem(iPv6Packet, ri);
|
||||
}
|
||||
} else { // 普通链路处理
|
||||
// 检查重路由计数
|
||||
if (iPv6Packet.getRerouteCounter().getAndIncrement() >= MAX_REROUTE_COUNT) {
|
||||
int count=iPv6Packet.getRouteCounter().getAndIncrement();
|
||||
if (count >= MAX_REROUTE_COUNT) {
|
||||
return; // 超过最大重路由次数,丢弃
|
||||
}
|
||||
|
||||
if (!reroute) {
|
||||
if (count<=0) {
|
||||
hop--; // 减少TTL(非重路由时)
|
||||
}
|
||||
|
||||
@@ -651,34 +647,16 @@ public class SRv6Router {
|
||||
|
||||
// 处理SRv6数据包
|
||||
private void processSRv6Packet(IPv6NetworkLink linkfrom, IPv6Packet iPv6Packet, RouteItem ri,
|
||||
IPv6SegmentRoutingHeader srhh, IPv6HopByHopHeader iPv6HopByHopHeader, boolean reroute)
|
||||
IPv6SegmentRoutingHeader srhh)
|
||||
throws IllegalRawDataException, IOException {
|
||||
|
||||
|
||||
if (srhh.getSegmentsLeft() <= 0) { // 所有段已处理完毕
|
||||
if (iPv6HopByHopHeader != null) {
|
||||
int sl = srhh.getSegmentsLeft();
|
||||
// IPv6Address prevSID
|
||||
// =sl+1>=srhh.getAddresses().size()?iPv6Packet.getSourceAddress():srhh.getAddresses().get(sl+1);
|
||||
if (linkfrom instanceof KLALBRemoteLink) {
|
||||
processKLALBOAM(iPv6Packet, linkfrom.getAddressGroups().get(0).getAddress(),
|
||||
((KLALBRemoteLink) linkfrom).getRemoteVaddr().getAddress(), iPv6HopByHopHeader);
|
||||
}
|
||||
}
|
||||
// System.out.println(iPv6HopByHopHeader);
|
||||
sendPacketToRouteItem(iPv6Packet, ri);
|
||||
} else {
|
||||
if (reroute) {
|
||||
// 重路由处理
|
||||
} else {
|
||||
if (iPv6Packet.getRouteCounter().get()<=0) {
|
||||
// 重路由不处理
|
||||
int oldSL = srhh.getSegmentsLeft();
|
||||
if (iPv6HopByHopHeader != null) {
|
||||
// IPv6Address prevSID
|
||||
// =oldSL+1>=srhh.getAddresses().size()?iPv6Packet.getSourceAddress():srhh.getAddresses().get(oldSL+1);
|
||||
if (linkfrom instanceof KLALBRemoteLink) {
|
||||
processKLALBOAM(iPv6Packet, linkfrom.getAddressGroups().get(0).getAddress(),
|
||||
((KLALBRemoteLink) linkfrom).getRemoteVaddr().getAddress(), iPv6HopByHopHeader);
|
||||
}
|
||||
}
|
||||
// 正常SRv6处理:移动到下一个段
|
||||
int newSL = oldSL - 1;
|
||||
srhh.setSegmentsLeft(newSL); // 更新剩余段数
|
||||
@@ -687,7 +665,7 @@ public class SRv6Router {
|
||||
// 记录热点地址(用于流量工程)
|
||||
if (iPv6Packet.getPayload().getProtocolNumber() != KLALBRoutingProtocol.DEFAULT_PROTOCOL_NUMBER)
|
||||
klalbRouteProtol.putHotspotAddress(iPv6Packet.getSourceAddress());
|
||||
routePacket(linkfrom, iPv6Packet, reroute); // 继续路由
|
||||
routePacket(linkfrom, iPv6Packet); // 继续路由
|
||||
}
|
||||
}
|
||||
|
||||
@@ -814,7 +792,7 @@ public class SRv6Router {
|
||||
if(ecn) {
|
||||
packet.markCE();
|
||||
}
|
||||
insertSRHandRoutePacket(null, packet); // 插入SRH并路由
|
||||
insertHeaderAndRoutePacket(null, packet); // 插入SRH并路由
|
||||
long time=System.nanoTime()-start;
|
||||
backplaneCount(time,ecn);
|
||||
} catch (Exception e) {
|
||||
@@ -827,7 +805,7 @@ public class SRv6Router {
|
||||
|
||||
public void onReceive(IPv6NetworkLink link,IPv6Packet t){
|
||||
if (unduplicate(t)) {
|
||||
insertSRHandRoutePacket(link, t); // 插入SRH并路由数据包
|
||||
insertHeaderAndRoutePacket(link, t); // 插入SRH并路由数据包
|
||||
}
|
||||
}
|
||||
|
||||
@@ -916,15 +894,17 @@ public class SRv6Router {
|
||||
}
|
||||
|
||||
// 构造函数
|
||||
public SRv6Router(IPv6AddressGroup hostAddress, HighAccuracyClock clock) {
|
||||
public SRv6Router(IPv6AddressGroup endSID,IPv6AddressGroup networkGroup, HighAccuracyClock clock) {
|
||||
super();
|
||||
this.locator = hostAddress;
|
||||
this.locator = endSID;
|
||||
this.clock = clock;
|
||||
// initWorkerThreads();
|
||||
// 创建环回链路
|
||||
this.inLoopBack = new LoopbackIPv6NetworkLink(
|
||||
List.of(new IPv6AddressGroup(IPv6Address.LOOPBACK, 128), hostAddress), this);
|
||||
List.of(new IPv6AddressGroup(IPv6Address.LOOPBACK, 128), endSID), this);
|
||||
linkTabel.add(inLoopBack); // 添加到链路表
|
||||
this.srhInserter=new SRHInsertNetworkLink(this,networkGroup);
|
||||
linkTabel.add(srhInserter);
|
||||
backplaneTimer.scheduleAtFixedRate(new TimerTask() {
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user