diff --git a/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java b/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java index 45e6021..924c98d 100644 --- a/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java +++ b/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java @@ -14,13 +14,20 @@ public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink { private SRv6Router srv6Router; private final boolean loopback; - - - + + private final boolean filter; + + public AbstractIPv6NetworkLink(boolean loopback) { super(); this.loopback = loopback; + this.filter = false; } + public AbstractIPv6NetworkLink(boolean loopback, boolean filter) { + super(); + this.loopback = loopback; + this.filter = filter; + } public SRv6Router getSrv6Router() { return srv6Router; @@ -108,4 +115,9 @@ public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink { } return rlist; } + + @Override + public boolean isFilter() { + return filter; + } } diff --git a/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java b/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java index 5fa2c4a..38b55a5 100644 --- a/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java +++ b/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java @@ -29,5 +29,6 @@ public interface IPv6NetworkLink { public void setReceiveConsumer(BiConsumer> srhReceive); public void addIPv6LinkStateListener(IPv6LinkStateListener listener); public void removeIPv6LinkStateListener(IPv6LinkStateListener listener); - + + public boolean isFilter(); } diff --git a/src/org/kne/cloud/network/srv6/SRHInsertNetworkLink.java b/src/org/kne/cloud/network/srv6/SRHInsertNetworkLink.java index 5cad7a4..eb06e4d 100644 --- a/src/org/kne/cloud/network/srv6/SRHInsertNetworkLink.java +++ b/src/org/kne/cloud/network/srv6/SRHInsertNetworkLink.java @@ -11,7 +11,7 @@ public class SRHInsertNetworkLink extends AbstractIPv6NetworkLink { private IPv6AddressGroup ipgroup; public SRHInsertNetworkLink(SRv6Router sRv6Router,IPv6AddressGroup ipgroup) { - super(false); + super(false,true); setSRv6Router(sRv6Router); this.ipgroup=ipgroup; } @@ -28,8 +28,9 @@ public class SRHInsertNetworkLink extends AbstractIPv6NetworkLink { @Override public void sendPacket(IPv6Packet pack, IPv6Address inet6Address) throws IOException { - getSrv6Router().insertSRHeader( pack); - getSrv6Router().insertHeaderAndRoutePacket(null, pack); + if(getSrv6Router().insertSRHeader( pack)) { + getSrv6Router().insertHeaderAndRoutePacket(null, pack); + } } @Override diff --git a/src/org/kne/cloud/network/srv6/SRv6Router.java b/src/org/kne/cloud/network/srv6/SRv6Router.java index 90b1955..cf4216c 100644 --- a/src/org/kne/cloud/network/srv6/SRv6Router.java +++ b/src/org/kne/cloud/network/srv6/SRv6Router.java @@ -578,16 +578,19 @@ public class SRv6Router { sendPacketToRouteItem(linkfrom,iPv6Packet, ri); } } else { // 普通链路处理 - // 检查重路由计数 - int count=iPv6Packet.getRouteCounter().getAndIncrement(); - if (count >= MAX_REROUTE_COUNT) { - return; // 超过最大重路由次数,丢弃 - } + if(ri.getDestlink().isFilter()){ - if (count<=0) { - hop--; // 减少TTL(非重路由时) - } + }else { + // 检查重路由计数 + int count = iPv6Packet.getRouteCounter().getAndIncrement(); + if (count > MAX_REROUTE_COUNT) { + return; // 超过最大重路由次数,丢弃 + } + if (count <= 0) { + hop--; // 减少TTL(非重路由时) + } + } if (hop > 0) { // TTL有效 iPv6Packet.setHopLimit(hop); // 更新TTL sendPacketToRouteItem(linkfrom,iPv6Packet, ri); // 发送数据包