* 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.linkstate.attribute;
+package org.opendaylight.protocol.bgp.linkstate.impl.attribute;
+
+import static org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4PrefixSidParser.PREFIX_SID;
+import static org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6PrefixSidParser.IPV6_PREFIX_SID;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Multimap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
-import org.opendaylight.protocol.bgp.linkstate.attribute.sr.BindingSidLabelParser;
-import org.opendaylight.protocol.bgp.linkstate.attribute.sr.Ipv6SrPrefixAttributesParser;
-import org.opendaylight.protocol.bgp.linkstate.attribute.sr.RangeTlvParser;
-import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrPrefixAttributesParser;
+import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.BindingSidLabelParser;
+import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.Ipv6SrPrefixAttributesParser;
+import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.RangeTlvParser;
+import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.SrPrefixAttributesParser;
import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
import org.opendaylight.protocol.util.BitArray;
import org.opendaylight.protocol.util.ByteArray;
@VisibleForTesting
public final class PrefixAttributesParser {
+ /* Segment routing TLV */
+ public static final int BINDING_SID = 1160;
private static final Logger LOG = LoggerFactory.getLogger(PrefixAttributesParser.class);
-
- private PrefixAttributesParser() {
- throw new UnsupportedOperationException();
- }
-
private static final int ROUTE_TAG_LENGTH = 4;
private static final int EXTENDED_ROUTE_TAG_LENGTH = 8;
-
private static final int FLAGS_SIZE = 8;
private static final int UP_DOWN_BIT = 0;
private static final int OSPF_NO_UNICAST = 1;
private static final int OSPF_LOCAL_ADDRESS = 2;
private static final int OSPF_PROPAGATE_ADDRESS = 3;
-
/* Prefix Attribute TLVs */
private static final int IGP_FLAGS = 1152;
private static final int ROUTE_TAG = 1153;
private static final int PREFIX_METRIC = 1155;
private static final int FORWARDING_ADDRESS = 1156;
private static final int PREFIX_OPAQUE = 1157;
+ private static final int RANGE = 1159;
- /* Segment routing TLV */
- public static final int PREFIX_SID = 1158;
- public static final int IPV6_PREFIX_SID = 1169;
- public static final int RANGE = 1159;
- public static final int BINDING_SID = 1160;
+ private PrefixAttributesParser() {
+ throw new UnsupportedOperationException();
+ }
/**
* Parse prefix attributes.
private static void parseAttribute(final int key, final ByteBuf value, final ProtocolId protocolId, final PrefixAttributesBuilder builder, final List<RouteTag> routeTags, final List<ExtendedRouteTag> exRouteTags) {
switch (key) {
case IGP_FLAGS:
- final BitArray flags = BitArray.valueOf(value, FLAGS_SIZE);
- final boolean upDownBit = flags.get(UP_DOWN_BIT);
- final boolean ospfNoUnicast = flags.get(OSPF_NO_UNICAST);
- final boolean ospfLocalAddress = flags.get(OSPF_LOCAL_ADDRESS);
- final boolean ospfPropagateAddress = flags.get(OSPF_PROPAGATE_ADDRESS);
- builder.setIgpBits(new IgpBitsBuilder().setUpDown(new UpDown(upDownBit))
- .setIsIsUpDown(upDownBit)
- .setOspfNoUnicast(ospfNoUnicast)
- .setOspfLocalAddress(ospfLocalAddress)
- .setOspfPropagateNssa(ospfPropagateAddress)
- .build());
- LOG.debug("Parsed IGP flag (up/down bit) : {}", upDownBit);
+ parseIgpFags(builder, value);
break;
case ROUTE_TAG:
parseRouteTags(routeTags, value);
LOG.debug("Parsed SR Range: {}", range);
break;
case BINDING_SID:
- final SrBindingSidLabels label = BindingSidLabelParser.parseBindingSidLabel(value, protocolId);
- if (builder.getSrBindingSidLabels() != null) {
- builder.getSrBindingSidLabels().add(label);
- } else {
- final List<SrBindingSidLabels> labels = new ArrayList<SrBindingSidLabels>();
- labels.add(label);
- builder.setSrBindingSidLabels(labels);
- }
- LOG.debug("Parsed SR Binding SID {}", label);
+ parseBindingSid(builder, value, protocolId);
break;
default:
LOG.warn("TLV {} is not a valid prefix attribute, ignoring it", key);
}
}
+ private static void parseIgpFags(final PrefixAttributesBuilder builder, final ByteBuf 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)).setIsIsUpDown(upDownBit).setOspfNoUnicast(flags.get(OSPF_NO_UNICAST))
+ .setOspfLocalAddress(flags.get(OSPF_LOCAL_ADDRESS)).setOspfPropagateNssa(flags.get(OSPF_PROPAGATE_ADDRESS)).build());
+ LOG.debug("Parsed IGP flag (up/down bit) : {}", upDownBit);
+ }
+
+ private static void parseBindingSid(final PrefixAttributesBuilder builder, final ByteBuf value, final ProtocolId protocolId) {
+ final List<SrBindingSidLabels> labels;
+ if (builder.getSrBindingSidLabels() != null) {
+ labels = builder.getSrBindingSidLabels();
+ } else {
+ labels = new ArrayList<>();
+ builder.setSrBindingSidLabels(labels);
+ }
+ final SrBindingSidLabels label = BindingSidLabelParser.parseBindingSidLabel(value, protocolId);
+ labels.add(label);
+ LOG.debug("Parsed SR Binding SID {}", label);
+ }
+
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));
}
serializeRouteTags(prefixAtrributes.getRouteTags(), byteAggregator);
serializeExtendedRouteTags(prefixAtrributes.getExtendedTags(), byteAggregator);
- if (prefixAtrributes.getPrefixMetric() != null) {
- TlvUtil.writeTLV(PREFIX_METRIC, Unpooled.copyInt(prefixAtrributes.getPrefixMetric().getValue().intValue()), byteAggregator);
- }
+ serializePrefixMetric(prefixAtrributes.getPrefixMetric(), byteAggregator);
serializeForwardingAddress(prefixAtrributes.getOspfForwardingAddress(), byteAggregator);
- if (prefixAtrributes.getSrPrefix() != null) {
- final ByteBuf buffer = Unpooled.buffer();
- SrPrefixAttributesParser.serializeSrPrefix(prefixAtrributes.getSrPrefix(), buffer);
- TlvUtil.writeTLV(PREFIX_SID, buffer, byteAggregator);
+ serializeSrPrefix(prefixAtrributes.getSrPrefix(), byteAggregator);
+ serializeIpv6SrPrefix(prefixAtrributes.getIpv6SrPrefix(), byteAggregator);
+ serializeSrRange(prefixAtrributes.getSrRange(), byteAggregator);
+ serializeSrBindingLabel(prefixAtrributes.getSrBindingSidLabels(), byteAggregator);
+ }
+
+ private static void serializeSrBindingLabel(final List<SrBindingSidLabels> srBindingSidLabels, final ByteBuf byteAggregator) {
+ if (srBindingSidLabels != null) {
+ for (final SrBindingSidLabels bindingSid : srBindingSidLabels) {
+ final ByteBuf sidBuffer = Unpooled.buffer();
+ BindingSidLabelParser.serializeBindingSidAttributes(bindingSid.getWeight(), bindingSid.getFlags(), bindingSid.getBindingSubTlvs(), sidBuffer);
+ TlvUtil.writeTLV(PrefixAttributesParser.BINDING_SID, sidBuffer, byteAggregator);
+ }
+ }
+ }
+
+ private static void serializeSrRange(final SrRange srRange, final ByteBuf byteAggregator) {
+ if (srRange != null) {
+ final ByteBuf sidBuffer = Unpooled.buffer();
+ RangeTlvParser.serializeSrRange(srRange, sidBuffer);
+ TlvUtil.writeTLV(RANGE, sidBuffer, byteAggregator);
}
- if (prefixAtrributes.getIpv6SrPrefix() != null) {
+ }
+
+ private static void serializeIpv6SrPrefix(final Ipv6SrPrefix ipv6SrPrefix, final ByteBuf byteAggregator) {
+ if (ipv6SrPrefix != null) {
final ByteBuf buffer = Unpooled.buffer();
- Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefixAtrributes.getIpv6SrPrefix(), buffer);
+ Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(ipv6SrPrefix, buffer);
TlvUtil.writeTLV(IPV6_PREFIX_SID, buffer, byteAggregator);
}
- if (prefixAtrributes.getSrRange() != null) {
- final ByteBuf sidBuffer = Unpooled.buffer();
- RangeTlvParser.serializeSrRange(prefixAtrributes.getSrRange(), sidBuffer);
- TlvUtil.writeTLV(RANGE, sidBuffer, byteAggregator);
+ }
+
+ private static void serializeSrPrefix(final SrPrefix srPrefix, final ByteBuf byteAggregator) {
+ if (srPrefix != null) {
+ final ByteBuf buffer = Unpooled.buffer();
+ SrPrefixAttributesParser.serializeSrPrefix(srPrefix, buffer);
+ TlvUtil.writeTLV(PREFIX_SID, buffer, byteAggregator);
}
- if (prefixAtrributes.getSrBindingSidLabels() != null) {
- BindingSidLabelParser.serializeBindingSidLabels(prefixAtrributes.getSrBindingSidLabels(), byteAggregator, BINDING_SID);
+ }
+
+ private static void serializePrefixMetric(final IgpMetric prefixMetric, final ByteBuf byteAggregator) {
+ if (prefixMetric != null) {
+ TlvUtil.writeTLV(PREFIX_METRIC, Unpooled.copyInt(prefixMetric.getValue().intValue()), byteAggregator);
}
}