首页 文章

删除单个流时流量消失

提问于
浏览
0

在我的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的整数或者倾向于使用整数来发布流 .

  • 在ODL代码中,例如l2switch,flowID可以是字符串 . 这使得某些调试更容易解析 .

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

EDIT :我现在尝试将我的ID重命名为数字,或者将数字重命名为"PluginName" "-",卸载似乎仍然失败 . 问题是现在我无法在不卸载整个表的情况下卸载流规则...

EDIT 2This 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对象,我就可以删除流,并且不会擦除表 .

But there is an exception . 在表0中,我安装了两个不同的表更改规则,这些规则具有相同的操作,但优先级不同 . 匹配略有不同(一个定义了一个端口,另一个没定义) . 当我删除最通用(和最低优先级)规则时,另一个规则也会被删除 .

我不明白为什么会这样 . 即使我尝试在输入构建器中设置优先级,这仍然会发生 . 人力资源管理 .

1 回答

  • 0

    正如我在第二次编辑中所写的那样,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());
    

    以下用于删除流的代码按预期工作(使用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());
    

    如果没有将“strict”设置为true,则会导致在同一个表上意外删除类似规则 . 我不确定删除时流的匹配方式,有或没有严格,但我可以确认 .

相关问题