diff options
Diffstat (limited to 'framework/src/onos/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/StatefulRsvpErrorSpecTlv.java')
-rw-r--r-- | framework/src/onos/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/StatefulRsvpErrorSpecTlv.java | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/framework/src/onos/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/StatefulRsvpErrorSpecTlv.java b/framework/src/onos/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/StatefulRsvpErrorSpecTlv.java new file mode 100644 index 00000000..9e1a074a --- /dev/null +++ b/framework/src/onos/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/StatefulRsvpErrorSpecTlv.java @@ -0,0 +1,216 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.pcepio.types; + +import java.util.Objects; + +import org.jboss.netty.buffer.ChannelBuffer; +import org.onosproject.pcepio.exceptions.PcepParseException; +import org.onosproject.pcepio.protocol.PcepVersion; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.MoreObjects; + +/** + * Provides StatefulRsvpErrorSpecTlv. + */ +public class StatefulRsvpErrorSpecTlv implements PcepValueType { + + protected static final Logger log = LoggerFactory.getLogger(StatefulRsvpErrorSpecTlv.class); + + /* RSVP-ERROR-SPEC TLV format + * Reference :PCEP Extensions for Stateful PCE draft-ietf-pce-stateful-pce-10 + * + * + + 0 1 2 3 + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type=21 | Length (variable) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + + RSVP ERROR_SPEC or USER_ERROR_SPEC Object + + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + 0 1 2 3 + +-------------+-------------+-------------+-------------+ + | Length (bytes) | Class-Num | C-Type | + +-------------+-------------+-------------+-------------+ + | | + // (Object contents) // + | | + +-------------+-------------+-------------+-------------+ + + Ref : ERROR_SPEC @ RFC2205 + + IPv4 ERROR_SPEC object: Class = 6, C-Type = 1 + +-------------+-------------+-------------+-------------+ + | IPv4 Error Node Address (4 bytes) | + +-------------+-------------+-------------+-------------+ + | Flags | Error Code | Error Value | + +-------------+-------------+-------------+-------------+ + + + IPv6 ERROR_SPEC object: Class = 6, C-Type = 2 + +-------------+-------------+-------------+-------------+ + | | + + + + | | + + IPv6 Error Node Address (16 bytes) + + | | + + + + | | + +-------------+-------------+-------------+-------------+ + | Flags | Error Code | Error Value | + +-------------+-------------+-------------+-------------+ + + + Ref : USER_ERROR_SPEC @ RFC5284 + USER_ERROR_SPEC object: Class = 194, C-Type = 1 + 0 1 2 3 + 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 + +---------------+---------------+---------------+---------------+ + | Enterprise Number | + +---------------+---------------+---------------+---------------+ + | Sub Org | Err Desc Len | User Error Value | + +---------------+---------------+---------------+---------------+ + | | + ~ Error Description ~ + | | + +---------------+---------------+---------------+---------------+ + | | + ~ User-Defined Subobjects ~ + | | + +---------------+---------------+---------------+---------------+ + + */ + + public static final short TYPE = 21; + public static final int OBJECT_HEADER_LENGTH = 4; + private short hLength; + + private final PcepRsvpErrorSpec rsvpErrSpecObj; + private final boolean isErrSpceObjSet; + + /** + * Constructor to initialize errSpecObj. + * + * @param rsvpErrSpecObj Rsvp error spec object + */ + public StatefulRsvpErrorSpecTlv(PcepRsvpErrorSpec rsvpErrSpecObj) { + this.rsvpErrSpecObj = rsvpErrSpecObj; + this.isErrSpceObjSet = true; + } + + /** + * Returns PcepRsvpErrorSpecObject. + * + * @return rsvpErrSpecObj + */ + public PcepRsvpErrorSpec getPcepRsvpErrorSpec() { + return this.rsvpErrSpecObj; + } + + @Override + public PcepVersion getVersion() { + return PcepVersion.PCEP_1; + } + + @Override + public short getType() { + return TYPE; + } + + @Override + public short getLength() { + return hLength; + } + + /** + * Reads channel buffer and returns object of StatefulRsvpErrorSpecTlv. + * + * @param cb of type channel buffer + * @return object of StatefulRsvpErrorSpecTlv + * @throws PcepParseException while parsing this tlv from channel buffer + */ + public static PcepValueType read(ChannelBuffer cb) throws PcepParseException { + + PcepRsvpErrorSpec rsvpErrSpecObj = null; + PcepRsvpSpecObjHeader rsvpErrSpecObjHeader; + + cb.markReaderIndex(); + rsvpErrSpecObjHeader = PcepRsvpSpecObjHeader.read(cb); + cb.resetReaderIndex(); + + if (PcepRsvpIpv4ErrorSpec.CLASS_NUM == rsvpErrSpecObjHeader.getObjClassNum() + && PcepRsvpIpv4ErrorSpec.CLASS_TYPE == rsvpErrSpecObjHeader.getObjClassType()) { + rsvpErrSpecObj = PcepRsvpIpv4ErrorSpec.read(cb); + } else if (PcepRsvpIpv6ErrorSpec.CLASS_NUM == rsvpErrSpecObjHeader.getObjClassNum() + && PcepRsvpIpv6ErrorSpec.CLASS_TYPE == rsvpErrSpecObjHeader.getObjClassType()) { + rsvpErrSpecObj = PcepRsvpIpv6ErrorSpec.read(cb); + } else if (PcepRsvpUserErrorSpec.CLASS_NUM == rsvpErrSpecObjHeader.getObjClassNum() + && PcepRsvpUserErrorSpec.CLASS_TYPE == rsvpErrSpecObjHeader.getObjClassType()) { + rsvpErrSpecObj = PcepRsvpUserErrorSpec.read(cb); + } + return new StatefulRsvpErrorSpecTlv(rsvpErrSpecObj); + } + + @Override + public int hashCode() { + return Objects.hash(rsvpErrSpecObj.hashCode()); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof StatefulRsvpErrorSpecTlv) { + StatefulRsvpErrorSpecTlv other = (StatefulRsvpErrorSpecTlv) obj; + return Objects.equals(this.rsvpErrSpecObj, other.rsvpErrSpecObj); + } + return false; + } + + @Override + public int write(ChannelBuffer c) { + int iStartIndex = c.writerIndex(); + c.writeShort(TYPE); + int tlvLenIndex = c.writerIndex(); + hLength = 0; + c.writeShort(hLength); + if (isErrSpceObjSet) { + rsvpErrSpecObj.write(c); + } + hLength = (short) (c.writerIndex() - iStartIndex); + c.setShort(tlvLenIndex, (hLength - OBJECT_HEADER_LENGTH)); + + return c.writerIndex() - iStartIndex; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(getClass()) + .omitNullValues() + .add("Type", TYPE) + .add("Length", hLength) + .add("RSVPErrorSpecObject", rsvpErrSpecObj) + .toString(); + } +} |