blob: e2b4a6b33a95f56d5766c9d2987738131bba904c [file] [log] [blame]
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -07001/*
2 * Copyright 2015 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 */
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 /*
33 SR-ERO subobject: (draft-ietf-pce-segment-routing-00)
34 0 1 2 3
35 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
36 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37 |L| Type | Length | ST | Flags |F|S|C|M|
38 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39 | SID |
40 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41 // NAI (variable) //
42 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43
44
45
46 NAI
47
48 0 1 2 3
49 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
50 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51 | Local IPv4 address |
52 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53 | Remote IPv4 address |
54 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55
56 NAI for IPv4 Adjacency
57
58 0 1 2 3
59 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
60 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61 // Local IPv6 address (16 bytes) //
62 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 // Remote IPv6 address (16 bytes) //
64 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65
66 NAI for IPv6 adjacency
67
68 0 1 2 3
69 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
70 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71 | Local Node-ID |
72 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73 | Local Interface ID |
74 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75 | Remote Node-ID |
76 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 | Remote Interface ID |
78 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79
80 NAI for Unnumbered adjacency with IPv4 Node IDs
81
82 */
83 protected static final Logger log = LoggerFactory.getLogger(SrEroSubObject.class);
84
85 public static final short TYPE = 0x60; //TODO : type to be defined
86 public static final short LENGTH = 12;
87 public static final short VALUE_LENGTH = 10;
88 public static final int SET = 1;
89 public static final byte MFLAG_SET = 0x01;
90 public static final byte CFLAG_SET = 0x02;
91 public static final byte SFLAG_SET = 0x04;
92 public static final byte FFLAG_SET = 0x08;
93 public static final byte SHIFT_ST = 12;
94
95 private final boolean bFFlag;
96 private final boolean bSFlag;
97 private final boolean bCFlag;
98 private final boolean bMFlag;
99 private final byte st;
100
101 private final int sID;
102 private final PcepNai nai;
103
104 /**
105 * Constructor to initialize member variables.
106 *
107 * @param st SID type
108 * @param bFFlag F flag
109 * @param bSFlag S flag
110 * @param bCFlag C flag
111 * @param bMFlag M flag
112 * @param sID segment identifier value
113 * @param nai NAI associated with SID
114 */
115 public SrEroSubObject(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sID,
116 PcepNai nai) {
117 this.st = st;
118 this.bFFlag = bFFlag;
119 this.bSFlag = bSFlag;
120 this.bCFlag = bCFlag;
121 this.bMFlag = bMFlag;
122 this.sID = sID;
123 this.nai = nai;
124 }
125
126 /**
127 * Creates object of SrEroSubObject.
128 *
129 * @param st SID type
130 * @param bFFlag F flag
131 * @param bSFlag S flag
132 * @param bCFlag C flag
133 * @param bMFlag M flag
134 * @param sID segment identifier value
135 * @param nai NAI associated with SID
136 * @return object of SrEroSubObject
137 */
138 public static SrEroSubObject of(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sID,
139 PcepNai nai) {
140 return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
141 }
142
143 /**
144 * Returns SID type.
145 * @return st sid type
146 */
147 public byte getSt() {
148 return st;
149 }
150
151 /**
152 * Returns bFFlag.
153 * @return bFFlag
154 */
155 public boolean getFFlag() {
156 return bFFlag;
157 }
158
159 /**
160 * Returns bSFlag.
161 * @return bSFlag
162 */
163 public boolean getSFlag() {
164 return bSFlag;
165 }
166
167 /**
168 * Returns bCFlag.
169 * @return bCFlag
170 */
171 public boolean getCFlag() {
172 return bCFlag;
173 }
174
175 /**
176 * Returns bMFlag.
177 * @return bMFlag
178 */
179 public boolean getMFlag() {
180 return bMFlag;
181 }
182
183 /**
184 * Returns sID.
185 * @return sID
186 */
Jonathan Hart51539b82015-10-29 09:53:04 -0700187 public int getSid() {
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700188 return sID;
189 }
190
191 /**
192 * Returns nai.
193 * @return nai
194 */
195 public PcepNai getNai() {
196 return nai;
197 }
198
199 @Override
200 public PcepVersion getVersion() {
201 return PcepVersion.PCEP_1;
202 }
203
204 @Override
205 public short getType() {
206 return TYPE;
207 }
208
209 @Override
210 public short getLength() {
211 return LENGTH;
212 }
213
214 @Override
215 public int hashCode() {
216 return Objects.hash(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
217 }
218
219 @Override
220 public boolean equals(Object obj) {
221 if (this == obj) {
222 return true;
223 }
224 if (obj instanceof SrEroSubObject) {
225 SrEroSubObject other = (SrEroSubObject) obj;
226 return Objects.equals(this.st, other.st) && Objects.equals(this.bFFlag, other.bFFlag)
227 && Objects.equals(this.bSFlag, other.bSFlag) && Objects.equals(this.bCFlag, other.bCFlag)
228 && Objects.equals(this.bMFlag, other.bMFlag) && Objects.equals(this.sID, other.sID)
229 && Objects.equals(this.nai, other.nai);
230 }
231 return false;
232 }
233
234 @Override
235 public int write(ChannelBuffer c) {
236 int iLenStartIndex = c.writerIndex();
237
238 c.writeShort(TYPE);
239 c.writeShort(LENGTH);
240
241 short temp = 0;
242 if (bMFlag) {
243 temp = (short) (temp | MFLAG_SET);
244 }
245 if (bCFlag) {
246 temp = (short) (temp | CFLAG_SET);
247 }
248 if (bSFlag) {
249 temp = (short) (temp | SFLAG_SET);
250 }
251 if (bFFlag) {
252 temp = (short) (temp | FFLAG_SET);
253 }
254 short tempST = (short) (st << SHIFT_ST);
255 temp = (short) (temp | tempST);
256 c.writeShort(temp);
257 c.writeInt(sID);
258 nai.write(c);
259
260 return c.writerIndex() - iLenStartIndex;
261 }
262
263 /**
264 * Reads the channel buffer and returns object of SrEroSubObject.
265 * @param c of type channel buffer
266 * @return object of SrEroSubObject
267 */
268 public static PcepValueType read(ChannelBuffer c) {
269 short temp = c.readShort();
270 boolean bMFlag;
271 boolean bCFlag;
272 boolean bSFlag;
273 boolean bFFlag;
274 byte st;
275 PcepNai nai = null;
276
Phanendra Mandaf346ea82015-09-04 15:21:39 -0700277 bMFlag = (temp & MFLAG_SET) == MFLAG_SET;
278 bCFlag = (temp & CFLAG_SET) == CFLAG_SET;
279 bSFlag = (temp & SFLAG_SET) == SFLAG_SET;
280 bFFlag = (temp & FFLAG_SET) == FFLAG_SET;
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700281
282 st = (byte) (temp >> SHIFT_ST);
283
284 int sID = c.readInt();
285 switch (st) {
286 case 0x01:
287 nai = PcepNaiIpv4NodeId.read(c);
288 break;
289 case 0x02:
290 nai = PcepNaiIpv6NodeId.read(c);
291 break;
292 case 0x03:
293 nai = PcepNaiIpv4Adjacency.read(c);
294 break;
295 case 0x04:
296 nai = PcepNaiIpv6Adjacency.read(c);
297 break;
298 case 0x05:
299 nai = PcepNaiUnnumberedAdjacencyIpv4.read(c);
300 break;
301 default:
302 nai = null;
303 break;
304 }
305
306 return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
307 }
308
309 @Override
310 public String toString() {
311 return MoreObjects.toStringHelper(getClass())
312 .add("Type", TYPE)
313 .add("Length", LENGTH)
314 .add("st", st)
315 .add("bFflag", bFFlag)
316 .add("bSFlag", bSFlag)
317 .add("bCFlag", bCFlag)
318 .add("bMFlag", bMFlag)
319 .add("sID", sID)
320 .add("nAI", nai)
321 .toString();
322 }
323}