Merge "Bug 1072 -Add OF13 pre-req for PCP match in TestCommandProvider"
authormichal rehak <mirehak@cisco.com>
Wed, 11 Jun 2014 16:09:40 +0000 (16:09 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 11 Jun 2014 16:09:40 +0000 (16:09 +0000)
drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/AbstractDropTest.java [new file with mode: 0644]
drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestCommiter.java
drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcProvider.java
drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestRpcSender.java
drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/DropTestUtils.java
drop-test/src/main/java/org/opendaylight/openflowplugin/outputtest/OutputTestCommandProvider.java
drop-test/src/main/java/org/opendaylight/openflowplugin/outputtest/OutputTestUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java
test-provider/src/main/java/org/opendaylight/openflowplugin/test/OpenflowpluginTestCommandProvider.java

diff --git a/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/AbstractDropTest.java b/drop-test/src/main/java/org/opendaylight/openflowplugin/droptest/AbstractDropTest.java
new file mode 100644 (file)
index 0000000..d1ded2c
--- /dev/null
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.openflowplugin.droptest;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+abstract class AbstractDropTest implements PacketProcessingListener {
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractDropTest.class);
+
+    private static final AtomicIntegerFieldUpdater<AbstractDropTest> SENT_UPDATER = AtomicIntegerFieldUpdater.newUpdater(AbstractDropTest.class, "_sent");
+    private volatile int _sent;
+
+    private static final AtomicIntegerFieldUpdater<AbstractDropTest> RCVD_UPDATER = AtomicIntegerFieldUpdater.newUpdater(AbstractDropTest.class, "_rcvd");
+    private volatile int _rcvd;
+
+    private static final AtomicIntegerFieldUpdater<AbstractDropTest> EXCS_UPDATER = AtomicIntegerFieldUpdater.newUpdater(AbstractDropTest.class, "_excs");
+    private volatile int _excs;
+
+    public final DropTestStats getStats() {
+        return new DropTestStats(this._sent, this._rcvd, this._excs);
+    }
+
+    public final void clearStats(){
+        this._sent = 0;
+        this._rcvd = 0;
+        this._excs = 0;
+    }
+
+    @Override
+    public final void onPacketReceived(final PacketReceived notification) {
+        LOG.debug("onPacketReceived - Entering - {}", notification);
+
+        RCVD_UPDATER.incrementAndGet(this);
+
+        try {
+            final byte[] rawPacket = notification.getPayload();
+
+            // LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}",
+            //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket));
+
+            final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12);
+
+            //LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}",
+            //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac));
+
+            final MatchBuilder match = new MatchBuilder();
+            final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+            final EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
+
+            //TODO: use HEX, use binary form
+            //Hex.decodeHex("000000000001".toCharArray());
+
+            ethSourceBuilder.setAddress(new MacAddress(DropTestUtils.macToString(srcMac)));
+            ethernetMatch.setEthernetSource(ethSourceBuilder.build());
+            match.setEthernetMatch(ethernetMatch.build());
+
+            final DropActionBuilder dab = new DropActionBuilder();
+            final DropAction dropAction = dab.build();
+            final ActionBuilder ab = new ActionBuilder();
+            ab.setOrder(0);
+            ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
+
+            // Add our drop action to a list
+            final List<Action> actionList = Collections.singletonList(ab.build());
+
+            // Create an Apply Action
+            final ApplyActionsBuilder aab = new ApplyActionsBuilder();
+            aab.setAction(actionList);
+
+            // Wrap our Apply Action in an Instruction
+            final InstructionBuilder ib = new InstructionBuilder();
+            ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
+
+            // Put our Instruction in a list of Instructions
+            final InstructionsBuilder isb = new InstructionsBuilder();;
+            final List<Instruction> instructions = Collections.singletonList(ib.build());
+            isb.setInstruction(instructions);
+
+            // Get the Ingress nodeConnectorRef
+            final NodeConnectorRef ncr = notification.getIngress();
+
+            // Get the instance identifier for the nodeConnectorRef
+            final InstanceIdentifier<?> ncri = ncr.getValue();
+
+            // Get the instanceID for the Node in the tree above us
+            final NodeKey node = ncri.firstKeyOf(Node.class, NodeKey.class);
+
+            processPacket(node, match.build(), isb.build());
+            SENT_UPDATER.incrementAndGet(this);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            LOG.error("Failed to process packet", e);
+            EXCS_UPDATER.incrementAndGet(this);
+        }
+
+        LOG.debug("onPacketReceived - Leaving", notification);
+    }
+
+    protected abstract void processPacket(NodeKey node, Match match, Instructions instructions);
+}
index 06b61c4ce7aa2f85cc799f67f441003ac6e3c94d..a45b9b5204f55b3a581e93bdf57d1e16d792816c 100644 (file)
@@ -7,14 +7,9 @@
  */
 package org.opendaylight.openflowplugin.droptest;
 
-import org.apache.commons.codec.binary.Hex;
+import java.math.BigInteger;
+
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
@@ -24,155 +19,69 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Arrays;
+import com.google.common.base.Preconditions;
 
-@SuppressWarnings("all")
-public class DropTestCommiter implements PacketProcessingListener {
+public class DropTestCommiter extends AbstractDropTest {
     private final static Logger LOG = LoggerFactory.getLogger(DropTestProvider.class);
 
-    private final DropTestProvider _manager;
+    private static final ThreadLocal<FlowBuilder> BUILDER = new ThreadLocal<FlowBuilder>() {
+        @Override
+        protected FlowBuilder initialValue() {
+            final FlowBuilder fb = new FlowBuilder();
 
-    private int _sent;
-    private int _rcvd;
-    
-    public DropTestStats getStats(){
-       return new DropTestStats(this._sent, this._rcvd);
-    }
-    
-    public void clearStats(){
-       this._sent = 0;
-       this._rcvd = 0;
-   }
+            fb.setPriority(4);
+            fb.setBufferId(0L);
+            final FlowCookie cookie = new FlowCookie(BigInteger.valueOf(10));
+            fb.setCookie(cookie);
+            fb.setCookieMask(cookie);
 
-    public DropTestProvider getManager() {
-        return this._manager;
-    }
+            fb.setTableId((short) 0);
+            fb.setHardTimeout(300);
+            fb.setIdleTimeout(240);
+            fb.setFlags(new FlowModFlags(false, false, false, false, false));
+            return fb;
+        }
+    };
+
+    private final DropTestProvider manager;
 
     public DropTestCommiter(final DropTestProvider manager) {
-        this._manager = manager;
+        this.manager = Preconditions.checkNotNull(manager);
     }
 
-    public void onPacketReceived(final PacketReceived notification) {
-        // LOG.debug("onPacketReceived - Entering - " + notification);
-
-       synchronized(this) {
-               this._rcvd++;
-       }
-       
-       // Get the Ingress nodeConnectorRef
-        final NodeConnectorRef ncr = notification.getIngress();
-
-        // Get the instance identifier for the nodeConnectorRef
-        final InstanceIdentifier<NodeConnector> ncri = (InstanceIdentifier<NodeConnector>) ncr.getValue();
-
-        final NodeConnectorKey ncKey = InstanceIdentifier.<NodeConnector, NodeConnectorKey>keyOf(ncri);
-
-        // Get the instanceID for the Node in the tree above us
-        final InstanceIdentifier<Node> nodeInstanceId = ncri.<Node>firstIdentifierOf(Node.class);
-        final NodeKey nodeKey = InstanceIdentifier.<Node, NodeKey>keyOf(nodeInstanceId);
-        final byte[] rawPacket = notification.getPayload();
-
-        // LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}",
-        //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket));
-
-        final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12);
-
-        //LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}",
-        //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac));
-
-        final MatchBuilder match = new MatchBuilder();
-        final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
-        final EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
-
-        //TODO: use HEX, use binary form
-        //Hex.decodeHex("000000000001".toCharArray());
-
-        ethSourceBuilder.setAddress(new MacAddress(DropTestUtils.macToString(srcMac)));
-        ethernetMatch.setEthernetSource(ethSourceBuilder.build());
-        match.setEthernetMatch(ethernetMatch.build());
-
-        final DropActionBuilder dab = new DropActionBuilder();
-        final DropAction dropAction = dab.build();
-        final ActionBuilder ab = new ActionBuilder();
-        ab.setOrder(0);
-        ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
-
-        // Add our drop action to a list
-        final ArrayList<Action> actionList = new ArrayList<Action>();
-        actionList.add(ab.build());
-
-        // Create an Apply Action
-        final ApplyActionsBuilder aab = new ApplyActionsBuilder();
-        aab.setAction(actionList);
-
-        // Wrap our Apply Action in an Instruction
-        final InstructionBuilder ib = new InstructionBuilder();
-        ib.setOrder(0);
-        ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
-
-        // Put our Instruction in a list of Instructions
-        final InstructionsBuilder isb = new InstructionsBuilder();
-        final ArrayList<Instruction> instructions = new ArrayList<Instruction>();
-        instructions.add(ib.build());
-        isb.setInstruction(instructions);
+    @Override
+    protected void processPacket(final NodeKey node, final Match match, final Instructions instructions) {
 
         // Finally build our flow
-        final FlowBuilder fb = new FlowBuilder();
-        fb.setMatch(match.build());
-        fb.setInstructions(isb.build());
-        fb.setId(new FlowId(Long.toString(fb.hashCode())));
-        fb.setPriority(4);
-        fb.setBufferId(0L);
-        final BigInteger value = new BigInteger("10", 10);
-        fb.setCookie(new FlowCookie(value));
-        fb.setCookieMask(new FlowCookie(value));
-
-        fb.setTableId(Short.valueOf(((short) 0)));
-        fb.setHardTimeout(300);
-        fb.setIdleTimeout(240);
-        fb.setFlags(new FlowModFlags(false, false, false, false, false));
+        final FlowBuilder fb = BUILDER.get();
+        fb.setMatch(match);
+        fb.setInstructions(instructions);
+        fb.setId(new FlowId(String.valueOf(fb.hashCode())));
 
         // Construct the flow instance id
         final InstanceIdentifier<Flow> flowInstanceId =
                 InstanceIdentifier.builder(Nodes.class) // File under nodes
-                        .child(Node.class, nodeKey) // A particular node indentified by nodeKey
+                        .child(Node.class, node) // A particular node identified by nodeKey
                         .augmentation(FlowCapableNode.class) // That is flow capable, only FlowCapableNodes have tables
-                        .child(Table.class, new TableKey(new Short(((short) 0)))) // In the table identified by TableKey
+                        .child(Table.class, new TableKey((short) 0)) // In the table identified by TableKey
                         .child(Flow.class, new FlowKey(fb.getId())) // A flow identified by flowKey
                         .build();
 
         final Flow flow = fb.build();
-        final DataModificationTransaction transaction = this._manager.getDataService().beginTransaction();
+        final DataModificationTransaction transaction = manager.getDataService().beginTransaction();
 
-        // LOG.debug("onPacketReceived - About to write flow - " + flow);
+        LOG.debug("onPacketReceived - About to write flow {}", flow);
         transaction.putConfigurationData(flowInstanceId, flow);
         transaction.commit();
-        // LOG.debug("onPacketReceived - About to write flow commited");
-       synchronized(this) {
-               this._sent++;
-       }
-
+        LOG.debug("onPacketReceived - About to write flow commited");
     }
 }
index 4c920122135c83f70401a2ee611d1648302f11da..587505a8a8ad0da428f0638915f6ec5befbac897 100644 (file)
@@ -40,25 +40,26 @@ public class DropTestRpcProvider implements AutoCloseable {
     }
 
     public void start() {
-        this.commiter = new DropTestRpcSender(this, this.getFlowService());;
+        this.commiter = new DropTestRpcSender(this.getFlowService());
         this.listenerRegistration = this.getNotificationService().registerNotificationListener(this.commiter);
         LOG.debug("DropTestProvider Started.");
     }
-    
+
     public DropTestStats getStats() {
-       if(this.commiter != null) {
-               return this.commiter.getStats();
-       } else {
-               return new DropTestStats("Not initialized yet.");               
-       }
+        if(this.commiter != null) {
+            return this.commiter.getStats();
+        } else {
+            return new DropTestStats("Not initialized yet.");
+        }
     }
-    
+
     public void clearStats() {
-       if(this.commiter != null) {
-               this.commiter.clearStats();
-       }
+        if(this.commiter != null) {
+            this.commiter.clearStats();
+        }
     }
 
+    @Override
     public void close() {
         try {
             LOG.debug("DropTestProvider stopped.");
index a90d310c473ca672ff2999f95949d65729ee1d62..daa53513a26c1098b1cc9eeb038a70edd16a621c 100644 (file)
 package org.opendaylight.openflowplugin.droptest;
 
 import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
 
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@SuppressWarnings("all")
-public class DropTestRpcSender implements PacketProcessingListener {
+public class DropTestRpcSender extends AbstractDropTest {
     private final static Logger LOG = LoggerFactory.getLogger(DropTestProvider.class);
 
-    private final DropTestRpcProvider _manager;
-    private final SalFlowService _flowService;
+    private final SalFlowService flowService;
 
-    private static final AtomicIntegerFieldUpdater<DropTestRpcSender> SENT_UPDATER = AtomicIntegerFieldUpdater.newUpdater(DropTestRpcSender.class, "_sent");
-    private volatile int _sent;
-
-    private static final AtomicIntegerFieldUpdater<DropTestRpcSender> RCVD_UPDATER = AtomicIntegerFieldUpdater.newUpdater(DropTestRpcSender.class, "_rcvd");
-    private volatile int _rcvd;
-
-    private static final AtomicIntegerFieldUpdater<DropTestRpcSender> EXCS_UPDATER = AtomicIntegerFieldUpdater.newUpdater(DropTestRpcSender.class, "_excs");
-    private volatile int _excs;
-
-    public DropTestStats getStats() {
-        return new DropTestStats(this._sent, this._rcvd, this._excs);
-    }
-
-    public void clearStats(){
-        this._sent = 0;
-        this._rcvd = 0;
-        this._excs = 0;
-   }
-
-    public DropTestRpcProvider getManager() {
-        return this._manager;
-    }
-
-    public SalFlowService getFlowService() {
-        return this._flowService;
+    public DropTestRpcSender(final SalFlowService flowService) {
+        this.flowService = flowService;
     }
 
-    public DropTestRpcSender(final DropTestRpcProvider manager, final SalFlowService flowService) {
-        this._manager = manager;
-        this._flowService = flowService;
-    }
-
-    @Override
-    public void onPacketReceived(final PacketReceived notification) {
-        // LOG.debug("onPacketReceived - Entering - " + notification);
-
-        RCVD_UPDATER.incrementAndGet(this);
-
-        try {
-            // Get the Ingress nodeConnectorRef
-            final NodeConnectorRef ncr = notification.getIngress();
-
-            // Get the instance identifier for the nodeConnectorRef
-            final InstanceIdentifier<NodeConnector> ncri = (InstanceIdentifier<NodeConnector>) ncr.getValue();
-            final NodeConnectorKey ncKey = InstanceIdentifier.<NodeConnector, NodeConnectorKey>keyOf(ncri);
-
-            // Get the instanceID for the Node in the tree above us
-            final InstanceIdentifier<Node> nodeInstanceId = ncri.<Node>firstIdentifierOf(Node.class);
-            final NodeKey nodeKey = InstanceIdentifier.<Node, NodeKey>keyOf(nodeInstanceId);
-            final byte[] rawPacket = notification.getPayload();
-
-            // LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} payload {}",
-            //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(rawPacket));
-
-            final byte[] srcMac = Arrays.copyOfRange(rawPacket, 6, 12);
-
-            //LOG.debug("onPacketReceived - received Packet on Node {} and NodeConnector {} srcMac {}",
-            //        nodeKey.getId(), ncKey.getId(), Hex.encodeHexString(srcMac));
-
-
-            final MatchBuilder match = new MatchBuilder();
-            final EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
-            final EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
-
-            //TODO: use HEX, use binary form
-            //Hex.decodeHex("000000000001".toCharArray());
-
-            ethSourceBuilder.setAddress(new MacAddress(DropTestUtils.macToString(srcMac)));
-            ethernetMatch.setEthernetSource(ethSourceBuilder.build());
-            match.setEthernetMatch(ethernetMatch.build());
-            final DropActionBuilder dab = new DropActionBuilder();
-            final DropAction dropAction = dab.build();
-            final ActionBuilder ab = new ActionBuilder();
-            ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
-
-            // Add our drop action to a list
-            final List<Action> actionList = Collections.singletonList(ab.build());
-
-            // Create an Apply Action
-            final ApplyActionsBuilder aab = new ApplyActionsBuilder();
-            aab.setAction(actionList);
-
-            // Wrap our Apply Action in an Instruction
-            final InstructionBuilder ib = new InstructionBuilder();
-            ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
-
-            // Put our Instruction in a list of Instructions
-            final InstructionsBuilder isb = new InstructionsBuilder();;
-            final List<Instruction> instructions = Collections.singletonList(ib.build());
-            isb.setInstruction(instructions);
-
-            // Finally build our flow
+    private static final ThreadLocal<AddFlowInputBuilder> BUILDER = new ThreadLocal<AddFlowInputBuilder>() {
+        @Override
+        protected AddFlowInputBuilder initialValue() {
             final AddFlowInputBuilder fb = new AddFlowInputBuilder();
-            fb.setMatch(match.build());
-            fb.setInstructions(isb.build());
-            //fb.setId(new FlowId(Long.toString(fb.hashCode)));
-
-            // Construct the flow instance id
-            final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
-                    .builder(Nodes.class) // File under nodes
-                    .child(Node.class, nodeKey).toInstance(); // A particular node identified by nodeKey
-            fb.setNode(new NodeRef(flowInstanceId));
 
             fb.setPriority(4);
             fb.setBufferId(0L);
-            final BigInteger value = BigInteger.valueOf(10);
-            fb.setCookie(new FlowCookie(value));
-            fb.setCookieMask(new FlowCookie(value));
+
+            final FlowCookie cookie = new FlowCookie(BigInteger.valueOf(10));
+            fb.setCookie(cookie);
+            fb.setCookieMask(cookie);
             fb.setTableId((short) 0);
             fb.setHardTimeout(300);
             fb.setIdleTimeout(240);
             fb.setFlags(new FlowModFlags(false, false, false, false, false));
 
-            // Add flow
-            this.getFlowService().addFlow(fb.build());
-            SENT_UPDATER.incrementAndGet(this);
-        } catch (Exception e) {
-            // TODO Auto-generated catch block
-            LOG.error("Failed to process packet", e);
-            EXCS_UPDATER.incrementAndGet(this);
+            return fb;
         }
+    };
+
+    @Override
+    protected void processPacket(final NodeKey node, final Match match, final Instructions instructions) {
+        final AddFlowInputBuilder fb = BUILDER.get();
+
+        // Finally build our flow
+        fb.setMatch(match);
+        fb.setInstructions(instructions);
+        //fb.setId(new FlowId(Long.toString(fb.hashCode)));
+
+        // Construct the flow instance id
+        final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
+                .builder(Nodes.class) // File under nodes
+                .child(Node.class, node).toInstance(); // A particular node identified by nodeKey
+        fb.setNode(new NodeRef(flowInstanceId));
+
+        // Add flow
+        flowService.addFlow(fb.build());
     }
 }
index 31ae9fa0387b3494459453e4d48221ae9ce995d9..e611190a9a06ca1497f87bc0f56346d98f5da75e 100644 (file)
@@ -15,7 +15,7 @@ public class DropTestUtils {
 
     private static final void appendByte(final StringBuilder sb, final byte b) {
         int v = UnsignedBytes.toInt(b);
-        sb.append(HEX[v >> 4]);
+        sb.append(HEX[v >>> 4]);
         sb.append(HEX[v & 15]);
     }
 
index a3dc93946dc06ad10376740bda2b8a29ce90beb4..84d0f17977a020209924004075fbb73069d4e92e 100644 (file)
@@ -38,18 +38,18 @@ public class OutputTestCommandProvider implements CommandProvider {
     private boolean sessionInitiated = false;
     private static Logger LOG = LoggerFactory.getLogger(OutputTestCommandProvider.class);
 
-    public OutputTestCommandProvider(BundleContext ctx) {
+    public OutputTestCommandProvider(final BundleContext ctx) {
         this.ctx = ctx;
     }
 
-    public void onSessionInitiated(ProviderContext session) {
+    public void onSessionInitiated(final ProviderContext session) {
         pc = session;
         packetProcessingService = session.getRpcService(PacketProcessingService.class);
         ctx.registerService(CommandProvider.class.getName(), this, null);
         this.sessionInitiated = true;
     }
 
-    public void _sendOutputMsg(CommandInterpreter ci) {
+    public void _sendOutputMsg(final CommandInterpreter ci) {
         /* Sending package OUT */
         LOG.debug("SendOutMsg");
         if (sessionInitiated) {
@@ -69,7 +69,7 @@ public class OutputTestCommandProvider implements CommandProvider {
         }
     }
 
-    public void _sendPacketOutputMsg(CommandInterpreter ci) {
+    public void _sendPacketOutputMsg(final CommandInterpreter ci) {
         /* Sending package OUT with action */
         LOG.debug("SendOutMsgWithAction");
         if (sessionInitiated) {
@@ -98,8 +98,7 @@ public class OutputTestCommandProvider implements CommandProvider {
             boolean _while = _lessThan;
             while (_while) {
                 {
-                    Byte _byte = new Byte("0");
-                    list.add(_byte);
+                    list.add((byte)0);
                     int _plus = (index + 1);
                     index = _plus;
                 }
@@ -125,7 +124,7 @@ public class OutputTestCommandProvider implements CommandProvider {
             ActionBuilder ab = new ActionBuilder();
 
             OutputActionBuilder output = new OutputActionBuilder();
-            output.setMaxLength(new Integer(0xffff));
+            output.setMaxLength(Integer.valueOf(0xffff));
             Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
             output.setOutputNodeConnector(value);
             ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
@@ -139,7 +138,7 @@ public class OutputTestCommandProvider implements CommandProvider {
             packet_out.setNode(ref);
             packet_out.setIngress(nIngressConRef);
             packet_out.setEgress(nEngressConRef);
-            packet_out.setBufferId(new Long(0xffffffffL));
+            packet_out.setBufferId(Long.valueOf(0xffffffffL));
 
             packetProcessingService.transmitPacket(packet_out.build());
         } else {
@@ -147,7 +146,7 @@ public class OutputTestCommandProvider implements CommandProvider {
         }
     }
 
-    public void _sendOutTopologyMsg(CommandInterpreter ci) {
+    public void _sendOutTopologyMsg(final CommandInterpreter ci) {
         /* Sending package OUT */
         LOG.debug("SendOutTopologyMsg");
 
index ef6132d1d27f753bfbc8381a27a3932514d7974f..8a287a92ba138f3834cb8a6a4498fdb5d649b2bf 100644 (file)
@@ -54,7 +54,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.Tr
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
-@SuppressWarnings("all")
 public class OutputTestUtil {
 
     private OutputTestUtil() {
@@ -73,7 +72,7 @@ public class OutputTestUtil {
         }
 
         while (index < 8) {
-            list.add(new Byte("0"));
+            list.add((byte)0);
             index++;
         }
         NodeRef ref = createNodeRef(nodeId);
@@ -83,7 +82,7 @@ public class OutputTestUtil {
 
         TransmitPacketInputBuilder tPackBuilder = new TransmitPacketInputBuilder();
 
-        final ArrayList<Byte> _converted_list = (ArrayList<Byte>) list;
+        final ArrayList<Byte> _converted_list = list;
         byte[] _primitive = ArrayUtils.toPrimitive(_converted_list.toArray(new Byte[0]));
         tPackBuilder.setPayload(_primitive);
 
@@ -135,7 +134,7 @@ public class OutputTestUtil {
     }
 
     public static NodeConnectorRef createNodeConnRef(final String nodeId, final String port) {
-        StringBuilder sBuild = new StringBuilder(nodeId).append(":").append(port);
+        StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(port);
         NodeConnectorId _nodeConnectorId = new NodeConnectorId(sBuild.toString());
 
         NodeConnectorKey nConKey = new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));
@@ -164,7 +163,7 @@ public class OutputTestUtil {
         FlowKey key = new FlowKey(new FlowId(Long.toString(flowId)));
         fBuild.setBarrier(false);
         // flow.setBufferId(new Long(12));
-        BigInteger value = new BigInteger("10", 10);
+        final BigInteger value = BigInteger.valueOf(10);
         fBuild.setCookie(new FlowCookie(value));
         fBuild.setCookieMask(new FlowCookie(value));
         fBuild.setHardTimeout(0);
@@ -175,7 +174,7 @@ public class OutputTestUtil {
         fBuild.setFlags(new FlowModFlags(false, false, false, false, false));
         fBuild.setId(new FlowId("12"));
         fBuild.setTableId(checkTableId(tableId));
-        fBuild.setOutGroup(new Long(2));
+        fBuild.setOutGroup(2L);
         fBuild.setOutPort(value);
 
         fBuild.setKey(key);
@@ -213,7 +212,7 @@ public class OutputTestUtil {
         try {
             return Short.parseShort(tableId);
         } catch (Exception ex) {
-            return Short.parseShort("2");
+            return 2;
         }
     }
 }
index ad0c7e50483ce3ac78093eadf2d27a7dc293643b..5075337c43da84bb090d27b18a85d9227f0ba93a 100644 (file)
@@ -460,8 +460,9 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntries>> {
         }
         if (!swMatch.getWildcards().isDLVLAN().booleanValue() && swMatch.getDlVlan() != null) {
             VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
-            vlanIdBuilder.setVlanId(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(swMatch
-                    .getDlVlan()));
+            int vlanId = (swMatch.getDlVlan() == ((int) 0xffff)) ? 0 : swMatch.getDlVlan();
+            vlanIdBuilder.setVlanId(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(vlanId));
+            vlanIdBuilder.setVlanIdPresent(vlanId == 0 ? false: true);
             vlanMatchBuilder.setVlanId(vlanIdBuilder.build());
             matchBuilder.setVlanMatch(vlanMatchBuilder.build());
         }
index 4821012c71aad8feda64f339a8a5b3bf3225d14e..64fa7233d8c01701570ec4a92512c2ddee87c42f 100644 (file)
@@ -8,9 +8,6 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 
-import java.math.BigInteger;
-import java.util.Iterator;
-
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
@@ -28,6 +25,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;
 
+import java.math.BigInteger;
+import java.util.Iterator;
+
 /**
  *
  */
@@ -38,6 +38,12 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
     /** default IPv4 */
     public static final Ipv4Address zeroIPv4 = new Ipv4Address("0.0.0.0");
 
+    /*
+     * The value 0xffff (OFP_VLAN_NONE) is used to indicate
+     * that no VLAN ID is set for OF Flow.
+     */
+    private static final int OFP_VLAN_NONE = (int) 0xffff;
+
     /**
      * Method builds openflow 1.0 specific match (MatchV10) from MD-SAL match.
      * @param match MD-SAL match
@@ -62,7 +68,7 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
         matchBuilder.setDlDst(zeroMac);
         matchBuilder.setDlSrc(zeroMac);
         matchBuilder.setDlType(0);
-        matchBuilder.setDlVlan(0);
+        matchBuilder.setDlVlan(OFP_VLAN_NONE);
         matchBuilder.setDlVlanPcp((short) 0);
         matchBuilder.setNwDst(zeroIPv4);
         matchBuilder.setNwDstMask((short) 0);
@@ -275,7 +281,8 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
      */
     private static boolean convertDlVlan(final MatchV10Builder matchBuilder, final VlanMatch vlanMatch) {
         if (vlanMatch.getVlanId() != null) {
-            matchBuilder.setDlVlan(vlanMatch.getVlanId().getVlanId().getValue());
+            int vlanId = vlanMatch.getVlanId().getVlanId().getValue();
+            matchBuilder.setDlVlan((vlanId == 0 ? OFP_VLAN_NONE : vlanId));
             return false;
         }
         return true;
index 00cc719e005116950b05b6776ca4b9082b54865d..d610e65996c5af8cab6562158c325ae92c162701 100644 (file)
@@ -858,7 +858,7 @@ public class OpenflowpluginTestCommandProvider implements CommandProvider {
     private static InstructionsBuilder createGotoTableInstructions() {
 
         GoToTableBuilder aab = new GoToTableBuilder();
-        aab.setTableId((short) 2);
+        aab.setTableId((short) 5);
 
         InstructionBuilder ib = new InstructionBuilder();
         ib.setInstruction(new GoToTableCaseBuilder().setGoToTable(aab.build()).build());
@@ -3205,8 +3205,8 @@ public class OpenflowpluginTestCommandProvider implements CommandProvider {
         MatchBuilder match = new MatchBuilder();
         TunnelBuilder tunnel = new TunnelBuilder(); // tunnel id match
         tunnel.setTunnelId(BigInteger.valueOf(10668));
-        byte[] mask = new byte[] { (byte) -1, (byte) -1, (byte) -1, 0, 0, 0, (byte) 1, (byte) 1 };
-        tunnel.setTunnelMask(new BigInteger(mask));
+        byte[] mask = new byte[] {(byte) -1, (byte) -1, (byte) -1, 0, 0, 0, (byte) 1, (byte) 1 };
+        tunnel.setTunnelMask(new BigInteger(1, mask));
         match.setTunnel(tunnel.build());
 
         return match;