尝试读取表上的流时损坏的MD-SAL查询:缺少流规则

时间:2017-10-24 19:01:29

标签: openflow opendaylight

我遇到了OpenDaylight的故障(使用Mininet)。

基本上,我在查询特定节点和特定表上的流规则。相关代码如下,并且由我轮询的每个节点由1个单独的线程运行:

public static final InstanceIdentifier<Nodes NODES_II = InstanceIdentifier
                                             .builder(Nodes.class).build();
public static InstanceIdentifier<Table> makeTableIId(NodeId nodeId, Short tableId) {
    return NODES_IID.child(Node.class, new NodeKey(nodeId))
                    .augmentation(FlowCapableNode.class)
                    .child(Table.class, new TableKey(tableId));
}

InstanceIdentifier<Table> tableIId = makeTableIId(nodeId, tableId);
Optional<Table> tableOptional = dataBroker.newReadOnlyTransaction()
                                .read(LogicalDatastoreType.OPERATIONAL, tableIId).get();

if(!tableOptional.isPresent()) {
    continue;
}

List<Flow> flows = tableOptional.get().getFlow();

行为:tableOptional存在,getFlow()返回一个空列表。

观察:我正在查询的表上的所有节点上都安装了流规则,但由于某些原因,其中一些节点在所有表中都没有显示这些流(这里是表3,4,5,和6)。

奇怪:在一个有问题的节点上,我有四个规则,分别安装在表9,13,17和22上。它们在150秒后同时超时。它们消失后,查询突然开始“看到”表3,4,5和6上安装的流程,并为每个表返回这些流程。

问题:这怎么可能?

编辑我刚刚意识到超时“突然修复所有内容”的规则也是在ODL日志中生成警告的规则(OpenFlowPlugin更具体)。我没有发现任何明显的问题,所以我有点把它放在一边。

以下是与错误相关的代码:

https://pastebin.com/yJDZesXU

以下是每次安装规则时遇到的错误:

https://pastebin.com/c9HYLBt6

我必须强调这些规则按预期工作,并且将它们打印出来显示没有明显的格式问题。同样,它们在倾倒时看起来很好。 我的假设是,这个警告是ODL“搞乱”的一个症状,试图将规则存储在MD-SAL中,最终搞乱了很多规则读取查询。在卸载随后发生的垃圾时,规则读取查询将再次起作用。

这对我来说很有意义,但后来......我还没有理解如何修复这些警告,或者首先是这些警告的内容。

编辑2 :通过评论怀疑导致上述pastebin中警告的行:

//ipv4MatchBuilder.setIpv4SourceAddressNoMask(...);
//ipv4MatchBuilder.setIpv4SourcenArbitraryBitmask(...);

警告消失,并且当被ping时,流量在所有表格上正确显示。这证实了我的假设,在某个地方,数据存储中发生了错误。

编辑3:我发现通过设置任何非平凡的任意位掩码,此错误消失了。也就是说,我试过设置一个既不为空也不是“255.255.255.255”的任意位掩码,这个错误就消失了。问题是我可能想为源提供一个位掩码,但是在目标上有完全匹配。甚至将位掩码设置为“127.255.255.255”(我试过)仍然令人不安。我觉得这对我来说是一个OpenFlowPlugin故障。

编辑4:重现错误的步骤

  1. 使用ipv4任意位掩码匹配安装规则,目标IP设置,目标任意位掩码为null或设置为255.255.255.255。

     Ipv4MatchArbitraryBitMaskBuilder ipv4MatchBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
     ipv4MatchBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("10.0.0.1"));
     ipv4MatchBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.255.255"));
     matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatchBuilder.build()).setLayer3Match(ipv4MatchBuilder.build());
     ... and so on ...
    
  2. 额外的可选步骤:为目标安装一个此类规则,为源安装一个此类规则,并安装等位规则,其中将位掩码设置为其他内容,如127.255.255.255。

  3. 查询MDSal以从安装了流规则的节点获取流信息。

  4. 现在,在ODL控制器中执行“log:display”。您应该收到有关格式错误的目标地址的警告。此外,您查询的Table对象不应包含任何流,因此tableObject.getFlow()应返回一个空列表。

0 个答案:

没有答案