修复了SRH插入失败导致无法转发的bug

This commit is contained in:
2026-10-21 14:24:32 +08:00
parent 61bc066f82
commit b898e4c5be
4 changed files with 32 additions and 15 deletions
@@ -14,13 +14,20 @@ public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink {
private SRv6Router srv6Router; private SRv6Router srv6Router;
private final boolean loopback; private final boolean loopback;
private final boolean filter;
public AbstractIPv6NetworkLink(boolean loopback) { public AbstractIPv6NetworkLink(boolean loopback) {
super(); super();
this.loopback = loopback; this.loopback = loopback;
this.filter = false;
} }
public AbstractIPv6NetworkLink(boolean loopback, boolean filter) {
super();
this.loopback = loopback;
this.filter = filter;
}
public SRv6Router getSrv6Router() { public SRv6Router getSrv6Router() {
return srv6Router; return srv6Router;
@@ -108,4 +115,9 @@ public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink {
} }
return rlist; return rlist;
} }
@Override
public boolean isFilter() {
return filter;
}
} }
@@ -29,5 +29,6 @@ public interface IPv6NetworkLink {
public void setReceiveConsumer(BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>> srhReceive); public void setReceiveConsumer(BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>> srhReceive);
public void addIPv6LinkStateListener(IPv6LinkStateListener listener); public void addIPv6LinkStateListener(IPv6LinkStateListener listener);
public void removeIPv6LinkStateListener(IPv6LinkStateListener listener); public void removeIPv6LinkStateListener(IPv6LinkStateListener listener);
public boolean isFilter();
} }
@@ -11,7 +11,7 @@ public class SRHInsertNetworkLink extends AbstractIPv6NetworkLink {
private IPv6AddressGroup ipgroup; private IPv6AddressGroup ipgroup;
public SRHInsertNetworkLink(SRv6Router sRv6Router,IPv6AddressGroup ipgroup) { public SRHInsertNetworkLink(SRv6Router sRv6Router,IPv6AddressGroup ipgroup) {
super(false); super(false,true);
setSRv6Router(sRv6Router); setSRv6Router(sRv6Router);
this.ipgroup=ipgroup; this.ipgroup=ipgroup;
} }
@@ -28,8 +28,9 @@ public class SRHInsertNetworkLink extends AbstractIPv6NetworkLink {
@Override @Override
public void sendPacket(IPv6Packet pack, IPv6Address inet6Address) throws IOException { public void sendPacket(IPv6Packet pack, IPv6Address inet6Address) throws IOException {
getSrv6Router().insertSRHeader( pack); if(getSrv6Router().insertSRHeader( pack)) {
getSrv6Router().insertHeaderAndRoutePacket(null, pack); getSrv6Router().insertHeaderAndRoutePacket(null, pack);
}
} }
@Override @Override
+11 -8
View File
@@ -578,16 +578,19 @@ public class SRv6Router {
sendPacketToRouteItem(linkfrom,iPv6Packet, ri); sendPacketToRouteItem(linkfrom,iPv6Packet, ri);
} }
} else { // 普通链路处理 } else { // 普通链路处理
// 检查重路由计数 if(ri.getDestlink().isFilter()){
int count=iPv6Packet.getRouteCounter().getAndIncrement();
if (count >= MAX_REROUTE_COUNT) {
return; // 超过最大重路由次数,丢弃
}
if (count<=0) { }else {
hop--; // 减少TTL(非重路由时) // 检查重路由计数
} int count = iPv6Packet.getRouteCounter().getAndIncrement();
if (count > MAX_REROUTE_COUNT) {
return; // 超过最大重路由次数,丢弃
}
if (count <= 0) {
hop--; // 减少TTL(非重路由时)
}
}
if (hop > 0) { // TTL有效 if (hop > 0) { // TTL有效
iPv6Packet.setHopLimit(hop); // 更新TTL iPv6Packet.setHopLimit(hop); // 更新TTL
sendPacketToRouteItem(linkfrom,iPv6Packet, ri); // 发送数据包 sendPacketToRouteItem(linkfrom,iPv6Packet, ri); // 发送数据包