删除单个流时流消失

Flows disappearing when deleting a single flow

在我的 ODL 代码中,我最近注意到在卸载流时出现意外行为。场景是这样的:

在我看来,ODL 完全无法识别 FlowId,并且默认删除给定 table 上的所有流。 OpenFlow 未发送任何错误消息,ODL 中也未记录任何错误。

事实是,我确实使用了相同的 FlowId 对象。

现在,我对可能出现的问题有点困惑,但我有一个想法,只是网上有相互矛盾的证据,而且由于我没有在 OpenFlowPlugin 上工作过,所以我不能完全告诉自己。

现在,这很奇怪。我们使用的是整数还是字符串,或者ODL是否可以通过某种映射机制在整数和字符串之间进行转换?无论哪种方式,我都会得到意想不到的行为。有趣的是,我链接到的代码不会删除...所以在这种情况下可能更像是一种黑客攻击?

编辑 :我现在尝试将我的 ID 重命名为纯数字,或 "PluginName" +“-”+ 数字,但卸载似乎仍然失败。现在的问题是,如果不卸载整个 table,我就无法卸载流规则...

编辑 2This issue 让我明白流 ID 并非必须 用于删除流。我提出了以下删除流的过程,其方式不会导致 table 上的所有流都被删除:

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对象,我就可以删除流,并且tables不会被擦除。

但有一个例外。在 table 0,我安装了两个不同的 table-change 规则,它们具有相同的操作,但优先级不同。匹配略有不同(一个定义了一个输入端口,另一个没有)。当我删除最通用(和最低优先级)的规则时,另一个也被删除。

我不明白为什么会这样。即使我尝试在输入构建器中设置优先级,这仍然会发生。嗯。

正如我在第二次编辑中所写,this post 建议流删除不会基于 Id 显式工作,而是在方法的输入构建器中定义的字段上工作。我没有对此进行测试,但我怀疑如果构建器中省略了流引用,则定义的字段将用于删除所有匹配规则,这可能意味着如果设置了错误的字段,则会意外删除所有流。

给定以下代码来添加流:

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());

以下删除流的代码按预期工作(使用相同的流对象):

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());

如果 "strict" 未设置为 true,这可能会导致意外删除相同 table 上的相似规则。我不确定流在删除时的匹配方式,无论是否严格,但我可以确认这一点。