1 package org.openflow.codec.protocol;
3 import java.util.ArrayList;
6 import org.openflow.codec.io.IDataBuffer;
7 import org.openflow.codec.util.U16;
10 * Represents an ofp_hello message
12 * @author David Erickson (daviderickson@cs.stanford.edu) - Feb 8, 2010
15 public class OFPHello extends OFPMessage {
16 public static int MINIMUM_LENGTH = 8;
17 private List<OFPHelloElemHeader> elements;
20 * Construct a ofp_hello message
24 this.type = OFPType.HELLO;
25 this.length = U16.t(MINIMUM_LENGTH);
33 public List<OFPHelloElemHeader> getHelloElements() {
42 public void setHelloElements(List<OFPHelloElemHeader> elements) {
43 this.elements = elements;
50 private void updateLength() {
51 int newLength = OFPHello.MINIMUM_LENGTH;
52 if (null != elements) {
53 for (OFPHelloElemHeader elem : elements) {
54 newLength += elem.getLengthU();
57 this.length = (short) newLength;
61 * read OFPHello from buffer
65 public void readFrom(IDataBuffer data) {
67 int elementsLength = this.getLengthU() - OFPHello.MINIMUM_LENGTH;
68 this.elements = readHelloElements(data, elementsLength);
79 private List<OFPHelloElemHeader> readHelloElements(IDataBuffer data, int length) {
80 List<OFPHelloElemHeader> results = null;
81 OFPHelloElemHeader tempElem = new OFPHelloElemHeader();
82 OFPHelloElemHeader ofHelloElem;
83 int end = data.position() + length;
85 while (data.position() <= end) {
86 if (data.remaining() < OFPHelloElemHeader.MINIMUM_LENGTH
87 || (data.position() + OFPHelloElemHeader.MINIMUM_LENGTH) > end)
90 // to read element type
92 tempElem.readFrom(data);
95 if (tempElem.getLengthU() > data.remaining() || (data.position() + tempElem.getLengthU()) > end)
98 if (null == tempElem.getType()) {
99 // element is not supported, so forward the position
100 data.position(data.position() + tempElem.getLengthU());
103 // create instance of element type
104 ofHelloElem = tempElem.getType().newInstance();
105 // read hello element from data
106 ofHelloElem.readFrom(data);
107 if (null == results) {
108 results = new ArrayList<OFPHelloElemHeader>();
110 results.add(ofHelloElem);
116 * write OFPHello to buffer
120 public void writeTo(IDataBuffer data) {
122 if (null != elements) {
123 for (OFPHelloElemHeader elem : elements) {
130 public int hashCode() {
131 final int prime = 764;
132 int result = super.hashCode();
133 result = prime * result + ((null == elements) ? 0 : elements.hashCode());
138 public boolean equals(Object obj) {
142 if (!super.equals(obj)) {
145 if (!(obj instanceof OFPHello)) {
148 OFPHello other = (OFPHello) obj;
149 if (elements == null) {
150 if (other.elements != null) {
153 } else if (!elements.equals(other.elements)) {