/* * 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 final LinkEncap encap; private final TimeStamp incomingTime; private final 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 performs a copy of the packet so each * packet can be modified independently 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 time stamp when the packet has entered the system * * @return The time stamp 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; } /** * Returns the time at which the current instance of RawPacket was created * as a copy of the original one. * * @return The time stamp at which this RawPacket instance was created. null * if this is the original instance. */ public TimeStamp getCopyTime() { return this.copyTime; } }