Initial opendaylight infrastructure commit!!
[controller.git] / opendaylight / sal / api / src / main / java / org / opendaylight / controller / sal / packet / RawPacket.java
diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/packet/RawPacket.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/packet/RawPacket.java
new file mode 100644 (file)
index 0000000..00befde
--- /dev/null
@@ -0,0 +1,196 @@
+
+/*
+ * Copyright (c) 2013 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
+ */
+
+/**
+ * @file   RawPacket.java
+ *
+ * @brief  Describe a raw Data Packet, this is how a packet is
+ * received from the network and how it will be transmitted. It
+ * essentially wraps the raw bytestream
+ *
+ */
+package org.opendaylight.controller.sal.packet;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.opendaylight.controller.sal.core.ConstructionException;
+import org.opendaylight.controller.sal.core.NodeConnector;
+import org.opendaylight.controller.sal.core.TimeStamp;
+
+/**
+ *
+ * Describe a raw Data Packet, this is how a packet is
+ * received from the network and how it will be transmitted. It
+ * essentially wraps the raw bytestream
+ *
+ */
+public class RawPacket {
+    private byte[] packetData;
+    private LinkEncap encap;
+    private TimeStamp incomingTime;
+    private TimeStamp copyTime;
+    private Map props;
+    private NodeConnector incomingNodeConnector;
+    private NodeConnector outgoingNodeConnector;
+
+    /**
+     * If the packet is being sent this parameter tells where the
+     * packet is sent toward
+     *
+     *
+     * @return the NodeConnector toward where the packet is being sent
+     */
+    public NodeConnector getOutgoingNodeConnector() {
+        return outgoingNodeConnector;
+    }
+
+    /**
+     * Setter method for OutGoing NodeConnector
+     *
+     * @param outgoingNodeConnector NodeConnector toward where the
+     * packet is travelling
+     */
+    public void setOutgoingNodeConnector(NodeConnector outgoingNodeConnector) {
+        this.outgoingNodeConnector = outgoingNodeConnector;
+    }
+
+    /**
+     * Return the incoming NodeConnector if the packet was received
+     *
+     * @return NodeConnector where the packet was received from
+     */
+    public NodeConnector getIncomingNodeConnector() {
+        return incomingNodeConnector;
+    }
+
+    /**
+     * Setter for Incoming NodeConnector
+     *
+     * @param incomingNodeConnector NodeConnector to be used and incoming one
+     */
+    public void setIncomingNodeConnector(NodeConnector incomingNodeConnector) {
+        this.incomingNodeConnector = incomingNodeConnector;
+    }
+
+    /**
+     * Retrieve a given property attached to the packet, if exits of course
+     *
+     * @param key Key to retrieve the wanted property attached to the packet
+     *
+     * @return The property attached to the packet
+     */
+    public Object getProps(Object key) {
+        if (this.props != null) {
+            return this.props.get(key);
+        }
+        return null;
+    }
+
+    /**
+     * Generic data associated to the data packet
+     *
+     * @param key key for the association
+     * @param value value associated to the key
+     */
+    public void setProps(Object key, Object value) {
+        if (this.props == null) {
+            this.props = new HashMap();
+        }
+
+        this.props.put(key, value);
+    }
+
+    /**
+     * Constructor for RawPacket
+     *
+     * @param data content of the packet as bytestream
+     * @param e datalink encapsulation for the packet
+     *
+     */
+    public RawPacket(byte[] data, LinkEncap e) throws ConstructionException {
+        if (data == null) {
+            throw new ConstructionException("Empty data");
+        }
+        if (e == null) {
+            throw new ConstructionException("Encap not known");
+        }
+        this.packetData = new byte[data.length];
+        System.arraycopy(data, 0, this.packetData, 0, data.length);
+        this.encap = e;
+        this.incomingTime = new TimeStamp(System.currentTimeMillis(),
+                "IncomingTime");
+        this.copyTime = null;
+    }
+
+    /**
+     * Copy Constructor for RawPacket, it perform a copy of the packet
+     * so each packet can be modified indipendently without worrying
+     * that source packet content is touched
+     *
+     * @param src packet to copy data from
+     *
+     */
+    public RawPacket(RawPacket src) throws ConstructionException {
+        if (src == null) {
+            throw new ConstructionException("null source packet");
+        }
+        if (src.getPacketData() != null) {
+            this.packetData = new byte[src.getPacketData().length];
+            System.arraycopy(src.getPacketData(), 0, this.packetData, 0, src
+                    .getPacketData().length);
+        } else {
+            throw new ConstructionException("Empty packetData");
+        }
+        this.encap = src.getEncap();
+        this.incomingTime = src.getIncomingTime();
+        this.incomingNodeConnector = src.getIncomingNodeConnector();
+        this.outgoingNodeConnector = src.getOutgoingNodeConnector();
+        this.props = (src.props == null ? null : new HashMap(src.props));
+        this.copyTime = new TimeStamp(System.currentTimeMillis(), "CopyTime");
+    }
+
+    /**
+     * Constructor for RawPacket with Ethernet encapsulation
+     *
+     * @param data content of the packet as bytestream
+     *
+     */
+    public RawPacket(byte[] data) throws ConstructionException {
+        this(data, LinkEncap.ETHERNET);
+    }
+
+    /**
+     * Read the timestamp when the packet has entered the system
+     *
+     * @return The timestamp when the packet has entered the system
+     */
+    public TimeStamp getIncomingTime() {
+        return this.incomingTime;
+    }
+
+    /**
+     * Read the packet encapsulation
+     *
+     * @return The encapsulation for the raw packet, necessary to
+     * start parsing the packet
+     */
+    public LinkEncap getEncap() {
+        return this.encap;
+    }
+
+    /**
+     * Get bytestream of the packet body
+     *
+     * @return The raw bytestream composing the packet
+     */
+    public byte[] getPacketData() {
+        return this.packetData;
+    }
+}