修复了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
@@ -15,12 +15,19 @@ 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;
}
}
@@ -30,4 +30,5 @@ public interface IPv6NetworkLink {
public void addIPv6LinkStateListener(IPv6LinkStateListener listener);
public void removeIPv6LinkStateListener(IPv6LinkStateListener listener);
public boolean isFilter();
}
@@ -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
+11 -8
View File
@@ -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); // 发送数据包