import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import java.util.ArrayList;
-import java.util.BitSet;
import java.util.List;
import java.util.Map.Entry;
import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrPrefixAttributesParser;
import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
+import org.opendaylight.protocol.util.BitArray;
import org.opendaylight.protocol.util.ByteArray;
import org.opendaylight.protocol.util.Ipv4Util;
import org.opendaylight.protocol.util.Ipv6Util;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ExtendedRouteTag;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.IgpBits.UpDown;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.RouteTag;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.LinkStateAttribute;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.PrefixAttributesCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.PrefixAttributesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.prefix.attributes._case.PrefixAttributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.path.attribute.link.state.attribute.prefix.attributes._case.PrefixAttributesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.IgpBitsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.LinkStateAttribute;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.PrefixAttributesCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.PrefixAttributesCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.prefix.attributes._case.PrefixAttributes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.prefix.attributes._case.PrefixAttributesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IgpMetric;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final int ROUTE_TAG_LENGTH = 4;
private static final int EXTENDED_ROUTE_TAG_LENGTH = 8;
- private static final int UP_DOWN_BIT = 7;
+
+ private static final int FLAGS_SIZE = 8;
+ private static final int UP_DOWN_BIT = 0;
/* Prefix Attribute TLVs */
private static final int IGP_FLAGS = 1152;
LOG.trace("Prefix attribute TLV {}", key);
switch (key) {
case IGP_FLAGS:
- final BitSet flags = BitSet.valueOf(ByteArray.readAllBytes(value));
+ final BitArray flags = BitArray.valueOf(value, FLAGS_SIZE);
final boolean upDownBit = flags.get(UP_DOWN_BIT);
builder.setIgpBits(new IgpBitsBuilder().setUpDown(new UpDown(upDownBit)).build());
LOG.debug("Parsed IGP flag (up/down bit) : {}", upDownBit);
break;
case ROUTE_TAG:
- while (value.isReadable()) {
- final RouteTag routeTag = new RouteTag(ByteArray.readBytes(value, ROUTE_TAG_LENGTH));
- routeTags.add(routeTag);
- LOG.debug("Parsed Route Tag: {}", routeTag);
- }
+ parseRouteTags(routeTags, value);
break;
case EXTENDED_ROUTE_TAG:
- while (value.isReadable()) {
- final ExtendedRouteTag exRouteTag = new ExtendedRouteTag(ByteArray.readBytes(value, EXTENDED_ROUTE_TAG_LENGTH));
- exRouteTags.add(exRouteTag);
- LOG.debug("Parsed Extended Route Tag: {}", exRouteTag);
- }
+ parseExtendedRouteTags(exRouteTags, value);
break;
case PREFIX_METRIC:
final IgpMetric metric = new IgpMetric(value.readUnsignedInt());
LOG.debug("Parsed FWD Address: {}", fwdAddress);
break;
case PREFIX_OPAQUE:
- LOG.debug("Parsed Opaque value: {}, not preserving it", ByteBufUtil.hexDump(value));
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Parsed Opaque value: {}, not preserving it", ByteBufUtil.hexDump(value));
+ }
break;
case PREFIX_SID:
final SrPrefix prefix = SrPrefixAttributesParser.parseSrPrefix(value);
return new PrefixAttributesCaseBuilder().setPrefixAttributes(builder.build()).build();
}
+ private static void parseRouteTags(final List<RouteTag> routeTags, final ByteBuf value) {
+ while (value.isReadable()) {
+ final RouteTag routeTag = new RouteTag(ByteArray.readBytes(value, ROUTE_TAG_LENGTH));
+ routeTags.add(routeTag);
+ LOG.debug("Parsed Route Tag: {}", routeTag);
+ }
+ }
+
+ private static void parseExtendedRouteTags(final List<ExtendedRouteTag> exRouteTags, final ByteBuf value) {
+ while (value.isReadable()) {
+ final ExtendedRouteTag exRouteTag = new ExtendedRouteTag(ByteArray.readBytes(value, EXTENDED_ROUTE_TAG_LENGTH));
+ exRouteTags.add(exRouteTag);
+ LOG.debug("Parsed Extended Route Tag: {}", exRouteTag);
+ }
+ }
+
private static IpAddress parseForwardingAddress(final ByteBuf value) {
IpAddress fwdAddress = null;
switch (value.readableBytes()) {
static void serializePrefixAttributes(final PrefixAttributesCase prefixAttributesCase, final ByteBuf byteAggregator) {
final PrefixAttributes prefixAtrributes = prefixAttributesCase.getPrefixAttributes();
if (prefixAtrributes.getIgpBits() != null) {
- final BitSet igpBit = new BitSet();
- final Boolean bit = prefixAtrributes.getIgpBits().getUpDown().isUpDown();
- if (bit != null) {
- igpBit.set(UP_DOWN_BIT, bit);
- }
- TlvUtil.writeTLV(IGP_FLAGS, Unpooled.wrappedBuffer(igpBit.toByteArray()), byteAggregator);
+ final BitArray igpBit = new BitArray(FLAGS_SIZE);
+ igpBit.set(UP_DOWN_BIT, prefixAtrributes.getIgpBits().getUpDown().isUpDown());
+ TlvUtil.writeTLV(IGP_FLAGS, Unpooled.wrappedBuffer(igpBit.array()), byteAggregator);
}
- if (prefixAtrributes.getRouteTags() != null) {
- final ByteBuf routeTagsBuf = Unpooled.buffer();
- for (final RouteTag routeTag : prefixAtrributes.getRouteTags()) {
- routeTagsBuf.writeBytes(routeTag.getValue());
- }
- TlvUtil.writeTLV(ROUTE_TAG, routeTagsBuf, byteAggregator);
- }
- final List<ExtendedRouteTag> routeTagList = prefixAtrributes.getExtendedTags();
- if (routeTagList != null) {
- final ByteBuf extendedBuf = Unpooled.buffer();
- for (final ExtendedRouteTag extendedRouteTag : routeTagList) {
- extendedBuf.writeBytes(extendedRouteTag.getValue());
- }
- TlvUtil.writeTLV(EXTENDED_ROUTE_TAG, extendedBuf, byteAggregator);
- }
- serializeForwardingAddress(prefixAtrributes.getOspfForwardingAddress(), byteAggregator);
+ serializeRouteTags(prefixAtrributes.getRouteTags(), byteAggregator);
+ serializeExtendedRouteTags(prefixAtrributes.getExtendedTags(), byteAggregator);
if (prefixAtrributes.getPrefixMetric() != null) {
TlvUtil.writeTLV(PREFIX_METRIC, Unpooled.copyInt(prefixAtrributes.getPrefixMetric().getValue().intValue()), byteAggregator);
}
+ serializeForwardingAddress(prefixAtrributes.getOspfForwardingAddress(), byteAggregator);
if (prefixAtrributes.getSrPrefix() != null) {
final ByteBuf b = Unpooled.buffer();
SrPrefixAttributesParser.serializeSrPrefix(prefixAtrributes.getSrPrefix(), b);
}
+ private static void serializeRouteTags(final List<RouteTag> routeTags, final ByteBuf byteAggregator) {
+ if (routeTags != null) {
+ final ByteBuf routeTagsBuf = Unpooled.buffer();
+ for (final RouteTag routeTag : routeTags) {
+ routeTagsBuf.writeBytes(routeTag.getValue());
+ }
+ TlvUtil.writeTLV(ROUTE_TAG, routeTagsBuf, byteAggregator);
+ }
+ }
+
+ private static void serializeExtendedRouteTags(final List<ExtendedRouteTag> exRouteTags, final ByteBuf byteAggregator) {
+ if (exRouteTags != null) {
+ final ByteBuf extendedBuf = Unpooled.buffer();
+ for (final ExtendedRouteTag exRouteTag : exRouteTags) {
+ extendedBuf.writeBytes(exRouteTag.getValue());
+ }
+ TlvUtil.writeTLV(EXTENDED_ROUTE_TAG, extendedBuf, byteAggregator);
+ }
+ }
+
private static void serializeForwardingAddress(final IpAddress forwardingAddress, final ByteBuf byteAggregator) {
if (forwardingAddress != null) {
final ByteBuf ospfBuf = Unpooled.buffer();