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]; 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

Reply via email to