public static final int TYPE = 5;
- private static final int SID_LENGTH = 4;
private static final int FLAGS_OFFSET = 1;
- private static final int HEADER_LENGTH = FLAGS_OFFSET + 1;
- private static final int MINIMAL_LENGTH = SID_LENGTH + HEADER_LENGTH;
private static final int SID_TYPE_BITS_OFFSET = 4;
+ private static final int MINIMAL_LENGTH = 4;
private static final int M_FLAG_POSITION = 7;
private static final int C_FLAG_POSITION = 6;
}
writeBitSet(bits, FLAGS_OFFSET, body);
- writeUnsignedInt(srEroSubobject.getSid(), body);
-
+ if (srEroSubobject.getSid() != null && !flags.isS()) {
+ writeUnsignedInt(srEroSubobject.getSid(), body);
+ }
final Nai nai = srEroSubobject.getNai();
- if (nai != null) {
+ if (nai != null && !flags.isF()) {
switch (srEroSubobject.getSidType()) {
case Ipv4NodeId:
writeIpv4Address(((IpNodeId) nai).getIpAddress().getIpv4Address(), body);
Preconditions.checkArgument(buffer != null && buffer.isReadable(),
"Array of bytes is mandatory. Can't be null or empty.");
if (buffer.readableBytes() <= MINIMAL_LENGTH) {
- throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes()
- + ";");
+ throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + ";");
}
+
final SrEroTypeBuilder srEroSubobjectBuilder = new SrEroTypeBuilder();
final int sidTypeByte = buffer.readByte() >> SID_TYPE_BITS_OFFSET;
final SidType sidType = SidType.forValue(sidTypeByte);
final Flags flags = new Flags(c, f, m, s);
srEroSubobjectBuilder.setFlags(flags);
- final long sid = buffer.readUnsignedInt();
- srEroSubobjectBuilder.setSid(sid);
- if (sidType != null) {
+ if (!flags.isS()) {
+ final long sid = buffer.readUnsignedInt();
+ srEroSubobjectBuilder.setSid(sid);
+ }
+ if (sidType != null && !flags.isF()) {
switch (sidType) {
case Ipv4NodeId:
srEroSubobjectBuilder.setNai(new IpNodeIdBuilder().setIpAddress(
0x00,0x00,0x00,0x04
};
+ private static final byte[] srEroSubobjectWithoutNAI = {
+ 0x05,0x08,(byte) 0x10,0x08,
+ 0x00,0x01,(byte) 0xe2,0x40,
+ };
+
+ private static final byte[] srEroSubobjectWithoutSID = {
+ 0x05,0x08,(byte) 0x10,0x04,
+ 0x4A,0x7D,0x2b,0x63,
+ };
+
private SimplePCEPExtensionProviderContext ctx;
private SegmentRoutingActivator act;
parser.serializeSubobject(subobjBuilder.build(), buffer);
assertArrayEquals(srEroSubobjectWithUnnumbered, ByteArray.getAllBytes(buffer));
}
+
+ @Test
+ public void testSrEroSubobjectWithoutNAI() throws PCEPDeserializerException {
+ final SrEroSubobjectParser parser = new SrEroSubobjectParser();
+ final SrEroTypeBuilder builder = new SrEroTypeBuilder();
+ builder.setFlags(new Flags(false, true, false, false));
+ builder.setSidType(SidType.Ipv4NodeId);
+ builder.setSid(123456L);
+ final SubobjectBuilder subobjBuilder = new SubobjectBuilder().setSubobjectType(builder.build()).setLoose(false);
+
+ assertEquals(subobjBuilder.build(), parser.parseSubobject(Unpooled.wrappedBuffer(ByteArray.cutBytes(srEroSubobjectWithoutNAI, 2)), false));
+ final ByteBuf buffer = Unpooled.buffer();
+ parser.serializeSubobject(subobjBuilder.build(), buffer);
+ assertArrayEquals(srEroSubobjectWithoutNAI, ByteArray.getAllBytes(buffer));
+ }
+
+ @Test
+ public void testSrEroSubobjectWithoutBody() throws PCEPDeserializerException {
+ final SrEroSubobjectParser parser = new SrEroSubobjectParser();
+ final SrEroTypeBuilder builder = new SrEroTypeBuilder();
+ builder.setFlags(new Flags(false, false, false, true));
+ builder.setSidType(SidType.Ipv4NodeId);
+ builder.setNai(new IpNodeIdBuilder().setIpAddress(new IpAddress(new Ipv4Address("74.125.43.99"))).build());
+ final SubobjectBuilder subobjBuilder = new SubobjectBuilder().setSubobjectType(builder.build()).setLoose(false);
+
+ assertEquals(subobjBuilder.build(), parser.parseSubobject(Unpooled.wrappedBuffer(ByteArray.cutBytes(srEroSubobjectWithoutSID, 2)), false));
+ final ByteBuf buffer = Unpooled.buffer();
+ parser.serializeSubobject(subobjBuilder.build(), buffer);
+ assertArrayEquals(srEroSubobjectWithoutSID, ByteArray.getAllBytes(buffer));
+ }
}