修复了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,11 +15,18 @@ 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() {
@@ -108,4 +115,9 @@ public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink {
} }
return rlist; return rlist;
} }
@Override
public boolean isFilter() {
return filter;
}
} }
@@ -30,4 +30,5 @@ public interface IPv6NetworkLink {
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,9 +28,10 @@ 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
public List<RouteItem> getRouteItems() { public List<RouteItem> getRouteItems() {
@@ -578,16 +578,19 @@ public class SRv6Router {
sendPacketToRouteItem(linkfrom,iPv6Packet, ri); sendPacketToRouteItem(linkfrom,iPv6Packet, ri);
} }
} else { // 普通链路处理 } else { // 普通链路处理
if(ri.getDestlink().isFilter()){
}else {
// 检查重路由计数 // 检查重路由计数
int count = iPv6Packet.getRouteCounter().getAndIncrement(); int count = iPv6Packet.getRouteCounter().getAndIncrement();
if (count >= MAX_REROUTE_COUNT) { if (count > MAX_REROUTE_COUNT) {
return; // 超过最大重路由次数,丢弃 return; // 超过最大重路由次数,丢弃
} }
if (count <= 0) { if (count <= 0) {
hop--; // 减少TTL(非重路由时) 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); // 发送数据包