Omnet++/INET中PeriodicGate关闭时仍转发数据包的问题排查
我是OMNeT++和INET的新手,正在修改INET库中的TsnLinearNetwork拓扑(Client <------> Switch <------> Server)。客户端持续发送UDP数据包流,经交换机转发到服务器。我配置了PeriodicGate,期望它按周期切换状态:第1秒关闭,第2秒打开,关闭时丢弃数据包。
目前已在omnetpp.ini中完成配置,能观察到网关状态变化,但关闭状态下数据包依然被转发。反复调整参数无效,按文档描述PeriodicGate应该根据状态允许或阻止数据包通过。
我的问题:
- 为何PeriodicGate关闭时数据包仍被转发?
- 如何实现关闭时丢弃数据包的预期行为?
问题原因分析
你的配置中,仅启用了入口流量过滤(*.switch.hasIngressTrafficFiltering = true),但未将PeriodicGate的动作设置为丢弃。默认情况下,PeriodicGate在关闭时只是暂停转发,而非直接丢弃——数据包会被暂存在队列中,等到Gate打开后继续转发,这就是你看到关闭状态下后续仍有数据包到达服务器的原因。
另外,配置中重复设置了*.switch.bridging.streamFilter.ingress.gate[*].initiallyOpen = false,虽然不影响功能,但建议清理冗余配置。
解决方案
要实现关闭时丢弃数据包,需修改以下配置:
为PeriodicGate添加丢弃动作
在*.switch.bridging.streamFilter.ingress.gate[0]的配置中,添加closingAction = "drop"参数,指定Gate关闭时直接丢弃匹配的数据包。优化冗余配置
删除重复的*.switch.bridging.streamFilter.ingress.gate[*].initiallyOpen = false,保留单个实例的设置即可。
修改后的关键配置片段:
*.switch.bridging.streamFilter.ingress.gate[*].typename = "PeriodicGate" *.switch.bridging.streamFilter.ingress.gate[0].display-name = "random traffic" *.switch.bridging.streamFilter.ingress.gate[0].initiallyOpen = false *.switch.bridging.streamFilter.ingress.gate[0].durations = [1s,1s] *.switch.bridging.streamFilter.ingress.gate[0].closingAction = "drop" # 添加此行
- 验证配置逻辑
确保流分类、PCP映射正确:客户端已将"random traffic"流标记为PCP=0,交换机也能通过PCP正确识别该流并关联到对应的Gate,这部分你的现有配置是正确的。
附原始配置信息
omnetpp.ini
[General] [simpleStart03] network = simpleStart sim-time-limit = 2s *.client.numApps = 1 *.client.app[*].typename = "UdpSourceApp" *.client.app[0].display-name = "random traffic" *.client.app[*].io.destAddress = "server" *.client.app[0].io.destPort = 1000 *.client.app[0].source.packetLength = 1000B *.client.app[0].source.productionInterval = 500us *.client.hasOutgoingStreams = true *.client.bridging.streamIdentifier.identifier.mapping = [{stream: "random traffic"}] *.client.bridging.streamCoder.encoder.mapping = [{stream: "random traffic", pcp: 0}] *.server.numApps = 1 *.server.app[*].typename = "UdpSinkApp" *.server.app[0].io.localPort = 1000 *.switch.bridging.streamCoder.decoder.mapping = [{pcp: 0, stream: "random traffic"}] *.switch.hasIngressTrafficFiltering = true *.switch.bridging.streamFilter.ingress.numGates = 1 *.switch.bridging.streamFilter.ingress.numMeters = 1 *.switch.bridging.streamFilter.ingress.numStreams = 1 *.switch.bridging.streamFilter.ingress.classifier.mapping = {"random traffic": 0} *.switch.bridging.streamFilter.ingress.meter[0].display-name = "random traffic" *.switch.bridging.streamFilter.ingress.meter[*].typename = "SingleRateTwoColorMeter" *.switch.bridging.streamFilter.ingress.meter[0].committedInformationRate = 40Mbps *.switch.bridging.streamFilter.ingress.meter[0].committedBurstSize = 10kB *.switch.bridging.streamFilter.ingress.gate[*].typename = "PeriodicGate" *.switch.bridging.streamFilter.ingress.gate[0].display-name = "random traffic" *.switch.bridging.streamFilter.ingress.gate[0].initiallyOpen = false *.switch.bridging.streamFilter.ingress.gate[0].durations = [1s,1s] *.switch.bridging.streamFilter.ingress.gate[*].initiallyOpen = false
omnetpp.ned
import inet.networks.tsn.TsnLinearNetwork; network simpleStart extends TsnLinearNetwork { }
版本信息:OMNeT++ 6.0.1;INET 4.4
内容的提问来源于stack exchange,提问作者olfline

