package com.bigswitch.floodlight.vendor; import java.util.ArrayList; import java.util.List; import org.jboss.netty.buffer.ChannelBuffer; import org.openflow.protocol.Instantiable; import org.openflow.protocol.vendor.OFVendorData; public class OFInterfaceIPReplyVendorData extends OFBigSwitchVendorData { protected List<OFInterfaceVendorData> interfaces; protected int length; protected static Instantiable<OFVendorData> instantiable = new Instantiable<OFVendorData>() { public OFVendorData instantiate() { return new OFInterfaceIPReplyVendorData(); } }; /** * @return a subclass of Instantiable<OFVendorData> that instantiates * an instance of OFInterfaceIPReplyVendorData. */ public static Instantiable<OFVendorData> getInstantiable() { return instantiable; } /** * Opcode/dataType to reply with IP addresses of all interfaces */ public static final int BSN_GET_INTERFACE_IP_REPLY = 10; /** * Construct an interface IP reply vendor data */ public OFInterfaceIPReplyVendorData() { super(BSN_GET_INTERFACE_IP_REPLY); } /** * @return the total length of the vendor-data part of the interface IP reply * message. The OF header (8B) and vendor (4B) are taken care of by the * OFVendor class MINIMUM_LENGTH. This method returns the length of the * vendor-extension-subtype (4B) + the length of the interfaces */ @Override public int getLength() { return length; } /** * Set the length of this message * * @param length */ public void setLength(int length) { this.length = length; } /** * @return the interfaces */ public List<OFInterfaceVendorData> getInterfaces() { return interfaces; } /** * @param intfs the ones to set */ public void setInterfaces(List<OFInterfaceVendorData> intfs) { this.interfaces = intfs; if (intfs == null) { this.setLength(super.getLength()); } else { this.setLength(super.getLength() + intfs.size() * OFInterfaceVendorData.MINIMUM_LENGTH); } } /** * Read from the ChannelBuffer * @param data the channel buffer from which we're deserializing * @param length the length to the end of the enclosing message */ @Override public void readFrom(ChannelBuffer data, int length) { //datatype read by super class super.readFrom(data, length); if (this.interfaces == null) { this.interfaces = new ArrayList<OFInterfaceVendorData>(); } else { this.interfaces.clear(); } int intfCount = (length - 4) / OFInterfaceVendorData.MINIMUM_LENGTH; OFInterfaceVendorData intf; for (int i = 0; i < intfCount; ++i) { intf = new OFInterfaceVendorData(); intf.readFrom(data); this.interfaces.add(intf); } } /** * Write to the ChannelBuffer * @param data the channel buffer to which we're serializing */ @Override public void writeTo(ChannelBuffer data) { // datatype written by super class super.writeTo(data); if (this.interfaces != null) { for (OFInterfaceVendorData intf : this.interfaces) { intf.writeTo(data); } } } }