private static final int F_FLAG_POSITION = 4;
@Override
- public void serializeSubobject(Subobject subobject, final ByteBuf buffer) {
+ public void serializeSubobject(final Subobject subobject, final ByteBuf buffer) {
Preconditions.checkArgument(subobject.getSubobjectType() instanceof SrEroSubobject,
"Unknown subobject instance. Passed %s. Needed SrEroSubobject.", subobject.getSubobjectType()
.getClass());
writeBitSet(bits, FLAGS_OFFSET, body);
if (srEroSubobject.getSid() != null && !flags.isS()) {
- writeUnsignedInt(srEroSubobject.getSid(), body);
+ long sid = srEroSubobject.getSid();
+ if (flags.isM()) {
+ sid = sid << 12;
+ }
+ writeUnsignedInt(sid, body);
}
final Nai nai = srEroSubobject.getNai();
if (nai != null && !flags.isF()) {
}
@Override
- public Subobject parseSubobject(ByteBuf buffer, boolean loose) throws PCEPDeserializerException {
+ public Subobject parseSubobject(final ByteBuf buffer, final boolean loose) throws PCEPDeserializerException {
Preconditions.checkArgument(buffer != null && buffer.isReadable(),
"Array of bytes is mandatory. Can't be null or empty.");
if (buffer.readableBytes() <= MINIMAL_LENGTH) {
final SidType sidType = SidType.forValue(sidTypeByte);
srEroSubobjectBuilder.setSidType(sidType);
- BitSet bitSet = ByteArray.bytesToBitSet(new byte[] { buffer.readByte() });
+ final BitSet bitSet = ByteArray.bytesToBitSet(new byte[] { buffer.readByte() });
final boolean f = bitSet.get(F_FLAG_POSITION);
final boolean s = bitSet.get(S_FLAG_POSITION);
final boolean c = bitSet.get(C_FLAG_POSITION);
srEroSubobjectBuilder.setFlags(flags);
if (!flags.isS()) {
- final long sid = buffer.readUnsignedInt();
+ Long sid = buffer.readUnsignedInt();
+ if (flags.isM()) {
+ sid = sid >>> 12;
+ }
srEroSubobjectBuilder.setSid(sid);
}
if (sidType != null && !flags.isF()) {
subobjectBuilder.setSubobjectType(srEroSubobjectBuilder.build());
return subobjectBuilder.build();
}
+}
-}
\ No newline at end of file
0x4A,0x7D,0x2b,0x63,
};
+ private static final byte[] srEroSubobjectWithIpv4NodeIDMFalse = {
+ 0x05,0x0c,(byte) 0x10,0x01,
+ 0x07,0x5B,(byte) 0xCD,0x15,
+ 0x4A,0x7D,0x2b,0x63,
+ };
+ private static final byte[] srEroSubobjectWithIpv4NodeIDMFalseAfter = {
+ 0x05,0x0c,(byte) 0x10,0x01,
+ 0x07,0x5B,(byte) 0xC0,0x00,
+ 0x4A,0x7D,0x2b,0x63,
+ };
+
private static final byte[] srEroSubobjectWithIpv6NodeID = {
0x05,0x18,(byte) 0x20,0x00,
0x00,0x01,(byte) 0xe2,0x40,
assertArrayEquals(srEroSubobjectWithIpv4NodeID, ByteArray.getAllBytes(buffer));
}
+ @Test
+ public void testSrEroSubobjectIpv4NodeIdNAIMFalse() throws PCEPDeserializerException {
+ final SrEroSubobjectParser parser = new SrEroSubobjectParser();
+ final SrEroTypeBuilder builder = new SrEroTypeBuilder();
+ builder.setFlags(new Flags(false, false, true, false));
+ builder.setSidType(SidType.Ipv4NodeId);
+ builder.setSid(30140L);
+ 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(srEroSubobjectWithIpv4NodeIDMFalse, 2)), false));
+ final ByteBuf buffer = Unpooled.buffer();
+ parser.serializeSubobject(subobjBuilder.build(), buffer);
+ assertArrayEquals(srEroSubobjectWithIpv4NodeIDMFalseAfter, ByteArray.getAllBytes(buffer));
+ }
+
@Test
public void testSrEroSubobjectIpv6NodeIdNAI() throws PCEPDeserializerException {
final SrEroSubobjectParser parser = new SrEroSubobjectParser();