blob: 77c803d0b3afaa377291eff8cccea63744454a19 [file] [log] [blame]
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-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 */
16
17package org.onosproject.pcepio.types;
18
Jonathan Hart51539b82015-10-29 09:53:04 -070019import com.google.common.base.MoreObjects;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070020import org.jboss.netty.buffer.ChannelBuffer;
21import org.onosproject.pcepio.protocol.PcepNai;
22import org.onosproject.pcepio.protocol.PcepVersion;
23import org.slf4j.Logger;
24import org.slf4j.LoggerFactory;
25
Jonathan Hart51539b82015-10-29 09:53:04 -070026import java.util.Objects;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070027
28/**
29 * Provides SrEroSubObject.
30 */
31public class SrEroSubObject implements PcepValueType {
32 /*
Priyanka B21f4b732016-03-21 20:54:12 +053033 SR-ERO subobject: (draft-ietf-pce-segment-routing-06)
34
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070035 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 |L| Type | Length | ST | Flags |F|S|C|M|
39 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40 | SID |
41 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42 // NAI (variable) //
43 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Priyanka B21f4b732016-03-21 20:54:12 +053044 When M bit is reset, SID is 32 bit Index.
45 When M bit is set, SID is 20 bit Label.
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070046
47
48 NAI
49
50 0 1 2 3
51 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
52 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53 | Local IPv4 address |
54 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55 | Remote IPv4 address |
56 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57
58 NAI for IPv4 Adjacency
59
60 0 1 2 3
61 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
62 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 // Local IPv6 address (16 bytes) //
64 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65 // Remote IPv6 address (16 bytes) //
66 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67
68 NAI for IPv6 adjacency
69
70 0 1 2 3
71 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
72 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73 | Local Node-ID |
74 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75 | Local Interface ID |
76 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 | Remote Node-ID |
78 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79 | Remote Interface ID |
80 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81
82 NAI for Unnumbered adjacency with IPv4 Node IDs
83
84 */
Ray Milkey9c9cde42018-01-12 14:22:06 -080085 private static final Logger log = LoggerFactory.getLogger(SrEroSubObject.class);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070086
Avantika-Huaweif849aab2016-06-21 22:29:15 +053087 public static final short TYPE = 0x24; //TODO : type to be defined
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070088 public static final short LENGTH = 12;
89 public static final short VALUE_LENGTH = 10;
90 public static final int SET = 1;
91 public static final byte MFLAG_SET = 0x01;
92 public static final byte CFLAG_SET = 0x02;
93 public static final byte SFLAG_SET = 0x04;
94 public static final byte FFLAG_SET = 0x08;
95 public static final byte SHIFT_ST = 12;
96
97 private final boolean bFFlag;
98 private final boolean bSFlag;
99 private final boolean bCFlag;
100 private final boolean bMFlag;
101 private final byte st;
102
Priyanka B21f4b732016-03-21 20:54:12 +0530103 //If m bit is set SID will store label else store 32 bit value
104 private final int sid;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700105 private final PcepNai nai;
106
107 /**
108 * Constructor to initialize member variables.
109 *
110 * @param st SID type
111 * @param bFFlag F flag
112 * @param bSFlag S flag
113 * @param bCFlag C flag
114 * @param bMFlag M flag
Priyanka B21f4b732016-03-21 20:54:12 +0530115 * @param sid segment identifier value
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700116 * @param nai NAI associated with SID
117 */
Priyanka B21f4b732016-03-21 20:54:12 +0530118 public SrEroSubObject(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sid,
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700119 PcepNai nai) {
120 this.st = st;
121 this.bFFlag = bFFlag;
122 this.bSFlag = bSFlag;
123 this.bCFlag = bCFlag;
124 this.bMFlag = bMFlag;
Priyanka B21f4b732016-03-21 20:54:12 +0530125 this.sid = sid;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700126 this.nai = nai;
127 }
128
129 /**
130 * Creates object of SrEroSubObject.
131 *
132 * @param st SID type
133 * @param bFFlag F flag
134 * @param bSFlag S flag
135 * @param bCFlag C flag
136 * @param bMFlag M flag
Priyanka B21f4b732016-03-21 20:54:12 +0530137 * @param sid segment identifier value
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700138 * @param nai NAI associated with SID
139 * @return object of SrEroSubObject
140 */
Priyanka B21f4b732016-03-21 20:54:12 +0530141 public static SrEroSubObject of(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sid,
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700142 PcepNai nai) {
Priyanka B21f4b732016-03-21 20:54:12 +0530143 return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sid, nai);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700144 }
145
146 /**
147 * Returns SID type.
Priyanka B21f4b732016-03-21 20:54:12 +0530148 *
149 * @return st SID type
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700150 */
151 public byte getSt() {
152 return st;
153 }
154
155 /**
156 * Returns bFFlag.
Priyanka B21f4b732016-03-21 20:54:12 +0530157 *
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700158 * @return bFFlag
159 */
160 public boolean getFFlag() {
161 return bFFlag;
162 }
163
164 /**
165 * Returns bSFlag.
Priyanka B21f4b732016-03-21 20:54:12 +0530166 *
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700167 * @return bSFlag
168 */
169 public boolean getSFlag() {
170 return bSFlag;
171 }
172
173 /**
174 * Returns bCFlag.
Priyanka B21f4b732016-03-21 20:54:12 +0530175 *
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700176 * @return bCFlag
177 */
178 public boolean getCFlag() {
179 return bCFlag;
180 }
181
182 /**
183 * Returns bMFlag.
Priyanka B21f4b732016-03-21 20:54:12 +0530184 *
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700185 * @return bMFlag
186 */
187 public boolean getMFlag() {
188 return bMFlag;
189 }
190
191 /**
192 * Returns sID.
Priyanka B21f4b732016-03-21 20:54:12 +0530193 *
194 * @return sid
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700195 */
Jonathan Hart51539b82015-10-29 09:53:04 -0700196 public int getSid() {
Priyanka B21f4b732016-03-21 20:54:12 +0530197 return sid;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700198 }
199
200 /**
201 * Returns nai.
202 * @return nai
203 */
204 public PcepNai getNai() {
205 return nai;
206 }
207
208 @Override
209 public PcepVersion getVersion() {
210 return PcepVersion.PCEP_1;
211 }
212
213 @Override
214 public short getType() {
215 return TYPE;
216 }
217
218 @Override
219 public short getLength() {
220 return LENGTH;
221 }
222
223 @Override
224 public int hashCode() {
Priyanka B21f4b732016-03-21 20:54:12 +0530225 return Objects.hash(st, bFFlag, bSFlag, bCFlag, bMFlag, sid, nai);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700226 }
227
228 @Override
229 public boolean equals(Object obj) {
230 if (this == obj) {
231 return true;
232 }
233 if (obj instanceof SrEroSubObject) {
234 SrEroSubObject other = (SrEroSubObject) obj;
235 return Objects.equals(this.st, other.st) && Objects.equals(this.bFFlag, other.bFFlag)
236 && Objects.equals(this.bSFlag, other.bSFlag) && Objects.equals(this.bCFlag, other.bCFlag)
Priyanka B21f4b732016-03-21 20:54:12 +0530237 && Objects.equals(this.bMFlag, other.bMFlag) && Objects.equals(this.sid, other.sid)
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700238 && Objects.equals(this.nai, other.nai);
239 }
240 return false;
241 }
242
243 @Override
244 public int write(ChannelBuffer c) {
245 int iLenStartIndex = c.writerIndex();
Avantika-Huaweif849aab2016-06-21 22:29:15 +0530246 c.writeByte(TYPE);
247 // Store the position of object length
248 int objectLenIndex = c.writerIndex();
249 c.writeByte(0);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700250
251 short temp = 0;
252 if (bMFlag) {
253 temp = (short) (temp | MFLAG_SET);
254 }
255 if (bCFlag) {
256 temp = (short) (temp | CFLAG_SET);
257 }
258 if (bSFlag) {
259 temp = (short) (temp | SFLAG_SET);
260 }
261 if (bFFlag) {
262 temp = (short) (temp | FFLAG_SET);
263 }
264 short tempST = (short) (st << SHIFT_ST);
265 temp = (short) (temp | tempST);
266 c.writeShort(temp);
Priyanka B21f4b732016-03-21 20:54:12 +0530267 if (bMFlag) {
Avantika-Huaweif849aab2016-06-21 22:29:15 +0530268 int tempSid = sid << 12;
Priyanka B21f4b732016-03-21 20:54:12 +0530269 c.writeInt(tempSid);
270 } else {
271 c.writeInt(sid);
272 }
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700273 nai.write(c);
274
Avantika-Huaweif849aab2016-06-21 22:29:15 +0530275 c.setByte(objectLenIndex, (c.writerIndex() - iLenStartIndex));
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700276 return c.writerIndex() - iLenStartIndex;
277 }
278
279 /**
280 * Reads the channel buffer and returns object of SrEroSubObject.
281 * @param c of type channel buffer
282 * @return object of SrEroSubObject
283 */
284 public static PcepValueType read(ChannelBuffer c) {
285 short temp = c.readShort();
286 boolean bMFlag;
287 boolean bCFlag;
288 boolean bSFlag;
289 boolean bFFlag;
290 byte st;
291 PcepNai nai = null;
292
Phanendra Mandaf346ea82015-09-04 15:21:39 -0700293 bMFlag = (temp & MFLAG_SET) == MFLAG_SET;
294 bCFlag = (temp & CFLAG_SET) == CFLAG_SET;
295 bSFlag = (temp & SFLAG_SET) == SFLAG_SET;
296 bFFlag = (temp & FFLAG_SET) == FFLAG_SET;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700297
298 st = (byte) (temp >> SHIFT_ST);
299
Priyanka B21f4b732016-03-21 20:54:12 +0530300 int sid = c.readInt();
301 if (bMFlag) {
302 sid = sid >> 12;
303 }
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700304 switch (st) {
Priyanka B21f4b732016-03-21 20:54:12 +0530305 case PcepNaiIpv4NodeId.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700306 nai = PcepNaiIpv4NodeId.read(c);
307 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530308 case PcepNaiIpv6NodeId.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700309 nai = PcepNaiIpv6NodeId.read(c);
310 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530311 case PcepNaiIpv4Adjacency.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700312 nai = PcepNaiIpv4Adjacency.read(c);
313 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530314 case PcepNaiIpv6Adjacency.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700315 nai = PcepNaiIpv6Adjacency.read(c);
316 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530317 case PcepNaiUnnumberedAdjacencyIpv4.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700318 nai = PcepNaiUnnumberedAdjacencyIpv4.read(c);
319 break;
320 default:
321 nai = null;
322 break;
323 }
324
Priyanka B21f4b732016-03-21 20:54:12 +0530325 return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sid, nai);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700326 }
327
328 @Override
329 public String toString() {
330 return MoreObjects.toStringHelper(getClass())
331 .add("Type", TYPE)
332 .add("Length", LENGTH)
333 .add("st", st)
334 .add("bFflag", bFFlag)
335 .add("bSFlag", bSFlag)
336 .add("bCFlag", bCFlag)
337 .add("bMFlag", bMFlag)
Priyanka B21f4b732016-03-21 20:54:12 +0530338 .add("sid", sid)
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700339 .add("nAI", nai)
340 .toString();
341 }
342}