X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fpacket%2FLLDPTLV.java;h=35244ea697d871617b09db6e232da95af0d51ebf;hb=44a86821d69cd804b6b23b437e0b27136eaac2b5;hp=a89816ffafe0cf7aa7e8c591475042a48dd00ca7;hpb=42210c03b0a4c54706320ba9f55794c0abd4d201;p=controller.git diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/packet/LLDPTLV.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/packet/LLDPTLV.java index a89816ffaf..35244ea697 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/packet/LLDPTLV.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/packet/LLDPTLV.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -10,13 +9,12 @@ package org.opendaylight.controller.sal.packet; import java.io.UnsupportedEncodingException; -import java.util.HashMap; - +import java.nio.charset.Charset; import java.util.Arrays; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; + import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; import org.opendaylight.controller.sal.utils.HexEncode; @@ -31,30 +29,29 @@ public class LLDPTLV extends Packet { private static final String LENGTH = "Length"; private static final String VALUE = "Value"; private static final int LLDPTLVFields = 3; - public static final byte[] OFOUI = new byte[] {(byte)0x00, (byte)0x26, (byte)0xe1}; // OpenFlow OUI - public static final byte[] customTlvSubType = new byte[] {0}; - public static final int customTlvOffset = OFOUI.length + customTlvSubType.length; - public static final byte chassisIDSubType[] = new byte[] {4}; // MAC address for the system - public static final byte portIDSubType[] = new byte[] {7}; // locally assigned - - public enum TLVType { - Unknown ((byte)0), - ChassisID ((byte)1), - PortID ((byte)2), - TTL ((byte)3), - PortDesc ((byte)4), - SystemName ((byte)5), - SystemDesc ((byte)6), - Custom ((byte)127); - - private byte value; - private TLVType(byte value) { - this.value = value; - } - public byte getValue() { - return value; - } - } + public static final byte[] OFOUI = new byte[] { (byte) 0x00, (byte) 0x26, + (byte) 0xe1 }; // OpenFlow OUI + public static final byte[] customTlvSubType = new byte[] { 0 }; + public static final int customTlvOffset = OFOUI.length + + customTlvSubType.length; + public static final byte chassisIDSubType[] = new byte[] { 4 }; // MAC address for the system + public static final byte portIDSubType[] = new byte[] { 7 }; // locally assigned + + public enum TLVType { + Unknown((byte) 0), ChassisID((byte) 1), PortID((byte) 2), TTL((byte) 3), PortDesc( + (byte) 4), SystemName((byte) 5), SystemDesc((byte) 6), Custom( + (byte) 127); + + private byte value; + + private TLVType(byte value) { + this.value = value; + } + + public byte getValue() { + return value; + } + } private static Map> fieldCoordinates = new LinkedHashMap>() { private static final long serialVersionUID = 1L; @@ -69,8 +66,8 @@ public class LLDPTLV extends Packet { protected Map fieldValues; /** - * Default constructor that creates and sets the hash map values - * and sets the payload to null + * Default constructor that creates and sets the hash map values and sets + * the payload to null */ public LLDPTLV() { payload = null; @@ -80,8 +77,7 @@ public class LLDPTLV extends Packet { } /** - * Constructor that writes the passed LLDPTLV values to the - * hdrFieldsMap + * Constructor that writes the passed LLDPTLV values to the hdrFieldsMap */ public LLDPTLV(LLDPTLV other) { for (Map.Entry entry : other.hdrFieldsMap.entrySet()) { @@ -146,75 +142,123 @@ public class LLDPTLV extends Packet { @Override public int hashCode() { - return HashCodeBuilder.reflectionHashCode(this); + final int prime = 31; + int result = super.hashCode(); + result = prime * result + + ((fieldValues == null) ? 0 : fieldValues.hashCode()); + return result; } @Override public boolean equals(Object obj) { - return EqualsBuilder.reflectionEquals(this, obj); + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + LLDPTLV other = (LLDPTLV) obj; + if (fieldValues == null) { + if (other.fieldValues != null) { + return false; + } + } else if (!fieldValues.equals(other.fieldValues)) { + return false; + } + return true; } @Override - public int getfieldnumBits(String fieldName) throws Exception { + public int getfieldnumBits(String fieldName) { if (fieldName.equals(VALUE)) { - return (NetUtils.NumBitsInAByte * (int) BitBufferHelper.getShort( + return (NetUtils.NumBitsInAByte * BitBufferHelper.getShort( fieldValues.get(LENGTH), fieldCoordinates.get(LENGTH) - .getRight().intValue())); + .getRight().intValue())); } return fieldCoordinates.get(fieldName).getRight(); } /** * Returns the size in bits of the whole TLV + * * @return int - size in bits of full TLV - * @throws Exception */ - public int getTLVSize() throws Exception { + public int getTLVSize() { return (LLDPTLV.fieldCoordinates.get(TYPE).getRight() + // static LLDPTLV.fieldCoordinates.get(LENGTH).getRight() + // static - getfieldnumBits(VALUE)); // variable + getfieldnumBits(VALUE)); // variable + } + + /** + * Creates the SystemName TLV value + * + * @param nodeId + * node identifier string + * @return the SystemName TLV value in byte array + */ + static public byte[] createSystemNameTLVValue(String nodeId) { + byte[] nid = nodeId.getBytes(); + return nid; } - + /** - * Creates the ChassisID TLV value including the subtype and ChassisID string - * - * @param nodeId node identifier string + * Creates the ChassisID TLV value including the subtype and ChassisID + * string + * + * @param nodeId + * node identifier string * @return the ChassisID TLV value in byte array */ static public byte[] createChassisIDTLVValue(String nodeId) { - byte[] cid = HexEncode.bytesFromHexString(nodeId); + byte[] nid = HexEncode.bytesFromHexString(nodeId); + byte[] cid = new byte[6]; + int srcPos = 0, dstPos = 0; + + if (nid.length > cid.length) { + srcPos = nid.length - cid.length; + } else { + dstPos = cid.length - nid.length; + } + System.arraycopy(nid, srcPos, cid, dstPos, cid.length); + byte[] cidValue = new byte[cid.length + chassisIDSubType.length]; - System.arraycopy(chassisIDSubType, 0, cidValue, 0, chassisIDSubType.length); + System.arraycopy(chassisIDSubType, 0, cidValue, 0, + chassisIDSubType.length); System.arraycopy(cid, 0, cidValue, chassisIDSubType.length, cid.length); - return cidValue; + return cidValue; } /** * Creates the PortID TLV value including the subtype and PortID string - * - * @param portId port identifier string + * + * @param portId + * port identifier string * @return the PortID TLV value in byte array */ static public byte[] createPortIDTLVValue(String portId) { - byte[] pid = portId.getBytes(); + byte[] pid = portId.getBytes(Charset.defaultCharset()); byte[] pidValue = new byte[pid.length + portIDSubType.length]; System.arraycopy(portIDSubType, 0, pidValue, 0, portIDSubType.length); System.arraycopy(pid, 0, pidValue, portIDSubType.length, pid.length); - return pidValue; + return pidValue; } /** * Creates the custom TLV value including OUI, subtype and custom string - * - * @param portId port identifier string + * + * @param portId + * port identifier string * @return the custom TLV value in byte array */ static public byte[] createCustomTLVValue(String customString) { - byte[] customArray = customString.getBytes(); + byte[] customArray = customString.getBytes(Charset.defaultCharset()); byte[] customValue = new byte[customTlvOffset + customArray.length]; System.arraycopy(OFOUI, 0, customValue, 0, OFOUI.length); @@ -223,40 +267,56 @@ public class LLDPTLV extends Packet { System.arraycopy(customArray, 0, customValue, customTlvOffset, customArray.length); - return customValue; + return customValue; } /** * Retrieves the string from TLV value and returns it in HexString format - * - * @param tlvValue the TLV value - * @param tlvLen the TLV length + * + * @param tlvValue + * the TLV value + * @param tlvLen + * the TLV length * @return the HexString */ static public String getHexStringValue(byte[] tlvValue, int tlvLen) { - byte[] cidBytes = new byte[tlvLen - chassisIDSubType.length]; - System.arraycopy(tlvValue, chassisIDSubType.length, cidBytes, 0, cidBytes.length); - return HexEncode.bytesToHexStringWithColumn(cidBytes); + byte[] cidBytes = new byte[tlvLen - chassisIDSubType.length]; + System.arraycopy(tlvValue, chassisIDSubType.length, cidBytes, 0, + cidBytes.length); + return HexEncode.bytesToHexStringFormat(cidBytes); } /** * Retrieves the string from TLV value - * - * @param tlvValue the TLV value - * @param tlvLen the TLV length + * + * @param tlvValue + * the TLV value + * @param tlvLen + * the TLV length * @return the string */ static public String getStringValue(byte[] tlvValue, int tlvLen) { - byte[] pidBytes = new byte[tlvLen - portIDSubType.length]; - System.arraycopy(tlvValue, portIDSubType.length, pidBytes, 0, pidBytes.length); - return (new String(pidBytes)); + byte[] pidSubType = new byte[portIDSubType.length]; + byte[] pidBytes = new byte[tlvLen - portIDSubType.length]; + System.arraycopy(tlvValue, 0, pidSubType, 0, + pidSubType.length); + System.arraycopy(tlvValue, portIDSubType.length, pidBytes, 0, + pidBytes.length); + if (pidSubType[0] == (byte) 0x3) { + return HexEncode.bytesToHexStringFormat(pidBytes); + } else { + return (new String(pidBytes, Charset.defaultCharset())); + } } /** - * Retrieves the custom string from the Custom TLV value which includes OUI, subtype and custom string - * - * @param customTlvValue the custom TLV value - * @param customTlvLen the custom TLV length + * Retrieves the custom string from the Custom TLV value which includes OUI, + * subtype and custom string + * + * @param customTlvValue + * the custom TLV value + * @param customTlvLen + * the custom TLV length * @return the custom string */ static public String getCustomString(byte[] customTlvValue, int customTlvLen) { @@ -266,14 +326,14 @@ public class LLDPTLV extends Packet { if (Arrays.equals(vendor, LLDPTLV.OFOUI)) { int customArrayLength = customTlvLen - customTlvOffset; byte[] customArray = new byte[customArrayLength]; - System.arraycopy(customTlvValue, customTlvOffset, - customArray, 0, customArrayLength); + System.arraycopy(customTlvValue, customTlvOffset, customArray, 0, + customArrayLength); try { - customString = new String(customArray, "UTF-8"); + customString = new String(customArray, "UTF-8"); } catch (UnsupportedEncodingException e) { } } - - return customString; - } + + return customString; + } }