serializeObject(p.getEro(), buffer);
serializeObject(p.getLspa(), buffer);
serializeObject(p.getBandwidth(), buffer);
+ serializeObject(p.getReoptimizationBandwidth(), buffer);
if (p.getMetrics() != null) {
for (final Metrics m : p.getMetrics()) {
serializeObject(m.getMetric(), buffer);
lspViaSR = PSTUtil.isDefaultPST(tlvs.getPathSetupType());
}
builder.setSrp(srp);
- if(objects.isEmpty()) {
+ if (objects.isEmpty()) {
object = null;
} else {
object = objects.remove(0);
}
}
- if(validateLsp(object, lspViaSR, errors, builder)) {
- if(!objects.isEmpty()) {
- object = objects.remove(0);
- if(!validateEmpty(object, objects, errors, builder)) {
+ if (validateLsp(object, lspViaSR, errors, builder)) {
+ if (!objects.isEmpty()) {
+ if (!validatePath(objects, errors, builder)) {
return null;
}
}
return null;
}
- private boolean validateEmpty(final Object object, final List<Object> objects, final List<Message> errors, final ReportsBuilder builder) {
- final PathBuilder pBuilder = new PathBuilder();
- if (object instanceof Ero) {
- pBuilder.setEro((Ero) object);
- } else {
- errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.<Rp>absent()));
- return false;
- }
- parsePath(objects, pBuilder);
- builder.setPath(pBuilder.build());
- return true;
- }
-
private boolean validateLsp(final Object object, final boolean lspViaSR, final List<Message> errors, final ReportsBuilder builder) {
if (object instanceof Lsp) {
final Lsp lsp = (Lsp) object;
final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.Tlvs tlvs = lsp.getTlvs();
- if(!lspViaSR && lsp.getPlspId().getValue() != 0 && (tlvs == null || tlvs.getLspIdentifiers() == null)) {
+ if (!lspViaSR && lsp.getPlspId().getValue() != 0 && (tlvs == null || tlvs.getLspIdentifiers() == null)) {
final Message errorMsg = createErrorMsg(PCEPErrors.LSP_IDENTIFIERS_TLV_MISSING, Optional.<Rp>absent());
errors.add(errorMsg);
return false;
return true;
}
+ private boolean validatePath(final List<Object> objects, final List<Message> errors, final ReportsBuilder builder) {
+ final PathBuilder pBuilder = new PathBuilder();
+ Object object = objects.remove(0);
+ if (object instanceof Ero) {
+ pBuilder.setEro((Ero) object);
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.<Rp>absent()));
+ return false;
+ }
+ parsePath(objects, pBuilder);
+ builder.setPath(pBuilder.build());
+ return true;
+ }
+
private void parsePath(final List<Object> objects, final PathBuilder builder) {
final List<Metrics> pathMetrics = Lists.newArrayList();
Object obj;
case LSPA_IN:
if (obj instanceof Bandwidth) {
builder.setBandwidth((Bandwidth) obj);
- return State.BANDWIDTH_IN;
+ return State.LSPA_IN;
+ }
+ if (obj instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reoptimization.bandwidth.object.ReoptimizationBandwidth) {
+ builder.setReoptimizationBandwidth((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reoptimization.bandwidth.object.ReoptimizationBandwidth) obj);
+ return State.LSPA_IN;
}
case BANDWIDTH_IN:
if (obj instanceof Metric) {
serializeObject(p.getEro(), buffer);
serializeObject(p.getLspa(), buffer);
serializeObject(p.getBandwidth(), buffer);
+ serializeObject(p.getReoptimizationBandwidth(), buffer);
if (p.getMetrics() != null) {
for (final Metrics m : p.getMetrics()) {
serializeObject(m.getMetric(), buffer);
while (!objects.isEmpty()) {
final Updates upd = getValidUpdates(objects, errors);
- if(upd != null) {
+ if (upd != null) {
updateRequests.add(upd);
}
}
}
protected Updates getValidUpdates(final List<Object> objects, final List<Message> errors) {
- boolean isValid = true;
final UpdatesBuilder builder = new UpdatesBuilder();
- if (objects.get(0) instanceof Srp) {
- builder.setSrp((Srp) objects.get(0));
- objects.remove(0);
+
+ Object object = objects.remove(0);
+ if (object instanceof Srp) {
+ builder.setSrp((Srp) object);
+ if (objects.isEmpty()) {
+ object = null;
+ } else {
+ object = objects.remove(0);
+ }
} else {
errors.add(createErrorMsg(PCEPErrors.SRP_MISSING, Optional.<Rp>absent()));
- isValid = false;
}
- if (objects.get(0) instanceof Lsp) {
- builder.setLsp((Lsp) objects.get(0));
- objects.remove(0);
- } else {
- errors.add(createErrorMsg(PCEPErrors.LSP_MISSING, Optional.<Rp>absent()));
- isValid = false;
- }
- if (!objects.isEmpty()) {
- final PathBuilder pBuilder = new PathBuilder();
- if (objects.get(0) instanceof Ero) {
- pBuilder.setEro((Ero) objects.get(0));
- objects.remove(0);
- } else {
- errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.<Rp>absent()));
- isValid = false;
+
+ if (validateLsp(object, errors, builder)) {
+ if (!objects.isEmpty()) {
+ if (!validatePath(objects, errors, builder)) {
+ return null;
+ }
}
- parsePath(objects, pBuilder);
- builder.setPath(pBuilder.build());
- }
- if(isValid) {
+
return builder.build();
}
return null;
}
+ private boolean validateLsp(final Object object, final List<Message> errors, final UpdatesBuilder builder) {
+ if (object instanceof Lsp) {
+ builder.setLsp((Lsp) object);
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.LSP_MISSING, Optional.<Rp>absent()));
+ return false;
+ }
+ return true;
+ }
+
+ private boolean validatePath(final List<Object> objects, final List<Message> errors, final UpdatesBuilder builder) {
+ final PathBuilder pBuilder = new PathBuilder();
+ Object object = objects.remove(0);
+ if (object instanceof Ero) {
+ pBuilder.setEro((Ero) object);
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.<Rp>absent()));
+ return false;
+ }
+ parsePath(objects, pBuilder);
+ builder.setPath(pBuilder.build());
+ return true;
+ }
+
private void parsePath(final List<Object> objects, final PathBuilder pBuilder) {
final List<Metrics> pathMetrics = Lists.newArrayList();
Object obj;
case LSPA_IN:
if (obj instanceof Bandwidth) {
pBuilder.setBandwidth((Bandwidth) obj);
- return State.BANDWIDTH_IN;
+ return State.LSPA_IN;
+ }
+ if (obj instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reoptimization.bandwidth.object.ReoptimizationBandwidth) {
+ pBuilder.setReoptimizationBandwidth((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reoptimization.bandwidth.object.ReoptimizationBandwidth) obj);
+ return State.LSPA_IN;
}
case BANDWIDTH_IN:
if (obj instanceof Metric) {
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+
import com.google.common.collect.Lists;
+import com.google.common.primitives.Bytes;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.opendaylight.protocol.util.ByteArray;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.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.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.PcinitiateBuilder;
private Srp srp;
private Lsp lsp;
private Lsp lspSrp;
+ private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.Bandwidth bandwidth;
+ private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reoptimization.bandwidth.object.ReoptimizationBandwidth reoptimizationBandwidth;
private AsNumberCase eroASSubobject;
private UnnumberedCase rroUnnumberedSub;
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
};
+ private static final byte[] PCRT3 = {
+ (byte) 0x20, (byte) 0x0A, (byte) 0x00, (byte) 0x4C,
+
+ (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x1C, //(byte) 0x39,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, //Skip
+ (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x10, //TLV Type + TLV Length
+ (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x01, //TLV 127.0.1.1
+ (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, //TLV LSP Id + Tunnel id
+ (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x02, //TLV Ipv4ExtendedTunnelId 127.0.1.2
+ (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x03, //TLV TunnelEndpointAddress 127.0.1.3
+
+ (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x08,
+ (byte) 0x20, (byte) 0x04, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x09, (byte) 0x10, (byte) 0x00, (byte) 0x14,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+
+ (byte) 0x05, (byte) 0x10, (byte) 0x00, (byte) 0x08,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x05, (byte) 0x20, (byte) 0x00, (byte) 0x08,
+ (byte) 0x47, (byte) 0x74, (byte) 0x24, (byte) 0x00
+ };
+
@Before
public void setUp() throws Exception {
this.ctx = new SimplePCEPExtensionProviderContext();
final Ipv4Builder afi = new Ipv4Builder();
afi.setSourceIpv4Address(new Ipv4Address("255.255.255.255"));
afi.setDestinationIpv4Address(new Ipv4Address("255.255.255.255"));
+
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.BandwidthBuilder bandwidthBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.BandwidthBuilder();
+ bandwidthBuilder.setIgnore(false);
+ bandwidthBuilder.setProcessingRule(false);
+ bandwidthBuilder.setBandwidth(new Bandwidth(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 }));
+ this.bandwidth = bandwidthBuilder.build();
+
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reoptimization.bandwidth.object.ReoptimizationBandwidthBuilder reoptimizationBandwidthBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reoptimization.bandwidth.object.ReoptimizationBandwidthBuilder();
+ reoptimizationBandwidthBuilder.setIgnore(false);
+ reoptimizationBandwidthBuilder.setProcessingRule(false);
+ reoptimizationBandwidthBuilder.setBandwidth(new Bandwidth(new byte[] { (byte) 0x47, (byte) 0x74, (byte) 0x24, (byte) 0x00 }));
+ this.reoptimizationBandwidth = reoptimizationBandwidthBuilder.build();
}
@Test
buf = Unpooled.buffer(result.readableBytes());
parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
assertArrayEquals(result.array(), buf.array());
+
+ result = Unpooled.wrappedBuffer(PCRT3);
+
+ final List<Reports> reports4 = Lists.newArrayList();
+ reports4.add(new ReportsBuilder().setLsp(this.lsp).setPath(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.reports.PathBuilder().setEro(
+ this.ero).setLspa(this.lspa).setBandwidth(this.bandwidth).setReoptimizationBandwidth(this.reoptimizationBandwidth).build()).build());
+ builder.setReports(reports4);
+
+ final ByteBuf input2 = result.slice(4, result.readableBytes() - 4);
+ assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(input2, Collections.emptyList()));
+ buf = Unpooled.buffer(result.readableBytes());
+ parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
+ assertArrayEquals(result.array(), buf.array());
}
}
@Test
public void testMissingLspObjectErrorInPcRptMsg() throws PCEPDeserializerException {
final byte[] statefulMsg= {
- 0x20,0x0B,0x00,0x1C,
+ (byte) 0x20, (byte) 0x0B, (byte) 0x00, (byte) 0x1C,
/* srp-object */
- 0x21,0x10,0x00,0x0C,
- 0x00,0x00,0x00,0x001,
- 0x00,0x00,0x00,0x01,
+ (byte) 0x21, (byte) 0x10, (byte) 0x00, (byte) 0x0C,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x001,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
/* lsp-object is missing*/
/* sr-ero-object */
- 0x07,0x10,0x00,0x0C,
+ (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x0C,
/* ipv4 prefix subobject */
- (byte) 0x81,0x08,(byte) 0xFF,(byte) 0xFF,
- (byte) 0xFF,(byte) 0xFF,0x16,0x00};
-
- final Stateful07PCReportMessageParser parser = new Stateful07PCReportMessageParser(this.ctx.getObjectHandlerRegistry());
-
- final PcerrMessageBuilder errMsgBuilder = new PcerrMessageBuilder();
- errMsgBuilder.setErrors(Lists.newArrayList(new ErrorsBuilder().setErrorObject(
- new ErrorObjectBuilder().setType((short) 6).setValue((short) 8).build()).build()));
- final PcerrBuilder builder = new PcerrBuilder();
- builder.setPcerrMessage(errMsgBuilder.build());
-
- final ByteBuf buf = Unpooled.wrappedBuffer(statefulMsg);
- final List<Message> errors = Lists.newArrayList();
- parser.parseMessage(buf.slice(4, buf.readableBytes() - 4), errors);
- assertFalse(errors.isEmpty());
- assertEquals(builder.build(), errors.get(0));
+ (byte) 0x81, (byte) 0x08, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0x16, (byte) 0x00
+ };
+
+ try (CrabbeInitiatedActivator a = new CrabbeInitiatedActivator();
+ StatefulActivator b = new StatefulActivator()) {
+ a.start(this.ctx);
+ b.start(this.ctx);
+ final Stateful07PCReportMessageParser parser = new Stateful07PCReportMessageParser(
+ this.ctx.getObjectHandlerRegistry());
+
+ final PcerrMessageBuilder errMsgBuilder = new PcerrMessageBuilder();
+ errMsgBuilder.setErrors(Lists.newArrayList(new ErrorsBuilder()
+ .setErrorObject(new ErrorObjectBuilder().setType((short) 6).setValue((short) 8).build()).build()));
+ final PcerrBuilder builder = new PcerrBuilder();
+ builder.setPcerrMessage(errMsgBuilder.build());
+
+ final ByteBuf buf = Unpooled.wrappedBuffer(statefulMsg);
+ final List<Message> errors = Lists.newArrayList();
+ parser.parseMessage(buf.slice(4, buf.readableBytes() - 4), errors);
+ assertFalse(errors.isEmpty());
+ assertEquals(builder.build(), errors.get(0));
+ }
+ }
+
+ @Test
+ public void testUnexpectedRroObjectInPcUpdMsg() throws PCEPDeserializerException {
+ final byte[] badUpdateMsg = {
+ (byte) 0x20, (byte) 0x0b, (byte) 0x00, (byte) 0x50,
+ /* SRP, LSP and ERO objects */
+ (byte) 0x21, (byte) 0x12, (byte) 0x00, (byte) 0x0c,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
+ (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x08,
+ (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x09,
+ (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x14,
+ (byte) 0x01, (byte) 0x08, (byte) 0x05, (byte) 0x05,
+ (byte) 0x05, (byte) 0x03, (byte) 0x18, (byte) 0x00,
+ (byte) 0x01, (byte) 0x08, (byte) 0x08, (byte) 0x08,
+ (byte) 0x08, (byte) 0x04, (byte) 0x18, (byte) 0x00,
+ /* RRO object */
+ (byte) 0x08, (byte) 0x10, (byte) 0x00, (byte) 0x24,
+ (byte) 0x01, (byte) 0x08, (byte) 0x0a, (byte) 0x00,
+ (byte) 0x00, (byte) 0x83, (byte) 0x20, (byte) 0x20,
+ (byte) 0x03, (byte) 0x08, (byte) 0x01, (byte) 0x01,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x01, (byte) 0x08, (byte) 0x0a, (byte) 0x00,
+ (byte) 0x09, (byte) 0xde, (byte) 0x20, (byte) 0x00,
+ (byte) 0x03, (byte) 0x08, (byte) 0x01, (byte) 0x01,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
+ };
+
+ try (CrabbeInitiatedActivator a = new CrabbeInitiatedActivator()) {
+ a.start(this.ctx);
+
+ final Stateful07PCUpdateRequestMessageParser parser = new Stateful07PCUpdateRequestMessageParser(
+ this.ctx.getObjectHandlerRegistry());
+
+ final PcerrMessageBuilder errMsgBuilder = new PcerrMessageBuilder();
+ errMsgBuilder.setErrors(Lists.newArrayList(new ErrorsBuilder()
+ .setErrorObject(new ErrorObjectBuilder().setType((short) 6).setValue((short) 10).build()).build()));
+ final PcerrBuilder builder = new PcerrBuilder();
+ builder.setPcerrMessage(errMsgBuilder.build());
+
+ final ByteBuf buf = Unpooled.wrappedBuffer(badUpdateMsg);
+ final List<Message> errors = Lists.newArrayList();
+ parser.parseMessage(buf.slice(4, buf.readableBytes() - 4), errors);
+ assertFalse(errors.isEmpty());
+ assertEquals(builder.build(), errors.get(0));
+ }
}
}