description
"This module contains the data model of PCEP extensions defined
- in draft-crabbe-pce-initiated-pce.
+ in draft-ietf-pce-pce-initiated-lsp.
Copyright (c)2013 Cisco Systems, Inc. All rights reserved.
revision "2013-11-26" {
description
"Initial revision.";
- reference "https://tools.ietf.org/html/draft-crabbe-pce-pce-initiated-lsp-02";
+ reference "http://tools.ietf.org/html/draft-ietf-pce-pce-initiated-lsp-00";
}
grouping pcinitiate-message {
container pcinitiate-message {
description "LSP Initiate Message";
- reference "https://tools.ietf.org/html/draft-crabbe-pce-pce-initiated-lsp-02#section-5.1";
+ reference "http://tools.ietf.org/html/draft-ietf-pce-pce-initiated-lsp-00#section-5.1";
uses pcep:message-header;
}
}
+ augment "/stateful:pcupd/stateful:pcupd-message/stateful:updates/stateful:srp" {
+ reference "http://tools.ietf.org/html/draft-ietf-pce-pce-initiated-lsp-00#section-5.2";
+ leaf remove {
+ type boolean;
+ default false;
+ }
+ }
+
+ augment "/stateful:pcrpt/stateful:pcrpt-message/stateful:reports/stateful:srp" {
+ reference "http://tools.ietf.org/html/draft-ietf-pce-pce-initiated-lsp-00#section-5.2";
+ leaf remove {
+ type boolean;
+ default false;
+ }
+ }
+
+ augment "/stateful:pcupd/stateful:pcupd-message/stateful:updates/stateful:lsp" {
+ reference "http://tools.ietf.org/html/draft-ietf-pce-pce-initiated-lsp-00#section-5.3.1";
+ leaf create {
+ type boolean;
+ default false;
+ }
+ }
+
+ augment "/stateful:pcrpt/stateful:pcrpt-message/stateful:reports/stateful:lsp" {
+ reference "http://tools.ietf.org/html/draft-ietf-pce-pce-initiated-lsp-00#section-5.3.1";
+ leaf create {
+ type boolean;
+ default false;
+ }
+ }
+
augment "/msg:open/msg:open-message/msg:open/msg:tlvs/msg:stateful" {
+ reference "http://tools.ietf.org/html/draft-ietf-pce-pce-initiated-lsp-00#section-4.1";
leaf initiation {
type boolean;
default false;
uses pcinitiate-message;
}
}
-
import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry;
import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.error.code.tlv.LspErrorCode;
private static final int REMOVE_FLAG_OFFSET = 13;
private static final int ADMINISTRATIVE_FLAG_OFFSET = 12;
private static final int OPERATIONAL_OFFSET = 9;
+ private static final int CREATE_FLAG_OFFSET = 8;
public PCEPLspObjectParser(final TlvHandlerRegistry tlvReg) {
super(tlvReg);
builder.setSync(flags.get(SYNC_FLAG_OFFSET));
builder.setRemove(flags.get(REMOVE_FLAG_OFFSET));
builder.setAdministrative(flags.get(ADMINISTRATIVE_FLAG_OFFSET));
+ builder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(flags.get(CREATE_FLAG_OFFSET)).build());
short s = 0;
s |= flags.get(OPERATIONAL_OFFSET + 2) ? 1 : 0;
s |= (flags.get(OPERATIONAL_OFFSET + 1) ? 1 : 0) << 1;
if (specObj.isAdministrative()) {
retBytes[3] |= 1 << (Byte.SIZE - (ADMINISTRATIVE_FLAG_OFFSET - Byte.SIZE) - 1);
}
+ if (specObj.getAugmentation(Lsp1.class).isCreate()) {
+ retBytes[3] |= 1 << (Byte.SIZE - (CREATE_FLAG_OFFSET - Byte.SIZE) - 1);
+ }
final int op = specObj.getOperational().getIntValue();
retBytes[3] |= (op & 7) << 4;
ByteArray.copyWhole(tlvs, retBytes, TLVS_OFFSET);
package org.opendaylight.protocol.pcep.impl.object;
import java.util.Arrays;
+import java.util.BitSet;
import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry;
import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
private static final int MIN_SIZE = FLAGS_SIZE + SRP_ID_SIZE;
+ private static final int REMOVE_FLAG = 31;
+
public PCEPSrpObjectParser(final TlvHandlerRegistry tlvReg) {
super(tlvReg);
}
final SrpBuilder builder = new SrpBuilder();
builder.setIgnore(header.isIgnore());
builder.setProcessingRule(header.isProcessingRule());
+ final BitSet flags = ByteArray.bytesToBitSet(ByteArray.subByte(bytes, 0, FLAGS_SIZE));
+ builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(flags.get(REMOVE_FLAG)).build());
final byte[] srpId = ByteArray.subByte(bytes, FLAGS_SIZE, SRP_ID_SIZE);
if (Arrays.equals(srpId, new byte[] { 0, 0, 0, 0 }) || Arrays.equals(srpId, new byte[] { 0xFFFFFFFF })) {
throw new PCEPDeserializerException("Min/Max values for SRP ID are reserved.");
if (tlvs != null) {
ByteArray.copyWhole(tlvs, retBytes, TLVS_OFFSET);
}
+ final BitSet flags = new BitSet(FLAGS_SIZE * Byte.SIZE);
+ flags.set(REMOVE_FLAG, srp.getAugmentation(Srp1.class).isRemove());
+ ByteArray.copyWhole(ByteArray.bitSetToBytes(flags, FLAGS_SIZE), retBytes, 0);
+
System.arraycopy(ByteArray.intToBytes(id.intValue(), SRP_ID_SIZE), 0, retBytes, FLAGS_SIZE, SRP_ID_SIZE);
ByteArray.copyWhole(tlvs, retBytes, TLVS_OFFSET);
return ObjectUtil.formatSubobject(TYPE, CLASS, object.isProcessingRule(), object.isIgnore(), retBytes);
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ieee754.rev130819.Float32;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
builder.setDelegate(false);
builder.setRemove(true);
builder.setSync(false);
+ builder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(false).build());
builder.setOperational(OperationalStatus.GoingDown);
builder.setPlspId(new PlspId(0x12345L));
@Test
public void testSrpObject() throws IOException, PCEPDeserializerException {
final PCEPSrpObjectParser parser = new PCEPSrpObjectParser(this.tlvRegistry);
- final byte[] result = new byte[] { (byte) 0x21, (byte) 0x10, (byte) 0x00, (byte) 0x0c, 0, 0, 0, 0, 0, 0, 0, (byte) 0x01 };
+ final byte[] result = new byte[] { (byte) 0x21, (byte) 0x10, (byte) 0x00, (byte) 0x0c, 0, 0, 0, (byte) 0x01, 0, 0, 0, (byte) 0x01 };
final SrpBuilder builder = new SrpBuilder();
builder.setProcessingRule(false);
builder.setIgnore(false);
builder.setOperationId(new SrpIdNumber(1L));
+ builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(true).build());
assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4)));
assertArrayEquals(result, parser.serializeObject(builder.build()));
import org.opendaylight.protocol.util.ByteArray;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ieee754.rev130819.Float32;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.PcinitiateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.PcinitiateMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.Requests;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.RequestsBuilder;
srpBuilder.setIgnore(false);
srpBuilder.setProcessingRule(false);
srpBuilder.setOperationId(new SrpIdNumber(1L));
+ srpBuilder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(false).build());
this.srp = srpBuilder.build();
final LspBuilder lspBuilder = new LspBuilder();
lspBuilder.setSync(false);
lspBuilder.setRemove(false);
lspBuilder.setTlvs(new TlvsBuilder().build());
+ lspBuilder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(false).build());
this.lsp = lspBuilder.build();
final Ipv4Builder afi = new Ipv4Builder();
this.fillIn(new PCEPErrorIdentifier((short) 6, (short) 9), PCEPErrors.ERO_MISSING);
this.fillIn(new PCEPErrorIdentifier((short) 6, (short) 10), PCEPErrors.SRP_MISSING);
this.fillIn(new PCEPErrorIdentifier((short) 6, (short) 11), PCEPErrors.LSP_IDENTIFIERS_TLV_MISSING);
- this.fillIn(new PCEPErrorIdentifier((short) 6, (short) 12), PCEPErrors.DB_VERSION_TLV_MISSING);
this.fillIn(new PCEPErrorIdentifier((short) 6, (short) 13), PCEPErrors.LSP_CLEANUP_TLV_MISSING);
this.fillIn(new PCEPErrorIdentifier((short) 6, (short) 14), PCEPErrors.SYMBOLIC_PATH_NAME_MISSING);
this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 1), PCEPErrors.UPDATE_REQ_FOR_NON_LSP);
this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 2), PCEPErrors.UPDATE_REQ_FOR_NO_STATEFUL);
- // TODO: replace with actual values by IANA
this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 3), PCEPErrors.UNKNOWN_PLSP_ID);
- this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 4), PCEPErrors.LSP_LIMIT_EXCEEDED);
+ this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 4), PCEPErrors.RESOURCE_LIMIT_EXCEEDED);
+ this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 6), PCEPErrors.LSP_LIMIT_EXCEEDED);
+ this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 7), PCEPErrors.DELEGATION_NON_REVOKABLE);
+ this.fillIn(new PCEPErrorIdentifier((short) 19, (short) 8), PCEPErrors.NON_ZERO_PLSPID);
this.fillIn(new PCEPErrorIdentifier((short) 20, (short) 1), PCEPErrors.CANNOT_PROCESS_STATE_REPORT);
this.fillIn(new PCEPErrorIdentifier((short) 20, (short) 2), PCEPErrors.LSP_DB_VERSION_MISMATCH);
this.fillIn(new PCEPErrorIdentifier((short) 20, (short) 5), PCEPErrors.CANNOT_COMPLETE_STATE_SYNC);
this.fillIn(new PCEPErrorIdentifier((short) 23, (short) 1), PCEPErrors.USED_SYMBOLIC_PATH_NAME);
+
+ this.fillIn(new PCEPErrorIdentifier((short) 24, (short) 1), PCEPErrors.LSP_UNACC_INST_PARAMS);
+ this.fillIn(new PCEPErrorIdentifier((short) 24, (short) 2), PCEPErrors.LSP_INTERNAL_ERROR);
+ this.fillIn(new PCEPErrorIdentifier((short) 24, (short) 3), PCEPErrors.LSP_RSVP_ERROR);
}
private void fillIn(final PCEPErrorIdentifier identifier, final PCEPErrors error) {
* LSP-IDENTIFIERS TLV missing for a path in an LSP Update Request where TE-LSP setup is requested.
*/
LSP_IDENTIFIERS_TLV_MISSING,
- /**
- * LSP-DB-VERSION TLV missing.
- */
- DB_VERSION_TLV_MISSING,
/**
* Reception of an object with P flag not set although the P flag must be set according to this specification.
*/
* A PCE indicates to a PCC that it has exceeded the resource limit allocated for its state, and thus it cannot
* accept and process its LSP State Report message.
*/
+ RESOURCE_LIMIT_EXCEEDED,
+ /**
+ * PCE-initiated LSP limit reached
+ */
LSP_LIMIT_EXCEEDED,
+ /**
+ * Delegation for PCE-initiated LSP cannot be revoked
+ */
+ DELEGATION_NON_REVOKABLE,
+ /**
+ * Non-zero PLSP-ID in LSP initiation request
+ */
+ NON_ZERO_PLSPID,
/**
* A PCE indicates to a PCC that it can not process (an otherwise valid) LSP State Report. The PCEP-ERROR Object is
* followed by the LSP Object that identifies the LSP.
/**
* SYMBOLIC-PATH-NAME in use
*/
- USED_SYMBOLIC_PATH_NAME
+ USED_SYMBOLIC_PATH_NAME,
+ /**
+ * LSP instantiation error: Unacceptable instantiation parameters
+ */
+ LSP_UNACC_INST_PARAMS,
+ /**
+ * LSP instantiation error: Internal error
+ */
+ LSP_INTERNAL_ERROR,
+ /**
+ * LSP instantiation error: RSVP signaling error
+ */
+ LSP_RSVP_ERROR
}