OpenDaylight SR3中,怎么用java代码删除流表?


我用以下这段代码来添加流表,成功了

final AddFlowInputBuilder builder = new AddFlowInputBuilder(flow);

builder.setNode(new NodeRef(nodeInstanceId));

builder.setFlowRef(new FlowRef(flowPath));

builder.setFlowTable(new FlowTableRef(tableInstanceId));

builder.setTransactionUri(new Uri(flow.getId().getValue()));

return salFlowService.addFlow(builder.build());

但是我用这段代码来删除流表时,这个交换机上的所有流表都被清空了!

RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder()

.setNode(new NodeRef(nodeInstanceId))

.setFlowRef(new FlowRef(flowPath))

.setFlowTable(new FlowTableRef(tableInstanceId))

.setTransactionUri(new Uri(flow.getId().getValue()));

return salFlowService.removeFlow(builder.build());

我在karaf的log中确定过 nodeInstanceId/flowPath/tableInstanceId/flow 的值在两段代码中都是相同的。不知道是我理解的问题还是什么问题?请大神们告诉我一下!谢谢!
已邀请:

林潇 - 90后,为什么可以如此的菜

赞同来自: 君子一诺


找到解决方案了。
使用cookie, cookieMask。

在OpenFlow1.3中,cookie相当于id,cookieMask相当于mask(废话)。
具体在OpenFlow1.3白皮书中有这样一句话:
(flow entry:cookie&flow mod:cookie mask) == (flow mod:cookie&flow mod:cookie mask).

flowentry:cookie就是已经存在在交换机上的流表项
flow mod:cookie就是你从控制器发送给交换机的删除流表的消息中的cookie
flow mod:cookie mask也是你从控制器发送给交换机的删除流表的消息中的cookie mask

跪了orz,智商捉急,看书看不懂。

林潇 - 90后,为什么可以如此的菜

赞同来自:


还有一种方法就是 用如下的命令
RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow)
.setNode(new NodeRef(nodeInstanceId));

flow就是你之前构造的那个flow,setNode就是指定交换机。

但我还想请问一下 addFlowInputBuilder中的
setFlowRef
还有setTransactionUri 是用来干嘛?

要回复问题请先登录注册