BUG-47 : unfinished PCEP migration to generated DTOs.
[bgpcep.git] / pcep / impl / src / main / java / org / opendaylight / protocol / pcep / impl / tlv / RSVPErrorSpecTlvParser.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.protocol.pcep.impl.tlv;
9
10 import java.util.BitSet;
11
12 import org.opendaylight.protocol.concepts.Ipv4Util;
13 import org.opendaylight.protocol.concepts.Ipv6Util;
14 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
15 import org.opendaylight.protocol.pcep.spi.TlvParser;
16 import org.opendaylight.protocol.pcep.spi.TlvSerializer;
17 import org.opendaylight.protocol.util.ByteArray;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.RsvpErrorSpecTlv;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.object.tlvs.RsvpErrorSpecBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rsvp.error.spec.tlv.ErrorType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rsvp.error.spec.tlv.error.type.Rsvp;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rsvp.error.spec.tlv.error.type.RsvpBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rsvp.error.spec.tlv.error.type.UserBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rsvp.error.spec.tlv.error.type.rsvp.RsvpError;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rsvp.error.spec.tlv.error.type.rsvp.RsvpErrorBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rsvp.error.spec.tlv.error.type.user.UserErrorBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.ErrorSpec.Flags;
31
32 import com.google.common.primitives.UnsignedBytes;
33
34 /**
35  * Parser for {@link RsvpErrorSpecTlv}
36  */
37 public class RSVPErrorSpecTlvParser implements TlvParser, TlvSerializer {
38
39         private static final int IP4_F_LENGTH = 4;
40         private static final int IP6_F_LENGTH = 16;
41         private static final int FLAGS_F_LENGTH = 1;
42         private static final int ERROR_CODE_F_LENGTH = 1;
43         private static final int ERROR_VALUE_F_LENGTH = 2;
44
45         private static final int ENTERPRISE_F_LENGTH = 4;
46         private static final int SUB_ORG_F_LENGTH = 1;
47         private static final int ERR_DESCR_LENGTH_F_LENGTH = 1;
48         private static final int USER_VALUE_F_LENGTH = 2;
49
50         private static final int RSVP_ERROR_CLASS_NUM = 6;
51         private static final int RSVP_IPV4_ERROR_CLASS_TYPE = 1;
52         private static final int RSVP_IPV6_ERROR_CLASS_TYPE = 2;
53
54         private static final int USER_ERROR_CLASS_NUM = 194;
55         private static final int USER_ERROR_CLASS_TYPE = 1;
56
57         public static final int TYPE = 21;
58
59         /*
60          * flags offsets inside flags field in bits
61          */
62         private static final int IN_PLACE_FLAG_OFFSET = 7;
63         private static final int NOT_GUILTY_FLAGS_OFFSET = 6;
64
65         @Override
66         public RsvpErrorSpecTlv parseTlv(final byte[] valueBytes) throws PCEPDeserializerException {
67                 if (valueBytes == null || valueBytes.length == 0)
68                         throw new IllegalArgumentException("Value bytes array is mandatory. Can't be null or empty.");
69
70                 final int classNum = ByteArray.bytesToInt(ByteArray.subByte(valueBytes, 2, 1));
71                 final int classType = ByteArray.bytesToInt(ByteArray.subByte(valueBytes, 3, 1));
72
73                 ErrorType errorType = null;
74                 int byteOffset = 0;
75
76                 if (classNum == RSVP_ERROR_CLASS_NUM) {
77                         final RsvpErrorBuilder builder = new RsvpErrorBuilder();
78                         if (classType == RSVP_IPV4_ERROR_CLASS_TYPE) {
79                                 builder.setNode(new IpAddress(Ipv4Util.addressForBytes(ByteArray.subByte(valueBytes, byteOffset, IP4_F_LENGTH))));
80                                 byteOffset += IP4_F_LENGTH;
81                         } else if (classType == RSVP_IPV6_ERROR_CLASS_TYPE) {
82                                 builder.setNode(new IpAddress(Ipv6Util.addressForBytes(ByteArray.subByte(valueBytes, byteOffset, IP6_F_LENGTH))));
83                                 byteOffset += IP6_F_LENGTH;
84                         }
85                         final BitSet flags = ByteArray.bytesToBitSet(ByteArray.subByte(valueBytes, byteOffset, FLAGS_F_LENGTH));
86                         byteOffset += FLAGS_F_LENGTH;
87
88                         final short errorCode = (short) (valueBytes[byteOffset] & 0xFF);
89                         byteOffset += ERROR_CODE_F_LENGTH;
90                         final int errorValue = (ByteArray.bytesToShort(ByteArray.subByte(valueBytes, byteOffset, ERROR_VALUE_F_LENGTH)) & 0xFFFF);
91
92                         errorType = new RsvpBuilder().setRsvpError(
93                                         builder.setFlags(new Flags(flags.get(IN_PLACE_FLAG_OFFSET), flags.get(NOT_GUILTY_FLAGS_OFFSET))).setCode(errorCode).setValue(
94                                                         errorValue).build()).build();
95                 } else if (classNum == USER_ERROR_CLASS_NUM && classType == USER_ERROR_CLASS_TYPE) {
96                         final UserErrorBuilder error = new UserErrorBuilder();
97                         error.setEnterprise(new EnterpriseNumber(ByteArray.bytesToLong(ByteArray.subByte(valueBytes, byteOffset, ENTERPRISE_F_LENGTH))));
98                         byteOffset += ENTERPRISE_F_LENGTH;
99                         error.setSubOrg(ByteArray.bytesToShort(ByteArray.subByte(valueBytes, byteOffset, SUB_ORG_F_LENGTH)));
100                         byteOffset += SUB_ORG_F_LENGTH;
101                         final int errDescrLength = UnsignedBytes.toInt(valueBytes[byteOffset]);
102                         byteOffset += ERR_DESCR_LENGTH_F_LENGTH;
103                         error.setValue(ByteArray.bytesToInt(ByteArray.subByte(valueBytes, byteOffset, USER_VALUE_F_LENGTH)));
104                         byteOffset += USER_VALUE_F_LENGTH;
105                         error.setDescription(ByteArray.bytesToHRString(ByteArray.subByte(valueBytes, byteOffset, errDescrLength)));
106                         byteOffset += errDescrLength;
107                         if (byteOffset < valueBytes.length) {
108                                 // TODO: if we have any subobjects
109                                 // error.setSubobjects(new SubobjectsBuilder().build());
110                         }
111                         errorType = new UserBuilder().setUserError(error.build()).build();
112                 }
113
114                 return new RsvpErrorSpecBuilder().setErrorType(errorType).build();
115         }
116
117         @Override
118         public byte[] serializeTlv(final Tlv tlv) {
119                 if (tlv == null)
120                         throw new IllegalArgumentException("RSVPErrorSpecTlv is mandatory.");
121                 final RsvpErrorSpecTlv rsvp = (RsvpErrorSpecTlv) tlv;
122
123                 if (rsvp.getErrorType().getClass().equals(Rsvp.class)) {
124                         final Rsvp r = (Rsvp) rsvp.getErrorType();
125                         final RsvpError e = r.getRsvpError();
126                         final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE);
127                         flags.set(IN_PLACE_FLAG_OFFSET, e.getFlags().isInPlace());
128                         flags.set(NOT_GUILTY_FLAGS_OFFSET, e.getFlags().isNotGuilty());
129                         final IpAddress node = e.getNode();
130                         if (node.getIpv4Address() != null) {
131
132                         }
133
134                 } else {
135
136                 }
137                 // TODO: finish
138                 return null;
139         }
140
141         @Override
142         public int getType() {
143                 return TYPE;
144         }
145 }