Bug-479: Implementation of Vendor-Information TLV 29/9629/6
authorMilos Fabian <milfabia@cisco.com>
Sun, 3 Aug 2014 14:02:34 +0000 (16:02 +0200)
committerRobert Varga <rovarga@cisco.com>
Tue, 5 Aug 2014 12:14:45 +0000 (14:14 +0200)
-reference: http://tools.ietf.org/html/draft-ietf-pce-rfc7150bis-00
-added yang model of new TLV
-added abstract skeleton of Vendor-Information TLV parser/serializer
-objects's tlvs container enhanced with list of Vendor-Information Tlvs
-added junit tests

-introduced new Vendor-Information TLV registry

Change-Id: Ib14c369afb39dffd58160596dbca4954f5641a7f
Signed-off-by: Milos Fabian <milfabia@cisco.com>
Signed-off-by: Robert Varga <rovarga@cisco.com>
60 files changed:
pcep/api/src/main/yang/pcep-types.yang
pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/crabbe/initiated00/InitiatedActivator.java
pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/crabbe/initiated00/PCEPOpenObjectParser.java
pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/Stateful02LspObjectParser.java
pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/Stateful02LspaObjectParser.java
pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/Stateful02OpenObjectParser.java
pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/StatefulActivator.java
pcep/ietf-stateful02/src/main/yang/odl-pcep-ietf-stateful02.yang
pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CrabbeInitiatedActivator.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspaObjectParser.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07OpenObjectParser.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07SrpObjectParser.java
pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/StatefulActivator.java
pcep/ietf-stateful07/src/main/yang/odl-pcep-ietf-stateful07.yang
pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java
pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPValidatorTest.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/Activator.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/AbstractBandwidthParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPBandwidthObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPClassTypeObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPCloseObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsIpv4ObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsIpv6ObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPErrorObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPExistingBandwidthObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPGlobalConstraintsObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLoadBalancingObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPMetricObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPNoPathObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPNotificationObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPObjectiveFunctionObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPOpenObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPRequestParameterObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPSvecObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/tlv/AbstractVendorInformationTlvParser.java [new file with mode: 0644]
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPObjectParserTest.java
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPTlvParserTest.java
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPValidatorTest.java
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/TestVendorInformationActivator.java [new file with mode: 0644]
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/TestVendorInformationTlvParser.java [new file with mode: 0644]
pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/lsp/setup/type01/CInitiated00SrpObjectWithPstTlvParser.java
pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/lsp/setup/type01/PcepRpObjectWithPstTlvParser.java
pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing02/PcepOpenObjectWithSpcTlvParser.java
pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing02/SegmentRoutingActivator.java
pcep/segment-routing/src/test/java/org/opendaylight/protocol/pcep/lsp/setup/type01/PcepObjectParserTest.java
pcep/segment-routing/src/test/java/org/opendaylight/protocol/pcep/segment/routing02/SrObjectParserTest.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractObjectWithTlvsParser.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/EnterpriseSpecificInformationParser.java [new file with mode: 0644]
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/PCEPExtensionConsumerContext.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/PCEPExtensionProviderContext.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/VendorInformationTlvRegistry.java [new file with mode: 0644]
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/VendorInformationUtil.java [new file with mode: 0644]
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimplePCEPExtensionProviderContext.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleVendorInformationTlvRegistry.java [new file with mode: 0644]
pcep/spi/src/test/java/org/opendaylight/protocol/pcep/spi/AbstractObjectWithTlvsTest.java

index 96513bb01224db25a945cb15597bff3bb945b628..5aaa39090151a78d777d6ce5f06827e017e3c82b 100644 (file)
@@ -65,6 +65,18 @@ module pcep-types {
         }
     }
 
+    grouping vendor-information {
+        description "VENDOR-INFORMATION format";
+        reference "http://tools.ietf.org/html/draft-ietf-pce-rfc7150bis-00#section-4";
+
+        leaf enterprise-number {
+            type iana:enterprise-number;
+        }
+
+        choice enterprise-specific-information {
+        }
+    }
+
     // TLVs
     grouping tlv {
         description "Marker grouping for TLV groupings.";
@@ -193,6 +205,15 @@ module pcep-types {
         uses object-header;
     }
 
+    grouping vendor-information-tlvs {
+        list vendor-information-tlv {
+            description "VENDOR-INFORMATION-TLV";
+            reference "http://tools.ietf.org/html/draft-ietf-pce-rfc7150bis-00#section-3";
+            uses tlv;
+            uses vendor-information;
+        }
+    }
+
     grouping open-object {
         description "OPEN Object";
         reference "https://tools.ietf.org/html/rfc5440#section-7.3";
@@ -201,6 +222,7 @@ module pcep-types {
             uses object;
             container "tlvs" {
                 uses of-list-tlv;
+                uses vendor-information-tlvs;
             }
 
             leaf version {
@@ -235,6 +257,7 @@ module pcep-types {
             uses object;
             container "tlvs" {
                 uses order-tlv;
+                uses vendor-information-tlvs;
             }
 
             leaf priority {
@@ -511,6 +534,7 @@ module pcep-types {
             uses object;
             uses rsvp:tunnel-attributes;
             container "tlvs" {
+                uses vendor-information-tlvs;
             }
         }
     }
@@ -553,6 +577,7 @@ module pcep-types {
                 when "../type = 2 and ../value = 1";
 
                 uses overload-duration-tlv;
+                uses vendor-information-tlvs;
             }
 
             leaf type {
@@ -575,6 +600,7 @@ module pcep-types {
             container "tlvs" {
                 when "../type = 7";
                 uses req-missing-tlv;
+                uses vendor-information-tlvs;
             }
 
             leaf type {
@@ -621,7 +647,7 @@ module pcep-types {
             }
 
             container tlvs {
-
+                uses vendor-information-tlvs;
             }
         }
     }
@@ -671,6 +697,10 @@ module pcep-types {
                 type of-id;
                 mandatory true;
             }
+
+            container tlvs {
+                uses vendor-information-tlvs;
+            }
         }
     }
 
@@ -728,6 +758,10 @@ module pcep-types {
                 units percent;
                 mandatory true;
             }
+
+            container tlvs {
+                uses vendor-information-tlvs;
+            }
         }
     }
 
@@ -873,6 +907,7 @@ module pcep-types {
                         container no-path {
                             uses no-path-object;
                             container "tlvs" {
+                                uses vendor-information-tlvs;
                                 container no-path-vector {
                                     uses no-path-vector-tlv;
                                 }
index 55a4d2c48a20d8e61e937707df2e9e394b16425f..2916d65ca424dc78d9e8eb2fd5c299cdd452ba83 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.protocol.pcep.crabbe.initiated00;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Pcinitiate;
@@ -27,8 +26,9 @@ public class InitiatedActivator extends AbstractPCEPExtensionProviderActivator {
         regs.add(context.registerMessageSerializer(Pcinitiate.class, new PcinitiateMessageParser(context.getObjectHandlerRegistry())));
 
         regs.add(context.registerObjectParser(PCEPOpenObjectParser.CLASS, PCEPOpenObjectParser.TYPE,
-                new PCEPOpenObjectParser(context.getTlvHandlerRegistry())));
-        regs.add(context.registerObjectSerializer(Open.class, new PCEPOpenObjectParser(context.getTlvHandlerRegistry())));
+                new PCEPOpenObjectParser(context.getTlvHandlerRegistry(), context.getVendorInformationTlvRegistry())));
+        regs.add(context.registerObjectSerializer(Open.class, new PCEPOpenObjectParser(context.getTlvHandlerRegistry(),
+                context.getVendorInformationTlvRegistry())));
 
         regs.add(context.registerTlvParser(LSPCleanupTlvParser.TYPE, new LSPCleanupTlvParser()));
         regs.add(context.registerTlvSerializer(LspCleanup.class, new LSPCleanupTlvParser()));
index 1a35711fccc325e0eb27c2318818e393ce0bdcd3..cc3e9f0180f6322e8482612cf9149bb0d9d78962 100644 (file)
@@ -8,9 +8,9 @@
 package org.opendaylight.protocol.pcep.crabbe.initiated00;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.ietf.stateful02.Stateful02OpenObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.lsp.cleanup.tlv.LspCleanup;
@@ -26,8 +26,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
  */
 public final class PCEPOpenObjectParser extends Stateful02OpenObjectParser {
 
-    public PCEPOpenObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPOpenObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
index f317e39b8d39c0bd6cc00167571e1eec27c0df6f..8a40b77fbfb33ac57dffe7eac61ec588e022aede 100644 (file)
@@ -13,10 +13,12 @@ import com.google.common.base.Preconditions;
 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.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.PlspId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.lsp.db.version.tlv.LspDbVersion;
@@ -29,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.cra
 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.Tlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link Lsp}
@@ -52,8 +55,8 @@ public class Stateful02LspObjectParser extends AbstractObjectWithTlvsParser<Tlvs
 
     private static final int FLAGS_SIZE = 2;
 
-    public Stateful02LspObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public Stateful02LspObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -126,5 +129,13 @@ public class Stateful02LspObjectParser extends AbstractObjectWithTlvsParser<Tlvs
         if (tlvs.getLspDbVersion() != null) {
             serializeTlv(tlvs.getLspDbVersion(), body);
         }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     }
 }
index 723c4753c24293ffc249734a5c22decd5fa9307e..cf02bafdf3ba0c71cd495388ac5a1a72436f97f4 100644 (file)
@@ -8,9 +8,9 @@
 package org.opendaylight.protocol.pcep.ietf.stateful02;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.impl.object.PCEPLspaObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.symbolic.path.name.tlv.SymbolicPathName;
@@ -23,8 +23,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
  */
 public class Stateful02LspaObjectParser extends PCEPLspaObjectParser {
 
-    public Stateful02LspaObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public Stateful02LspaObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
index 7ccf95c89a582fb8d09025ad71667a4aa5f9370f..3692e1f52443e80b8ac6bf04c3e56bc94a7da4ff 100644 (file)
@@ -8,9 +8,9 @@
 package org.opendaylight.protocol.pcep.ietf.stateful02;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.impl.object.PCEPOpenObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.node.identifier.tlv.NodeIdentifier;
@@ -24,8 +24,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
  */
 public class Stateful02OpenObjectParser extends PCEPOpenObjectParser {
 
-    public Stateful02OpenObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public Stateful02OpenObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
index 2a14a5e1f895b17dd70af5645bd69c5288249037..784e346493b57996fb3e709dd162482a41a129c8 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.protocol.pcep.ietf.stateful02;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Pcrpt;
@@ -48,16 +47,20 @@ public class StatefulActivator extends AbstractPCEPExtensionProviderActivator {
         regs.add(context.registerMessageSerializer(Pcreq.class, new Stateful02PCRequestMessageParser(context.getObjectHandlerRegistry())));
 
         regs.add(context.registerObjectParser(Stateful02LspObjectParser.CLASS, Stateful02LspObjectParser.TYPE,
-                new Stateful02LspObjectParser(context.getTlvHandlerRegistry())));
-        regs.add(context.registerObjectSerializer(Lsp.class, new Stateful02LspObjectParser(context.getTlvHandlerRegistry())));
+                new Stateful02LspObjectParser(context.getTlvHandlerRegistry(), context.getVendorInformationTlvRegistry())));
+        regs.add(context.registerObjectSerializer(Lsp.class, new Stateful02LspObjectParser(context.getTlvHandlerRegistry(),
+                context.getVendorInformationTlvRegistry())));
 
         regs.add(context.registerObjectParser(Stateful02OpenObjectParser.CLASS, Stateful02OpenObjectParser.TYPE,
-                new Stateful02OpenObjectParser(context.getTlvHandlerRegistry())));
-        regs.add(context.registerObjectSerializer(Open.class, new Stateful02OpenObjectParser(context.getTlvHandlerRegistry())));
+                new Stateful02OpenObjectParser(context.getTlvHandlerRegistry(), context.getVendorInformationTlvRegistry())));
+        regs.add(context.registerObjectSerializer(Open.class, new Stateful02OpenObjectParser(context.getTlvHandlerRegistry(),
+                context.getVendorInformationTlvRegistry())));
 
         regs.add(context.registerObjectParser(Stateful02LspaObjectParser.CLASS, Stateful02LspaObjectParser.TYPE,
-                new Stateful02LspaObjectParser(context.getTlvHandlerRegistry())));
-        regs.add(context.registerObjectSerializer(Lspa.class, new Stateful02LspaObjectParser(context.getTlvHandlerRegistry())));
+                new Stateful02LspaObjectParser(context.getTlvHandlerRegistry(),
+                        context.getVendorInformationTlvRegistry())));
+        regs.add(context.registerObjectSerializer(Lspa.class, new Stateful02LspaObjectParser(context.getTlvHandlerRegistry(),
+                context.getVendorInformationTlvRegistry())));
 
         regs.add(context.registerTlvParser(Stateful02StatefulCapabilityTlvParser.TYPE, new Stateful02StatefulCapabilityTlvParser()));
         regs.add(context.registerTlvSerializer(Stateful.class, new Stateful02StatefulCapabilityTlvParser()));
index 179a4f2818050a0d1e96c6ae340402f650f88a9a..6f65494bf04955b572bedccc9f96ad6c84986530 100644 (file)
@@ -130,6 +130,8 @@ module odl-pcep-ietf-stateful02 {
                 uses rsvp-error-spec-tlv;
 
                 uses symbolic-path-name-tlv;
+
+                uses pcep:vendor-information-tlvs;
             }
 
             leaf plsp-id {
index 99bff2d5d485df593e2c56480ebac55327bb60a7..c61c2a613915c9481096d75cbcf9058d31d090ee 100644 (file)
@@ -9,11 +9,10 @@ package org.opendaylight.protocol.pcep.ietf;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-
 import java.io.IOException;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.protocol.pcep.crabbe.initiated00.PCEPOpenObjectParser;
@@ -22,6 +21,7 @@ import org.opendaylight.protocol.pcep.ietf.stateful02.Stateful02LspaObjectParser
 import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Stateful1;
@@ -47,14 +47,17 @@ public class PCEPObjectParserTest {
 
     private TlvRegistry tlvRegistry;
 
+    private VendorInformationTlvRegistry viTlvRegistry;
+
     @Before
     public void setUp() throws Exception {
         this.tlvRegistry = ServiceLoaderPCEPExtensionProviderContext.create().getTlvHandlerRegistry();
+        this.viTlvRegistry = ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance().getVendorInformationTlvRegistry();
     }
 
     @Test
     public void testOpenObjectWithTLV() throws PCEPDeserializerException, IOException {
-        final PCEPOpenObjectParser parser = new PCEPOpenObjectParser(this.tlvRegistry);
+        final PCEPOpenObjectParser parser = new PCEPOpenObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin"));
 
         final OpenBuilder builder = new OpenBuilder();
@@ -85,7 +88,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testLspaObjectWithTlv() throws IOException, PCEPDeserializerException {
-        final Stateful02LspaObjectParser parser = new Stateful02LspaObjectParser(this.tlvRegistry);
+        final Stateful02LspaObjectParser parser = new Stateful02LspaObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin"));
 
         final LspaBuilder builder = new LspaBuilder();
@@ -123,7 +126,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException {
-        final Stateful02LspObjectParser parser = new Stateful02LspObjectParser(this.tlvRegistry);
+        final Stateful02LspObjectParser parser = new Stateful02LspObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspObject1WithTLV.bin"));
 
         final LspBuilder builder = new LspBuilder();
index 0de742e8d2d66d1392a00e92912eb61fa1129e4f..7a9975056c358ee1ebdecc97f00548a5f5dc655b 100644 (file)
@@ -8,16 +8,14 @@
 package org.opendaylight.protocol.pcep.ietf.initiated00;
 
 import com.google.common.base.Preconditions;
-
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-
 import java.util.BitSet;
-
 import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07LspObjectParser;
 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.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1Builder;
@@ -36,8 +34,8 @@ public class CInitiated00LspObjectParser extends Stateful07LspObjectParser {
 
     private static final int CREATE_FLAG_OFFSET = 8;
 
-    public CInitiated00LspObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public CInitiated00LspObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
index cfbb861fa7c676936527a60fb0de31a525bc4adf..027f935dfbc35d2463ef8b3b5b7364853ce48c24 100644 (file)
@@ -18,12 +18,14 @@ import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07SrpObjectParser;
 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.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.TlvsBuilder;
 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;
 
@@ -34,8 +36,8 @@ public class CInitiated00SrpObjectParser extends Stateful07SrpObjectParser {
 
     private static final int REMOVE_FLAG = 31;
 
-    public CInitiated00SrpObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public CInitiated00SrpObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -54,7 +56,9 @@ public class CInitiated00SrpObjectParser extends Stateful07SrpObjectParser {
         final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, FLAGS_SIZE));
         builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(flags.get(REMOVE_FLAG)).build());
         builder.setOperationId(new SrpIdNumber(bytes.readUnsignedInt()));
-        parseTlvs(builder, bytes.slice());
+        final TlvsBuilder tlvsBuilder = new TlvsBuilder();
+        parseTlvs(tlvsBuilder, bytes.slice());
+        builder.setTlvs(tlvsBuilder.build());
         return builder.build();
     }
 
index 01d921eeb1e630fffc4aebbe0cac335982cc4eca..2eaa0408523e5e3883884ff067e1c3a70fbbec09 100644 (file)
@@ -9,9 +9,9 @@ package org.opendaylight.protocol.pcep.ietf.initiated00;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Pcinitiate;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp;
@@ -29,12 +29,13 @@ public final class CrabbeInitiatedActivator extends AbstractPCEPExtensionProvide
                 new CInitiated00PCInitiateMessageParser(context.getObjectHandlerRegistry())));
 
         final TlvRegistry tlvReg = context.getTlvHandlerRegistry();
+        final VendorInformationTlvRegistry viTlvReg = context.getVendorInformationTlvRegistry();
         regs.add(context.registerObjectParser(CInitiated00LspObjectParser.CLASS, CInitiated00LspObjectParser.TYPE,
-                new CInitiated00LspObjectParser(tlvReg)));
-        regs.add(context.registerObjectSerializer(Lsp.class, new CInitiated00LspObjectParser(tlvReg)));
+                new CInitiated00LspObjectParser(tlvReg, viTlvReg)));
+        regs.add(context.registerObjectSerializer(Lsp.class, new CInitiated00LspObjectParser(tlvReg, viTlvReg)));
         regs.add(context.registerObjectParser(CInitiated00SrpObjectParser.CLASS, CInitiated00SrpObjectParser.TYPE,
-                new CInitiated00SrpObjectParser(tlvReg)));
-        regs.add(context.registerObjectSerializer(Srp.class, new CInitiated00SrpObjectParser(tlvReg)));
+                new CInitiated00SrpObjectParser(tlvReg, viTlvReg)));
+        regs.add(context.registerObjectSerializer(Srp.class, new CInitiated00SrpObjectParser(tlvReg, viTlvReg)));
 
         regs.add(context.registerTlvParser(CInitiated00StatefulCapabilityTlvParser.TYPE, new CInitiated00StatefulCapabilityTlvParser()));
         regs.add(context.registerTlvSerializer(Stateful.class, new CInitiated00StatefulCapabilityTlvParser()));
index eaee975b4ce630a0837b6ef9126b63c0ef107a03..3db875c93c396131ad1bc15717fe39af31eea673 100644 (file)
@@ -8,16 +8,15 @@
 package org.opendaylight.protocol.pcep.ietf.stateful07;
 
 import com.google.common.base.Preconditions;
-
 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.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
@@ -32,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet
 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.Tlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vs.tlv.VsTlv;
 
 /**
@@ -58,8 +58,8 @@ public class Stateful07LspObjectParser extends AbstractObjectWithTlvsParser<Tlvs
     protected static final int ADMINISTRATIVE_FLAG_OFFSET = 12;
     protected static final int OPERATIONAL_OFFSET = 9;
 
-    public Stateful07LspObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public Stateful07LspObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -154,5 +154,13 @@ public class Stateful07LspObjectParser extends AbstractObjectWithTlvsParser<Tlvs
         if (tlvs.getVsTlv() != null) {
             serializeTlv(tlvs.getVsTlv(), body);
         }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     }
 }
index 108605a937258f2881af6cb63d9732d9e0c0adc2..ae6bca64e267c7c4367b762fcb887e415e606b75 100644 (file)
@@ -8,9 +8,9 @@
 package org.opendaylight.protocol.pcep.ietf.stateful07;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.impl.object.PCEPLspaObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs2Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.symbolic.path.name.tlv.SymbolicPathName;
@@ -23,8 +23,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
  */
 public class Stateful07LspaObjectParser extends PCEPLspaObjectParser {
 
-    public Stateful07LspaObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public Stateful07LspaObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
index bc593aef53fee2b3153d3832fffb8776f294bd6f..71df41445543579c7c8b1aed66f67cfd008d41ed 100644 (file)
@@ -8,9 +8,9 @@
 package org.opendaylight.protocol.pcep.ietf.stateful07;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.impl.object.PCEPOpenObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.Stateful;
@@ -23,8 +23,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
  */
 public class Stateful07OpenObjectParser extends PCEPOpenObjectParser {
 
-    public Stateful07OpenObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public Stateful07OpenObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
index a40cbdef98f4f2e1bbb6f7b6686b10edd960fd6b..5948a4c4faaa91bb76f088089a4317a9c116c4ca 100644 (file)
@@ -12,10 +12,12 @@ import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedInt;
 import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+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.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
@@ -25,11 +27,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet
 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.Tlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link Srp}
  */
-public class Stateful07SrpObjectParser extends AbstractObjectWithTlvsParser<SrpBuilder> {
+public class Stateful07SrpObjectParser extends AbstractObjectWithTlvsParser<TlvsBuilder> {
 
     public static final int CLASS = 33;
 
@@ -43,8 +46,8 @@ public class Stateful07SrpObjectParser extends AbstractObjectWithTlvsParser<SrpB
 
     protected static final int MIN_SIZE = FLAGS_SIZE + SRP_ID_SIZE;
 
-    public Stateful07SrpObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    protected Stateful07SrpObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -62,13 +65,16 @@ public class Stateful07SrpObjectParser extends AbstractObjectWithTlvsParser<SrpB
         builder.setProcessingRule(header.isProcessingRule());
         bytes.readerIndex(bytes.readerIndex() + FLAGS_SIZE);
         builder.setOperationId(new SrpIdNumber(bytes.readUnsignedInt()));
+        final TlvsBuilder tlvsBuilder = new TlvsBuilder();
+        parseTlvs(tlvsBuilder, bytes.slice());
+        builder.setTlvs(tlvsBuilder.build());
         return builder.build();
     }
 
     @Override
-    public void addTlv(final SrpBuilder builder, final Tlv tlv) {
+    public void addTlv(final TlvsBuilder builder, final Tlv tlv) {
         if (tlv instanceof SymbolicPathName) {
-            builder.setTlvs(new TlvsBuilder().setSymbolicPathName((SymbolicPathName) tlv).build());
+            builder.setSymbolicPathName((SymbolicPathName) tlv);
         }
     }
 
@@ -92,4 +98,11 @@ public class Stateful07SrpObjectParser extends AbstractObjectWithTlvsParser<SrpB
             serializeTlv(tlvs.getSymbolicPathName(), body);
         }
     }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
+    }
 }
index 5301536604a3757470743aede9e82686a34ea1de..ddb6456bc51d7cbe0fa02bb8779ccc07ad719d42 100644 (file)
@@ -12,6 +12,7 @@ import java.util.List;
 import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcupd;
@@ -40,15 +41,16 @@ public final class StatefulActivator extends AbstractPCEPExtensionProviderActiva
         regs.add(context.registerMessageSerializer(Pcerr.class, new Stateful07ErrorMessageParser(objReg)));
 
         final TlvRegistry tlvReg = context.getTlvHandlerRegistry();
+        final VendorInformationTlvRegistry viTlvReg = context.getVendorInformationTlvRegistry();
         regs.add(context.registerObjectParser(Stateful07LspObjectParser.CLASS, Stateful07LspObjectParser.TYPE,
-            new Stateful07LspObjectParser(tlvReg)));
-        regs.add(context.registerObjectSerializer(Lsp.class, new Stateful07LspObjectParser(tlvReg)));
+            new Stateful07LspObjectParser(tlvReg, viTlvReg)));
+        regs.add(context.registerObjectSerializer(Lsp.class, new Stateful07LspObjectParser(tlvReg, viTlvReg)));
         regs.add(context.registerObjectParser(Stateful07SrpObjectParser.CLASS, Stateful07SrpObjectParser.TYPE,
-            new Stateful07SrpObjectParser(tlvReg)));
-        regs.add(context.registerObjectSerializer(Srp.class, new Stateful07SrpObjectParser(tlvReg)));
+            new Stateful07SrpObjectParser(tlvReg, viTlvReg)));
+        regs.add(context.registerObjectSerializer(Srp.class, new Stateful07SrpObjectParser(tlvReg, viTlvReg)));
         regs.add(context.registerObjectParser(Stateful07OpenObjectParser.CLASS, Stateful07OpenObjectParser.TYPE,
-            new Stateful07OpenObjectParser(tlvReg)));
-        regs.add(context.registerObjectSerializer(Open.class, new Stateful07OpenObjectParser(tlvReg)));
+            new Stateful07OpenObjectParser(tlvReg, viTlvReg)));
+        regs.add(context.registerObjectSerializer(Open.class, new Stateful07OpenObjectParser(tlvReg, viTlvReg)));
 
         regs.add(context.registerTlvParser(Stateful07LSPIdentifierIpv4TlvParser.TYPE, new Stateful07LSPIdentifierIpv4TlvParser()));
         regs.add(context.registerTlvParser(Stateful07LSPIdentifierIpv6TlvParser.TYPE, new Stateful07LSPIdentifierIpv6TlvParser()));
index 7301b68809bfabfca6647e5b03f43c6a1a18d6c1..f724e83da35ed899afbb536d465ea2cc6964108c 100644 (file)
@@ -194,6 +194,8 @@ module odl-pcep-ietf-stateful07 {
                 uses symbolic-path-name-tlv;
 
                 uses pcep:vs-tlv;
+
+                uses pcep:vendor-information-tlvs;
             }
 
             leaf plsp-id {
@@ -235,6 +237,8 @@ module odl-pcep-ietf-stateful07 {
 
             container "tlvs" {
                 uses symbolic-path-name-tlv;
+
+                uses pcep:vendor-information-tlvs;
             }
 
             leaf operation-id {
index 29f0ae6b9e0cc997903d090039366dd100b82a7d..137792d45f4ec87423103a342a7683471f1481b4 100644 (file)
@@ -9,11 +9,10 @@ package org.opendaylight.protocol.pcep.ietf;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-
 import java.io.IOException;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.protocol.pcep.ietf.initiated00.CInitiated00LspObjectParser;
@@ -23,6 +22,7 @@ import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07OpenObjectParser
 import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1;
@@ -40,6 +40,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.error.code.tlv.LspErrorCodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.TlvsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.Stateful;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.StatefulBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.symbolic.path.name.tlv.SymbolicPathName;
@@ -54,14 +55,17 @@ public class PCEPObjectParserTest {
 
     private TlvRegistry tlvRegistry;
 
+    private VendorInformationTlvRegistry viTlvRegistry;
+
     @Before
     public void setUp() throws Exception {
         this.tlvRegistry = ServiceLoaderPCEPExtensionProviderContext.create().getTlvHandlerRegistry();
+        this.viTlvRegistry = ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance().getVendorInformationTlvRegistry();
     }
 
     @Test
     public void testOpenObjectWithTLV() throws PCEPDeserializerException, IOException {
-        final Stateful07OpenObjectParser parser = new Stateful07OpenObjectParser(this.tlvRegistry);
+        final Stateful07OpenObjectParser parser = new Stateful07OpenObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin"));
 
         final OpenBuilder builder = new OpenBuilder();
@@ -88,7 +92,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException {
-        final CInitiated00LspObjectParser parser = new CInitiated00LspObjectParser(this.tlvRegistry);
+        final CInitiated00LspObjectParser parser = new CInitiated00LspObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspObject1WithTLV.bin"));
 
         final LspBuilder builder = new LspBuilder();
@@ -115,7 +119,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testLspaObject() throws IOException, PCEPDeserializerException {
-        final Stateful07LspaObjectParser parser = new Stateful07LspaObjectParser(this.tlvRegistry);
+        final Stateful07LspaObjectParser parser = new Stateful07LspaObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final LspaBuilder builder = new LspaBuilder();
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspaObject3RandVals.bin"));
 
@@ -148,7 +152,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testSrpObject() throws IOException, PCEPDeserializerException {
-        final CInitiated00SrpObjectParser parser = new CInitiated00SrpObjectParser(this.tlvRegistry);
+        final CInitiated00SrpObjectParser parser = new CInitiated00SrpObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(new byte[] { (byte) 0x21, (byte) 0x10, (byte) 0x00, (byte) 0x0c, 0, 0, 0,
             (byte) 0x01, 0, 0, 0, (byte) 0x01 });
 
@@ -157,6 +161,7 @@ public class PCEPObjectParserTest {
         builder.setIgnore(false);
         builder.setOperationId(new SrpIdNumber(1L));
         builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(true).build());
+        builder.setTlvs(new TlvsBuilder().build());
 
         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4)));
         ByteBuf buf = Unpooled.buffer();
index fc34a3b5827524108a34b0bc6a930b87de06d5a9..01788f35f1a73326d746585414b5a3f89ec62b0b 100644 (file)
@@ -178,6 +178,7 @@ public class PCEPValidatorTest {
         srpBuilder.setProcessingRule(false);
         srpBuilder.setOperationId(new SrpIdNumber(1L));
         srpBuilder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(false).build());
+        srpBuilder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.TlvsBuilder().build());
         this.srp = srpBuilder.build();
 
         final LspBuilder lspBuilder = new LspBuilder();
@@ -383,7 +384,7 @@ public class PCEPValidatorTest {
             final PcerrMessageBuilder builder = new PcerrMessageBuilder();
             builder.setErrors(innerErr);
             List<Srps> srps = new ArrayList<>();
-            srps.add(new SrpsBuilder().setSrp(new SrpBuilder().setOperationId(new SrpIdNumber(3L)).setIgnore(false).setProcessingRule(false).build()).build());
+            srps.add(new SrpsBuilder().setSrp(new SrpBuilder().setOperationId(new SrpIdNumber(3L)).setIgnore(false).setProcessingRule(false).setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.TlvsBuilder().build()).build()).build());
             builder.setErrorType(new StatefulCaseBuilder().setStateful(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcerr.pcerr.message.error.type.stateful._case.StatefulBuilder().setSrps(srps).build()).build());
 
             assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
index 54abe6e57114039eab860bc29f62b3c3a6c209a7..773c117e7ff2498fc73a13f9adac38aa19a0f651 100644 (file)
@@ -71,6 +71,7 @@ import org.opendaylight.protocol.pcep.spi.LabelRegistry;
 import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Close;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Keepalive;
@@ -161,31 +162,32 @@ public final class Activator extends AbstractPCEPExtensionProviderActivator {
 
     private void registerObjectParsers(final List<AutoCloseable> regs, final PCEPExtensionProviderContext context) {
         final TlvRegistry tlvReg = context.getTlvHandlerRegistry();
-        final PCEPOpenObjectParser openParser = new PCEPOpenObjectParser(tlvReg);
+        final VendorInformationTlvRegistry viTlvReg = context.getVendorInformationTlvRegistry();
+        final PCEPOpenObjectParser openParser = new PCEPOpenObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPOpenObjectParser.CLASS, PCEPOpenObjectParser.TYPE, openParser));
         regs.add(context.registerObjectSerializer(Open.class, openParser));
 
-        final PCEPRequestParameterObjectParser rpParser = new PCEPRequestParameterObjectParser(tlvReg);
+        final PCEPRequestParameterObjectParser rpParser = new PCEPRequestParameterObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPRequestParameterObjectParser.CLASS, PCEPRequestParameterObjectParser.TYPE, rpParser));
         regs.add(context.registerObjectSerializer(Rp.class, rpParser));
 
-        final PCEPNoPathObjectParser noPathParser = new PCEPNoPathObjectParser(tlvReg);
+        final PCEPNoPathObjectParser noPathParser = new PCEPNoPathObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPNoPathObjectParser.CLASS, PCEPNoPathObjectParser.TYPE, noPathParser));
         regs.add(context.registerObjectSerializer(NoPath.class, noPathParser));
 
-        final PCEPEndPointsIpv4ObjectParser endpoints4Parser = new PCEPEndPointsIpv4ObjectParser(tlvReg);
+        final PCEPEndPointsIpv4ObjectParser endpoints4Parser = new PCEPEndPointsIpv4ObjectParser();
         regs.add(context.registerObjectParser(PCEPEndPointsIpv4ObjectParser.CLASS, PCEPEndPointsIpv4ObjectParser.TYPE, endpoints4Parser));
         regs.add(context.registerObjectParser(PCEPEndPointsIpv6ObjectParser.CLASS, PCEPEndPointsIpv6ObjectParser.TYPE,
-            new PCEPEndPointsIpv4ObjectParser(tlvReg)));
+            new PCEPEndPointsIpv4ObjectParser()));
         regs.add(context.registerObjectSerializer(EndpointsObj.class, endpoints4Parser));
 
-        final PCEPBandwidthObjectParser bwParser = new PCEPBandwidthObjectParser(tlvReg);
+        final PCEPBandwidthObjectParser bwParser = new PCEPBandwidthObjectParser();
         regs.add(context.registerObjectParser(PCEPBandwidthObjectParser.CLASS, PCEPBandwidthObjectParser.TYPE, bwParser));
         regs.add(context.registerObjectParser(PCEPExistingBandwidthObjectParser.CLASS, PCEPExistingBandwidthObjectParser.TYPE,
-            new PCEPExistingBandwidthObjectParser(tlvReg)));
+            new PCEPExistingBandwidthObjectParser()));
         regs.add(context.registerObjectSerializer(Bandwidth.class, bwParser));
 
-        final PCEPMetricObjectParser metricParser = new PCEPMetricObjectParser(tlvReg);
+        final PCEPMetricObjectParser metricParser = new PCEPMetricObjectParser();
         regs.add(context.registerObjectParser(PCEPMetricObjectParser.CLASS, PCEPMetricObjectParser.TYPE, metricParser));
         regs.add(context.registerObjectSerializer(Metric.class, metricParser));
 
@@ -198,7 +200,7 @@ public final class Activator extends AbstractPCEPExtensionProviderActivator {
         regs.add(context.registerObjectParser(PCEPReportedRouteObjectParser.CLASS, PCEPReportedRouteObjectParser.TYPE, rroParser));
         regs.add(context.registerObjectSerializer(Rro.class, rroParser));
 
-        final PCEPLspaObjectParser lspaParser = new PCEPLspaObjectParser(tlvReg);
+        final PCEPLspaObjectParser lspaParser = new PCEPLspaObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPLspaObjectParser.CLASS, PCEPLspaObjectParser.TYPE, lspaParser));
         regs.add(context.registerObjectSerializer(Lspa.class, lspaParser));
 
@@ -206,23 +208,23 @@ public final class Activator extends AbstractPCEPExtensionProviderActivator {
         regs.add(context.registerObjectParser(PCEPIncludeRouteObjectParser.CLASS, PCEPIncludeRouteObjectParser.TYPE, iroParser));
         regs.add(context.registerObjectSerializer(Iro.class, iroParser));
 
-        final PCEPSvecObjectParser svecParser = new PCEPSvecObjectParser(tlvReg);
+        final PCEPSvecObjectParser svecParser = new PCEPSvecObjectParser();
         regs.add(context.registerObjectParser(PCEPSvecObjectParser.CLASS, PCEPSvecObjectParser.TYPE, svecParser));
         regs.add(context.registerObjectSerializer(Svec.class, svecParser));
 
-        final PCEPNotificationObjectParser notParser = new PCEPNotificationObjectParser(tlvReg);
+        final PCEPNotificationObjectParser notParser = new PCEPNotificationObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPNotificationObjectParser.CLASS, PCEPNotificationObjectParser.TYPE, notParser));
         regs.add(context.registerObjectSerializer(CNotification.class, notParser));
 
-        final PCEPErrorObjectParser errParser = new PCEPErrorObjectParser(tlvReg);
+        final PCEPErrorObjectParser errParser = new PCEPErrorObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPErrorObjectParser.CLASS, PCEPErrorObjectParser.TYPE, errParser));
         regs.add(context.registerObjectSerializer(ErrorObject.class, errParser));
 
-        final PCEPLoadBalancingObjectParser lbParser = new PCEPLoadBalancingObjectParser(tlvReg);
+        final PCEPLoadBalancingObjectParser lbParser = new PCEPLoadBalancingObjectParser();
         regs.add(context.registerObjectParser(PCEPLoadBalancingObjectParser.CLASS, PCEPLoadBalancingObjectParser.TYPE, lbParser));
         regs.add(context.registerObjectSerializer(LoadBalancing.class, lbParser));
 
-        final PCEPCloseObjectParser closeParser = new PCEPCloseObjectParser(tlvReg);
+        final PCEPCloseObjectParser closeParser = new PCEPCloseObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPCloseObjectParser.CLASS, PCEPCloseObjectParser.TYPE, closeParser));
         regs.add(context.registerObjectSerializer(CClose.class, closeParser));
 
@@ -236,15 +238,15 @@ public final class Activator extends AbstractPCEPExtensionProviderActivator {
         regs.add(context.registerObjectParser(PCEPExcludeRouteObjectParser.CLASS, PCEPExcludeRouteObjectParser.TYPE, xroParser));
         regs.add(context.registerObjectSerializer(Xro.class, xroParser));
 
-        final PCEPObjectiveFunctionObjectParser objectiveParser = new PCEPObjectiveFunctionObjectParser(tlvReg);
+        final PCEPObjectiveFunctionObjectParser objectiveParser = new PCEPObjectiveFunctionObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPObjectiveFunctionObjectParser.CLASS, PCEPObjectiveFunctionObjectParser.TYPE, objectiveParser));
         regs.add(context.registerObjectSerializer(Of.class, objectiveParser));
 
-        final PCEPClassTypeObjectParser ctParser = new PCEPClassTypeObjectParser(tlvReg);
+        final PCEPClassTypeObjectParser ctParser = new PCEPClassTypeObjectParser();
         regs.add(context.registerObjectParser(PCEPClassTypeObjectParser.CLASS, PCEPClassTypeObjectParser.TYPE, ctParser));
         regs.add(context.registerObjectSerializer(ClassType.class, ctParser));
 
-        final PCEPGlobalConstraintsObjectParser gcParser = new PCEPGlobalConstraintsObjectParser(tlvReg);
+        final PCEPGlobalConstraintsObjectParser gcParser = new PCEPGlobalConstraintsObjectParser(tlvReg, viTlvReg);
         regs.add(context.registerObjectParser(PCEPGlobalConstraintsObjectParser.CLASS, PCEPGlobalConstraintsObjectParser.TYPE, gcParser));
         regs.add(context.registerObjectSerializer(Gc.class, gcParser));
     }
index 697fe1a58eed82c30a1bd40b60b7ab59b59d1de2..e19c3be4c2d2fc2f77b3f8e1cfbb0c778b277495 100644 (file)
@@ -12,23 +12,19 @@ import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeFloat32;
 import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
+import org.opendaylight.protocol.pcep.spi.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 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.bandwidth.object.Bandwidth;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.BandwidthBuilder;
 
-abstract class AbstractBandwidthParser extends AbstractObjectWithTlvsParser<BandwidthBuilder> {
+abstract class AbstractBandwidthParser implements ObjectParser, ObjectSerializer {
 
     private static final int BANDWIDTH_F_LENGTH = 4;
 
-    AbstractBandwidthParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @Override
     public Bandwidth 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.");
index 1f26087522f43f2ac054d8f9069dcdb8834eb10e..83cc7f22e9c9a711d034cff54d92d710ce0dbd13 100644 (file)
@@ -8,9 +8,7 @@
 package org.opendaylight.protocol.pcep.impl.object;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.spi.ObjectUtil;
-import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 
 /**
  * Parser for Bandwidth
@@ -21,10 +19,6 @@ public class PCEPBandwidthObjectParser extends AbstractBandwidthParser {
 
     public static final int TYPE = 1;
 
-    public PCEPBandwidthObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @Override
     protected void formatBandwidth(final Boolean processed, final Boolean ignored, final ByteBuf body, final ByteBuf buffer) {
         ObjectUtil.formatSubobject(TYPE, CLASS, processed, ignored, body, buffer);
index 2ccf3eb3e119ef5646b79f94ab7bb534ee465e42..332919a22a6eee11c031fe935bc799d00e9ca184 100644 (file)
@@ -12,11 +12,11 @@ import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedByte;
 import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
+import org.opendaylight.protocol.pcep.spi.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 import org.opendaylight.protocol.pcep.spi.ObjectUtil;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
-import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 import org.opendaylight.protocol.pcep.spi.UnknownObject;
 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;
@@ -28,7 +28,8 @@ import org.slf4j.LoggerFactory;
 /**
  * Parser for {@link ClassType}
  */
-public class PCEPClassTypeObjectParser extends AbstractObjectWithTlvsParser<ClassTypeBuilder> {
+public class PCEPClassTypeObjectParser implements ObjectParser, ObjectSerializer {
+
     private static final Logger LOG = LoggerFactory.getLogger(PCEPClassTypeObjectParser.class);
 
     public static final int CLASS = 22;
@@ -50,10 +51,6 @@ public class PCEPClassTypeObjectParser extends AbstractObjectWithTlvsParser<Clas
      */
     private static final int SIZE = (RESERVED + CT_F_LENGTH) / Byte.SIZE;
 
-    public PCEPClassTypeObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @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.");
index 8369aff26d251f0afa07c9bb17b3fcc7b6e6d11c..b24cd90a0203dfcb077e4bed3a8e1208f212d7ac 100644 (file)
@@ -13,20 +13,24 @@ 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.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.pcep.spi.VendorInformationTlvRegistry;
 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.close.object.CClose;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.CCloseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.c.close.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.c.close.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link org.opendaylight.protocol.pcep.object.PCEPCloseObject PCEPCloseObject}
  */
-public class PCEPCloseObjectParser extends AbstractObjectWithTlvsParser<CCloseBuilder> {
+public class PCEPCloseObjectParser extends AbstractObjectWithTlvsParser<TlvsBuilder> {
 
     public static final int CLASS = 15;
 
@@ -38,10 +42,11 @@ public class PCEPCloseObjectParser extends AbstractObjectWithTlvsParser<CCloseBu
     private static final int RESERVED = 2;
     private static final int FLAGS_F_LENGTH = 1;
 
-    public PCEPCloseObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPCloseObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
+
     @Override
     public CClose 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.");
@@ -50,7 +55,9 @@ public class PCEPCloseObjectParser extends AbstractObjectWithTlvsParser<CCloseBu
         builder.setProcessingRule(header.isProcessingRule());
         bytes.readerIndex(bytes.readerIndex() + FLAGS_F_LENGTH + RESERVED);
         builder.setReason((short) UnsignedBytes.toInt(bytes.readByte()));
-        parseTlvs(builder, bytes.slice());
+        final TlvsBuilder tlvsBuilder = new TlvsBuilder();
+        parseTlvs(tlvsBuilder, bytes.slice());
+        builder.setTlvs(tlvsBuilder.build());
         return builder.build();
     }
 
@@ -67,6 +74,17 @@ public class PCEPCloseObjectParser extends AbstractObjectWithTlvsParser<CCloseBu
     }
 
     public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) {
-        return;
+        if (tlvs == null) {
+            return;
+        }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     }
 }
index 1728e50655e58cc5a5c5d879b8c9afec0ffd19aa..1185fdd38043231a0078d520204c78b8a2a846a2 100644 (file)
@@ -12,11 +12,11 @@ import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv4Address;
 import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
+import org.opendaylight.protocol.pcep.spi.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 import org.opendaylight.protocol.pcep.spi.ObjectUtil;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
-import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 import org.opendaylight.protocol.pcep.spi.UnknownObject;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.protocol.util.Ipv4Util;
@@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Parser for IPv4 {@link EndpointsObj}
  */
-public class PCEPEndPointsIpv4ObjectParser extends AbstractObjectWithTlvsParser<EndpointsObjBuilder> {
+public class PCEPEndPointsIpv4ObjectParser implements ObjectParser, ObjectSerializer {
 
     private static final Logger LOG = LoggerFactory.getLogger(PCEPEndPointsIpv4ObjectParser.class);
 
@@ -43,10 +43,6 @@ public class PCEPEndPointsIpv4ObjectParser extends AbstractObjectWithTlvsParser<
 
     public static final int TYPE = 1;
 
-    public PCEPEndPointsIpv4ObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @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.");
index aefbd1777c03a2f73cee33cdead689eabc47e2b6..22adcd6e887a7cd18ce103031394a8f0c82f8609 100644 (file)
@@ -12,11 +12,11 @@ import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv6Address;
 import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
+import org.opendaylight.protocol.pcep.spi.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 import org.opendaylight.protocol.pcep.spi.ObjectUtil;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
-import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 import org.opendaylight.protocol.pcep.spi.UnknownObject;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.protocol.util.Ipv6Util;
@@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Parser for IPv6 {@link EndpointsObj}
  */
-public class PCEPEndPointsIpv6ObjectParser extends AbstractObjectWithTlvsParser<EndpointsObjBuilder> {
+public class PCEPEndPointsIpv6ObjectParser implements ObjectParser, ObjectSerializer {
 
     private static final Logger LOG = LoggerFactory.getLogger(PCEPEndPointsIpv6ObjectParser.class);
 
@@ -43,10 +43,6 @@ public class PCEPEndPointsIpv6ObjectParser extends AbstractObjectWithTlvsParser<
 
     public static final int TYPE = 2;
 
-    public PCEPEndPointsIpv6ObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @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.");
index 3402676d271091181ac90d7e899f2c1e6748d534..e3a0c1de45b245257f131a3a6c98976a38e1db52 100644 (file)
@@ -13,10 +13,12 @@ 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.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.pcep.spi.VendorInformationTlvRegistry;
 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.Tlv;
@@ -25,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.error.object.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.error.object.TlvsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.req.missing.tlv.ReqMissing;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link ErrorObject}
@@ -39,8 +42,8 @@ public class PCEPErrorObjectParser extends AbstractObjectWithTlvsParser<ErrorObj
 
     private static final int RESERVED  = 1;
 
-    public PCEPErrorObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPErrorObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -80,8 +83,17 @@ public class PCEPErrorObjectParser extends AbstractObjectWithTlvsParser<ErrorObj
     public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) {
         if (tlvs == null) {
             return;
-        } else if (tlvs.getReqMissing() != null) {
+        }
+        if (tlvs.getReqMissing() != null) {
             serializeTlv(tlvs.getReqMissing(), body);
         }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final ErrorObjectBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setTlvs(new TlvsBuilder(builder.getTlvs()).setVendorInformationTlv(tlvs).build());
+        }
     }
 }
index ddc6bad5777d0c160ac92681c719055d51994b50..3d99eda891a57c2eed4878af5f3eae8048817106 100644 (file)
@@ -8,9 +8,7 @@
 package org.opendaylight.protocol.pcep.impl.object;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.spi.ObjectUtil;
-import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 
 /**
  * Parser for Bandwidth
@@ -21,10 +19,6 @@ public class PCEPExistingBandwidthObjectParser extends AbstractBandwidthParser {
 
     public static final int TYPE = 2;
 
-    public PCEPExistingBandwidthObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @Override
     protected void formatBandwidth(final Boolean processed, final Boolean ignored, final ByteBuf body, final ByteBuf buffer) {
         ObjectUtil.formatSubobject(TYPE, CLASS, processed, ignored, body, buffer);
index ecfb8c815ec3acc672a2b09966a8b39aaa6b4ee1..9ddf03a68d8c120b1a5b4497e035c75994e515e6 100644 (file)
@@ -13,26 +13,31 @@ 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.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.pcep.spi.VendorInformationTlvRegistry;
 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.gc.object.Gc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.gc.object.GcBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.gc.object.gc.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.gc.object.gc.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link Gc}
  */
-public class PCEPGlobalConstraintsObjectParser extends AbstractObjectWithTlvsParser<GcBuilder> {
+public class PCEPGlobalConstraintsObjectParser extends AbstractObjectWithTlvsParser<TlvsBuilder> {
 
     public static final int CLASS = 24;
 
     public static final int TYPE = 1;
 
-    public PCEPGlobalConstraintsObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPGlobalConstraintsObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -47,6 +52,9 @@ public class PCEPGlobalConstraintsObjectParser extends AbstractObjectWithTlvsPar
         builder.setMaxUtilization((short) UnsignedBytes.toInt(bytes.readByte()));
         builder.setMinUtilization((short) UnsignedBytes.toInt(bytes.readByte()));
         builder.setOverBookingFactor((short) UnsignedBytes.toInt(bytes.readByte()));
+        final TlvsBuilder tlvsBuilder = new TlvsBuilder();
+        parseTlvs(tlvsBuilder, bytes.slice());
+        builder.setTlvs(tlvsBuilder.build());
         return builder.build();
     }
 
@@ -59,6 +67,21 @@ public class PCEPGlobalConstraintsObjectParser extends AbstractObjectWithTlvsPar
         writeUnsignedByte(specObj.getMaxUtilization(), body);
         writeUnsignedByte(specObj.getMinUtilization(), body);
         writeUnsignedByte(specObj.getOverBookingFactor(), body);
+        serializeTlvs(specObj.getTlvs(), body);
         ObjectUtil.formatSubobject(TYPE, CLASS, object.isProcessingRule(), object.isIgnore(), body, buffer);
     }
+
+    public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) {
+        if (tlvs == null) {
+            return;
+        }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
+    }
 }
index e46475ba37960b057e86ddbfea9481cc7b28c088..67c025de4ccb7a913eafc39c235b49753ff864ef 100644 (file)
@@ -14,10 +14,10 @@ import com.google.common.base.Preconditions;
 import com.google.common.primitives.UnsignedBytes;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
+import org.opendaylight.protocol.pcep.spi.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
@@ -28,7 +28,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 /**
  * Parser for {@link LoadBalancing}
  */
-public class PCEPLoadBalancingObjectParser extends AbstractObjectWithTlvsParser<LoadBalancingBuilder> {
+public class PCEPLoadBalancingObjectParser implements ObjectParser, ObjectSerializer {
 
     public static final int CLASS = 14;
 
@@ -39,10 +39,6 @@ public class PCEPLoadBalancingObjectParser extends AbstractObjectWithTlvsParser<
 
     private static final int SIZE = 8;
 
-    public PCEPLoadBalancingObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @Override
     public LoadBalancing 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.");
index de2ee0dd37669c9bb84d0bdbc3d4f87798d2f4e4..243e5447076e60d993a681b6c7ed675be45b9f2b 100644 (file)
@@ -16,10 +16,12 @@ 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.pcep.spi.VendorInformationTlvRegistry;
 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;
@@ -27,6 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.LspaBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.AttributeFilter;
 
 /**
@@ -50,8 +53,8 @@ public class PCEPLspaObjectParser extends AbstractObjectWithTlvsParser<TlvsBuild
 
     private static final int RESERVED = 1;
 
-    public PCEPLspaObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPLspaObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -97,10 +100,20 @@ public class PCEPLspaObjectParser extends AbstractObjectWithTlvsParser<TlvsBuild
     }
 
     public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) {
-        return;
+        if (tlvs == null) {
+            return;
+        }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
     }
 
     private void writeAttributeFilter(final AttributeFilter attributeFilter, final ByteBuf body) {
         writeUnsignedInt(attributeFilter != null ? attributeFilter.getValue() : null, body);
     }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
+    }
 }
index 6bbeaa3404e43e400ce5b3ec468e453cf064bf01..c976f346b6ff2f6de7d306e3d7ef30a5fe939703 100644 (file)
@@ -16,10 +16,10 @@ import com.google.common.primitives.UnsignedBytes;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import java.util.BitSet;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
+import org.opendaylight.protocol.pcep.spi.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ieee754.rev130819.Float32;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
@@ -30,7 +30,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 /**
  * Parser for {@link Metric}
  */
-public class PCEPMetricObjectParser extends AbstractObjectWithTlvsParser<MetricBuilder> {
+public class PCEPMetricObjectParser implements ObjectParser, ObjectSerializer {
 
     public static final int CLASS = 6;
 
@@ -55,10 +55,6 @@ public class PCEPMetricObjectParser extends AbstractObjectWithTlvsParser<MetricB
 
     private static final int SIZE = 4 + METRIC_VALUE_F_LENGTH;
 
-    public PCEPMetricObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @Override
     public Metric 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.");
index a6c02c523ee068500e41fdfbab01a647e78ae495..8a02c4c7a9974063ca5673c4e19f9095c9ab2b0a 100644 (file)
@@ -15,10 +15,12 @@ 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.pcep.spi.VendorInformationTlvRegistry;
 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;
@@ -28,11 +30,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.TlvsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.tlvs.NoPathVector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link NoPath}
  */
-public class PCEPNoPathObjectParser extends AbstractObjectWithTlvsParser<NoPathBuilder> {
+public class PCEPNoPathObjectParser extends AbstractObjectWithTlvsParser<TlvsBuilder> {
 
     public static final int CLASS = 3;
 
@@ -49,8 +52,8 @@ public class PCEPNoPathObjectParser extends AbstractObjectWithTlvsParser<NoPathB
      */
     private static final int C_FLAG_OFFSET = 0;
 
-    public PCEPNoPathObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPNoPathObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -65,14 +68,16 @@ public class PCEPNoPathObjectParser extends AbstractObjectWithTlvsParser<NoPathB
         final BitSet flags = ByteArray.bytesToBitSet(flagsByte);
         builder.setUnsatisfiedConstraints(flags.get(C_FLAG_OFFSET));
         bytes.readerIndex(bytes.readerIndex() + RESERVED_F_LENGTH);
-        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 NoPathBuilder builder, final Tlv tlv) {
+    public void addTlv(final TlvsBuilder builder, final Tlv tlv) {
         if (tlv instanceof NoPathVector) {
-            builder.setTlvs(new TlvsBuilder().setNoPathVector((NoPathVector) tlv).build());
+            builder.setNoPathVector((NoPathVector) tlv);
         }
     }
 
@@ -100,5 +105,13 @@ public class PCEPNoPathObjectParser extends AbstractObjectWithTlvsParser<NoPathB
         if (tlvs.getNoPathVector() != null) {
             serializeTlv(tlvs.getNoPathVector(), body);
         }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if(!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     }
 }
index af5c5063a22266f0748021bae695cd85365850bc..d4b7dbc1fc8d8f66ac18ffb008643cce9da03014 100644 (file)
@@ -13,10 +13,12 @@ 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.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.pcep.spi.VendorInformationTlvRegistry;
 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.Tlv;
@@ -25,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.notification.object.c.notification.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.notification.object.c.notification.TlvsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.duration.tlv.OverloadDuration;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link CNotification}
@@ -40,8 +43,8 @@ public class PCEPNotificationObjectParser extends AbstractObjectWithTlvsParser<C
      */
     private static final int NT_F_OFFSET = 2;
 
-    public PCEPNotificationObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPNotificationObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -85,5 +88,13 @@ public class PCEPNotificationObjectParser extends AbstractObjectWithTlvsParser<C
         if (tlvs.getOverloadDuration() != null) {
             serializeTlv(tlvs.getOverloadDuration(), body);
         }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final CNotificationBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setTlvs(new TlvsBuilder(builder.getTlvs()).setVendorInformationTlv(tlvs).build());
+        }
     }
 }
index b494a4a7157866a49f76d09578367ed2c9390072..b0f50abcdfb85c364cb26314a31979c4590c09af 100644 (file)
@@ -12,20 +12,25 @@ import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedShort
 import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+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.pcep.spi.VendorInformationTlvRegistry;
 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.OfId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.Of;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.OfBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.of.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.of.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 /**
  * Parser for {@link Of}
  */
-public class PCEPObjectiveFunctionObjectParser extends AbstractObjectWithTlvsParser<OfBuilder> {
+public class PCEPObjectiveFunctionObjectParser extends AbstractObjectWithTlvsParser<TlvsBuilder> {
 
     public static final int CLASS = 21;
 
@@ -33,8 +38,8 @@ public class PCEPObjectiveFunctionObjectParser extends AbstractObjectWithTlvsPar
 
     private static final int RESERVED = 2;
 
-    public PCEPObjectiveFunctionObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPObjectiveFunctionObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -44,6 +49,10 @@ public class PCEPObjectiveFunctionObjectParser extends AbstractObjectWithTlvsPar
         builder.setIgnore(header.isIgnore());
         builder.setProcessingRule(header.isProcessingRule());
         builder.setCode(new OfId(bytes.readUnsignedShort()));
+        bytes.readBytes(RESERVED);
+        final TlvsBuilder tlvsBuilder = new TlvsBuilder();
+        parseTlvs(tlvsBuilder, bytes.slice());
+        builder.setTlvs(tlvsBuilder.build());
         return builder.build();
     }
 
@@ -55,6 +64,21 @@ public class PCEPObjectiveFunctionObjectParser extends AbstractObjectWithTlvsPar
         Preconditions.checkArgument(specObj.getCode() != null, "Code is mandatory");
         writeUnsignedShort(specObj.getCode().getValue(), body);
         body.writeZero(RESERVED);
+        serializeTlvs(specObj.getTlvs(), body);
         ObjectUtil.formatSubobject(TYPE, CLASS, object.isProcessingRule(), object.isIgnore(), body, buffer);
     }
+
+    public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) {
+        if (tlvs == null) {
+            return;
+        }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
+    }
 }
index 7d2dc4de2e20e861878abb104c4e958519638f3b..bbd1896d2a5437703e2fca5c0878656b96eb6cbc 100644 (file)
@@ -14,12 +14,14 @@ 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.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.PCEPErrors;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 import org.opendaylight.protocol.pcep.spi.UnknownObject;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 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;
@@ -30,6 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,8 +58,8 @@ public class PCEPOpenObjectParser extends AbstractObjectWithTlvsParser<TlvsBuild
 
     private static final int PCEP_VERSION = 1;
 
-    public PCEPOpenObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PCEPOpenObjectParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
@@ -120,5 +123,13 @@ public class PCEPOpenObjectParser extends AbstractObjectWithTlvsParser<TlvsBuild
         if (tlvs.getOfList() != null) {
             serializeTlv(tlvs.getOfList(), body);
         }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     }
 }
index aee1b1f7af2e3a30ea255aecccf8b299a0fd8c28..23499f851f17800e64cc1f29522fb80541e2d5b5 100644 (file)
@@ -16,10 +16,12 @@ 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.pcep.spi.VendorInformationTlvRegistry;
 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;
@@ -30,11 +32,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 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;
 
@@ -88,8 +91,8 @@ 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
@@ -118,14 +121,16 @@ 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);
         }
     }
 
@@ -182,5 +187,13 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
         } else if (tlvs.getOrder() != null) {
             serializeTlv(tlvs.getOrder(), body);
         }
+        serializeVendorInformationTlvs(tlvs.getVendorInformationTlv(), body);
+    }
+
+    @Override
+    protected final void addVendorInformationTlvs(final TlvsBuilder builder, final List<VendorInformationTlv> tlvs) {
+        if (!tlvs.isEmpty()) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     }
 }
index afc85beab26dc72d224f5939e4f4553b0c299cd4..3cf8f593f0bada13b2fd6467f99d9dc21e095162 100644 (file)
@@ -16,10 +16,10 @@ 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.ObjectParser;
+import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 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.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;
@@ -30,7 +30,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 /**
  * Parser for {@link Svec}
  */
-public class PCEPSvecObjectParser extends AbstractObjectWithTlvsParser<SvecBuilder> {
+public class PCEPSvecObjectParser implements ObjectParser, ObjectSerializer {
 
     public static final int CLASS = 11;
 
@@ -58,10 +58,6 @@ public class PCEPSvecObjectParser extends AbstractObjectWithTlvsParser<SvecBuild
      */
     private static final int MIN_SIZE = FLAGS_F_LENGTH + FLAGS_F_OFFSET;
 
-    public PCEPSvecObjectParser(final TlvRegistry tlvReg) {
-        super(tlvReg);
-    }
-
     @Override
     public Svec 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.");
diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/tlv/AbstractVendorInformationTlvParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/tlv/AbstractVendorInformationTlvParser.java
new file mode 100644 (file)
index 0000000..12a560f
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.impl.tlv;
+
+import static org.opendaylight.protocol.pcep.spi.VendorInformationUtil.VENDOR_INFORMATION_TLV_TYPE;
+import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedInt;
+
+import com.google.common.base.Preconditions;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+
+import org.opendaylight.protocol.pcep.spi.EnterpriseSpecificInformationParser;
+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.types.rev131005.Tlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.EnterpriseSpecificInformation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlvBuilder;
+
+public abstract class AbstractVendorInformationTlvParser implements TlvSerializer, TlvParser, EnterpriseSpecificInformationParser {
+
+    @Override
+    public final void serializeTlv(final Tlv tlv, final ByteBuf buffer) {
+        Preconditions.checkArgument(tlv instanceof VendorInformationTlv, "Vendor Specific Tlv is mandatory.");
+        final VendorInformationTlv viTlv = (VendorInformationTlv) tlv;
+        final ByteBuf body = Unpooled.buffer();
+        writeUnsignedInt(getEnterpriseNumber().getValue(), body);
+        serializeEnterpriseSpecificInformation(viTlv.getEnterpriseSpecificInformation(), body);
+        TlvUtil.formatTlv(VENDOR_INFORMATION_TLV_TYPE, body, buffer);
+    }
+
+    @Override
+    public final VendorInformationTlv parseTlv(final ByteBuf buffer) throws PCEPDeserializerException {
+        if (buffer == null) {
+            return null;
+        }
+        final VendorInformationTlvBuilder viTlvBuider = new VendorInformationTlvBuilder();
+        viTlvBuider.setEnterpriseNumber(getEnterpriseNumber());
+        if (buffer.isReadable()) {
+            final EnterpriseSpecificInformation esInformation = parseEnterpriseSpecificInformation(buffer.slice());
+            if (esInformation != null) {
+                viTlvBuider.setEnterpriseSpecificInformation(esInformation);
+            }
+        }
+        return viTlvBuider.build();
+    }
+}
index 3eff2f60d2353e6467f2de39805578b9f2c0a590..24aad5e64b751e52ac2cce77b3d19ddd38a184f3 100644 (file)
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
+import org.opendaylight.protocol.pcep.impl.TestVendorInformationTlvParser.TestEnterpriseSpecificInformation;
 import org.opendaylight.protocol.pcep.impl.object.PCEPBandwidthObjectParser;
 import org.opendaylight.protocol.pcep.impl.object.PCEPClassTypeObjectParser;
 import org.opendaylight.protocol.pcep.impl.object.PCEPCloseObjectParser;
@@ -48,6 +49,7 @@ import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 import org.opendaylight.protocol.pcep.spi.UnknownObject;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.protocol.util.Ipv4Util;
@@ -55,6 +57,7 @@ import org.opendaylight.protocol.util.Ipv6Util;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ieee754.rev130819.Float32;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ClassType;
@@ -97,6 +100,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.req.missing.tlv.ReqMissingBuilder;
 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.svec.object.SvecBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlvBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.AttributeFilter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.ExcludeRouteSubobjects.Attribute;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.AsNumberCaseBuilder;
@@ -110,20 +115,26 @@ public class PCEPObjectParserTest {
 
     private TlvRegistry tlvRegistry;
 
+    private VendorInformationTlvRegistry viTlvRegistry;
+
     private SimplePCEPExtensionProviderContext ctx;
     private Activator act;
+    private TestVendorInformationActivator viAct;
 
     @Before
     public void setUp() {
         this.ctx = new SimplePCEPExtensionProviderContext();
         this.act = new Activator();
+        this.viAct = new TestVendorInformationActivator();
         this.act.start(this.ctx);
+        this.viAct.start(this.ctx);
         this.tlvRegistry = this.ctx.getTlvHandlerRegistry();
+        this.viTlvRegistry = this.ctx.getVendorInformationTlvRegistry();
     }
 
     @Test
     public void testOpenObjectWOTLV() throws PCEPDeserializerException, IOException {
-        final PCEPOpenObjectParser parser = new PCEPOpenObjectParser(this.tlvRegistry);
+        final PCEPOpenObjectParser parser = new PCEPOpenObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin"));
 
         final OpenBuilder builder = new OpenBuilder();
@@ -144,13 +155,14 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testCloseObject() throws IOException, PCEPDeserializerException {
-        final PCEPCloseObjectParser parser = new PCEPCloseObjectParser(this.tlvRegistry);
+        final PCEPCloseObjectParser parser = new PCEPCloseObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPCloseObject1.bin"));
 
         final CCloseBuilder builder = new CCloseBuilder();
         builder.setProcessingRule(false);
         builder.setIgnore(false);
         builder.setReason((short) 5);
+        builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.c.close.TlvsBuilder().build());
 
         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4)));
         ByteBuf buf = Unpooled.buffer();
@@ -160,7 +172,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testLoadBalancingObject() throws IOException, PCEPDeserializerException {
-        final PCEPLoadBalancingObjectParser parser = new PCEPLoadBalancingObjectParser(this.tlvRegistry);
+        final PCEPLoadBalancingObjectParser parser = new PCEPLoadBalancingObjectParser();
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLoadBalancingObject1.bin"));
 
         final LoadBalancingBuilder builder = new LoadBalancingBuilder();
@@ -269,7 +281,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testBandwidthObject() throws IOException, PCEPDeserializerException {
-        final PCEPBandwidthObjectParser parser = new PCEPBandwidthObjectParser(this.tlvRegistry);
+        final PCEPBandwidthObjectParser parser = new PCEPBandwidthObjectParser();
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPBandwidthObject1LowerBounds.bin"));
 
         final BandwidthBuilder builder = new BandwidthBuilder();
@@ -285,7 +297,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testExistingBandwidthObject() throws IOException, PCEPDeserializerException {
-        final PCEPExistingBandwidthObjectParser parser = new PCEPExistingBandwidthObjectParser(this.tlvRegistry);
+        final PCEPExistingBandwidthObjectParser parser = new PCEPExistingBandwidthObjectParser();
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPBandwidthObject2UpperBounds.bin"));
 
         final BandwidthBuilder builder = new BandwidthBuilder();
@@ -304,7 +316,7 @@ public class PCEPObjectParserTest {
         final byte[] srcIPBytes = { (byte) 0xA2, (byte) 0xF5, (byte) 0x11, (byte) 0x0E };
         final byte[] destIPBytes = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF };
 
-        final PCEPEndPointsIpv4ObjectParser parser = new PCEPEndPointsIpv4ObjectParser(this.tlvRegistry);
+        final PCEPEndPointsIpv4ObjectParser parser = new PCEPEndPointsIpv4ObjectParser();
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPEndPointsObject1IPv4.bin"));
 
         final EndpointsObjBuilder builder = new EndpointsObjBuilder();
@@ -327,7 +339,7 @@ public class PCEPObjectParserTest {
         final byte[] srcIPBytes = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF };
 
-        final PCEPEndPointsIpv6ObjectParser parser = new PCEPEndPointsIpv6ObjectParser(this.tlvRegistry);
+        final PCEPEndPointsIpv6ObjectParser parser = new PCEPEndPointsIpv6ObjectParser();
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPEndPointsObject2IPv6.bin"));
 
         final EndpointsObjBuilder builder = new EndpointsObjBuilder();
@@ -345,7 +357,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testErrorObjectWithTlv() throws PCEPDeserializerException, IOException {
-        final PCEPErrorObjectParser parser = new PCEPErrorObjectParser(this.tlvRegistry);
+        final PCEPErrorObjectParser parser = new PCEPErrorObjectParser(this.tlvRegistry, this.viTlvRegistry);
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPErrorObject1.bin"));
 
         final ErrorObjectBuilder builder = new ErrorObjectBuilder();
@@ -373,7 +385,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testLspaObject() throws IOException, PCEPDeserializerException {
-        final PCEPLspaObjectParser parser = new PCEPLspaObjectParser(this.tlvRegistry);
+        final PCEPLspaObjectParser parser = new PCEPLspaObjectParser(this.tlvRegistry, this.viTlvRegistry);
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin"));
 
         final LspaBuilder builder = new LspaBuilder();
@@ -409,7 +421,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testMetricObject() throws IOException, PCEPDeserializerException {
-        final PCEPMetricObjectParser parser = new PCEPMetricObjectParser(this.tlvRegistry);
+        final PCEPMetricObjectParser parser = new PCEPMetricObjectParser();
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPMetricObject1LowerBounds.bin"));
 
         final MetricBuilder builder = new MetricBuilder();
@@ -440,7 +452,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testNoPathObjectWithTlv() throws PCEPDeserializerException, IOException {
-        final PCEPNoPathObjectParser parser = new PCEPNoPathObjectParser(this.tlvRegistry);
+        final PCEPNoPathObjectParser parser = new PCEPNoPathObjectParser(this.tlvRegistry, this.viTlvRegistry);
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPNoPathObject1WithoutTLV.bin"));
 
         final NoPathBuilder builder = new NoPathBuilder();
@@ -448,6 +460,7 @@ public class PCEPObjectParserTest {
         builder.setIgnore(true);
         builder.setNatureOfIssue((short) 1);
         builder.setUnsatisfiedConstraints(true);
+        builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.TlvsBuilder().build());
 
         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() - 4)));
         ByteBuf buf = Unpooled.buffer();
@@ -472,7 +485,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testNotifyObjectWithTlv() throws PCEPDeserializerException, IOException {
-        final PCEPNotificationObjectParser parser = new PCEPNotificationObjectParser(this.tlvRegistry);
+        final PCEPNotificationObjectParser parser = new PCEPNotificationObjectParser(this.tlvRegistry, this.viTlvRegistry);
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPNotificationObject2WithoutTlv.bin"));
 
         final CNotificationBuilder builder = new CNotificationBuilder();
@@ -501,7 +514,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testRPObjectWithTlv() throws PCEPDeserializerException, IOException {
-        final PCEPRequestParameterObjectParser parser = new PCEPRequestParameterObjectParser(this.tlvRegistry);
+        final PCEPRequestParameterObjectParser parser = new PCEPRequestParameterObjectParser(this.tlvRegistry, this.viTlvRegistry);
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPRPObject1.bin"));
 
         final RpBuilder builder = new RpBuilder();
@@ -519,6 +532,7 @@ public class PCEPObjectParserTest {
         builder.setEroCompression(false);
         builder.setPriority((short) 5);
         builder.setRequestId(new RequestId(0xdeadbeefL));
+        builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.TlvsBuilder().build());
 
         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() - 4)));
         ByteBuf buf = Unpooled.buffer();
@@ -546,7 +560,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testSvecObject() throws IOException, PCEPDeserializerException {
-        final PCEPSvecObjectParser parser = new PCEPSvecObjectParser(this.tlvRegistry);
+        final PCEPSvecObjectParser parser = new PCEPSvecObjectParser();
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPSvecObject2.bin"));
 
         final SvecBuilder builder = new SvecBuilder();
@@ -590,7 +604,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testClassTypeObject() throws PCEPDeserializerException {
-        final PCEPClassTypeObjectParser parser = new PCEPClassTypeObjectParser(this.tlvRegistry);
+        final PCEPClassTypeObjectParser parser = new PCEPClassTypeObjectParser();
         final ByteBuf result = Unpooled.wrappedBuffer(new byte[] { (byte) 0x16, (byte) 0x12, (byte) 0x00, (byte) 0x08, 0, 0, 0, (byte) 0x04 });
 
         final ClassTypeBuilder builder = new ClassTypeBuilder();
@@ -649,13 +663,14 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testObjectiveFunctionObject() throws IOException, PCEPDeserializerException {
-        final PCEPObjectiveFunctionObjectParser parser = new PCEPObjectiveFunctionObjectParser(this.tlvRegistry);
+        final PCEPObjectiveFunctionObjectParser parser = new PCEPObjectiveFunctionObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPObjectiveFunctionObject.1.bin"));
 
         final OfBuilder builder = new OfBuilder();
         builder.setProcessingRule(true);
         builder.setIgnore(false);
         builder.setCode(new OfId(4));
+        builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.of.TlvsBuilder().build());
 
         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() - 4)));
         ByteBuf buf = Unpooled.buffer();
@@ -665,7 +680,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testGlobalConstraintsObject() throws IOException, PCEPDeserializerException {
-        final PCEPGlobalConstraintsObjectParser parser = new PCEPGlobalConstraintsObjectParser(this.tlvRegistry);
+        final PCEPGlobalConstraintsObjectParser parser = new PCEPGlobalConstraintsObjectParser(this.tlvRegistry, this.viTlvRegistry);
         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPGlobalConstraintsObject.1.bin"));
 
         final GcBuilder builder = new GcBuilder();
@@ -675,6 +690,7 @@ public class PCEPObjectParserTest {
         builder.setMaxUtilization((short) 0);
         builder.setMinUtilization((short) 100);
         builder.setOverBookingFactor((short) 99);
+        builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.gc.object.gc.TlvsBuilder().build());
 
         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() - 4)));
         ByteBuf buf = Unpooled.buffer();
@@ -706,7 +722,7 @@ public class PCEPObjectParserTest {
 
     @Test
     public void testLspaObjectSerializerDefence() throws IOException, PCEPDeserializerException {
-        final PCEPLspaObjectParser parser = new PCEPLspaObjectParser(this.tlvRegistry);
+        final PCEPLspaObjectParser parser = new PCEPLspaObjectParser(this.tlvRegistry, this.viTlvRegistry);
         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin"));
 
         final LspaBuilder builder = new LspaBuilder();
@@ -732,4 +748,36 @@ public class PCEPObjectParserTest {
         final byte[] expected = {0x07, 0x13, 0x00, 0x04};
         assertArrayEquals(expected, ByteArray.getAllBytes(buffer));
     }
+
+    @Test
+    public void testCloseObjectWithVendorInformationTlv() throws IOException, PCEPDeserializerException {
+        final byte[] closeBytes = {
+            0x0f, 0x10, 0x00, 0x14,
+            0x00, 0x00, 0x00, 0x05,
+            /* vendor-information TLV */
+            0x00, 0x07, 0x00, 0x08,
+            /* enterprise number */
+            0x00, 0x00, 0x00, 0x00,
+            /* enterprise specific information */
+            0x00, 0x00, 0x00, 0x05
+        };
+        final PCEPCloseObjectParser parser = new PCEPCloseObjectParser(this.tlvRegistry, this.viTlvRegistry);
+        final ByteBuf result = Unpooled.wrappedBuffer(closeBytes);
+
+        final TestEnterpriseSpecificInformation esInfo = new TestEnterpriseSpecificInformation(5);
+        final VendorInformationTlv viTlv = new VendorInformationTlvBuilder().setEnterpriseNumber(new EnterpriseNumber(0L))
+                .setEnterpriseSpecificInformation(esInfo).build();
+        final CCloseBuilder builder = new CCloseBuilder();
+        builder.setProcessingRule(false);
+        builder.setIgnore(false);
+        builder.setReason((short) 5);
+        builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.c.close.TlvsBuilder()
+            .setVendorInformationTlv(Lists.newArrayList(viTlv)).build());
+
+        assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4)));
+
+        final ByteBuf buf = Unpooled.buffer();
+        parser.serializeObject(builder.build(), buf);
+        assertArrayEquals(result.array(), ByteArray.getAllBytes(buf));
+    }
 }
index 5d717d99b232a1251adae2917dee7799d07ba4c2..e9fdd2e73fee5876a868eb2cc2a20deb5d8ce736 100644 (file)
@@ -15,6 +15,7 @@ import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import java.util.List;
 import org.junit.Test;
+import org.opendaylight.protocol.pcep.impl.TestVendorInformationTlvParser.TestEnterpriseSpecificInformation;
 import org.opendaylight.protocol.pcep.impl.tlv.AbstractVendorSpecificTlvParser;
 import org.opendaylight.protocol.pcep.impl.tlv.NoPathVectorTlvParser;
 import org.opendaylight.protocol.pcep.impl.tlv.OFListTlvParser;
@@ -36,6 +37,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.tlvs.NoPathVectorBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.req.missing.tlv.ReqMissing;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.req.missing.tlv.ReqMissingBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlvBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vs.tlv.VsTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vs.tlv.VsTlvBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vs.tlv.vs.tlv.VendorPayload;
@@ -51,6 +54,13 @@ public class PCEPTlvParserTest {
     private static final byte[] ofListBytes = { 0x00, 0x04, 0x00, 0x04, 0x12, 0x34, 0x56, 0x78 };
     private static final byte[] vsTlvBytes = { 0x00, 0x1b, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,
         0x05 };
+    private static final byte[] VENDOR_INFO_BYTES = {
+        0x00, 0x07, 0x00, 0x08,
+        /* Enterprise number */
+        0x00, 0x00, 0x00, 0x00,
+        /* Enterprise specific information */
+        0x00, 0x00, 0x00, 0x05
+    };
 
     private final AbstractVendorSpecificTlvParser vsParser = new AbstractVendorSpecificTlvParser() {
 
@@ -134,10 +144,25 @@ public class PCEPTlvParserTest {
 
     @Test
     public void testVendorSpecificTlv() throws PCEPDeserializerException {
-        VsTlv tlv = new VsTlvBuilder().setEnterpriseNumber(new EnterpriseNumber(9L)).setVendorPayload(this.vp).build();
+        final VsTlv tlv = new VsTlvBuilder().setEnterpriseNumber(new EnterpriseNumber(9L)).setVendorPayload(this.vp).build();
         assertEquals(tlv, this.vsParser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(vsTlvBytes, 4))));
         final ByteBuf buff = Unpooled.buffer();
         this.vsParser.serializeTlv(tlv, buff);
         assertArrayEquals(vsTlvBytes, ByteArray.getAllBytes(buff));
     }
+
+    @Test
+    public void testVendorInformationTlv() throws PCEPDeserializerException {
+        final TestVendorInformationTlvParser parser = new TestVendorInformationTlvParser();
+        final TestEnterpriseSpecificInformation esInfo = new TestEnterpriseSpecificInformation(5);
+        final VendorInformationTlv viTlv = new VendorInformationTlvBuilder().setEnterpriseNumber(new EnterpriseNumber(0L))
+                .setEnterpriseSpecificInformation(esInfo).build();
+
+        final VendorInformationTlv parsedTlv = parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(VENDOR_INFO_BYTES, 8)));
+        assertEquals(viTlv, parsedTlv);
+
+        final ByteBuf buff = Unpooled.buffer(VENDOR_INFO_BYTES.length);
+        parser.serializeTlv(viTlv, buff);
+        assertArrayEquals(VENDOR_INFO_BYTES, ByteArray.getAllBytes(buff));
+    }
 }
index 25abbbac782b244edf1638a9ec45c909df393886..aa8a2066e03a10abb7310632788f806215159df4 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 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.close.message.CCloseMessageBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.CCloseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.c.close.TlvsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.Ipv4CaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.ipv4._case.Ipv4Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.object.EndpointsObj;
@@ -145,6 +146,7 @@ public class PCEPValidatorTest {
         rpBuilder.setEroCompression(false);
         rpBuilder.setPriority((short) 1);
         rpBuilder.setRequestId(new RequestId(10L));
+        rpBuilder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.TlvsBuilder().build());
         this.rpTrue = rpBuilder.build();
         rpBuilder.setProcessingRule(false);
         this.rpFalse = rpBuilder.build();
@@ -164,6 +166,7 @@ public class PCEPValidatorTest {
         npbuilder.setIgnore(false);
         npbuilder.setNatureOfIssue((short) 0);
         npbuilder.setUnsatisfiedConstraints(false);
+        npbuilder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.TlvsBuilder().build());
         this.noPath = npbuilder.build();
 
         final LspaBuilder lspaBuilder = new LspaBuilder();
@@ -212,6 +215,7 @@ public class PCEPValidatorTest {
         ofBuilder.setIgnore(false);
         ofBuilder.setProcessingRule(false);
         ofBuilder.setCode(new OfId(0));
+        ofBuilder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.of.TlvsBuilder().build());
         this.of = ofBuilder.build();
 
         final Ipv4Builder afi = new Ipv4Builder();
@@ -275,7 +279,7 @@ public class PCEPValidatorTest {
 
         final PCEPCloseMessageParser parser = new PCEPCloseMessageParser(this.objectRegistry);
         final CloseBuilder builder = new CloseBuilder().setCCloseMessage(new CCloseMessageBuilder().setCClose(
-            new CCloseBuilder().setIgnore(false).setProcessingRule(false).setReason((short) 5).build()).build());
+            new CCloseBuilder().setIgnore(false).setProcessingRule(false).setReason((short) 5).setTlvs(new TlvsBuilder().build()).build()).build());
 
         assertEquals(builder.build(), parser.parseMessage(result.slice(4, result.readableBytes() - 4), Collections.<Message> emptyList()));
         final ByteBuf buf = Unpooled.buffer(result.readableBytes());
diff --git a/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/TestVendorInformationActivator.java b/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/TestVendorInformationActivator.java
new file mode 100644 (file)
index 0000000..19e5a2c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.impl;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.opendaylight.protocol.pcep.impl.TestVendorInformationTlvParser.TestEnterpriseSpecificInformation;
+import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
+import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
+
+public class TestVendorInformationActivator extends AbstractPCEPExtensionProviderActivator {
+
+    @Override
+    protected List<AutoCloseable> startImpl(PCEPExtensionProviderContext context) {
+        final List<AutoCloseable> regs = Lists.newArrayList();
+        final TestVendorInformationTlvParser parser = new TestVendorInformationTlvParser();
+        regs.add(context.registerVendorInformationTlvParser(parser.getEnterpriseNumber(), parser));
+        regs.add(context.registerVendorInformationTlvSerializer(TestEnterpriseSpecificInformation.class, parser));
+        return regs;
+    }
+
+}
diff --git a/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/TestVendorInformationTlvParser.java b/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/TestVendorInformationTlvParser.java
new file mode 100644 (file)
index 0000000..8489e5d
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.impl;
+
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.protocol.pcep.impl.tlv.AbstractVendorInformationTlvParser;
+import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.EnterpriseSpecificInformation;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+
+public class TestVendorInformationTlvParser extends AbstractVendorInformationTlvParser {
+
+    private static final EnterpriseNumber TEST_ENTERPRISE_NUMBER = new EnterpriseNumber(0L);
+
+    @Override
+    public void serializeEnterpriseSpecificInformation(final EnterpriseSpecificInformation enterpriseSpecificInformation,
+            final ByteBuf buffer) {
+        if (enterpriseSpecificInformation instanceof TestEnterpriseSpecificInformation) {
+            buffer.writeInt(((TestEnterpriseSpecificInformation) enterpriseSpecificInformation).getValue());
+        }
+    }
+
+    @Override
+    public EnterpriseSpecificInformation parseEnterpriseSpecificInformation(final ByteBuf buffer)
+            throws PCEPDeserializerException {
+        return new TestEnterpriseSpecificInformation(buffer.readInt());
+    }
+
+    @Override
+    public EnterpriseNumber getEnterpriseNumber() {
+        return TEST_ENTERPRISE_NUMBER;
+    }
+
+    protected static final class TestEnterpriseSpecificInformation implements EnterpriseSpecificInformation {
+
+        private final int value;
+
+        public TestEnterpriseSpecificInformation(final int value) {
+            this.value = value;
+        }
+
+        public int getValue() {
+            return value;
+        }
+
+        @Override
+        public Class<? extends DataContainer> getImplementedInterface() {
+            return TestEnterpriseSpecificInformation.class;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + value;
+            return result;
+        }
+
+        @Override
+        public boolean equals(final Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            TestEnterpriseSpecificInformation other = (TestEnterpriseSpecificInformation) obj;
+            if (value != other.value) {
+                return false;
+            }
+            return true;
+        }
+    }
+
+}
index f89bb4995672a0b5ae4db869e4f9cdbac832ffbd..01c7d41936c4809830766fc57c8366240e952159 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.protocol.pcep.lsp.setup.type01;
 import io.netty.buffer.ByteBuf;
 import org.opendaylight.protocol.pcep.ietf.initiated00.CInitiated00SrpObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.Tlvs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.TlvsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.lsp.setup.type._01.rev140507.PathSetupTypeTlv;
@@ -24,16 +24,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 
 public class CInitiated00SrpObjectWithPstTlvParser extends CInitiated00SrpObjectParser {
 
-    public CInitiated00SrpObjectWithPstTlvParser(TlvRegistry tlvReg) {
-        super(tlvReg);
+    public CInitiated00SrpObjectWithPstTlvParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
-    public void addTlv(SrpBuilder builder, Tlv tlv) {
+    public void addTlv(final TlvsBuilder builder, final Tlv tlv) {
         super.addTlv(builder, tlv);
         final Tlvs7Builder tlvBuilder = new Tlvs7Builder();
-        if (builder.getTlvs() != null) {
-            final Tlvs7 tlvs = builder.getTlvs().getAugmentation(Tlvs7.class);
+        if (builder != null) {
+            final Tlvs7 tlvs = builder.getAugmentation(Tlvs7.class);
             if (tlvs != null && tlvs.getPathSetupType() != null) {
                 tlvBuilder.setPathSetupType(tlvs.getPathSetupType());
             }
@@ -41,7 +41,7 @@ public class CInitiated00SrpObjectWithPstTlvParser extends CInitiated00SrpObject
         if (tlv instanceof PathSetupType) {
             tlvBuilder.setPathSetupType((PathSetupType) tlv);
         }
-        builder.setTlvs(new TlvsBuilder().addAugmentation(Tlvs7.class, tlvBuilder.build()).build());
+        builder.addAugmentation(Tlvs7.class, tlvBuilder.build());
     }
 
     @Override
index 43980fd557907dbf2ed98bdfe1bc1204a7d3c411..f6393ba9d05b357ccebdb93b056b1f835bf227c5 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.protocol.pcep.lsp.setup.type01;
 import io.netty.buffer.ByteBuf;
 import org.opendaylight.protocol.pcep.impl.object.PCEPRequestParameterObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.lsp.setup.type._01.rev140507.PathSetupTypeTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.lsp.setup.type._01.rev140507.Tlvs1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.lsp.setup.type._01.rev140507.Tlvs1Builder;
@@ -18,22 +19,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.lsp
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.lsp.setup.type._01.rev140507.Tlvs4;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.lsp.setup.type._01.rev140507.path.setup.type.tlv.PathSetupType;
 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.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;
 
 public class PcepRpObjectWithPstTlvParser extends PCEPRequestParameterObjectParser {
 
-    public PcepRpObjectWithPstTlvParser(TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PcepRpObjectWithPstTlvParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
-    public void addTlv(RpBuilder builder, Tlv tlv) {
+    public void addTlv(final TlvsBuilder builder, Tlv tlv) {
         super.addTlv(builder, tlv);
         final Tlvs1Builder tlvBuilder = new Tlvs1Builder();
-        if (builder.getTlvs() != null) {
-            final Tlvs1 tlvs = builder.getTlvs().getAugmentation(Tlvs1.class);
+        if (builder != null) {
+            final Tlvs1 tlvs = builder.getAugmentation(Tlvs1.class);
             if (tlvs != null && tlvs.getPathSetupType() != null) {
                 tlvBuilder.setPathSetupType(tlvs.getPathSetupType());
             }
@@ -41,7 +41,7 @@ public class PcepRpObjectWithPstTlvParser extends PCEPRequestParameterObjectPars
         if (tlv instanceof PathSetupType) {
             tlvBuilder.setPathSetupType((PathSetupType) tlv);
         }
-        builder.setTlvs(new TlvsBuilder().addAugmentation(Tlvs1.class, tlvBuilder.build()).build());
+        builder.addAugmentation(Tlvs1.class, tlvBuilder.build()).build();
     }
 
     @Override
index ac29cdb33c16a5967131f3618d04f095b4427c0c..aed2af8b5f19c8bde583759ee2a9c2fdd9f24a80 100644 (file)
@@ -8,9 +8,9 @@
 package org.opendaylight.protocol.pcep.segment.routing02;
 
 import io.netty.buffer.ByteBuf;
-
 import org.opendaylight.protocol.pcep.impl.object.PCEPOpenObjectParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.Tlvs1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.Tlvs1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.sr.pce.capability.tlv.SrPceCapability;
@@ -20,8 +20,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 
 public class PcepOpenObjectWithSpcTlvParser extends PCEPOpenObjectParser {
 
-    public PcepOpenObjectWithSpcTlvParser(TlvRegistry tlvReg) {
-        super(tlvReg);
+    public PcepOpenObjectWithSpcTlvParser(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+        super(tlvReg, viTlvReg);
     }
 
     @Override
index 6f2e39ade84e7969293f5c226e728eeb82cf4567..f4bcedbf903ce8cae249b912d247d74549ff824f 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.protocol.pcep.lsp.setup.type01.PcepRpObjectWithPstTlvPar
 import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Pcinitiate;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
@@ -47,16 +48,17 @@ public class SegmentRoutingActivator extends AbstractPCEPExtensionProviderActiva
 
         /* Objects */
         final TlvRegistry tlvReg = context.getTlvHandlerRegistry();
+        final VendorInformationTlvRegistry viTlvRegistry = context.getVendorInformationTlvRegistry();
         regs.add(context.registerObjectParser(CInitiated00SrpObjectWithPstTlvParser.CLASS,
-                CInitiated00SrpObjectWithPstTlvParser.TYPE, new CInitiated00SrpObjectWithPstTlvParser(tlvReg)));
+                CInitiated00SrpObjectWithPstTlvParser.TYPE, new CInitiated00SrpObjectWithPstTlvParser(tlvReg, viTlvRegistry)));
         regs.add(context.registerObjectParser(PcepRpObjectWithPstTlvParser.CLASS, PcepRpObjectWithPstTlvParser.TYPE,
-                new PcepRpObjectWithPstTlvParser(tlvReg)));
+                new PcepRpObjectWithPstTlvParser(tlvReg, viTlvRegistry)));
         regs.add(context.registerObjectParser(PcepOpenObjectWithSpcTlvParser.CLASS,
-                PcepOpenObjectWithSpcTlvParser.TYPE, new PcepOpenObjectWithSpcTlvParser(tlvReg)));
+                PcepOpenObjectWithSpcTlvParser.TYPE, new PcepOpenObjectWithSpcTlvParser(tlvReg, viTlvRegistry)));
 
-        regs.add(context.registerObjectSerializer(Srp.class, new CInitiated00SrpObjectWithPstTlvParser(tlvReg)));
-        regs.add(context.registerObjectSerializer(Rp.class, new PcepRpObjectWithPstTlvParser(tlvReg)));
-        regs.add(context.registerObjectSerializer(Open.class, new PcepOpenObjectWithSpcTlvParser(tlvReg)));
+        regs.add(context.registerObjectSerializer(Srp.class, new CInitiated00SrpObjectWithPstTlvParser(tlvReg, viTlvRegistry)));
+        regs.add(context.registerObjectSerializer(Rp.class, new PcepRpObjectWithPstTlvParser(tlvReg, viTlvRegistry)));
+        regs.add(context.registerObjectSerializer(Open.class, new PcepOpenObjectWithSpcTlvParser(tlvReg, viTlvRegistry)));
 
         /* Messages */
         final ObjectRegistry objRegistry = context.getObjectHandlerRegistry();
index 0322313e99c72b1c54840289903b2831d730a819..2926de993661a996347bcb2857b434881604838b 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.protocol.pcep.segment.routing02.SegmentRoutingActivator;
 import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
@@ -47,6 +48,7 @@ public class PcepObjectParserTest {
         0x0, 0x1b, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1 };
 
     private TlvRegistry tlvRegistry;
+    private VendorInformationTlvRegistry viTlvRegistry;
 
     private SimplePCEPExtensionProviderContext ctx;
     private SegmentRoutingActivator act;
@@ -57,11 +59,12 @@ public class PcepObjectParserTest {
         this.act = new SegmentRoutingActivator();
         this.act.start(this.ctx);
         this.tlvRegistry = this.ctx.getTlvHandlerRegistry();
+        this.viTlvRegistry = this.ctx.getVendorInformationTlvRegistry();
     }
 
     @Test
     public void testRpObjectWithPstTlvParser() throws PCEPDeserializerException {
-        final PcepRpObjectWithPstTlvParser parser = new PcepRpObjectWithPstTlvParser(this.tlvRegistry);
+        final PcepRpObjectWithPstTlvParser parser = new PcepRpObjectWithPstTlvParser(this.tlvRegistry, this.viTlvRegistry);
         final RpBuilder builder = new RpBuilder();
         builder.setProcessingRule(false);
         builder.setIgnore(false);
@@ -90,7 +93,7 @@ public class PcepObjectParserTest {
 
     @Test
     public void testSrpObjectWithPstTlvParser() throws PCEPDeserializerException {
-        final CInitiated00SrpObjectWithPstTlvParser parser = new CInitiated00SrpObjectWithPstTlvParser(this.tlvRegistry);
+        final CInitiated00SrpObjectWithPstTlvParser parser = new CInitiated00SrpObjectWithPstTlvParser(this.tlvRegistry, this.viTlvRegistry);
         final SrpBuilder builder = new SrpBuilder();
         builder.setProcessingRule(false);
         builder.setIgnore(false);
index 3b9f359caba1ffdaed0dc319bb3052b7044bc694..fa1d1d481a79816c634a56bf9b41bd8db5790a13 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.protocol.pcep.impl.object.PCEPExplicitRouteObjectParser;
 import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
@@ -57,6 +58,7 @@ public class SrObjectParserTest {
     };
 
     private TlvRegistry tlvRegistry;
+    private VendorInformationTlvRegistry viTlvRegistry;
 
     private SimplePCEPExtensionProviderContext ctx;
     private SegmentRoutingActivator act;
@@ -67,11 +69,12 @@ public class SrObjectParserTest {
         this.act = new SegmentRoutingActivator();
         this.act.start(this.ctx);
         this.tlvRegistry = this.ctx.getTlvHandlerRegistry();
+        this.viTlvRegistry = this.ctx.getVendorInformationTlvRegistry();
     }
 
     @Test
     public void testOpenObjectWithSpcTlv() throws PCEPDeserializerException {
-        final PcepOpenObjectWithSpcTlvParser parser = new PcepOpenObjectWithSpcTlvParser(tlvRegistry);
+        final PcepOpenObjectWithSpcTlvParser parser = new PcepOpenObjectWithSpcTlvParser(this.tlvRegistry, this.viTlvRegistry);
 
         final OpenBuilder builder = new OpenBuilder();
         builder.setProcessingRule(false);
index 3a79af9decaf121811f45a45cab82dc141599374..69e891aa6ecbdf864886b5966cad03569d11a13f 100644 (file)
@@ -7,10 +7,18 @@
  */
 package org.opendaylight.protocol.pcep.spi;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufUtil;
+
+import java.util.List;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
 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.vendor.information.tlvs.VendorInformationTlv;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -18,16 +26,15 @@ public abstract class AbstractObjectWithTlvsParser<T> implements ObjectParser, O
 
     private static final Logger LOG = LoggerFactory.getLogger(AbstractObjectWithTlvsParser.class);
 
-    private static final int TLV_TYPE_F_LENGTH = 2;
-    private static final int TLV_LENGTH_F_LENGTH = 2;
-    private static final int TLV_HEADER_LENGTH = TLV_LENGTH_F_LENGTH + TLV_TYPE_F_LENGTH;
-
     public static final int PADDED_TO = 4;
 
     private final TlvRegistry tlvReg;
 
-    protected AbstractObjectWithTlvsParser(final TlvRegistry tlvReg) {
+    private final VendorInformationTlvRegistry viTlvReg;
+
+    protected AbstractObjectWithTlvsParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) {
         this.tlvReg = Preconditions.checkNotNull(tlvReg);
+        this.viTlvReg = Preconditions.checkNotNull(viTlvReg);
     }
 
     protected final void parseTlvs(final T builder, final ByteBuf bytes) throws PCEPDeserializerException {
@@ -35,6 +42,7 @@ public abstract class AbstractObjectWithTlvsParser<T> implements ObjectParser, O
         if (!bytes.isReadable()) {
             return;
         }
+        final List<VendorInformationTlv> viTlvs = Lists.newArrayList();
         while (bytes.isReadable()) {
             int type = bytes.readUnsignedShort();
             int length = bytes.readUnsignedShort();
@@ -44,11 +52,24 @@ public abstract class AbstractObjectWithTlvsParser<T> implements ObjectParser, O
             }
             final ByteBuf tlvBytes = bytes.slice(bytes.readerIndex(), length);
             LOG.trace("Parsing PCEP TLV : {}", ByteBufUtil.hexDump(tlvBytes));
-            final Tlv tlv = this.tlvReg.parseTlv(type, tlvBytes);
-            LOG.trace("Parsed PCEP TLV {}.", tlv);
-            addTlv(builder, tlv);
+
+            if (VendorInformationUtil.isVendorInformationTlv(type)) {
+                final EnterpriseNumber enterpriseNumber = new EnterpriseNumber(tlvBytes.readUnsignedInt());
+                final Optional<VendorInformationTlv> viTlv = this.viTlvReg.parseVendorInformationTlv(enterpriseNumber, tlvBytes);
+                if(viTlv.isPresent()) {
+                    LOG.trace("Parsed VENDOR-INFORMATION TLV {}.", viTlv.get());
+                    viTlvs.add(viTlv.get());
+                }
+            } else {
+                final Tlv tlv = this.tlvReg.parseTlv(type, tlvBytes);
+                if(tlv != null) {
+                    LOG.trace("Parsed PCEP TLV {}.", tlv);
+                    addTlv(builder, tlv);
+                }
+            }
             bytes.skipBytes(length + TlvUtil.getPadding(TlvUtil.HEADER_SIZE + length, TlvUtil.PADDED_TO));
         }
+        addVendorInformationTlvs(builder, viTlvs);
     }
 
     protected final void serializeTlv(final Tlv tlv, final ByteBuf buffer) {
@@ -61,4 +82,16 @@ public abstract class AbstractObjectWithTlvsParser<T> implements ObjectParser, O
     protected void addTlv(final T builder, final Tlv tlv) {
         // FIXME: No TLVs by default, fallback to augments
     }
+
+    abstract protected void addVendorInformationTlvs(final T builder, final List<VendorInformationTlv> tlvs);
+
+    protected final void serializeVendorInformationTlvs(final List<VendorInformationTlv> tlvs, final ByteBuf buffer) {
+        if (tlvs != null && !tlvs.isEmpty()) {
+            for (final VendorInformationTlv tlv : tlvs) {
+                LOG.trace("Serializing VENDOR-INFORMATION TLV {}", tlv);
+                this.viTlvReg.serializeVendorInformationTlv(tlv, buffer);
+                LOG.trace("Serialized VENDOR-INFORMATION TLV : {}.", ByteBufUtil.hexDump(buffer));
+            }
+        }
+    }
 }
diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/EnterpriseSpecificInformationParser.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/EnterpriseSpecificInformationParser.java
new file mode 100644 (file)
index 0000000..19e057b
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.spi;
+
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.EnterpriseSpecificInformation;
+
+public interface EnterpriseSpecificInformationParser {
+
+    void serializeEnterpriseSpecificInformation(final EnterpriseSpecificInformation enterpriseSpecificInformation, final ByteBuf buffer);
+
+    EnterpriseSpecificInformation parseEnterpriseSpecificInformation(final ByteBuf buffer) throws PCEPDeserializerException;
+
+    EnterpriseNumber getEnterpriseNumber();
+}
index 582d1e460301095a8fef43704660d11d744a238f..57916753ab23aedf3f525dd24cdd9240ef6daee3 100644 (file)
@@ -22,4 +22,6 @@ public interface PCEPExtensionConsumerContext {
     XROSubobjectRegistry getXROSubobjectHandlerRegistry();
 
     TlvRegistry getTlvHandlerRegistry();
+
+    VendorInformationTlvRegistry getVendorInformationTlvRegistry();
 }
index 593aa7d8b2632282692feedfb16d61460e8d272d..9dfeb1842127f7eb3d7ae39ffe2477151ce6d190 100644 (file)
@@ -7,9 +7,11 @@
  */
 package org.opendaylight.protocol.pcep.spi;
 
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
 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.Tlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.EnterpriseSpecificInformation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.SubobjectType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.label.subobject.LabelType;
 
@@ -40,6 +42,10 @@ public interface PCEPExtensionProviderContext extends PCEPExtensionConsumerConte
 
     AutoCloseable registerTlvParser(int tlvType, TlvParser parser);
 
+    AutoCloseable registerVendorInformationTlvSerializer(Class<? extends EnterpriseSpecificInformation> esInformationClass, TlvSerializer serializer);
+
+    AutoCloseable registerVendorInformationTlvParser(EnterpriseNumber enterpriseNumber, TlvParser parser);
+
     AutoCloseable registerXROSubobjectSerializer(Class<? extends SubobjectType> subobjectClass, XROSubobjectSerializer serializer);
 
     AutoCloseable registerXROSubobjectParser(int subobjectType, XROSubobjectParser parser);
diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/VendorInformationTlvRegistry.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/VendorInformationTlvRegistry.java
new file mode 100644 (file)
index 0000000..d6aac75
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.spi;
+
+import com.google.common.base.Optional;
+
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
+
+public interface VendorInformationTlvRegistry {
+
+    Optional<VendorInformationTlv> parseVendorInformationTlv(final EnterpriseNumber enterpriseNumber, final ByteBuf buffer) throws PCEPDeserializerException;
+
+    void serializeVendorInformationTlv(final VendorInformationTlv viTlv, final ByteBuf buffer);
+
+}
diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/VendorInformationUtil.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/VendorInformationUtil.java
new file mode 100644 (file)
index 0000000..873e3dc
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.spi;
+
+public class VendorInformationUtil {
+
+    public static final int VENDOR_INFORMATION_TLV_TYPE = 7;
+
+    private VendorInformationUtil() {
+    }
+
+    public static boolean isVendorInformationTlv(final int type) {
+        return type == VENDOR_INFORMATION_TLV_TYPE;
+    }
+}
index 04b6565a6ccee285e049f5830a0913a627e331c5..024ae2fea76d448ae9048bdecbe5dde230c6dd60 100644 (file)
@@ -28,12 +28,15 @@ import org.opendaylight.protocol.pcep.spi.RROSubobjectSerializer;
 import org.opendaylight.protocol.pcep.spi.TlvParser;
 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
 import org.opendaylight.protocol.pcep.spi.TlvSerializer;
+import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
 import org.opendaylight.protocol.pcep.spi.XROSubobjectParser;
 import org.opendaylight.protocol.pcep.spi.XROSubobjectRegistry;
 import org.opendaylight.protocol.pcep.spi.XROSubobjectSerializer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
 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.Tlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.EnterpriseSpecificInformation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.SubobjectType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.label.subobject.LabelType;
 
@@ -49,6 +52,7 @@ public class SimplePCEPExtensionProviderContext implements PCEPExtensionProvider
     private final SimpleRROSubobjectRegistry rroSubReg = new SimpleRROSubobjectRegistry();
     private final SimpleXROSubobjectRegistry xroSubReg = new SimpleXROSubobjectRegistry();
     private final SimpleTlvRegistry tlvReg = new SimpleTlvRegistry();
+    private final SimpleVendorInformationTlvRegistry viTlvReg = new SimpleVendorInformationTlvRegistry();
 
     @Override
     public final LabelRegistry getLabelHandlerRegistry() {
@@ -85,6 +89,11 @@ public class SimplePCEPExtensionProviderContext implements PCEPExtensionProvider
         return this.tlvReg;
     }
 
+    @Override
+    public VendorInformationTlvRegistry getVendorInformationTlvRegistry() {
+        return this.viTlvReg;
+    }
+
     @Override
     public final AutoCloseable registerLabelSerializer(final Class<? extends LabelType> labelClass, final LabelSerializer serializer) {
         return this.labelReg.registerLabelSerializer(labelClass, serializer);
@@ -158,4 +167,15 @@ public class SimplePCEPExtensionProviderContext implements PCEPExtensionProvider
             final XROSubobjectSerializer serializer) {
         return this.xroSubReg.registerSubobjectSerializer(subobjectClass, serializer);
     }
+
+    @Override
+    public AutoCloseable registerVendorInformationTlvSerializer(final
+            Class<? extends EnterpriseSpecificInformation> esInformationClass, final TlvSerializer serializer) {
+        return this.viTlvReg.registerVendorInformationTlvSerializer(esInformationClass, serializer);
+    }
+
+    @Override
+    public AutoCloseable registerVendorInformationTlvParser(final EnterpriseNumber enterpriseNumber, final TlvParser parser) {
+        return this.viTlvReg.registerVendorInformationTlvParser(enterpriseNumber, parser);
+    }
 }
diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleVendorInformationTlvRegistry.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleVendorInformationTlvRegistry.java
new file mode 100644 (file)
index 0000000..0edf981
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.spi.pojo;
+
+import com.google.common.base.Optional;
+import com.google.common.primitives.Ints;
+
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.protocol.concepts.HandlerRegistry;
+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.VendorInformationTlvRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.EnterpriseSpecificInformation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+
+public class SimpleVendorInformationTlvRegistry implements VendorInformationTlvRegistry {
+
+    private final HandlerRegistry<DataContainer, TlvParser, TlvSerializer> handlers = new HandlerRegistry<>();
+
+    public AutoCloseable registerVendorInformationTlvParser(final EnterpriseNumber enterpriseNumber, final TlvParser parser) {
+        return this.handlers.registerParser(Ints.checkedCast(enterpriseNumber.getValue()), parser);
+    }
+
+    public AutoCloseable registerVendorInformationTlvSerializer(final Class<? extends EnterpriseSpecificInformation> esInformationClass, final TlvSerializer serializer) {
+        return this.handlers.registerSerializer(esInformationClass, serializer);
+    }
+
+    @Override
+    public Optional<VendorInformationTlv> parseVendorInformationTlv(final EnterpriseNumber enterpriseNumber, final ByteBuf buffer) throws PCEPDeserializerException {
+        final TlvParser parser = this.handlers.getParser(Ints.checkedCast(enterpriseNumber.getValue()));
+        if (parser == null) {
+            return Optional.absent();
+        }
+        return Optional.of((VendorInformationTlv) parser.parseTlv(buffer));
+    }
+
+    @Override
+    public void serializeVendorInformationTlv(final VendorInformationTlv viTlv, final ByteBuf buffer) {
+        final TlvSerializer serializer = this.handlers.getSerializer(viTlv.getEnterpriseSpecificInformation().getImplementedInterface());
+        if (serializer == null) {
+            return;
+        }
+        serializer.serializeTlv(viTlv, buffer);
+    }
+
+
+}
index 73fee156d169e05c5593fc6e9d964f431718c9f7..9831e8e608ae1fe8f018e2cade6475c12b62290f 100644 (file)
@@ -12,6 +12,7 @@ import static org.junit.Assert.assertEquals;
 import com.google.common.collect.Lists;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -24,6 +25,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.list.tlv.OfList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.list.tlv.OfListBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.tlvs.VendorInformationTlv;
 
 public class AbstractObjectWithTlvsTest {
 
@@ -32,10 +34,13 @@ public class AbstractObjectWithTlvsTest {
     @Mock
     private TlvRegistry tlvRegistry;
 
+    @Mock
+    private VendorInformationTlvRegistry viTlvRegistry;
+
     private class Abs extends AbstractObjectWithTlvsParser<TlvsBuilder> {
 
-        protected Abs(TlvRegistry tlvReg) {
-            super(tlvReg);
+        protected Abs(TlvRegistry tlvReg, VendorInformationTlvRegistry viTlvReg) {
+            super(tlvReg, viTlvReg);
         }
 
         @Override
@@ -51,6 +56,11 @@ public class AbstractObjectWithTlvsTest {
         public void addTlv(final TlvsBuilder builder, final Tlv tlv) {
             builder.setOfList((OfList) tlv);
         }
+
+        @Override
+        protected void addVendorInformationTlvs(TlvsBuilder builder, List<VendorInformationTlv> tlvs) {
+            builder.setVendorInformationTlv(tlvs);
+        }
     };
 
     @Before
@@ -63,7 +73,7 @@ public class AbstractObjectWithTlvsTest {
 
     @Test
     public void testParseTlvs() throws PCEPDeserializerException {
-        Abs a = new Abs(this.tlvRegistry);
+        Abs a = new Abs(this.tlvRegistry, this.viTlvRegistry);
         ByteBuf buffer = Unpooled.buffer();
         a.serializeTlv(this.tlv, buffer);