--- /dev/null
+/**
+ * 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);
+}
*/
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;
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");
}
}
}
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.");
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());
}
}
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]);
}
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) {
}
}
- public void _sendPacketOutputMsg(CommandInterpreter ci) {
+ public void _sendPacketOutputMsg(final CommandInterpreter ci) {
/* Sending package OUT with action */
LOG.debug("SendOutMsgWithAction");
if (sessionInitiated) {
boolean _while = _lessThan;
while (_while) {
{
- Byte _byte = new Byte("0");
- list.add(_byte);
+ list.add((byte)0);
int _plus = (index + 1);
index = _plus;
}
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());
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 {
}
}
- public void _sendOutTopologyMsg(CommandInterpreter ci) {
+ public void _sendOutTopologyMsg(final CommandInterpreter ci) {
/* Sending package OUT */
LOG.debug("SendOutTopologyMsg");
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcResult;
-@SuppressWarnings("all")
public class OutputTestUtil {
private OutputTestUtil() {
}
while (index < 8) {
- list.add(new Byte("0"));
+ list.add((byte)0);
index++;
}
NodeRef ref = createNodeRef(nodeId);
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);
}
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()));
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);
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);
try {
return Short.parseShort(tableId);
} catch (Exception ex) {
- return Short.parseShort("2");
+ return 2;
}
}
}
}
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());
}
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;
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;
+
/**
*
*/
/** 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
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);
*/
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;
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());
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;