Merge "Support proper route redistribution"
[bgpcep.git] / pcep / impl / src / main / java / org / opendaylight / protocol / pcep / impl / object / PCEPRequestParameterObjectParser.java
index aee1b1f7af2e3a30ea255aecccf8b299a0fd8c28..b9fc394d8dc438ffd910b462d7ceae9f3bdbbf1e 100644 (file)
@@ -8,33 +8,35 @@
 
 package org.opendaylight.protocol.pcep.impl.object;
 
-import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet;
 import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedInt;
 
 import com.google.common.base.Preconditions;
 import com.google.common.primitives.UnsignedBytes;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import java.util.BitSet;
+import java.util.List;
 import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
 import org.opendaylight.protocol.pcep.spi.ObjectUtil;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
-import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
+import org.opendaylight.protocol.util.BitArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.RequestId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.order.tlv.Order;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.path.setup.type.tlv.PathSetupType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.RpBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link Rp}
  */
-public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsParser<RpBuilder> {
+public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsParser<TlvsBuilder> {
 
     public static final int CLASS = 2;
 
@@ -43,7 +45,7 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
     /*
      * lengths of fields in bytes
      */
-    private static final int FLAGS_PRI_MF_LENGTH = 4;
+    private static final int FLAGS_SIZE = 32;
 
     /*
      * lengths of subfields inside multi-field in bits
@@ -88,14 +90,14 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
 
     private static final int E_FLAG_OFFSET = 20;
 
-    public PCEPRequestParameterObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPRequestParameterObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
     public Object parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException {
         Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty.");
-        final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, FLAGS_PRI_MF_LENGTH));
+        final BitArray flags = BitArray.valueOf(bytes, FLAGS_SIZE);
 
         final RpBuilder builder = new RpBuilder();
         builder.setIgnore(header.isIgnore());
@@ -118,14 +120,19 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
         builder.setReoptimization(flags.get(R_FLAG_OFFSET));
 
         builder.setRequestId(new RequestId(bytes.readUnsignedInt()));
-        parseTlvs(builder, bytes.slice());
+        final TlvsBuilder tlvsBuilder = new TlvsBuilder();
+        parseTlvs(tlvsBuilder, bytes.slice());
+        builder.setTlvs(tlvsBuilder.build());
         return builder.build();
     }
 
     @Override
-    public void addTlv(final RpBuilder builder, final Tlv tlv) {
+    public void addTlv(final TlvsBuilder builder, final Tlv tlv) {
         if (tlv instanceof Order) {
-            builder.setTlvs(new TlvsBuilder().setOrder((Order) tlv).build());
+            builder.setOrder((Order) tlv);
+        }
+        if (tlv instanceof PathSetupType) {
+            builder.setPathSetupType((PathSetupType) tlv);
         }
     }
 
@@ -134,42 +141,23 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
         Preconditions.checkArgument(object instanceof Rp, "Wrong instance of PCEPObject. Passed %s. Needed RPObject.", object.getClass());
         final ByteBuf body = Unpooled.buffer();
         final Rp rpObj = (Rp) object;
-        final BitSet flags = new BitSet(FLAGS_PRI_MF_LENGTH * Byte.SIZE);
-        if (rpObj.isReoptimization() != null) {
-            flags.set(R_FLAG_OFFSET, rpObj.isReoptimization());
-        }
-        if (rpObj.isBiDirectional() != null) {
-            flags.set(B_FLAG_OFFSET, rpObj.isBiDirectional());
-        }
-        if (rpObj.isLoose() != null) {
-            flags.set(O_FLAG_OFFSET, rpObj.isLoose());
-        }
-        if (rpObj.isMakeBeforeBreak() != null) {
-            flags.set(M_FLAG_OFFSET, rpObj.isMakeBeforeBreak());
-        }
-        if (rpObj.isOrder() != null) {
-            flags.set(D_FLAG_OFFSET, rpObj.isOrder());
-        }
-        if (rpObj.isPathKey() != null) {
-            flags.set(P_FLAG_OFFSET, rpObj.isPathKey());
-        }
-        if (rpObj.isSupplyOf() != null) {
-            flags.set(S_FLAG_OFFSET, rpObj.isSupplyOf());
-        }
-        if (rpObj.isFragmentation() != null) {
-            flags.set(F_FLAG_OFFSET, rpObj.isFragmentation());
-        }
-        if (rpObj.isP2mp() != null) {
-            flags.set(N_FLAG_OFFSET, rpObj.isP2mp());
-        }
-        if (rpObj.isEroCompression() != null) {
-            flags.set(E_FLAG_OFFSET, rpObj.isEroCompression());
-        }
+        final BitArray flags = new BitArray(FLAGS_SIZE);
+        flags.set(R_FLAG_OFFSET, rpObj.isReoptimization());
+        flags.set(B_FLAG_OFFSET, rpObj.isBiDirectional());
+        flags.set(O_FLAG_OFFSET, rpObj.isLoose());
+        flags.set(M_FLAG_OFFSET, rpObj.isMakeBeforeBreak());
+        flags.set(D_FLAG_OFFSET, rpObj.isOrder());
+        flags.set(P_FLAG_OFFSET, rpObj.isPathKey());
+        flags.set(S_FLAG_OFFSET, rpObj.isSupplyOf());
+        flags.set(F_FLAG_OFFSET, rpObj.isFragmentation());
+        flags.set(N_FLAG_OFFSET, rpObj.isP2mp());
+        flags.set(E_FLAG_OFFSET, rpObj.isEroCompression());
+        final byte[] res = flags.array();
         if (rpObj.getPriority() != null) {
-            final byte[] p = { 0, 0, 0, UnsignedBytes.checkedCast(rpObj.getPriority().shortValue())};
-            flags.or(ByteArray.bytesToBitSet(p));
+            final byte p = UnsignedBytes.checkedCast(rpObj.getPriority().shortValue());
+            res[res.length -1] = (byte) (res[res.length -1] | p);
         }
-        writeBitSet(flags, FLAGS_PRI_MF_LENGTH, body);
+        body.writeBytes(res);
         Preconditions.checkArgument(rpObj.getRequestId() != null, "RequestId is mandatory");
         writeUnsignedInt(rpObj.getRequestId().getValue(), body);
         serializeTlvs(rpObj.getTlvs(), body);
@@ -179,8 +167,20 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
     public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) {
         if (tlvs == null) {
             return;
-        } else if (tlvs.getOrder() != null) {
+        }
+        if (tlvs.getOrder() != null) {
             serializeTlv(tlvs.getOrder(), body);
         }
+        if (tlvs.getPathSetupType() != null) {
+            serializeTlv(tlvs.getPathSetupType(), body);
+        }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     }
 }