package org.openflow.protocol.queue; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import org.openflow.protocol.factory.OFQueuePropertyFactory; import org.openflow.protocol.factory.OFQueuePropertyFactoryAware; import org.openflow.util.U16; /** * Corresponds to the struct ofp_packet_queue OpenFlow structure * * @author David Erickson (daviderickson@cs.stanford.edu) */ public class OFPacketQueue implements Cloneable, OFQueuePropertyFactoryAware { public static int MINIMUM_LENGTH = 8; protected OFQueuePropertyFactory queuePropertyFactory; protected int queueId; protected short length; protected List properties; /** * @return the queueId */ public int getQueueId() { return queueId; } /** * @param queueId the queueId to set */ public OFPacketQueue setQueueId(int queueId) { this.queueId = queueId; return this; } /** * @return the length */ public short getLength() { return length; } /** * @param length the length to set */ public void setLength(short length) { this.length = length; } /** * @return the properties */ public List getProperties() { return properties; } /** * @param properties the properties to set */ public OFPacketQueue setProperties(List properties) { this.properties = properties; return this; } public void readFrom(ByteBuffer data) { this.queueId = data.getInt(); this.length = data.getShort(); data.getShort(); // pad if (this.queuePropertyFactory == null) throw new RuntimeException("OFQueuePropertyFactory not set"); this.properties = queuePropertyFactory.parseQueueProperties(data, U16.f(this.length) - MINIMUM_LENGTH); } public void writeTo(ByteBuffer data) { data.putInt(this.queueId); data.putShort(this.length); data.putShort((short) 0); // pad if (this.properties != null) { for (OFQueueProperty queueProperty : this.properties) { queueProperty.writeTo(data); } } } @Override public int hashCode() { final int prime = 6367; int result = 1; result = prime * result + length; result = prime * result + ((properties == null) ? 0 : properties.hashCode()); result = prime * result + queueId; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof OFPacketQueue)) return false; OFPacketQueue other = (OFPacketQueue) obj; if (length != other.length) return false; if (properties == null) { if (other.properties != null) return false; } else if (!properties.equals(other.properties)) return false; if (queueId != other.queueId) return false; return true; } @Override public OFPacketQueue clone() { try { OFPacketQueue clone = (OFPacketQueue) super.clone(); if (this.properties != null) { List queueProps = new ArrayList(); for (OFQueueProperty prop : this.properties) { queueProps.add(prop.clone()); } clone.setProperties(queueProps); } return clone; } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } @Override public void setQueuePropertyFactory( OFQueuePropertyFactory queuePropertyFactory) { this.queuePropertyFactory = queuePropertyFactory; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "OFPacketQueue [queueId=" + queueId + ", properties=" + properties + "]"; } }