blob: 4d4e0a46ca404fb3a3a911ff36ee1b17e25d405e [file] [log] [blame]
/*******************************************************************************
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
/**
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
package org.onlab.packet;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Arrays;
/**
* The class representing LLDP Organizationally Specific TLV.
*
*/
public class LLDPOrganizationalTLV extends LLDPTLV {
public static final int OUI_LENGTH = 3;
public static final int SUBTYPE_LENGTH = 1;
public static final byte ORGANIZATIONAL_TLV_TYPE = 127;
public static final int MAX_INFOSTRING_LENGTH = 507;
protected byte[] oui;
protected byte subType;
private byte[] infoString;
public LLDPOrganizationalTLV() {
this.type = LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE;
}
/**
* Set the value of OUI.
*
* @param oui
* The value of OUI to be set.
* @return This LLDP Organizationally Specific TLV.
*/
public LLDPOrganizationalTLV setOUI(final byte[] oui) {
if (oui.length != LLDPOrganizationalTLV.OUI_LENGTH) {
throw new IllegalArgumentException("The length of OUI must be "
+ LLDPOrganizationalTLV.OUI_LENGTH + ", but it is "
+ oui.length);
}
this.oui = Arrays.copyOf(oui, oui.length);
return this;
}
/**
* Returns the value of the OUI.
*
* @return The value of the OUI .
*/
public byte[] getOUI() {
return Arrays.copyOf(this.oui, this.oui.length);
}
/**
* Set the value of sub type.
*
* @param subType
* The value of sub type to be set.
* @return This LLDP Organizationally Specific TLV.
*/
public LLDPOrganizationalTLV setSubType(final byte subType) {
this.subType = subType;
return this;
}
/**
* Returns the value of the sub type.
*
* @return The value of the sub type.
*/
public byte getSubType() {
return this.subType;
}
/**
* Set the value of information string.
*
* @param infoString
* the byte array of the value of information string.
* @return This LLDP Organizationally Specific TLV.
*/
public LLDPOrganizationalTLV setInfoString(final byte[] infoString) {
if (infoString.length > LLDPOrganizationalTLV.MAX_INFOSTRING_LENGTH) {
throw new IllegalArgumentException(
"The length of infoString cannot exceed "
+ LLDPOrganizationalTLV.MAX_INFOSTRING_LENGTH);
}
this.infoString = Arrays.copyOf(infoString, infoString.length);
return this;
}
/**
* Set the value of information string. The String value is automatically
* converted into byte array with UTF-8 encoding.
*
* @param infoString
* the String value of information string.
* @return This LLDP Organizationally Specific TLV.
*/
public LLDPOrganizationalTLV setInfoString(final String infoString) {
final byte[] infoStringBytes = infoString.getBytes(Charset
.forName("UTF-8"));
return this.setInfoString(infoStringBytes);
}
/**
* Returns the value of information string.
*
* @return the value of information string.
*/
public byte[] getInfoString() {
return Arrays.copyOf(this.infoString, this.infoString.length);
}
@Override
public byte[] serialize() {
if (this.type != LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE) {
return super.serialize();
}
final int valueLength = LLDPOrganizationalTLV.OUI_LENGTH
+ LLDPOrganizationalTLV.SUBTYPE_LENGTH + this.infoString.length;
this.value = new byte[valueLength];
final ByteBuffer bb = ByteBuffer.wrap(this.value);
bb.put(this.oui);
bb.put(this.subType);
bb.put(this.infoString);
return super.serialize();
}
@Override
public LLDPTLV deserialize(final ByteBuffer bb) {
LLDPTLV tlv = super.deserialize(bb);
if (tlv.getType() != LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE) {
return tlv;
}
final ByteBuffer optionalField = ByteBuffer.wrap(this.value);
final byte[] oui = new byte[LLDPOrganizationalTLV.OUI_LENGTH];
optionalField.get(oui);
this.setOUI(oui);
this.setSubType(optionalField.get());
final byte[] infoString = new byte[this.getLength()
- LLDPOrganizationalTLV.OUI_LENGTH
- LLDPOrganizationalTLV.SUBTYPE_LENGTH];
optionalField.get(infoString);
this.setInfoString(infoString);
return this;
}
@Override
public int hashCode() {
final int prime = 1423;
int result = 1;
result = prime * result + this.type;
result = prime * result + this.length;
result = prime * result + Arrays.hashCode(this.oui);
result = prime * result + this.subType;
result = prime * result + Arrays.hashCode(this.infoString);
return result;
}
@Override
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof LLDPOrganizationalTLV)) {
return false;
}
final LLDPOrganizationalTLV other = (LLDPOrganizationalTLV) o;
if (this.type != other.type) {
return false;
}
if (this.length != other.length) {
return false;
}
if (!Arrays.equals(this.oui, other.oui)) {
return false;
}
if (this.subType != other.subType) {
return false;
}
if (!Arrays.equals(this.infoString, other.infoString)) {
return false;
}
return true;
}
}