blob: c6cd9f0086c5932173de48ead3de82a5f8a6bb53 [file] [log] [blame]
tejeshwer degala3fe1ed52016-04-22 17:04:01 +05301/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
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.isis.io.isispacket.tlv;
17
18import com.google.common.base.MoreObjects;
19import com.google.common.primitives.Bytes;
20import org.jboss.netty.buffer.ChannelBuffer;
21import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvFinder;
22import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvToBytes;
23import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvType;
24import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
25import org.onosproject.isis.io.util.IsisUtil;
26
27import java.util.ArrayList;
28import java.util.List;
29
30/**
31 * Representation of IS extended reachability TLV.
32 */
33public class IsExtendedReachability extends TlvHeader implements IsisTlv {
34
35 private String neighborId;
36 private int metric;
37 private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
38
39 /**
40 * Creates an instance of IP external reachability TLV.
41 *
42 * @param tlvHeader TLV header
43 */
44 public IsExtendedReachability(TlvHeader tlvHeader) {
45 this.setTlvType(tlvHeader.tlvType());
46 this.setTlvLength(tlvHeader.tlvLength());
47 }
48
49 /**
50 * Returns neighbor ID.
51 *
52 * @return neighbor ID
53 */
54 public String neighborId() {
55 return neighborId;
56 }
57
58 /**
59 * Sets neighbor ID.
60 *
61 * @param neighborId neighbor ID
62 */
63 public void setNeighborId(String neighborId) {
64 this.neighborId = neighborId;
65 }
66
67 /**
68 * Returns metric.
69 *
70 * @return metric
71 */
72 public int metric() {
73 return metric;
74 }
75
76 /**
77 * Sets metric.
78 *
79 * @param metric metric
80 */
81 public void setMetric(int metric) {
82 this.metric = metric;
83 }
84
85 /**
86 * Adds the traffic engineering sub TLV to IS extended reachability TLV.
87 *
88 * @param trafEnginSubTlv traffic engineering sub TLV
89 */
90 public void addSubTlv(TrafficEngineeringSubTlv trafEnginSubTlv) {
91 this.trafEnginSubTlv.add(trafEnginSubTlv);
92 }
93
94 @Override
95 public void readFrom(ChannelBuffer channelBuffer) {
96 byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES];
97 channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES);
98 this.setNeighborId(IsisUtil.systemId(tempByteArray));
99 this.setMetric(channelBuffer.readUnsignedMedium());
100 while (channelBuffer.readableBytes() > 0) {
101 TlvHeader tlvHeader = new TlvHeader();
102 tlvHeader.setTlvType(channelBuffer.readByte());
103 tlvHeader.setTlvLength(channelBuffer.readByte());
104 SubTlvType tlvValue = SubTlvType.get(tlvHeader.tlvType());
105 if (tlvValue != null) {
106 this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
107 channelBuffer.readBytes(tlvHeader.tlvLength())));
108 } else {
109 channelBuffer.readBytes(tlvHeader.tlvLength());
110 }
111 }
112 }
113
114 @Override
115 public byte[] asBytes() {
116 byte[] bytes = null;
117 byte[] tlvHeader = tlvHeaderAsByteArray();
118 byte[] tlvBody = tlvBodyAsBytes();
119 tlvHeader[1] = (byte) tlvBody.length;
120 bytes = Bytes.concat(tlvHeader, tlvBody);
121 return bytes;
122 }
123
124 /**
125 * Returns TLV body of IS extended reachability TLV.
126 *
127 * @return byteArray TLV body of IS extended reachability TLV.
128 */
129 private byte[] tlvBodyAsBytes() {
130 List<Byte> byteList = new ArrayList<>();
131 byteList.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborId()));
132 byteList.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.metric())));
133 if (this.trafEnginSubTlv.size() > 0) {
134 for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
135 byteList.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
136 }
137 }
138 return Bytes.toArray(byteList);
139 }
140
141 @Override
142 public String toString() {
143 return MoreObjects.toStringHelper(getClass())
144 .omitNullValues()
145 .add("neighborId", neighborId)
146 .add("metric", metric)
147 .add("trafEnginSubTlv", trafEnginSubTlv)
148 .toString();
149 }
150
151}