Hi, Brady It looks like an Openflowplugin-side issue, you can see some ovs log if ovs has any exception. Per my use experience, as Shuva said, config data store should have all the flows SFC added, You can follow Openflowplugin log to find corresponding checkNotNull call, obviously current Openflowplugin doesn’t allow any match per error log, maybe you can add “priority = 0” to workaround it.
From: [email protected] [mailto:[email protected]] On Behalf Of Shuva Jyoti Kar Sent: Tuesday, July 05, 2016 12:43 AM To: Brady Allen Johnson <[email protected]>; [email protected]; Abhijit Kumbhare <[email protected]>; Anil Vishnoi <[email protected]> Subject: Re: [openflowplugin-dev] Problems writing MatchAny flows Brady, since on the ofplugin we react to the DTCL of a flow being added to the config DS and then call the rpc, lets debug the part writing to the config DS then and find out where the empty match is converted to a null one. Thanks Shuva From: Brady Allen Johnson Sent: Monday, July 04, 2016 10:05 PM To: Shuva Jyoti Kar; [email protected]<mailto:[email protected]>; Abhijit Kumbhare; Anil Vishnoi Subject: Re: [openflowplugin-dev] Problems writing MatchAny flows Shuva, The config DS doesnt have any sort of match when programmatically adding a flow. I put that in my previous email, here it is again: "flow-node-inventory:table": [ { "id": 2, "flow": [ { "id": "2", "cookie_mask": 20, "table_id": 2, "priority": 5, "strict": false, "flags": "", "flow-name": "MatchAny", "idle-timeout": 0, "hard-timeout": 0, "cookie": 20, "barrier": false, "instructions": { "instruction": [ { "order": 0, "go-to-table": { "table_id": 3 } } ] } } ] } Thanks, Brady On 04/07/16 18:07, Shuva Jyoti Kar wrote: Brady, one small thing I wanted to verify - when you programmatically add a flow , does the config DS reflect the empty match ? This would help us to locate the problem. Thanks Shuva From: Brady Allen Johnson Sent: Monday, July 04, 2016 9:12 PM To: Shuva Jyoti Kar; [email protected]<mailto:[email protected]>; Abhijit Kumbhare; Anil Vishnoi Subject: Re: [openflowplugin-dev] Problems writing MatchAny flows Shuva, I just verified that I can do a very similar MatchAny flow via RestConf and it gets written to the switch: $ curl -i -H "Content-Type: application/json" --data '{ "flow": [ { "id": "1000", "table_id": 0, "strict": false, "match": {}, "instructions": { "instruction": [ { "order": 0, "go-to-table": { "table_id": 10 } } ] } } ] }' -X PUT --user admin:admin http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:236095091025485/table/0/flow/1000 Here's the flow in the switch: $ sudo ovs-ofctl -O OpenFlow13 dump-flows br-int table=0 OFPST_FLOW reply (OF1.3) (xid=0x2): cookie=0x0, duration=142.350s, table=0, n_packets=0, n_bytes=0, actions=goto_table:10 But, when I do this programmatically, I get the nasty exception: (More exception details in original email) java.lang.NullPointerException: Match value must not be null at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:226)[65:com.google.guava:18.0.0] at org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory$FlowRegistryKeyDto.<init>(FlowRegistryKeyFactory.java:43)[286:org.opendaylight.openflowplugin.impl:0.3.0.SNAPSHOT] at org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory.create(FlowRegistryKeyFactory.java:29)[286:org.opendaylight.openflowplugin.impl:0.3.0.SNAPSHOT] So, there seems to be a bug in the OpenFlowPlugin code when creating flows programmatically. Now that I know that its still possible in Boron to create MatchAny flows like always, I'll look into finding where the bug is. Notice, Im using OVS 2.5.90. Regards, Brady On 04/07/16 17:03, Shuva Jyoti Kar wrote: Brady, This is the details Operation: PUT URL: http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/1/flow/2 BODY: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <flow xmlns="urn:opendaylight:flow:inventory"> <hard-timeout>0</hard-timeout> <idle-timeout>0</idle-timeout> <priority>2</priority> <flow-name>flow5</flow-name> <match> </match> <id>2</id> <table_id>1</table_id> <instructions> <instruction> <order>0</order> <apply-actions> <action> <output-action> <output-node-connector>1</output-node-connector> </output-action> <order>0</order> </action> </apply-actions> </instruction> </instructions> </flow> On ovs2.4: mininet> sh ovs-ofctl -O Openflow13 dump-flows s1 OFPST_FLOW reply (OF1.3) (xid=0x2): cookie=0x0, duration=3.008s, table=1, n_packets=0, n_bytes=0, priority=2 actions=output:1 CONFIG DATASTORE: GET on http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/1/flow/2 <flow xmlns="urn:opendaylight:flow:inventory"> <id>2</id> <priority>2</priority> <table_id>1</table_id> <hard-timeout>0</hard-timeout> <match></match> <flow-name>flow5</flow-name> <instructions> <instruction> <order>0</order> <apply-actions> <action> <order>0</order> <output-action> <output-node-connector>1</output-node-connector> </output-action> </action> </apply-actions> </instruction> </instructions> <idle-timeout>0</idle-timeout> </flow> Thanks Shuva From: Brady Allen Johnson Sent: Monday, July 04, 2016 3:34 PM To: Shuva Jyoti Kar; [email protected]<mailto:[email protected]>; Abhijit Kumbhare; Anil Vishnoi Subject: Re: [openflowplugin-dev] Problems writing MatchAny flows Shuva, Thanks for the info. Can you send me the curl/URL you used, please. I just tried this with SFC master from today, and still get the same problem. Here is what is in the configuration data store, you can see that there is no match. Seems like now when the match is empty, it doesnt get written to config. "flow-node-inventory:table": [ { "id": 2, "flow": [ { "id": "2", "cookie_mask": 20, "table_id": 2, "priority": 5, "strict": false, "flags": "", "flow-name": "MatchAny", "idle-timeout": 0, "hard-timeout": 0, "cookie": 20, "barrier": false, "instructions": { "instruction": [ { "order": 0, "go-to-table": { "table_id": 3 } } ] } } ] }, Thanks, Brady On 04/07/16 09:28, Shuva Jyoti Kar wrote: Hi Brady, I do see this error only while adding a flow without any match(<match>..</match>) . But with empty match fields(<match></match>) I donot see this error and I do see the flow getting provisioned on the switch. I am using Restconf for pushing the flows. Thanks Shuva From: [email protected]<mailto:[email protected]> [mailto:[email protected]] On Behalf Of Brady Allen Johnson Sent: Friday, July 01, 2016 8:14 PM To: [email protected]<mailto:[email protected]>; Abhijit Kumbhare; Anil Vishnoi Subject: [openflowplugin-dev] Problems writing MatchAny flows Hello, Im getting an Exception when writing a MatchAny flow in Boron. The MatchAny flow has different names, but Im referring to an empty match. Here is the code Ive always used to create the Match: MatchBuilder matchBuilder = new MatchBuilder(); return matchBuilder.build(); The exception I get is below. Has the way of creating MatchAny flows changed recently?? Thanks, Brady 2016-07-01 16:34:05,567 | ERROR | on-dispatcher-67 | DataTreeChangeListenerActor | 187 - org.opendaylight.controller.sal-distributed-datastore - 1.4.0.SNAPSHOT | Error notifying listener org.opendaylight.controller.md.sal.binding.impl.BindingClusteredDOMDataTreeChangeListenerAdapter@1f10a709<mailto:org.opendaylight.controller.md.sal.binding.impl.BindingClusteredDOMDataTreeChangeListenerAdapter@1f10a709> java.lang.NullPointerException: Match value must not be null at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:226)[65:com.google.guava:18.0.0] at org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory$FlowRegistryKeyDto.<init>(FlowRegistryKeyFactory.java:43)[286:org.opendaylight.openflowplugin.impl:0.3.0.SNAPSHOT] at org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory.create(FlowRegistryKeyFactory.java:29)[286:org.opendaylight.openflowplugin.impl:0.3.0.SNAPSHOT] at org.opendaylight.openflowplugin.impl.services.SalFlowServiceImpl.addFlow(SalFlowServiceImpl.java:86)[286:org.opendaylight.openflowplugin.impl:0.3.0.SNAPSHOT] at org.opendaylight.yangtools.yang.binding.util.RpcMethodInvokerWithInput.invokeOn(RpcMethodInvokerWithInput.java:30)[73:org.opendaylight.mdsal.yang-binding:0.9.0.SNAPSHOT] at org.opendaylight.yangtools.yang.binding.util.AbstractMappedRpcInvoker.invokeRpc(AbstractMappedRpcInvoker.java:52)[73:org.opendaylight.mdsal.yang-binding:0.9.0.SNAPSHOT] at org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcImplementationAdapter.invoke(BindingDOMRpcImplementationAdapter.java:85)[158:org.opendaylight.controller.sal-binding-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcImplementationAdapter.invokeRpc(BindingDOMRpcImplementationAdapter.java:72)[158:org.opendaylight.controller.sal-binding-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.md.sal.dom.broker.impl.RoutedDOMRpcRoutingTableEntry.invokeRpc(RoutedDOMRpcRoutingTableEntry.java:59)[156:org.opendaylight.controller.sal-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRoutingTable.invokeRpc(DOMRpcRoutingTable.java:186)[156:org.opendaylight.controller.sal-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRouter.invokeRpc(DOMRpcRouter.java:131)[156:org.opendaylight.controller.sal-broker-impl:1.4.0.SNAPSHOT] at Proxye0ec0900_6b74_429b_9f12_0a7613d48bda.invokeRpc(Unknown Source)[:] at Proxybc49a3aa_9bb1_4cc7_a246_6274d4eebb3c.invokeRpc(Unknown Source)[:] at org.opendaylight.controller.md.sal.binding.impl.RpcServiceAdapter.invoke0(RpcServiceAdapter.java:65)[158:org.opendaylight.controller.sal-binding-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.md.sal.binding.impl.RpcServiceAdapter.access$000(RpcServiceAdapter.java:43)[158:org.opendaylight.controller.sal-binding-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.md.sal.binding.impl.RpcServiceAdapter$RpcInvocationStrategy.invoke(RpcServiceAdapter.java:159)[158:org.opendaylight.controller.sal-binding-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.md.sal.binding.impl.RpcServiceAdapter.invoke(RpcServiceAdapter.java:96)[158:org.opendaylight.controller.sal-binding-broker-impl:1.4.0.SNAPSHOT] at com.sun.proxy.$Proxy110.addFlow(Unknown Source)[274:org.opendaylight.openflowplugin.model.flow-service:0.3.0.SNAPSHOT] at org.opendaylight.openflowplugin.applications.frm.impl.FlowForwarder.add(FlowForwarder.java:197)[278:org.opendaylight.openflowplugin.applications.forwardingrules-manager:0.3.0.SNAPSHOT] at org.opendaylight.openflowplugin.applications.frm.impl.FlowForwarder.add(FlowForwarder.java:61)[278:org.opendaylight.openflowplugin.applications.forwardingrules-manager:0.3.0.SNAPSHOT] at org.opendaylight.openflowplugin.applications.frm.impl.AbstractListeningCommiter.onDataTreeChanged(AbstractListeningCommiter.java:64)[278:org.opendaylight.openflowplugin.applications.forwardingrules-manager:0.3.0.SNAPSHOT] at org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataTreeChangeListenerAdapter.onDataTreeChanged(BindingDOMDataTreeChangeListenerAdapter.java:41)[158:org.opendaylight.controller.sal-binding-broker-impl:1.4.0.SNAPSHOT] at org.opendaylight.controller.cluster.datastore.DataTreeChangeListenerActor.dataChanged(DataTreeChangeListenerActor.java:55)[187:org.opendaylight.controller.sal-distributed-datastore:1.4.0.SNAPSHOT] at org.opendaylight.controller.cluster.datastore.DataTreeChangeListenerActor.handleReceive(DataTreeChangeListenerActor.java:37)[187:org.opendaylight.controller.sal-distributed-datastore:1.4.0.SNAPSHOT] at org.opendaylight.controller.cluster.common.actor.AbstractUntypedActor.onReceive(AbstractUntypedActor.java:25)[182:org.opendaylight.controller.sal-clustering-commons:1.4.0.SNAPSHOT] at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:165)[170:com.typesafe.akka.actor:2.4.7] at akka.actor.Actor$class.aroundReceive(Actor.scala:484)[170:com.typesafe.akka.actor:2.4.7] at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:95)[170:com.typesafe.akka.actor:2.4.7] at akka.actor.ActorCell.receiveMessage(ActorCell.scala:526)[170:com.typesafe.akka.actor:2.4.7] at akka.actor.ActorCell.invoke(ActorCell.scala:495)[170:com.typesafe.akka.actor:2.4.7] at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)[170:com.typesafe.akka.actor:2.4.7] at akka.dispatch.Mailbox.run(Mailbox.scala:224)[170:com.typesafe.akka.actor:2.4.7] at akka.dispatch.Mailbox.exec(Mailbox.scala:234)[170:com.typesafe.akka.actor:2.4.7] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)[166:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8] at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)[166:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8] at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)[166:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)[166:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8] 2016-07-01 16:34:05,574 | ERROR | on-dispatcher-67 | SalFlowServiceImpl | 286 - org.opendaylight.openflowplugin.impl - 0.3.0.SNAPSHOT | flow add failed for id=16, errors=Device reported error type BADMATCH code BADFIELD 2016-07-01 16:34:05,577 | ERROR | on-dispatcher-67 | SalFlowServiceImpl | 286 - org.opendaylight.openflowplugin.impl - 0.3.0.SNAPSHOT | flow add failed for id=18, errors=Device reported error type BADMATCH code BADFIELD 2016-07-01 16:34:05,581 | ERROR | on-dispatcher-67 | SalFlowServiceImpl | 286 - org.opendaylight.openflowplugin.impl - 0.3.0.SNAPSHOT | flow add failed for id=17, errors=Device reported error type BADMATCH code BADFIELD 2016-07-01 16:34:05,585 | ERROR | on-dispatcher-67 | SalFlowServiceImpl | 286 - org.opendaylight.openflowplugin.impl - 0.3.0.SNAPSHOT | flow add failed for id=19, errors=Device reported error type BADMATCH code BADFIELD 2016-07-01 16:34:05,592 | ERROR | on-dispatcher-67 | SalFlowServiceImpl | 286 - org.opendaylight.openflowplugin.impl - 0.3.0.SNAPSHOT | flow add failed for id=13, errors=Device reported error type BADMATCH code BADFIELD
_______________________________________________ openflowplugin-dev mailing list [email protected] https://lists.opendaylight.org/mailman/listinfo/openflowplugin-dev
