Update to RFC 8664 (PCEP Segment Routing)
[bgpcep.git] / pcep / segment-routing / src / main / java / org / opendaylight / protocol / pcep / segment / routing / SrPceCapabilityTlvParser.java
index f30b5f7d9eda01ea6875045d7fa515693fad0dd0..4d3d83722cec1336be45a4db2a18e34397e73cf8 100644 (file)
@@ -15,24 +15,39 @@ import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.TlvParser;
 import org.opendaylight.protocol.pcep.spi.TlvSerializer;
 import org.opendaylight.protocol.pcep.spi.TlvUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev181109.sr.pce.capability.tlv.SrPceCapability;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev181109.sr.pce.capability.tlv.SrPceCapabilityBuilder;
+import org.opendaylight.protocol.util.BitArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev200720.sr.pce.capability.tlv.SrPceCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev200720.sr.pce.capability.tlv.SrPceCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Tlv;
 import org.opendaylight.yangtools.yang.common.netty.ByteBufUtils;
 
 public class SrPceCapabilityTlvParser implements TlvParser, TlvSerializer {
     public static final int TYPE = 26;
 
-    private static final int MSD_LENGTH = 1;
+    private static final int BITSET_LENGTH = 8;
+    private static final int N_FLAG_POSITION = 7;
+    private static final int X_FLAG_POSITION = 6;
     private static final int CONTENT_LENGTH = 4;
-    private static final int OFFSET = CONTENT_LENGTH - MSD_LENGTH;
+    private static final int OFFSET = 2;
 
     @Override
     public void serializeTlv(final Tlv tlv, final ByteBuf buffer) {
         checkArgument(tlv instanceof SrPceCapability, "SrPceCapability is mandatory.");
         final ByteBuf body = Unpooled.buffer(CONTENT_LENGTH);
+
+        /* Reserved 2 bytes */
         body.writerIndex(OFFSET);
-        ByteBufUtils.writeOrZero(body, ((SrPceCapability) tlv).getMsd());
+
+        /* Flags */
+        final SrPceCapability srPceCapability = (SrPceCapability) tlv;
+        final BitArray bits = new BitArray(BITSET_LENGTH);
+        bits.set(N_FLAG_POSITION, srPceCapability.isNFlag());
+        bits.set(X_FLAG_POSITION, srPceCapability.isXFlag());
+        bits.toByteBuf(body);
+
+        /* MSD */
+        ByteBufUtils.writeOrZero(body, srPceCapability.getMsd());
+
         TlvUtil.formatTlv(TYPE, body, buffer);
     }
 
@@ -41,8 +56,14 @@ public class SrPceCapabilityTlvParser implements TlvParser, TlvSerializer {
         if (buffer == null) {
             return null;
         }
+        final BitArray bitSet = BitArray.valueOf(buffer.readerIndex(OFFSET).readByte());
+        final boolean n = bitSet.get(N_FLAG_POSITION);
+        final boolean x = bitSet.get(X_FLAG_POSITION);
+
         return new SrPceCapabilityBuilder()
-                .setMsd(ByteBufUtils.readUint8(buffer.readerIndex(OFFSET)))
+                .setNFlag(n)
+                .setXFlag(x)
+                .setMsd(ByteBufUtils.readUint8(buffer))
                 .build();
     }
 }