final int key = entry.getKey();
final ByteBuf value = entry.getValue();
LOG.trace("Prefix attribute TLV {}", key);
- switch (key) {
- case IGP_FLAGS:
- 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:
- parseRouteTags(routeTags, value);
- break;
- case EXTENDED_ROUTE_TAG:
- parseExtendedRouteTags(exRouteTags, value);
- break;
- case PREFIX_METRIC:
- final IgpMetric metric = new IgpMetric(value.readUnsignedInt());
- builder.setPrefixMetric(metric);
- LOG.debug("Parsed Metric: {}", metric);
- break;
- case FORWARDING_ADDRESS:
- final IpAddress fwdAddress = parseForwardingAddress(value);
- builder.setOspfForwardingAddress(fwdAddress);
- LOG.debug("Parsed FWD Address: {}", fwdAddress);
- break;
- case PREFIX_OPAQUE:
- if (LOG.isDebugEnabled()) {
- LOG.debug("Parsed Opaque value: {}, not preserving it", ByteBufUtil.hexDump(value));
- }
- break;
- case PREFIX_SID:
- final SrPrefix prefix = SrPrefixAttributesParser.parseSrPrefix(value);
- builder.setSrPrefix(prefix);
- LOG.debug("Parsed SR Prefix: {}", prefix);
- break;
- case RANGE:
- final SrRange range = RangeTlvParser.parseSrRange(value);
- builder.setSrRange(range);
- LOG.debug("Parsed SR Range: {}", range);
- break;
- case BINDING_SID:
- final SrBindingSidLabel label = BindingSidLabelParser.parseBindingSidLabel(value);
- builder.setSrBindingSidLabel(label);
- LOG.debug("Parsed SR Binding SID {}", label);
- break;
- default:
- LOG.warn("TLV {} is not a valid prefix attribute, ignoring it", key);
- }
+ parseAttribute(key, value, builder, routeTags, exRouteTags);
}
LOG.trace("Finished parsing Prefix Attributes.");
builder.setRouteTags(routeTags);
return new PrefixAttributesCaseBuilder().setPrefixAttributes(builder.build()).build();
}
+ private static void parseAttribute(final int key, final ByteBuf value, 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);
+ builder.setIgpBits(new IgpBitsBuilder().setUpDown(new UpDown(upDownBit)).build());
+ LOG.debug("Parsed IGP flag (up/down bit) : {}", upDownBit);
+ break;
+ case ROUTE_TAG:
+ parseRouteTags(routeTags, value);
+ break;
+ case EXTENDED_ROUTE_TAG:
+ parseExtendedRouteTags(exRouteTags, value);
+ break;
+ case PREFIX_METRIC:
+ final IgpMetric metric = new IgpMetric(value.readUnsignedInt());
+ builder.setPrefixMetric(metric);
+ LOG.debug("Parsed Metric: {}", metric);
+ break;
+ case FORWARDING_ADDRESS:
+ final IpAddress fwdAddress = parseForwardingAddress(value);
+ builder.setOspfForwardingAddress(fwdAddress);
+ LOG.debug("Parsed FWD Address: {}", fwdAddress);
+ break;
+ case PREFIX_OPAQUE:
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Parsed Opaque value: {}, not preserving it", ByteBufUtil.hexDump(value));
+ }
+ break;
+ case PREFIX_SID:
+ final SrPrefix prefix = SrPrefixAttributesParser.parseSrPrefix(value);
+ builder.setSrPrefix(prefix);
+ LOG.debug("Parsed SR Prefix: {}", prefix);
+ break;
+ case RANGE:
+ final SrRange range = RangeTlvParser.parseSrRange(value);
+ builder.setSrRange(range);
+ LOG.debug("Parsed SR Range: {}", range);
+ break;
+ case BINDING_SID:
+ final SrBindingSidLabel label = BindingSidLabelParser.parseBindingSidLabel(value);
+ builder.setSrBindingSidLabel(label);
+ LOG.debug("Parsed SR Binding SID {}", label);
+ break;
+ default:
+ LOG.warn("TLV {} is not a valid prefix attribute, ignoring it", key);
+ }
+ }
+
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));
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class BindingSidLabelParser {
+public final class BindingSidLabelParser {
private static final Logger LOG = LoggerFactory.getLogger(BindingSidLabelParser.class);
final int length = buffer.readUnsignedShort();
final ByteBuf slice = buffer.readSlice(length);
final BindingSubTlvsBuilder builder = new BindingSubTlvsBuilder();
- switch (type) {
- case SidLabelIndexParser.SID_TYPE:
- final SidLabelIndex sid = SidLabelIndexParser.parseSidLabelIndex(Size.forValue(slice.readableBytes()), slice);
- builder.setBindingSubTlv(new SidLabelCaseBuilder()
- .setSidLabelIndex(sid).build());
- break;
- case PrefixAttributesParser.PREFIX_SID:
- final SrPrefix prefix = SrPrefixAttributesParser.parseSrPrefix(slice);
- builder.setBindingSubTlv(new PrefixSidCaseBuilder()
- .setAlgorithm(prefix.getAlgorithm())
- .setFlags(prefix.getFlags())
- .setSidLabelIndex(prefix.getSidLabelIndex()).build());
- break;
- case ERO_METRIC:
- builder.setBindingSubTlv(new EroMetricCaseBuilder()
- .setEroMetric(new TeMetric(slice.readUnsignedInt())).build());
- break;
- case ERO_IPV4:
- final Ipv4EroCase ipv4Ero = parseIpv4EroCase(slice);
- builder.setBindingSubTlv(new Ipv4EroCaseBuilder()
- .setAddress(ipv4Ero.getAddress())
- .setLoose(ipv4Ero.isLoose()).build());
- break;
- case BACKUP_ERO_IPV4:
- final Ipv4EroCase ipv4Backup = parseIpv4EroCase(slice);
- builder.setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
- .setAddress(ipv4Backup.getAddress())
- .setLoose(ipv4Backup.isLoose()).build());
- break;
- case ERO_IPV6:
- final Ipv6EroCase ipv6ero = parseIpv6EroCase(slice);
- builder.setBindingSubTlv(new Ipv6EroCaseBuilder()
- .setAddress(ipv6ero.getAddress())
- .setLoose(ipv6ero.isLoose()).build());
- break;
- case BACKUP_ERO_IPV6:
- final Ipv6EroCase ipv6backup = parseIpv6EroCase(slice);
- builder.setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
- .setAddress(ipv6backup.getAddress())
- .setLoose(ipv6backup.isLoose()).build());
- break;
- case UNNUMBERED_ERO:
- final UnnumberedInterfaceIdEroCase unnumbered = parseUnnumberedEroCase(slice);
- builder.setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
- .setLoose(unnumbered.isLoose())
- .setRouterId(unnumbered.getRouterId())
- .setInterfaceId(unnumbered.getInterfaceId()).build());
- break;
- case BACKUP_UNNUMBERED_ERO:
- final UnnumberedInterfaceIdEroCase unnumberedBackup = parseUnnumberedEroCase(slice);
- builder.setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
- .setLoose(unnumberedBackup.isLoose())
- .setRouterId(unnumberedBackup.getRouterId())
- .setInterfaceId(unnumberedBackup.getInterfaceId()).build());
- break;
- default:
- LOG.info("Unknown binding sub Tlv type {}", type);
- break;
- }
+ parseSubTlv(type, slice, builder);
subTlvs.add(builder.build());
}
return subTlvs;
}
+ private static void parseSubTlv(final int type, final ByteBuf slice, final BindingSubTlvsBuilder builder) {
+ switch (type) {
+ case SidLabelIndexParser.SID_TYPE:
+ final SidLabelIndex sid = SidLabelIndexParser.parseSidLabelIndex(Size.forValue(slice.readableBytes()), slice);
+ builder.setBindingSubTlv(new SidLabelCaseBuilder()
+ .setSidLabelIndex(sid).build());
+ break;
+ case PrefixAttributesParser.PREFIX_SID:
+ final SrPrefix prefix = SrPrefixAttributesParser.parseSrPrefix(slice);
+ builder.setBindingSubTlv(new PrefixSidCaseBuilder()
+ .setAlgorithm(prefix.getAlgorithm())
+ .setFlags(prefix.getFlags())
+ .setSidLabelIndex(prefix.getSidLabelIndex()).build());
+ break;
+ case ERO_METRIC:
+ builder.setBindingSubTlv(new EroMetricCaseBuilder()
+ .setEroMetric(new TeMetric(slice.readUnsignedInt())).build());
+ break;
+ case ERO_IPV4:
+ final Ipv4EroCase ipv4Ero = parseIpv4EroCase(slice);
+ builder.setBindingSubTlv(new Ipv4EroCaseBuilder()
+ .setAddress(ipv4Ero.getAddress())
+ .setLoose(ipv4Ero.isLoose()).build());
+ break;
+ case BACKUP_ERO_IPV4:
+ final Ipv4EroCase ipv4Backup = parseIpv4EroCase(slice);
+ builder.setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
+ .setAddress(ipv4Backup.getAddress())
+ .setLoose(ipv4Backup.isLoose()).build());
+ break;
+ case ERO_IPV6:
+ final Ipv6EroCase ipv6ero = parseIpv6EroCase(slice);
+ builder.setBindingSubTlv(new Ipv6EroCaseBuilder()
+ .setAddress(ipv6ero.getAddress())
+ .setLoose(ipv6ero.isLoose()).build());
+ break;
+ case BACKUP_ERO_IPV6:
+ final Ipv6EroCase ipv6backup = parseIpv6EroCase(slice);
+ builder.setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
+ .setAddress(ipv6backup.getAddress())
+ .setLoose(ipv6backup.isLoose()).build());
+ break;
+ case UNNUMBERED_ERO:
+ final UnnumberedInterfaceIdEroCase unnumbered = parseUnnumberedEroCase(slice);
+ builder.setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
+ .setLoose(unnumbered.isLoose())
+ .setRouterId(unnumbered.getRouterId())
+ .setInterfaceId(unnumbered.getInterfaceId()).build());
+ break;
+ case BACKUP_UNNUMBERED_ERO:
+ final UnnumberedInterfaceIdEroCase unnumberedBackup = parseUnnumberedEroCase(slice);
+ builder.setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
+ .setLoose(unnumberedBackup.isLoose())
+ .setRouterId(unnumberedBackup.getRouterId())
+ .setInterfaceId(unnumberedBackup.getInterfaceId()).build());
+ break;
+ default:
+ LOG.info("Unknown binding sub Tlv type {}", type);
+ break;
+ }
+ }
+
private static Ipv4EroCase parseIpv4EroCase(final ByteBuf buffer) {
final Ipv4EroCaseBuilder builder = new Ipv4EroCaseBuilder();
final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);