import java.util.BitSet;
import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
-import org.opendaylight.protocol.pcep.impl.Util;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry;
import org.opendaylight.protocol.util.ByteArray;
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.OrderTlv;
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.RpObject;
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.pcreq.message.pcreq.message.requests.RpBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Tlvs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.TlvsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.tlvs.OrderBuilder;
+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.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;
/**
- * Parser for {@link RpObject}
+ * Parser for {@link Rp}
*/
-
public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsParser<RpBuilder> {
public static final int CLASS = 2;
/*
* lengths of fields in bytes
*/
- public static final int FLAGS_PRI_MF_LENGTH = 4; // multi-field
- public static final int RID_F_LENGTH = 4;
+ private static final int FLAGS_PRI_MF_LENGTH = 4;
+ private static final int RID_F_LENGTH = 4;
/*
* lengths of subfields inside multi-field in bits
*/
- public static final int FLAGS_SF_LENGTH = 29;
- public static final int PRI_SF_LENGTH = 3;
+ private static final int FLAGS_SF_LENGTH = 29;
/*
* offsets of field in bytes
*/
- public static final int FLAGS_PRI_MF_OFFSET = 0;
- public static final int RID_F_OFFSET = FLAGS_PRI_MF_OFFSET + FLAGS_PRI_MF_LENGTH;
- public static final int TLVS_OFFSET = RID_F_OFFSET + RID_F_LENGTH;
+ private static final int FLAGS_PRI_MF_OFFSET = 0;
+ private static final int RID_F_OFFSET = FLAGS_PRI_MF_OFFSET + FLAGS_PRI_MF_LENGTH;
+ private static final int TLVS_OFFSET = RID_F_OFFSET + RID_F_LENGTH;
/*
* offsets of subfields inside multi-field in bits
*/
- public static final int FLAGS_SF_OFFSET = 0;
- public static final int PRI_SF_OFFSET = FLAGS_SF_OFFSET + FLAGS_SF_LENGTH;
+ private static final int FLAGS_SF_OFFSET = 0;
+ private static final int PRI_SF_OFFSET = FLAGS_SF_OFFSET + FLAGS_SF_LENGTH;
/*
* flags offsets inside flags sub-field in bits
* OF extension flags offsets inside flags sub.field in bits
*/
- private static int S_FLAG_OFFSET = 24; // Supply OF on response
-
+ private static final int S_FLAG_OFFSET = 24;
/*
* RFC6006 flags
*/
- private static int F_FLAG_OFFSET = 18;
+ private static final int F_FLAG_OFFSET = 18;
- private static int N_FLAG_OFFSET = 19;
+ private static final int N_FLAG_OFFSET = 19;
- private static int E_FLAG_OFFSET = 20;
+ private static final int E_FLAG_OFFSET = 20;
public PCEPRequestParameterObjectParser(final TlvHandlerRegistry tlvReg) {
super(tlvReg);
}
@Override
- public RpObject parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
+ public Rp parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException {
if (bytes == null || bytes.length == 0) {
throw new IllegalArgumentException("Array of bytes is mandatory. Can't be null or empty.");
}
priority |= (flags.get(PRI_SF_OFFSET) ? 1 : 0) << 2;
final RpBuilder builder = new RpBuilder();
+ builder.setIgnore(header.isIgnore());
- parseTlvs(builder, ByteArray.cutBytes(bytes, TLVS_OFFSET));
+ //FIXME : change binary files
+ //if (!header.isProcessingRule()) {
+ //LOG.debug("Processed bit not set on RP OBJECT, ignoring it");
+ // return null;
+ //}
- builder.setIgnore(header.isIgnore());
builder.setProcessingRule(header.isProcessingRule());
- builder.setBiDirectional(flags.get(B_FLAG_OFFSET));
- builder.setEroCompression(flags.get(E_FLAG_OFFSET));
+ builder.setPriority(priority);
builder.setFragmentation(flags.get(F_FLAG_OFFSET));
- builder.setLoose(flags.get(O_FLAG_OFFSET));
+ builder.setP2mp(flags.get(N_FLAG_OFFSET));
+ builder.setEroCompression(flags.get(E_FLAG_OFFSET));
builder.setMakeBeforeBreak(flags.get(M_FLAG_OFFSET));
builder.setOrder(flags.get(D_FLAG_OFFSET));
- builder.setP2mp(flags.get(N_FLAG_OFFSET));
- builder.setReoptimization(flags.get(R_FLAG_OFFSET));
builder.setSupplyOf(flags.get(S_FLAG_OFFSET));
- builder.setPriority(priority);
- builder.setRequestId(new RequestId(ByteArray.bytesToLong(Arrays.copyOfRange(bytes, RID_F_OFFSET, RID_F_OFFSET + RID_F_LENGTH))));
+ builder.setLoose(flags.get(O_FLAG_OFFSET));
+ builder.setBiDirectional(flags.get(B_FLAG_OFFSET));
+ builder.setReoptimization(flags.get(R_FLAG_OFFSET));
+ builder.setRequestId(new RequestId(ByteArray.bytesToLong(Arrays.copyOfRange(bytes, RID_F_OFFSET, RID_F_OFFSET + RID_F_LENGTH))));
+ parseTlvs(builder, ByteArray.cutBytes(bytes, TLVS_OFFSET));
return builder.build();
}
@Override
public void addTlv(final RpBuilder builder, final Tlv tlv) {
- final TlvsBuilder tbuilder = new TlvsBuilder();
- if (tlv instanceof OrderTlv) {
- final OrderBuilder b = new OrderBuilder();
- b.setDelete(((OrderTlv) tlv).getDelete());
- b.setSetup(((OrderTlv) tlv).getSetup());
- tbuilder.setOrder(b.build());
+ if (tlv instanceof Order) {
+ builder.setTlvs(new TlvsBuilder().setOrder((Order) tlv).build());
}
- builder.setTlvs(tbuilder.build());
}
@Override
public byte[] serializeObject(final Object object) {
- if (!(object instanceof RpObject)) {
+ if (!(object instanceof Rp)) {
throw new IllegalArgumentException("Wrong instance of PCEPObject. Passed " + object.getClass() + ". Needed RpObject.");
}
-
- final RpObject rPObj = (RpObject) object;
-
- final BitSet flags_priority = new BitSet(FLAGS_PRI_MF_LENGTH * Byte.SIZE);
-
- flags_priority.set(R_FLAG_OFFSET, rPObj.isReoptimization());
- flags_priority.set(B_FLAG_OFFSET, rPObj.isBiDirectional());
- flags_priority.set(O_FLAG_OFFSET, rPObj.isLoose());
- flags_priority.set(M_FLAG_OFFSET, rPObj.isMakeBeforeBreak());
- flags_priority.set(D_FLAG_OFFSET, rPObj.isOrder());
- flags_priority.set(S_FLAG_OFFSET, rPObj.isSupplyOf());
- flags_priority.set(F_FLAG_OFFSET, rPObj.isFragmentation());
- flags_priority.set(N_FLAG_OFFSET, rPObj.isP2mp());
- flags_priority.set(E_FLAG_OFFSET, rPObj.isEroCompression());
-
- flags_priority.set(PRI_SF_OFFSET, (rPObj.getPriority() & 1 << 2) != 0);
- flags_priority.set(PRI_SF_OFFSET + 1, (rPObj.getPriority() & 1 << 1) != 0);
- flags_priority.set(PRI_SF_OFFSET + 2, (rPObj.getPriority() & 1) != 0);
+ final Rp rPObj = (Rp) object;
+ final BitSet flags = new BitSet(FLAGS_PRI_MF_LENGTH * Byte.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(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());
+
+ flags.set(PRI_SF_OFFSET, (rPObj.getPriority() & 1 << 2) != 0);
+ flags.set(PRI_SF_OFFSET + 1, (rPObj.getPriority() & 1 << 1) != 0);
+ flags.set(PRI_SF_OFFSET + 2, (rPObj.getPriority() & 1) != 0);
final byte[] tlvs = serializeTlvs(rPObj.getTlvs());
- int tlvsLength = 0;
- if (tlvs != null) {
- tlvsLength = tlvs.length;
- }
- final byte[] retBytes = new byte[TLVS_OFFSET + tlvsLength + Util.getPadding(TLVS_OFFSET + tlvs.length, PADDED_TO)];
-
- if (tlvs != null) {
- ByteArray.copyWhole(tlvs, retBytes, TLVS_OFFSET);
- }
+ final byte[] retBytes = new byte[TLVS_OFFSET + tlvs.length + getPadding(TLVS_OFFSET + tlvs.length, PADDED_TO)];
- ByteArray.copyWhole(ByteArray.bitSetToBytes(flags_priority, FLAGS_PRI_MF_LENGTH), retBytes, FLAGS_PRI_MF_OFFSET);
+ ByteArray.copyWhole(ByteArray.bitSetToBytes(flags, FLAGS_PRI_MF_LENGTH), retBytes, FLAGS_PRI_MF_OFFSET);
ByteArray.copyWhole(ByteArray.subByte(ByteArray.longToBytes(rPObj.getRequestId().getValue()), (Long.SIZE / Byte.SIZE)
- RID_F_LENGTH, RID_F_LENGTH), retBytes, RID_F_OFFSET);
-
+ if (tlvs.length != 0) {
+ ByteArray.copyWhole(tlvs, retBytes, TLVS_OFFSET);
+ }
return retBytes;
}
public byte[] serializeTlvs(final Tlvs tlvs) {
- if (tlvs.getOrder() != null) {
- return serializeTlv(new OrderBuilder().setDelete(tlvs.getOrder().getDelete()).setSetup(tlvs.getOrder().getSetup()).build());
+ if (tlvs == null) {
+ return new byte[0];
+ } else if (tlvs.getOrder() != null) {
+ return serializeTlv(tlvs.getOrder());
}
- return null;
+ return new byte[0];
}
@Override