BUG-2534 : fixed M processing in SR 46/14246/2
authorDana Kutenicsova <dkutenic@cisco.com>
Mon, 19 Jan 2015 12:07:50 +0000 (13:07 +0100)
committerDana Kutenicsova <dkutenic@cisco.com>
Mon, 19 Jan 2015 15:45:18 +0000 (16:45 +0100)
Change-Id: If1147d6c4c0f07e87199c06c531b70e5ae1226ae
Signed-off-by: Dana Kutenicsova <dkutenic@cisco.com>
pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing02/SrEroSubobjectParser.java
pcep/segment-routing/src/test/java/org/opendaylight/protocol/pcep/segment/routing02/SrEroSubobjectParserTest.java

index 632a2ee0382cf1000772c59d8d4d1a64f6be27f3..2daa848bfae2b4d7c4a60c42a112526dd3aa346f 100644 (file)
@@ -56,7 +56,7 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
     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());
@@ -76,7 +76,11 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
         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()) {
@@ -108,7 +112,7 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
     }
 
     @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) {
@@ -120,7 +124,7 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
         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);
@@ -129,7 +133,10 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
         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()) {
@@ -164,5 +171,5 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
         subobjectBuilder.setSubobjectType(srEroSubobjectBuilder.build());
         return subobjectBuilder.build();
     }
+}
 
-}
\ No newline at end of file
index 4daf84d3bca39eae3baed5590ca10ce9df788d58..c6809caff6fcbd96ac23b2340f0b82a13b472cee 100644 (file)
@@ -37,6 +37,17 @@ public class SrEroSubobjectParserTest {
         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,
@@ -111,6 +122,22 @@ public class SrEroSubobjectParserTest {
         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();