修复了SRH插入失败导致无法转发的bug
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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); // 发送数据包
|
||||||
|
|||||||
Reference in New Issue
Block a user