blob: 57b719e2d22e822cbb25d2f0d956df1666a80827 [file] [log] [blame]
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
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 */
85 protected static final Logger log = LoggerFactory.getLogger(SrEroSubObject.class);
86
87 public static final short TYPE = 0x60; //TODO : type to be defined
88 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();
246
247 c.writeShort(TYPE);
248 c.writeShort(LENGTH);
249
250 short temp = 0;
251 if (bMFlag) {
252 temp = (short) (temp | MFLAG_SET);
253 }
254 if (bCFlag) {
255 temp = (short) (temp | CFLAG_SET);
256 }
257 if (bSFlag) {
258 temp = (short) (temp | SFLAG_SET);
259 }
260 if (bFFlag) {
261 temp = (short) (temp | FFLAG_SET);
262 }
263 short tempST = (short) (st << SHIFT_ST);
264 temp = (short) (temp | tempST);
265 c.writeShort(temp);
Priyanka B21f4b732016-03-21 20:54:12 +0530266 if (bMFlag) {
267 int tempSid = (int) sid << 12;
268 c.writeInt(tempSid);
269 } else {
270 c.writeInt(sid);
271 }
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700272 nai.write(c);
273
274 return c.writerIndex() - iLenStartIndex;
275 }
276
277 /**
278 * Reads the channel buffer and returns object of SrEroSubObject.
279 * @param c of type channel buffer
280 * @return object of SrEroSubObject
281 */
282 public static PcepValueType read(ChannelBuffer c) {
283 short temp = c.readShort();
284 boolean bMFlag;
285 boolean bCFlag;
286 boolean bSFlag;
287 boolean bFFlag;
288 byte st;
289 PcepNai nai = null;
290
Phanendra Mandaf346ea82015-09-04 15:21:39 -0700291 bMFlag = (temp & MFLAG_SET) == MFLAG_SET;
292 bCFlag = (temp & CFLAG_SET) == CFLAG_SET;
293 bSFlag = (temp & SFLAG_SET) == SFLAG_SET;
294 bFFlag = (temp & FFLAG_SET) == FFLAG_SET;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700295
296 st = (byte) (temp >> SHIFT_ST);
297
Priyanka B21f4b732016-03-21 20:54:12 +0530298 int sid = c.readInt();
299 if (bMFlag) {
300 sid = sid >> 12;
301 }
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700302 switch (st) {
Priyanka B21f4b732016-03-21 20:54:12 +0530303 case PcepNaiIpv4NodeId.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700304 nai = PcepNaiIpv4NodeId.read(c);
305 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530306 case PcepNaiIpv6NodeId.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700307 nai = PcepNaiIpv6NodeId.read(c);
308 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530309 case PcepNaiIpv4Adjacency.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700310 nai = PcepNaiIpv4Adjacency.read(c);
311 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530312 case PcepNaiIpv6Adjacency.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700313 nai = PcepNaiIpv6Adjacency.read(c);
314 break;
Priyanka B21f4b732016-03-21 20:54:12 +0530315 case PcepNaiUnnumberedAdjacencyIpv4.ST_TYPE:
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700316 nai = PcepNaiUnnumberedAdjacencyIpv4.read(c);
317 break;
318 default:
319 nai = null;
320 break;
321 }
322
Priyanka B21f4b732016-03-21 20:54:12 +0530323 return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sid, nai);
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700324 }
325
326 @Override
327 public String toString() {
328 return MoreObjects.toStringHelper(getClass())
329 .add("Type", TYPE)
330 .add("Length", LENGTH)
331 .add("st", st)
332 .add("bFflag", bFFlag)
333 .add("bSFlag", bSFlag)
334 .add("bCFlag", bCFlag)
335 .add("bMFlag", bMFlag)
Priyanka B21f4b732016-03-21 20:54:12 +0530336 .add("sid", sid)
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700337 .add("nAI", nai)
338 .toString();
339 }
340}