BUG 5031:
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / impl / attribute / PrefixAttributesParser.java
similarity index 75%
rename from bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java
rename to bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/impl/attribute/PrefixAttributesParser.java
index bf63919bf60e28702fb45a45dd4d2e5b87341480..e70bbaa2ebee7567db9bd2e9d02a3e6951ee5104 100644 (file)
@@ -5,7 +5,10 @@
  * 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;
@@ -15,10 +18,10 @@ import io.netty.buffer.Unpooled;
 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;
@@ -47,21 +50,16 @@ import org.slf4j.LoggerFactory;
 @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;
@@ -69,12 +67,11 @@ public final class PrefixAttributesParser {
     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.
@@ -102,18 +99,7 @@ public final class PrefixAttributesParser {
     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);
@@ -152,21 +138,34 @@ public final class PrefixAttributesParser {
             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));
@@ -211,27 +210,51 @@ public final class PrefixAttributesParser {
         }
         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);
         }
     }