<groupId>${project.groupId}</groupId>
<artifactId>bgp-parser-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>bgp-parser-spi</artifactId>
+ </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>bgp-rib-api</artifactId>
<groupId>${project.groupId}</groupId>
<artifactId>bgp-bmp-api</artifactId>
</dependency>
+
+ <!-- test scope dependencies -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
</dependencies>
<build>
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.inet;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlv;
+
+public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
+
+ @Override
+ protected List<AutoCloseable> startImpl(final BGPExtensionProviderContext context) {
+ final List<AutoCloseable> regs = new ArrayList<>(2);
+ final Ipv6BgpPrefixSidParser tlvHandler = new Ipv6BgpPrefixSidParser();
+ regs.add(context.registerBgpPrefixSidTlvParser(tlvHandler.getType(), tlvHandler));
+ regs.add(context.registerBgpPrefixSidTlvSerializer(Ipv6SidTlv.class, tlvHandler));
+ return regs;
+ }
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.inet;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.protocol.util.BitArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class Ipv6BgpPrefixSidParser implements BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer {
+
+ private static final int IPV6_SID_TYPE = 2;
+ private static final int RESERVED = 1;
+ private static final int FLAGS_SIZE = 2 * Byte.SIZE;
+ private static final int PROCESS_IPV6_HEADER_FLAG = 0;
+
+ @Override
+ public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf bytes) {
+ Preconditions.checkArgument(tlv instanceof Ipv6SidTlv, "Incoming TLV is not Ipv6SidTlv");
+ final Ipv6SidTlv ipv6Tlv = (Ipv6SidTlv) tlv;
+ bytes.writeZero(RESERVED);
+ final BitArray flags = new BitArray(FLAGS_SIZE);
+ flags.set(PROCESS_IPV6_HEADER_FLAG, ipv6Tlv.isProcessIpv6HeadAbility());
+ flags.toByteBuf(bytes);
+ }
+
+ @Override
+ public Ipv6SidTlv parseBgpPrefixSidTlv(final ByteBuf buffer) {
+ buffer.readBytes(RESERVED);
+ final boolean canProcessIpv6Header = BitArray.valueOf(buffer, FLAGS_SIZE).get(PROCESS_IPV6_HEADER_FLAG);
+ return new Ipv6SidTlvBuilder().setProcessIpv6HeadAbility(canProcessIpv6Header).build();
+ }
+
+ @Override
+ public int getType() {
+ return IPV6_SID_TYPE;
+ }
+}
}
}
+ grouping ipv6-bgp-prefix-sid-tlv {
+ reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02#section-4.2";
+ leaf process-ipv6-head-ability {
+ description "S flag position 0. If set then it means that the BGP speaker is capable of processing the
+ IPv6 Segment Routing Header.";
+ type boolean;
+ default "true";
+ }
+ }
+
grouping ipv6-routes {
container ipv6-routes {
list ipv6-route {
key prefix;
- uses bgp-rib:route;
+ uses bgp-rib:route {
+ augment "attributes/bgp-prefix-sid/bgp-prefix-sid-tlvs/bgp-prefix-sid-tlv" {
+ case ipv6-sid-tlv {
+ uses ipv6-bgp-prefix-sid-tlv;
+ }
+ }
+ }
}
}
}
uses ipv6-routes;
}
}
+
+ augment "/bgp-msg:update/bgp-msg:attributes/bgp-msg:bgp-prefix-sid/bgp-msg:bgp-prefix-sid-tlvs/bgp-msg:bgp-prefix-sid-tlv" {
+ case ipv6-sid-tlv {
+ uses ipv6-bgp-prefix-sid-tlv;
+ }
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.inet;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+
+public final class Ipv6BgpPrefixSidParserTest {
+
+ private final Ipv6BgpPrefixSidParser handler = new Ipv6BgpPrefixSidParser();
+
+ private final byte[] expected = new byte[] {0, (byte)0x80, 0};
+
+ @Test(expected=IllegalArgumentException.class)
+ public void testWrongTlvType() {
+ this.handler.serializeBgpPrefixSidTlv(new BgpPrefixSidTlv() {
+ @Override
+ public Class<? extends DataContainer> getImplementedInterface() {
+ return BgpPrefixSidTlv.class;
+ }
+ }, Unpooled.EMPTY_BUFFER);
+ }
+
+ @Test
+ public void testHandling() {
+ final Ipv6SidTlvBuilder tlv = new Ipv6SidTlvBuilder();
+ tlv.setProcessIpv6HeadAbility(Boolean.TRUE);
+ final ByteBuf serialized = Unpooled.buffer(3);
+ this.handler.serializeBgpPrefixSidTlv(tlv.build(), serialized);
+ assertArrayEquals(this.expected, serialized.array());
+ assertTrue(this.handler.parseBgpPrefixSidTlv(serialized).isProcessIpv6HeadAbility());
+ }
+
+ @Test
+ public void testType() {
+ assertEquals(2, this.handler.getType());
+ }
+}
import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.LabeledUnicastSubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.labeled.unicast.routes.LabeledUnicastRoutes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlv;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
@Override
protected List<AutoCloseable> startImpl(final BGPExtensionProviderContext context) {
- final List<AutoCloseable> regs = new ArrayList<>(4);
+ final List<AutoCloseable> regs = new ArrayList<>(8);
final LUNlriParser luNlriParser = new LUNlriParser();
regs.add(context.registerSubsequentAddressFamily(LabeledUnicastSubsequentAddressFamily.class, LABELED_UNICAST_SAFI));
- Ipv4NextHopParserSerializer ipv4NextHopParser = new Ipv4NextHopParserSerializer();
- Ipv6NextHopParserSerializer ipv6NextHopParser = new Ipv6NextHopParserSerializer();
+ final Ipv4NextHopParserSerializer ipv4NextHopParser = new Ipv4NextHopParserSerializer();
+ final Ipv6NextHopParserSerializer ipv6NextHopParser = new Ipv6NextHopParserSerializer();
regs.add(context.registerNlriParser(Ipv4AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class,
luNlriParser, ipv4NextHopParser, Ipv4NextHopCase.class));
regs.add(context.registerNlriParser(Ipv6AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class,
regs.add(context.registerNlriSerializer(LabeledUnicastRoutes.class, luNlriParser));
+ final LabelIndexTlvParser labelHandler = new LabelIndexTlvParser();
+ final OriginatorSrgbTlvParser originatorHandler = new OriginatorSrgbTlvParser();
+ regs.add(context.registerBgpPrefixSidTlvParser(labelHandler.getType(), labelHandler));
+ regs.add(context.registerBgpPrefixSidTlvParser(labelHandler.getType(), originatorHandler));
+ regs.add(context.registerBgpPrefixSidTlvSerializer(LuLabelIndexTlv.class, labelHandler));
+ regs.add(context.registerBgpPrefixSidTlvSerializer(LuOriginatorSrgbTlv.class, originatorHandler));
+
return regs;
}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.labeled.unicast;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class LabelIndexTlvParser implements BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer {
+
+ private static final int LABEL_INDEX_TYPE = 1;
+ private static final int RESERVED = 1;
+ private static final int LABEL_INDEX_FLAGS_BYTES = 2;
+
+ @Override
+ public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf valueBuf) {
+ Preconditions.checkArgument(tlv instanceof LuLabelIndexTlv, "Incoming TLV is not LuLabelIndexTlv");
+ valueBuf.writeZero(RESERVED);
+ valueBuf.writeZero(LABEL_INDEX_FLAGS_BYTES);
+ valueBuf.writeInt(((LuLabelIndexTlv) tlv).getLabelIndexTlv().intValue());
+ }
+
+ @Override
+ public LuLabelIndexTlv parseBgpPrefixSidTlv(final ByteBuf buffer) {
+ buffer.readBytes(RESERVED);
+ buffer.readBytes(LABEL_INDEX_FLAGS_BYTES);
+ final Long value = buffer.readUnsignedInt();
+ return new LuLabelIndexTlvBuilder().setLabelIndexTlv(value).build();
+ }
+
+ @Override
+ public int getType() {
+ return LABEL_INDEX_TYPE;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.labeled.unicast;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.Srgb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class OriginatorSrgbTlvParser implements BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer {
+
+ private static final int ORIGINATOR_SRGB_TYPE = 3;
+ private static final int ORIGINATOR_FLAGS_BYTES = 2;
+ private static final int SRGB_LENGTH = 6;
+
+ @Override
+ public LuOriginatorSrgbTlv parseBgpPrefixSidTlv(final ByteBuf buffer) {
+ buffer.readBytes(ORIGINATOR_FLAGS_BYTES);
+ final List<SrgbValue> srgbList = parseSrgbs(buffer);
+ return new LuOriginatorSrgbTlvBuilder().setSrgbValue(srgbList).build();
+ }
+
+ private static List<SrgbValue> parseSrgbs(final ByteBuf buffer) {
+ Preconditions.checkState(buffer.readableBytes() % SRGB_LENGTH == 0, "Number of SRGBs doesn't fit available bytes.");
+ final List<SrgbValue> ret = new ArrayList<SrgbValue>();
+ while (buffer.isReadable()) {
+ ret.add(new SrgbValueBuilder().setBase(new Srgb((long) buffer.readUnsignedMedium())).setRange(new Srgb((long) buffer.readUnsignedMedium())).build());
+ }
+ return ret;
+ }
+
+ @Override
+ public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf valueBuf) {
+ Preconditions.checkArgument(tlv instanceof LuOriginatorSrgbTlv, "Incoming TLV is not LuOriginatorSrgbTlv");
+ final LuOriginatorSrgbTlv luTlv = (LuOriginatorSrgbTlv) tlv;
+ valueBuf.writeZero(ORIGINATOR_FLAGS_BYTES);
+ for (final SrgbValue val : luTlv.getSrgbValue()) {
+ valueBuf.writeMedium(val.getBase().getValue().intValue());
+ valueBuf.writeMedium(val.getRange().getValue().intValue());
+ }
+ }
+
+ @Override
+ public int getType() {
+ return ORIGINATOR_SRGB_TYPE;
+ }
+}
base bgp-t:subsequent-address-family;
}
+ typedef srgb {
+ type uint32 {
+ range "0..16777215";
+ }
+ }
+
grouping label {
reference "https://tools.ietf.org/html/rfc3032#section-2.1";
description
}
key "route-key";
uses labeled-unicast;
- uses bgp-rib:route;
+ uses bgp-rib:route {
+ augment "attributes/bgp-prefix-sid/bgp-prefix-sid-tlvs/bgp-prefix-sid-tlv" {
+ case lu-label-index-tlv {
+ uses label-index-tlv;
+ }
+ case lu-originator-srgb-tlv {
+ uses originator-srgb-tlv;
+ }
+ }
+ }
}
}
}
uses labeled-unicast-routes;
}
}
+
+ grouping label-index-tlv {
+ reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02#section-4.1";
+ leaf label-index-tlv {
+ description "Value representing the index value in the SRGB space.";
+ type uint32;
+ mandatory true;
+ }
+ }
+
+ grouping originator-srgb-tlv {
+ reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02#section-4.3";
+ list srgb-value {
+ description "Originator SRGB: 3 octets of base followed by 3 octets of range.";
+ leaf base {
+ type srgb;
+ mandatory true;
+ }
+ leaf range {
+ type srgb;
+ mandatory true;
+ }
+ }
+ }
+
+ augment "/bgp-msg:update/bgp-msg:attributes/bgp-msg:bgp-prefix-sid/bgp-msg:bgp-prefix-sid-tlvs/bgp-msg:bgp-prefix-sid-tlv" {
+ reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02";
+ case lu-label-index-tlv {
+ uses label-index-tlv;
+ }
+ case lu-originator-srgb-tlv {
+ uses originator-srgb-tlv;
+ }
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.labeled.unicast;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.Srgb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlvBuilder;
+
+public final class BgpPrefixSidTlvsTest {
+
+ @Test
+ public void testLabelIndexParser() {
+ final LabelIndexTlvParser parser = new LabelIndexTlvParser();
+ final LuLabelIndexTlv tlv = new LuLabelIndexTlvBuilder().setLabelIndexTlv(333L).build();
+ final ByteBuf serialized = Unpooled.buffer(7);
+ final byte[] expected = new byte[] {0, 0, 0, 0, 0, 1, (byte)0x4d};
+ parser.serializeBgpPrefixSidTlv(tlv, serialized);
+ assertArrayEquals(expected, serialized.array());
+
+ assertEquals(tlv.getLabelIndexTlv(), parser.parseBgpPrefixSidTlv(serialized).getLabelIndexTlv());
+
+ assertEquals(1, parser.getType());
+ }
+
+ @Test
+ public void testOriginatorParser() {
+ final OriginatorSrgbTlvParser parser = new OriginatorSrgbTlvParser();
+ final List<SrgbValue> list = new ArrayList<SrgbValue>();
+
+ final Srgb srgb1 = new Srgb(1L);
+ final Srgb srgb2 = new Srgb(2L);
+ list.add(new SrgbValueBuilder().setBase(srgb1).setRange(srgb2).build());
+ list.add(new SrgbValueBuilder().setBase(srgb2).setRange(srgb1).build());
+
+ final LuOriginatorSrgbTlv tlv = new LuOriginatorSrgbTlvBuilder().setSrgbValue(list).build();
+ final ByteBuf serialized = Unpooled.buffer(14);
+ parser.serializeBgpPrefixSidTlv(tlv, serialized);
+ final byte[] expected = new byte[] {0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 0, 0, 1};
+ assertArrayEquals(expected, serialized.array());
+
+ final LuOriginatorSrgbTlv parsed = parser.parseBgpPrefixSidTlv(serialized);
+ assertEquals(tlv.getSrgbValue().size(), parsed.getSrgbValue().size());
+ assertTrue(tlv.getSrgbValue().get(0).getBase().equals(srgb1));
+ assertTrue(tlv.getSrgbValue().get(0).getRange().equals(srgb2));
+ assertTrue(tlv.getSrgbValue().get(1).getBase().equals(srgb2));
+ assertTrue(tlv.getSrgbValue().get(1).getRange().equals(srgb1));
+
+ assertEquals(3, parser.getType());
+ }
+}
mandatory true;
}
}
+ container bgp-prefix-sid {
+ list bgp-prefix-sid-tlvs {
+ choice bgp-prefix-sid-tlv {
+ reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02";
+ // to be augmented
+ }
+ }
+ }
}
}
import org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser;
import org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser;
import org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser;
+import org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser;
import org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser;
import org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser;
import org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Aigp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AsPath;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AtomicAggregate;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.BgpPrefixSid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.ClusterId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Communities;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.ExtendedCommunities;
}
private void registerAttributeParsers(final List<AutoCloseable> regs, final BGPExtensionProviderContext context) {
+ final BgpPrefixSidAttributeParser prefixSidAttributeParser = new BgpPrefixSidAttributeParser(context.getBgpPrefixSidTlvRegistry());
+ regs.add(context.registerAttributeSerializer(BgpPrefixSid.class, prefixSidAttributeParser));
+ regs.add(context.registerAttributeParser(BgpPrefixSidAttributeParser.TYPE, prefixSidAttributeParser));
+
final OriginAttributeParser originAttributeParser = new OriginAttributeParser();
regs.add(context.registerAttributeSerializer(Origin.class, originAttributeParser));
regs.add(context.registerAttributeParser(OriginAttributeParser.TYPE, originAttributeParser));
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.parser.impl.message.update;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
+import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.protocol.bgp.parser.spi.AttributeParser;
+import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.BgpPrefixSid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.BgpPrefixSidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.BgpPrefixSidTlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.BgpPrefixSidTlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+
+public final class BgpPrefixSidAttributeParser implements AttributeParser, AttributeSerializer {
+
+ public static final int TYPE = 40;
+
+ private final BgpPrefixSidTlvRegistry reg;
+
+ public BgpPrefixSidAttributeParser(final BgpPrefixSidTlvRegistry registry) {
+ this.reg = Preconditions.checkNotNull(registry);
+ }
+
+ @Override
+ public void serializeAttribute(final DataObject attribute, final ByteBuf byteAggregator) {
+ Preconditions.checkArgument(attribute instanceof Attributes, "Attribute parameter is not a PathAttribute object.");
+ final Attributes pathAttributes = (Attributes) attribute;
+ final BgpPrefixSid prefixSid = pathAttributes.getBgpPrefixSid();
+ if (prefixSid == null) {
+ return;
+ }
+ for (final BgpPrefixSidTlvs tlv : prefixSid.getBgpPrefixSidTlvs()) {
+ this.reg.serializeBgpPrefixSidTlv(tlv.getBgpPrefixSidTlv(), byteAggregator);
+ }
+ }
+
+ @Override
+ public void parseAttribute(final ByteBuf buffer, final AttributesBuilder builder) throws BGPDocumentedException, BGPParsingException {
+ final BgpPrefixSidBuilder sid = new BgpPrefixSidBuilder();
+ final List<BgpPrefixSidTlvs> tlvList = new ArrayList<BgpPrefixSidTlvs>();
+ while (buffer.isReadable()) {
+ final BgpPrefixSidTlv tlv = this.reg.parseBgpPrefixSidTlv(buffer.readUnsignedByte(), buffer);
+ tlvList.add(new BgpPrefixSidTlvsBuilder().setBgpPrefixSidTlv(tlv).build());
+ }
+ builder.setBgpPrefixSid(sid.setBgpPrefixSidTlvs(tlvList).build());
+ }
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.parser.impl.message.update;
+
+import static org.junit.Assert.assertEquals;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
+import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class BgpPrefixSidAttributeParserTest {
+
+ private final BgpPrefixSidTlvRegistry reg = Mockito.mock(BgpPrefixSidTlvRegistry.class);
+ private final BgpPrefixSidTlv tlv = Mockito.mock(BgpPrefixSidTlv.class);
+ private final BgpPrefixSidAttributeParser parser = new BgpPrefixSidAttributeParser(this.reg);
+ private final byte[] bytes = new byte[] {1, 2, 3};
+
+ @Before
+ public void setUp() {
+ Mockito.doReturn(this.tlv).when(this.reg).parseBgpPrefixSidTlv(Mockito.anyInt(), Mockito.any(ByteBuf.class));
+ Mockito.doNothing().when(this.reg).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+ }
+
+ @Test
+ public void testHandling() throws BGPDocumentedException, BGPParsingException {
+ final AttributesBuilder builder = new AttributesBuilder();
+ this.parser.parseAttribute(Unpooled.copiedBuffer(this.bytes), builder);
+ assertEquals(3, builder.getBgpPrefixSid().getBgpPrefixSidTlvs().size());
+
+ this.parser.serializeAttribute(builder.build(), Unpooled.EMPTY_BUFFER);
+ Mockito.verify(this.reg, Mockito.times(3)).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+ }
+}
SubsequentAddressFamilyRegistry getSubsequentAddressFamilyRegistry();
ExtendedCommunityRegistry getExtendedCommunityReistry();
+
+ BgpPrefixSidTlvRegistry getBgpPrefixSidTlvRegistry();
}
import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunityParser;
import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunitySerializer;
-
import org.opendaylight.protocol.util.ReferenceCache;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.ExtendedCommunity;
AutoCloseable registerMessageSerializer(Class<? extends Notification> messageClass, MessageSerializer serializer);
+ AutoCloseable registerBgpPrefixSidTlvParser(int tlvType, BgpPrefixSidTlvParser parser);
+
+ AutoCloseable registerBgpPrefixSidTlvSerializer(Class<? extends BgpPrefixSidTlv> tlvClass, BgpPrefixSidTlvSerializer serializer);
+
/**
* Each extension requires a specific NextHop handler. Therefore this method has been deprecated for
* the method which enforce user to register it.
@Deprecated
AutoCloseable registerNlriParser(Class<? extends AddressFamily> afi, Class<? extends SubsequentAddressFamily> safi, NlriParser parser);
- AutoCloseable registerNlriParser(Class<? extends AddressFamily> afi, Class<? extends SubsequentAddressFamily>
- safi, NlriParser parser, final NextHopParserSerializer nextHopHandler, final Class<? extends CNextHop> cNextHopClass,
- final Class<? extends CNextHop>... cNextHopClassList);
+ AutoCloseable registerNlriParser(Class<? extends AddressFamily> afi, Class<? extends SubsequentAddressFamily> safi,
+ NlriParser parser, final NextHopParserSerializer nextHopHandler, final Class<? extends CNextHop> cNextHopClass,
+ final Class<? extends CNextHop>... cNextHopClassList);
AutoCloseable registerNlriSerializer(Class<? extends DataObject> nlriClass, NlriSerializer serializer);
AutoCloseable registerParameterSerializer(Class<? extends BgpParameters> paramClass, ParameterSerializer serializer);
AutoCloseable registerExtendedCommunitySerializer(final Class<? extends ExtendedCommunity> extendedCommunityClass,
- final ExtendedCommunitySerializer serializer);
+ final ExtendedCommunitySerializer serializer);
AutoCloseable registerExtendedCommunityParser(final int type, final int subtype, final ExtendedCommunityParser parser);
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+/**
+ * Common interface for BGP prefix SID TLVs parser implementations.
+ */
+public interface BgpPrefixSidTlvParser {
+ /**
+ * Method for parsing specific types of TLVs from incoming buffer
+ *
+ * @param buffer with TLV bytes
+ * @return instance of specific TLV
+ */
+ BgpPrefixSidTlv parseBgpPrefixSidTlv(ByteBuf buffer);
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+/**
+ * BGP prefix SID TLVs registry for encoding/decoding
+ */
+public interface BgpPrefixSidTlvRegistry {
+ /**
+ * Decode incoming TLV
+ * @param type number of TLV
+ * @param buffer contains bytes of TLV
+ * @return instance of specific TLV
+ */
+ BgpPrefixSidTlv parseBgpPrefixSidTlv(int type, ByteBuf buffer);
+
+ /**
+ * Encode TLV instance
+ * @param tlv instance
+ * @param bytes encoded TLV outcome
+ */
+ void serializeBgpPrefixSidTlv(BgpPrefixSidTlv tlv, ByteBuf bytes);
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+/**
+ * Interface for BGP prefix SID TLVs serializers implementations.
+ */
+public interface BgpPrefixSidTlvSerializer {
+ /**
+ * Method for serializing specific types of TLVs from incoming buffer
+ *
+ * @param tlv instance
+ * @param bytes outcome serialized TLV
+ */
+ void serializeBgpPrefixSidTlv(BgpPrefixSidTlv tlv, ByteBuf bytes);
+
+ int getType();
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+
+public final class BgpPrefixSidTlvUtil {
+
+ private BgpPrefixSidTlvUtil() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Utilized method for serialization of BGP prefix SID TLV
+ *
+ * @param type of TLV
+ * @param value of TLV
+ * @param buffer output aggregator
+ */
+ public static void formatBgpPrefixSidTlv(final int type, final ByteBuf value, final ByteBuf buffer) {
+ buffer.writeByte(type);
+ buffer.writeShort(value.writerIndex());
+ buffer.writeBytes(value);
+ }
+}
private final SimpleParameterRegistry paramReg = new SimpleParameterRegistry();
private final SimpleNlriRegistry nlriReg = new SimpleNlriRegistry(this.afiReg, this.safiReg);
private final SimpleExtendedCommunityRegistry ecReg = new SimpleExtendedCommunityRegistry();
+ private final SimpleBgpPrefixSidTlvRegistry prefixSidTlvReg = new SimpleBgpPrefixSidTlvRegistry();
@Override
public final SimpleAddressFamilyRegistry getAddressFamilyRegistry() {
public SimpleExtendedCommunityRegistry getExtendedCommunityReistry() {
return this.ecReg;
}
+
+ @Override
+ public SimpleBgpPrefixSidTlvRegistry getBgpPrefixSidTlvRegistry() {
+ return this.prefixSidTlvReg;
+ }
}
import org.opendaylight.protocol.bgp.parser.spi.AttributeParser;
import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer;
import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser;
import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer;
import org.opendaylight.protocol.bgp.parser.spi.MessageParser;
import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunitySerializer;
import org.opendaylight.protocol.util.ReferenceCache;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.ExtendedCommunity;
@Override
public AutoCloseable registerNlriParser(final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi,
- final NlriParser parser, final NextHopParserSerializer nextHopParserSerializer, final Class<? extends
- CNextHop> cNextHopClass, final Class<? extends CNextHop>... cNextHopClassList) {
+ final NlriParser parser, final NextHopParserSerializer nextHopParserSerializer, final Class<? extends
+ CNextHop> cNextHopClass, final Class<? extends CNextHop>... cNextHopClassList) {
return this.getNlriRegistry().registerNlriParser(afi, safi, parser, nextHopParserSerializer, cNextHopClass);
}
@Override
public AutoCloseable registerExtendedCommunitySerializer(final Class<? extends ExtendedCommunity> extendedCommunityClass,
- final ExtendedCommunitySerializer serializer) {
+ final ExtendedCommunitySerializer serializer) {
return this.getExtendedCommunityReistry().registerExtendedCommunitySerializer(extendedCommunityClass, serializer);
}
public AutoCloseable registerExtendedCommunityParser(final int type, final int subtype, final ExtendedCommunityParser parser) {
return this.getExtendedCommunityReistry().registerExtendedCommunityParser(type, subtype, parser);
}
+
+ @Override
+ public AutoCloseable registerBgpPrefixSidTlvParser(final int tlvType, final BgpPrefixSidTlvParser parser) {
+ return this.getBgpPrefixSidTlvRegistry().registerBgpPrefixSidTlvParser(tlvType, parser);
+ }
+
+ @Override
+ public AutoCloseable registerBgpPrefixSidTlvSerializer(final Class<? extends BgpPrefixSidTlv> tlvClass, final BgpPrefixSidTlvSerializer serializer) {
+ return this.getBgpPrefixSidTlvRegistry().registerBgpPrefixSidTlvSerializer(tlvClass, serializer);
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2016 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.bgp.parser.spi.pojo;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvUtil;
+import org.opendaylight.protocol.concepts.HandlerRegistry;
+import org.opendaylight.protocol.util.Values;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+
+public final class SimpleBgpPrefixSidTlvRegistry implements BgpPrefixSidTlvRegistry {
+
+ private final HandlerRegistry<DataContainer, BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer> handlers = new HandlerRegistry<>();
+
+ AutoCloseable registerBgpPrefixSidTlvParser(final int tlvType, final BgpPrefixSidTlvParser parser) {
+ Preconditions.checkArgument(tlvType >= 0 && tlvType <= Values.UNSIGNED_BYTE_MAX_VALUE);
+ return this.handlers.registerParser(tlvType, parser);
+ }
+
+ AutoCloseable registerBgpPrefixSidTlvSerializer(final Class<? extends BgpPrefixSidTlv> tlvClass, final BgpPrefixSidTlvSerializer serializer) {
+ return this.handlers.registerSerializer(tlvClass, serializer);
+ }
+
+ @Override
+ public BgpPrefixSidTlv parseBgpPrefixSidTlv(final int type, final ByteBuf buffer) {
+ final BgpPrefixSidTlvParser parser = this.handlers.getParser(type);
+ if (parser == null) {
+ return null;
+ }
+ final int length = buffer.readUnsignedShort();
+ Preconditions.checkState(length <= buffer.readableBytes(), "Length of BGP prefix SID TLV exceeds readable bytes of income.");
+ return parser.parseBgpPrefixSidTlv(buffer.readBytes(length));
+ }
+
+ @Override
+ public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf bytes) {
+ final BgpPrefixSidTlvSerializer serializer = this.handlers.getSerializer(tlv.getImplementedInterface());
+ if (serializer == null) {
+ return;
+ }
+ final ByteBuf valueBuf = Unpooled.buffer();
+ serializer.serializeBgpPrefixSidTlv(tlv, valueBuf);
+ BgpPrefixSidTlvUtil.formatBgpPrefixSidTlv(serializer.getType(), valueBuf, bytes);
+ }
+
+}
import org.opendaylight.protocol.bgp.parser.spi.AttributeParser;
import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer;
import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser;
import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer;
import org.opendaylight.protocol.bgp.parser.spi.MessageParser;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParameters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
protected NextHopParserSerializer nextHopParserSerializer;
+ @Mock
+ protected BgpPrefixSidTlvParser sidTlvParser;
+ @Mock
+ protected BgpPrefixSidTlvSerializer sidTlvSerializer;
+
@Override
protected List<AutoCloseable> startImpl(final BGPExtensionProviderContext context) {
initMock();
regs.add(context.registerCapabilityParser(TYPE, this.capaParser));
regs.add(context.registerCapabilitySerializer(CParameters.class, this.capaSerializer));
+ regs.add(context.registerBgpPrefixSidTlvParser(TYPE, this.sidTlvParser));
+ regs.add(context.registerBgpPrefixSidTlvSerializer(BgpPrefixSidTlv.class, this.sidTlvSerializer));
+
regs.add(context.registerMessageParser(TYPE, this.msgParser));
regs.add(context.registerMessageSerializer(Notification.class, this.msgSerializer));
MockitoAnnotations.initMocks(this);
try {
Mockito.doNothing().when(this.attrParser).parseAttribute(Mockito.any(ByteBuf.class), Mockito.any(AttributesBuilder.class),
- Mockito.any(PeerSpecificParserConstraint.class));
+ Mockito.any(PeerSpecificParserConstraint.class));
Mockito.doReturn(EMPTY).when(this.attrParser).toString();
Mockito.doNothing().when(this.attrSerializer).serializeAttribute(Mockito.any(DataObject.class), Mockito.any(ByteBuf.class));
Mockito.doReturn(EMPTY).when(this.attrSerializer).toString();
Mockito.doNothing().when(this.capaSerializer).serializeCapability(Mockito.any(CParameters.class), Mockito.any(ByteBuf.class));
Mockito.doReturn(EMPTY).when(this.capaSerializer).toString();
+ Mockito.doReturn(null).when(this.sidTlvParser).parseBgpPrefixSidTlv(Mockito.any(ByteBuf.class));
+ Mockito.doReturn(EMPTY).when(this.sidTlvParser).toString();
+ Mockito.doNothing().when(this.sidTlvSerializer).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+ Mockito.doReturn(EMPTY).when(this.sidTlvSerializer).toString();
+ Mockito.doReturn(0).when(this.sidTlvSerializer).getType();
+
Mockito.doReturn(Mockito.mock(Notification.class)).when(this.msgParser).parseMessageBody(Mockito.any(ByteBuf.class), Mockito.anyInt(),
- Mockito.any(PeerSpecificParserConstraint.class));
+ Mockito.any(PeerSpecificParserConstraint.class));
Mockito.doReturn(EMPTY).when(this.msgParser).toString();
Mockito.doNothing().when(this.msgSerializer).serializeMessage(Mockito.any(Notification.class), Mockito.any(ByteBuf.class));
Mockito.doReturn(EMPTY).when(this.msgSerializer).toString();
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.util.Optional;
import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
import org.opendaylight.protocol.bgp.parser.spi.AttributeRegistry;
import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
import org.opendaylight.protocol.bgp.parser.spi.CapabilityRegistry;
import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
import org.opendaylight.protocol.bgp.parser.spi.MultiPathSupport;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
attrReg.serializeAttribute(Mockito.mock(DataObject.class), byteAggregator);
attrReg.parseAttributes(Unpooled.wrappedBuffer(attributeBytes), CONSTRAINT);
verify(this.activator.attrParser, times(1)).parseAttribute(Mockito.any(ByteBuf.class), Mockito.any(AttributesBuilder.class),
- Mockito.any(PeerSpecificParserConstraint.class));
+ Mockito.any(PeerSpecificParserConstraint.class));
verify(this.activator.attrSerializer, times(1)).serializeAttribute(Mockito.any(DataObject.class), Mockito.any(ByteBuf.class));
}
verify(this.activator.capaParser, times(1)).parseCapability(Mockito.any(ByteBuf.class));
}
+ @Test
+ public void testSimpleBgpPrefixSidTlvRegistry() {
+ final BgpPrefixSidTlvRegistry sidTlvReg = this.ctx.getBgpPrefixSidTlvRegistry();
+ final byte[] tlvBytes = {
+ 0x00, 0x03, 0x00, 0x00, 0x00
+ };
+
+ final BgpPrefixSidTlv tlv = mock(BgpPrefixSidTlv.class);
+ doReturn(BgpPrefixSidTlv.class).when(tlv).getImplementedInterface();
+
+ final ByteBuf buffer = Unpooled.buffer(tlvBytes.length);
+ sidTlvReg.serializeBgpPrefixSidTlv(tlv, buffer);
+ verify(this.activator.sidTlvSerializer, times(1)).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+
+ sidTlvReg.parseBgpPrefixSidTlv(BgpTestActivator.TYPE, Unpooled.wrappedBuffer(tlvBytes));
+ verify(this.activator.sidTlvParser, times(1)).parseBgpPrefixSidTlv(Mockito.any(ByteBuf.class));
+ }
+
@Test
public void testSimpleMessageRegistry() throws Exception {
final MessageRegistry msgRegistry = this.ctx.getMessageRegistry();
msgRegistry.serializeMessage(msg, buffer);
msgRegistry.parseMessage(Unpooled.wrappedBuffer(msgBytes), CONSTRAINT);
verify(this.activator.msgParser, times(1)).parseMessageBody(Mockito.any(ByteBuf.class), Mockito.anyInt(),
- Mockito.any(PeerSpecificParserConstraint.class));
+ Mockito.any(PeerSpecificParserConstraint.class));
verify(this.activator.msgSerializer, times(1)).serializeMessage(Mockito.any(Notification.class), Mockito.any(ByteBuf.class));
}
<feature name='odl-bgpcep-bgp-inet' version='${project.version}'>
<feature version='${project.version}'>odl-bgpcep-bgp-dependencies</feature>
<feature version='${config.version}'>odl-config-api</feature>
+ <feature version='${yangtools.version}'>odl-yangtools-yang-data</feature>
<bundle>mvn:org.opendaylight.bgpcep/bgp-parser-api/{{VERSION}}</bundle>
+ <bundle>mvn:org.opendaylight.bgpcep/bgp-parser-spi/{{VERSION}}</bundle>
<bundle>mvn:org.opendaylight.bgpcep/bgp-rib-api/{{VERSION}}</bundle>
<bundle>mvn:org.opendaylight.bgpcep/bgp-inet/{{VERSION}}</bundle>
<bundle>mvn:org.opendaylight.bgpcep/bgp-bmp-api/{{VERSION}}</bundle>