blob: cec72920d2342fbf2f0e43b19969e34df786215c [file] [log] [blame]
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.pcepio.types;
17
Saritha8539a2e2017-01-05 11:58:54 +053018import java.util.Arrays;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070019import org.jboss.netty.buffer.ChannelBuffer;
20import org.onosproject.pcepio.protocol.PcepVersion;
21import org.slf4j.Logger;
22import org.slf4j.LoggerFactory;
23
24import com.google.common.base.MoreObjects;
25import com.google.common.base.MoreObjects.ToStringHelper;
26
27/**
28 * Provides Opaque Link Attribute.
29 */
Mahesh Poojary Sf1bbd362016-02-25 18:19:59 +053030public class OpaqueLinkAttributeSubTlv implements PcepValueType {
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070031
32 /*
33 * TLV format.
34 * Reference :[I-D.ietf-idr-attributesls-distribution] /3.3.2.6
35 0 1 2 3
36 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
37 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38 | Type=TBD42 | Length |
39 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40 // Opaque link attributes (variable) //
41 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42 */
43
Ray Milkey9c9cde42018-01-12 14:22:06 -080044 private static final Logger log = LoggerFactory.getLogger(OpaqueLinkAttributeSubTlv.class);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070045
Mahesh Poojary Sf1bbd362016-02-25 18:19:59 +053046 public static final short TYPE = 31;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070047 private final short hLength;
48
49 private final byte[] rawValue;
50
51 /**
52 * constructor to initialize rawValue.
53 *
54 * @param rawValue of Opaque Link Attribute
55 * @param hLength length
56 */
Mahesh Poojary Sf1bbd362016-02-25 18:19:59 +053057 public OpaqueLinkAttributeSubTlv(byte[] rawValue, short hLength) {
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070058 log.debug("OpaqueLinkAttributeTlv");
59 this.rawValue = rawValue;
60 if (0 == hLength) {
61 this.hLength = (short) rawValue.length;
62 } else {
63 this.hLength = hLength;
64 }
65 }
66
67 /**
68 * Returns newly created OpaqueLinkAttributeTlv object.
69 *
70 * @param raw of Opaque Link Attribute
71 * @param hLength length
72 * @return new object of OpaqueLinkAttributeTlv
73 */
Mahesh Poojary Sf1bbd362016-02-25 18:19:59 +053074 public static OpaqueLinkAttributeSubTlv of(final byte[] raw, short hLength) {
75 return new OpaqueLinkAttributeSubTlv(raw, hLength);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070076 }
77
78 /**
79 * Returns raw value of Opaque Link Attribute Tlv.
80 * @return rawValue raw value
81 */
82 public byte[] getValue() {
83 return rawValue;
84 }
85
86 @Override
87 public PcepVersion getVersion() {
88 return PcepVersion.PCEP_1;
89 }
90
91 @Override
92 public short getType() {
93 return TYPE;
94 }
95
96 @Override
97 public short getLength() {
98 return hLength;
99 }
100
101 @Override
102 public int hashCode() {
Saritha8539a2e2017-01-05 11:58:54 +0530103 return Arrays.hashCode(rawValue);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700104 }
105
106 @Override
107 public boolean equals(Object obj) {
108 if (this == obj) {
109 return true;
110 }
Mahesh Poojary Sf1bbd362016-02-25 18:19:59 +0530111 if (obj instanceof OpaqueLinkAttributeSubTlv) {
112 OpaqueLinkAttributeSubTlv other = (OpaqueLinkAttributeSubTlv) obj;
Saritha8539a2e2017-01-05 11:58:54 +0530113 return Arrays.equals(this.rawValue, other.rawValue);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700114 }
115 return false;
116 }
117
118 @Override
119 public int write(ChannelBuffer c) {
120 int iLenStartIndex = c.writerIndex();
121 c.writeShort(TYPE);
122 c.writeShort(hLength);
123 c.writeBytes(rawValue);
124 return c.writerIndex() - iLenStartIndex;
125 }
126
127 /**
128 * Reads the channel buffer and returns object of OpaqueLinkAttributeTlv.
129 *
130 * @param c input channel buffer
131 * @param hLength length
132 * @return object of Opaque Link Attribute Tlv
133 */
134 public static PcepValueType read(ChannelBuffer c, short hLength) {
135 byte[] iOpaqueValue = new byte[hLength];
136 c.readBytes(iOpaqueValue, 0, hLength);
Mahesh Poojary Sf1bbd362016-02-25 18:19:59 +0530137 return new OpaqueLinkAttributeSubTlv(iOpaqueValue, hLength);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700138 }
139
140 @Override
141 public String toString() {
142 ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass());
143
144 toStrHelper.add("Type", TYPE);
145 toStrHelper.add("Length", hLength);
146
147 StringBuffer result = new StringBuffer();
148 for (byte b : rawValue) {
149 result.append(String.format("%02X ", b));
150 }
151 toStrHelper.add("Value", result);
152
153 return toStrHelper.toString();
154 }
155}