Some of sonar issues in learning-switch artifact were solved.
Change-Id: I423136cb503c8d9922eb7064ab2bd3eddd24d411
Signed-off-by: Jozef Gloncak <jgloncak@cisco.com>
package org.opendaylight.openflowplugin.learningswitch;
import com.google.common.util.concurrent.CheckedFuture;
-import java.util.concurrent.Future;
-
-import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
/**
*
import com.google.common.collect.ImmutableList;
public class FlowUtils {
+ private FlowUtils() {
+ //prohibite to instantiate util class
+ }
+
/**
* @param tableId
* @param priority
*/
public static FlowBuilder createDirectMacToMacFlow(final Short tableId, final int priority, final MacAddress srcMac,
final MacAddress dstMac, final NodeConnectorRef dstPort) {
- FlowBuilder macToMacFlow = new FlowBuilder() //
- .setTableId(tableId) //
+ FlowBuilder macToMacFlow = new FlowBuilder()
+ .setTableId(tableId)
.setFlowName("mac2mac");
macToMacFlow.setId(new FlowId(Long.toString(macToMacFlow.hashCode())));
- EthernetMatch ethernetMatch = new EthernetMatchBuilder() //
- .setEthernetSource(new EthernetSourceBuilder() //
- .setAddress(srcMac) //
- .build()) //
- .setEthernetDestination(new EthernetDestinationBuilder() //
- .setAddress(dstMac) //
- .build()) //
+ EthernetMatch ethernetMatch = new EthernetMatchBuilder()
+ .setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(srcMac)
+ .build())
+ .setEthernetDestination(new EthernetDestinationBuilder()
+ .setAddress(dstMac)
+ .build())
.build();
MatchBuilder match = new MatchBuilder();
Uri outputPort = dstPort.getValue().firstKeyOf(NodeConnector.class, NodeConnectorKey.class).getId();
- Action outputToControllerAction = new ActionBuilder() //
+ Action outputToControllerAction = new ActionBuilder()
.setOrder(0)
- .setAction(new OutputActionCaseBuilder() //
- .setOutputAction(new OutputActionBuilder() //
- .setMaxLength(new Integer(0xffff)) //
- .setOutputNodeConnector(outputPort) //
- .build()) //
- .build()) //
+ .setAction(new OutputActionCaseBuilder()
+ .setOutputAction(new OutputActionBuilder()
+ .setMaxLength(Integer.valueOf(0xffff))
+ .setOutputNodeConnector(outputPort)
+ .build())
+ .build())
.build();
// Create an Apply Action
.build();
// Wrap our Apply Action in an Instruction
- Instruction applyActionsInstruction = new InstructionBuilder() //
+ Instruction applyActionsInstruction = new InstructionBuilder()
.setOrder(0)
- .setInstruction(new ApplyActionsCaseBuilder()//
- .setApplyActions(applyActions) //
- .build()) //
+ .setInstruction(new ApplyActionsCaseBuilder()
+ .setApplyActions(applyActions)
+ .build())
.build();
// Put our Instruction in a list of Instructions
- macToMacFlow //
- .setMatch(new MatchBuilder() //
- .setEthernetMatch(ethernetMatch) //
- .build()) //
- .setInstructions(new InstructionsBuilder() //
- .setInstruction(ImmutableList.of(applyActionsInstruction)) //
- .build()) //
- .setPriority(priority) //
- .setBufferId(OFConstants.OFP_NO_BUFFER) //
- .setHardTimeout(0) //
- .setIdleTimeout(0) //
+ macToMacFlow
+ .setMatch(new MatchBuilder()
+ .setEthernetMatch(ethernetMatch)
+ .build())
+ .setInstructions(new InstructionsBuilder()
+ .setInstruction(ImmutableList.of(applyActionsInstruction))
+ .build())
+ .setPriority(priority)
+ .setBufferId(OFConstants.OFP_NO_BUFFER)
+ .setHardTimeout(0)
+ .setIdleTimeout(0)
.setFlags(new FlowModFlags(false, false, false, false, false));
return macToMacFlow;
// Create output action -> send to controller
OutputActionBuilder output = new OutputActionBuilder();
- output.setMaxLength(new Integer(0xffff));
+ output.setMaxLength(Integer.valueOf(0xffff));
Uri controllerPort = new Uri(OutputPortValues.CONTROLLER.toString());
output.setOutputNodeConnector(controllerPort);
instructions.add(ib.build());
isb.setInstruction(instructions);
- allToCtrlFlow //
- .setMatch(matchBuilder.build()) //
- .setInstructions(isb.build()) //
- .setPriority(priority) //
- .setBufferId(OFConstants.OFP_NO_BUFFER) //
- .setHardTimeout(0) //
- .setIdleTimeout(0) //
+ allToCtrlFlow
+ .setMatch(matchBuilder.build())
+ .setInstructions(isb.build())
+ .setPriority(priority)
+ .setBufferId(OFConstants.OFP_NO_BUFFER)
+ .setHardTimeout(0)
+ .setIdleTimeout(0)
.setFlags(new FlowModFlags(false, false, false, false, false));
return allToCtrlFlow;
public class InstanceIdentifierUtils {
+ private InstanceIdentifierUtils() {
+ //hiding constructor for util class
+ }
+
/**
* Creates an Instance Identifier (path) for node with specified id
*
* @return
*/
public static final InstanceIdentifier<Node> createNodePath(NodeId nodeId) {
- return InstanceIdentifier.builder(Nodes.class) //
- .child(Node.class, new NodeKey(nodeId)) //
+ return InstanceIdentifier.builder(Nodes.class)
+ .child(Node.class, new NodeKey(nodeId))
.build();
}
//
public static final InstanceIdentifier<NodeConnector> createNodeConnectorPath(InstanceIdentifier<Node> nodeKey,NodeConnectorKey nodeConnectorKey) {
- return InstanceIdentifier.builder(nodeKey) //
- .child(NodeConnector.class,nodeConnectorKey) //
+ return InstanceIdentifier.builder(nodeKey)
+ .child(NodeConnector.class,nodeConnectorKey)
.build();
}
}
/**
* Simple Learning Switch implementation which does mac learning for one switch.
- *
- *
+ *
+ *
*/
public class LearningSwitchHandlerSimpleImpl implements LearningSwitchHandler, PacketProcessingListener {
private NodeId nodeId;
private AtomicLong flowIdInc = new AtomicLong();
private AtomicLong flowCookieInc = new AtomicLong(0x2a00000000000000L);
-
+
private InstanceIdentifier<Node> nodePath;
private InstanceIdentifier<Table> tablePath;
}
iAmLearning = true;
-
+
tablePath = appearedTablePath;
nodePath = tablePath.firstIdentifierOf(Node.class);
nodeId = nodePath.firstKeyOf(Node.class, NodeKey.class).getId();
private void sendPacketOut(byte[] payload, NodeConnectorRef ingress, NodeConnectorRef egress) {
InstanceIdentifier<Node> egressNodePath = InstanceIdentifierUtils.getNodePath(egress.getValue());
- TransmitPacketInput input = new TransmitPacketInputBuilder() //
- .setPayload(payload) //
- .setNode(new NodeRef(egressNodePath)) //
- .setEgress(egress) //
- .setIngress(ingress) //
+ TransmitPacketInput input = new TransmitPacketInputBuilder()
+ .setPayload(payload)
+ .setNode(new NodeRef(egressNodePath))
+ .setEgress(egress)
+ .setIngress(ingress)
.build();
packetProcessingService.transmitPacket(input);
}
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.sal.binding.api.NotificationService;
-import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
/**
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.NotificationListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package org.opendaylight.openflowplugin.learningswitch;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.List;
-
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
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.OutputActionCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
-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.action.types.rev131112.action.list.ActionKey;
-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.FlowBuilder;
-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.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
-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.ApplyActions;
-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.flow.types.rev131026.instruction.list.InstructionKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
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.EthernetDestinationBuilder;
-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.EthernetMatch;
-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.PacketProcessingService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import com.google.common.collect.ImmutableList;
-
/**
- *
+ *
*/
public abstract class PacketUtils {
-
+ /**
+ * size of MAC address in octets (6*8 = 48 bits)
+ */
+ private static final int MAC_ADDRESS_SIZE = 6;
+
+ /**
+ * start position of destination MAC address in array
+ */
+ private static final int DST_MAC_START_POSITION = 0;
+
+ /**
+ * end position of destination MAC address in array
+ */
+ private static final int DST_MAC_END_POSITION = 6;
+
+ /**
+ * start position of source MAC address in array
+ */
+ private static final int SRC_MAC_START_POSITION = 6;
+
+ /**
+ * end position of source MAC address in array
+ */
+ private static final int SRC_MAC_END_POSITION = 12;
+
+ /**
+ * start position of ethernet type in array
+ */
+ private static final int ETHER_TYPE_START_POSITION = 12;
+
+ /**
+ * end position of ethernet type in array
+ */
+ private static final int ETHER_TYPE_END_POSITION = 14;
+
+ private PacketUtils() {
+ //prohibite to instantiate this class
+ }
/**
* @param payload
* @return destination MAC address
*/
public static byte[] extractDstMac(byte[] payload) {
- return Arrays.copyOfRange(payload, 0, 6);
+ return Arrays.copyOfRange(payload, DST_MAC_START_POSITION, DST_MAC_END_POSITION);
}
/**
* @return source MAC address
*/
public static byte[] extractSrcMac(byte[] payload) {
- return Arrays.copyOfRange(payload, 6, 12);
+ return Arrays.copyOfRange(payload, SRC_MAC_START_POSITION, SRC_MAC_END_POSITION);
}
/**
* @return source MAC address
*/
public static byte[] extractEtherType(byte[] payload) {
- return Arrays.copyOfRange(payload, 12, 14);
+ return Arrays.copyOfRange(payload, ETHER_TYPE_START_POSITION, ETHER_TYPE_END_POSITION);
}
/**
*/
public static MacAddress rawMacToMac(byte[] rawMac) {
MacAddress mac = null;
- if (rawMac != null && rawMac.length == 6) {
- StringBuffer sb = new StringBuffer();
+ if (rawMac != null && rawMac.length == MAC_ADDRESS_SIZE) {
+ StringBuilder sb = new StringBuilder();
for (byte octet : rawMac) {
sb.append(String.format(":%02X", octet));
}
try {
packetInRegistration.close();
} catch (Exception e) {
- LOG.error("Error unregistering packet in listener, cause %s ", e.getMessage());
+ LOG.error("Error unregistering packet in listener. Exception:", e);
}
try {
dataChangeListenerRegistration.close();
} catch (Exception e) {
- LOG.error("Error unregistering data change listener, cause %s ", e.getMessage());
- LOG.error(e.getMessage(), e);
+ LOG.error("Error unregistering data change listener. Exception:", e);
}
LOG.debug("stop() <--");
}