在我的ODL代码中,我最近注意到在卸载流时,我会遇到意外行为。场景如下:
在多个表中安装了一堆流
我使用创建它时使用的相同NodeId,TableId和FlowId删除了一个流。作为参考,我使用SalFlowService的addFlow和removeFlow方法。
我执行ovs-ofctl dump-flows
并注意到删除了给定节点和给定表上的所有流。作为参考,我使用的flowId类似于“routing-rename-src-0.0.0.0-to-123.123.123.0”。
在我看来,ODL以某种方式完全无法识别FlowId,并默认删除给定表上的所有流。没有从OpenFlow发送错误消息,并且ODL中没有记录错误。
问题是,我肯定使用相同的FlowId对象。
现在,我对可能出现的问题感到有些困惑,但我有一个想法,就是网上存在相互矛盾的证据,而且由于我没有使用OpenFlowPlugin,我无法告诉自己。
在REST请求路径中,使用flowIds的整数来发布或倾向于发布流。
在l2switch等ODL代码中,flowID可以是字符串。这使得某些调试更容易解析。
现在,这很奇怪。我们使用整数或字符串,还是ODL可以通过各种映射机制在整数和字符串之间进行转换?无论哪种方式,我都会遇到意外行为。有趣的是,我链接的代码没有删除...所以在这种情况下可能更像是黑客攻击?
编辑:我现在尝试将我的ID重命名为数字,或者将“PluginName”+“ - ”+数字重命名,卸载似乎仍然失败。问题是现在我无法在不卸载整个表的情况下卸载流规则...
编辑2 :This issue让我了解流ID不是必须用于删除流量。我提出了以下过程来删除流,这种方式不会导致表上的所有流被删除:
final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow);
builder.setNode(new NodeRef(nodeId));
builder.setFlowRef(new FlowRef(flowPath));
builder.setFlowTable(new FlowTableRef(tableId));
flowIdentity.context.salFlowService.removeFlow(builder.build());
与我之前的代码的不同之处在于我没有使用Flow对象来初始化输入构建器。在这种形式中,我的添加和删除方法是相同的。只要我在添加流后保留Flow对象,我就可以删除流,并且不会擦除表。
但有一个例外。在表0中,我安装了两个不同的表更改规则,这些规则具有相同的操作,但优先级不同。匹配略有不同(一个定义了一个端口,另一个没定义)。当我删除最通用(和最低优先级)规则时,另一个规则也会被删除。
我不明白为什么会这样。即使我尝试在输入构建器中设置优先级,这仍然会发生。 HRM。
答案 0 :(得分:0)
正如我在第二次编辑中所写,this post表明流删除不基于Id显式工作,而是基于方法的输入构建器中定义的字段。我还没有对此进行测试,但我怀疑如果构建器中省略了流引用,则定义的字段将用于删除所有匹配的规则,这可能意味着如果设置了错误的字段,则意外删除所有流。< / p>
给出以下代码来添加流程:
final AddFlowInputBuilder builder = new AddFlowInputBuilder(flow);
builder.setNode(new NodeRef(nodeId));
builder.setFlowRef(new FlowRef(flowPath));
builder.setFlowTable(new FlowTableRef(tableId));
builder.setPriority(flow.getPriority());
flowIdentity.context.salFlowService.addFlow(builder.build());
以下用于删除流的代码按预期工作(使用SAME Flow对象):
final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow);
builder.setNode(new NodeRef(flowLocation.nodeIdentifier));
builder.setFlowRef(new FlowRef(flowLocation.flowPath));
builder.setFlowTable(new FlowTableRef(flowLocation.tableIdentifier));
builder.setPriority(flow.getPriority());
builder.setStrict(Boolean.TRUE);
flowIdentity.context.salFlowService.removeFlow(builder.build());
没有&#34;严格&#34;设置为true,这可能会导致在同一个表上意外删除类似的规则。我不确定删除时流的匹配方式,有或没有严格,但我可以确认这一点。