import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv6RouterIdentifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkProtectionType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.MplsProtocolMask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSidBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIdBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.UnreservedBandwidth;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.UnreservedBandwidthBuilder;
private static final int LINK_NAME = 1098;
private static final int SR_ADJ_ID = 1099;
private static final int SR_LAN_ADJ_ID = 1100;
+ private static final int PEER_SID_CODE = 1036;
+ private static final int PEER_SET_SID_CODE = 1037;
/**
* Parse Link Attributes.
LOG.debug("Parsed Link Name : {}", name);
break;
case SR_ADJ_ID:
- final SrAdjId srAdjId = SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value);
+ final SrAdjId srAdjId = new SrAdjIdBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build();
builder.setSrAdjId(srAdjId);
LOG.debug("Parsed Adjacency Segment Identifier :{}", srAdjId);
break;
builder.setSrLanAdjId(srLanAdjId);
LOG.debug("Parsed Adjacency Segment Identifier :{}", srLanAdjId);
break;
+ case PEER_SID_CODE:
+ final PeerSid peerSid = new PeerSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build();
+ builder.setPeerSid(peerSid);
+ LOG.debug("Parsed Peer Segment Identifier :{}", peerSid);
+ break;
+ case PEER_SET_SID_CODE:
+ final PeerSetSid peerSetSid = new PeerSetSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build();
+ builder.setPeerSetSid(peerSetSid);
+ LOG.debug("Parsed Peer Set Sid :{}", peerSetSid);
+ break;
default:
LOG.warn("TLV {} is not a valid link attribute, ignoring it", key);
}
if (linkAttributes.getSrLanAdjId() != null) {
TlvUtil.writeTLV(SR_LAN_ADJ_ID, SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(linkAttributes.getSrLanAdjId()), byteAggregator);
}
+ if (linkAttributes.getPeerSid() != null) {
+ TlvUtil.writeTLV(PEER_SID_CODE, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getPeerSid()), byteAggregator);
+ }
+ if (linkAttributes.getPeerSetSid() != null) {
+ TlvUtil.writeTLV(PEER_SET_SID_CODE, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getPeerSetSid()), byteAggregator);
+ }
LOG.trace("Finished serializing Link Attributes");
}
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
+import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
import org.opendaylight.protocol.util.BitArray;
import org.opendaylight.protocol.util.ByteArray;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIdBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjIdBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.AdjacencyFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.AdjacencySegmentIdentifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabel;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.Weight;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public final class SrLinkAttributesParser {
+ private static final Logger LOG = LoggerFactory.getLogger(SrLinkAttributesParser.class);
private static final int ISO_SYSTEM_ID_SIZE = 6;
private static final int LOCAL_FLAG = 3;
private static final int SET_FLAG = 4;
private static final int FLAGS_SIZE = 8;
+ private static final int SID_TYPE = 1;
private SrLinkAttributesParser() {
throw new UnsupportedOperationException();
}
- public static SrAdjId parseAdjacencySegmentIdentifier(final ByteBuf buffer) {
- if (!buffer.isReadable()) {
- return new SrAdjIdBuilder().build();
+ public static AdjacencySegmentIdentifier parseAdjacencySegmentIdentifier(final ByteBuf buffer) {
+ final AdjacencyFlags adjFlags;
+ final Weight weight;
+ final SidLabel sidValue;
+ if (buffer.isReadable()) {
+ final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
+ adjFlags = new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG));
+ weight = new Weight(buffer.readUnsignedByte());
+ sidValue = parseSidSubTlv(buffer);
+ } else {
+ adjFlags = null;
+ weight = null;
+ sidValue = null;
}
- final SrAdjIdBuilder srAdjIdBuilder = new SrAdjIdBuilder();
- final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
- srAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG)));
- srAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
- srAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer)));
- return srAdjIdBuilder.build();
+ return new AdjacencySegmentIdentifier() {
+
+ @Override
+ public Class<? extends DataContainer> getImplementedInterface() {
+ return AdjacencySegmentIdentifier.class;
+ }
+
+ @Override
+ public Weight getWeight() {
+ return weight;
+ }
+
+ @Override
+ public SidLabel getSid() {
+ return sidValue;
+ }
+
+ @Override
+ public AdjacencyFlags getFlags() {
+ return adjFlags;
+ }
+ };
}
- public static ByteBuf serializeAdjacencySegmentIdentifier(final SrAdjId srAdjId) {
+ public static ByteBuf serializeAdjacencySegmentIdentifier(final AdjacencySegmentIdentifier srAdjId) {
final ByteBuf value = Unpooled.buffer();
final AdjacencyFlags srAdjIdFlags = srAdjId.getFlags();
final BitArray flags = new BitArray(FLAGS_SIZE);
flags.set(SET_FLAG, srAdjIdFlags.isSetFlag());
flags.toByteBuf(value);
value.writeByte(srAdjId.getWeight().getValue());
- value.writeBytes(srAdjId.getSid().getValue());
+ TlvUtil.writeSrTLV(SID_TYPE, Unpooled.wrappedBuffer(srAdjId.getSid().getValue()), value);
return value;
}
srLanAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG)));
srLanAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
srLanAdjIdBuilder.setIsoSystemId(new IsoSystemIdentifier(ByteArray.readBytes(buffer, ISO_SYSTEM_ID_SIZE)));
- srLanAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer)));
+ srLanAdjIdBuilder.setSid(new SidLabel(parseSidSubTlv(buffer)));
return srLanAdjIdBuilder.build();
}
+ private static SidLabel parseSidSubTlv(final ByteBuf buffer) {
+ final SidLabel sidValue;
+ final int type = buffer.readUnsignedByte();
+ final int length = buffer.readUnsignedByte();
+ sidValue = new SidLabel(ByteArray.readAllBytes(buffer.readSlice(length)));
+ if (type != SID_TYPE) {
+ LOG.warn("Unexpected type in SID/label Sub-TLV, expected {}, actual {}, ignoring it", SID_TYPE, type);
+ return null;
+ }
+ return sidValue;
+ }
+
public static ByteBuf serializeLanAdjacencySegmentIdentifier(final SrLanAdjId srLanAdjId) {
final ByteBuf value = Unpooled.buffer();
final AdjacencyFlags srAdjIdFlags = srLanAdjId.getFlags();
flags.toByteBuf(value);
value.writeByte(srLanAdjId.getWeight().getValue());
value.writeBytes(srLanAdjId.getIsoSystemId().getValue());
- value.writeBytes(srLanAdjId.getSid().getValue());
+ TlvUtil.writeSrTLV(SID_TYPE, Unpooled.wrappedBuffer(srLanAdjId.getSid().getValue()), value);
return value;
}
}
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-
import com.google.common.collect.Lists;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
0x46, 0x43, 0x50, 0, 0x04, 0x43, 0, 0x20, 0x46, 0x43, 0x50, 0, 0x46, 0x43, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x44, 0, 0x08, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x45, 0, 0x02, 0, 0x08, 0x04, 0x46, 0, 0x01,
(byte) 0xc0, 0x04, 0x47, 0, 0x03, 0, 0, 0x0a, 0x04, 0x48, 0, 0x08, 0x12, 0x34, 0x56, 0x78, 0x10, 0x30, 0x50, 0x70, 0x04, 0x4a,
- 0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, (byte) 0x88, 0, 0x01, 0x0a };
+ 0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32,
+ 0x04, 0x0c, 0, 0x08, (byte)0x80, 0x05, 0x01, 0x04, 0x0a, 0x0b, 0x0c, 0x0d,
+ 0x04, 0x0d, 0, 0x08, (byte)0x80, 0x05, 0x01, 0x04, 0x0a, 0x0b, 0x0c, 0x0e,
+ 0x04, (byte) 0x88, 0, 0x01, 0x0a };
private static final byte[] NODE_ATTR = { 0x01, 0x07, 0, 0x04, 0, 0x2a, 0, 0x2b, 0x04, 0, 0, 0x01, (byte) 0xb0, 0x04, 0x02, 0,
0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, 0x03, 0, 0x01, 0x72, 0x04, 0x03, 0, 0x01, 0x73, 0x04, 0x04, 0, 0x04,
assertEquals(2, ls.getSharedRiskLinkGroups().size());
assertEquals(305419896, ls.getSharedRiskLinkGroups().get(0).getValue().intValue());
assertEquals("12K-2", ls.getLinkName());
+ assertTrue(ls.getPeerSid().getFlags().isAddressFamily());
+ assertFalse(ls.getPeerSid().getFlags().isBackup());
+ assertTrue(ls.getPeerSetSid().getFlags().isAddressFamily());
+ assertFalse(ls.getPeerSetSid().getFlags().isBackup());
+ assertArrayEquals(new byte[] {10, 11, 12, 13}, ls.getPeerSid().getSid().getValue());
+ assertEquals(new Short("5"), ls.getPeerSid().getWeight().getValue());
+ assertArrayEquals(new byte[] {10, 11, 12, 14}, ls.getPeerSetSid().getSid().getValue());
+ assertEquals(new Short("5"), ls.getPeerSetSid().getWeight().getValue());
//serialization
final ByteBuf buff = Unpooled.buffer();
@Test
public void testSrAdjId() {
- final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
+ final byte[] tested = { (byte)-80, 10, 1, 24, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
final SrAdjId srAdjId = new SrAdjIdBuilder().setFlags(new AdjacencyFlags(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)).setWeight(new Weight((short) 10)).setSid(new SidLabel(sidLabel)).build();
final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
- assertEquals(srAdjId, SrLinkAttributesParser.parseAdjacencySegmentIdentifier(Unpooled.wrappedBuffer(tested)));
+ assertEquals(srAdjId, new SrAdjIdBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(Unpooled.wrappedBuffer(tested))).build());
assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
}
@Test
public void testSrLanAdjId() {
- final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
+ final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 1, 24, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
final SrLanAdjId srLanAdjId = new SrLanAdjIdBuilder().setFlags(new AdjacencyFlags(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)).setWeight(new Weight((short)10)).setIsoSystemId(new IsoSystemIdentifier(systemId)).setSid(new SidLabel(sidLabel)).build();