Bug-2436: PCEP segment-routing - take F and S flag into account 44/13144/2
authorMilos Fabian <milfabia@cisco.com>
Wed, 26 Nov 2014 10:32:46 +0000 (11:32 +0100)
committerMilos Fabian <milfabia@cisco.com>
Fri, 28 Nov 2014 10:05:35 +0000 (10:05 +0000)
-if F flag is set, NAI value is ommited
-if S flag is set, SID value is ommited

Change-Id: Ia92680c77af0a6f8b1406de4723e9e9174479a4c
Signed-off-by: Milos Fabian <milfabia@cisco.com>
(cherry picked from commit 87e629b4ad88887bc356700ff15d261dbe405d74)

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 0ea0335a8ff0b080dfa7cc85aea3a99819ff371b..632a2ee0382cf1000772c59d8d4d1a64f6be27f3 100644 (file)
@@ -46,11 +46,9 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
 
     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;
@@ -77,10 +75,11 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
         }
         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);
@@ -113,9 +112,9 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
         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);
@@ -129,9 +128,11 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer
         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(
index 3dba386798ba24b94050d40228d44aff64bcfb16..4daf84d3bca39eae3baed5590ca10ce9df788d58 100644 (file)
@@ -75,6 +75,16 @@ public class SrEroSubobjectParserTest {
         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;
 
@@ -166,4 +176,34 @@ public class SrEroSubobjectParserTest {
         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));
+    }
 }