X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgp%2Fparser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fbgp%2Fparser%2Fimpl%2Fmessage%2Fupdate%2FMPUnreachAttributeParser.java;h=d4461265b051b9c82a478288991fe763a1505f47;hb=3c135df98a164d4207775de96a5217a392d1949e;hp=6ac50915baccf06fa30417dbcc86fb8c5b80070c;hpb=e24af0968e3fb059bfff670e21ae1cbd28a81f52;p=bgpcep.git diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java index 6ac50915ba..d4461265b0 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java @@ -10,29 +10,23 @@ package org.opendaylight.protocol.bgp.parser.impl.message.update; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import org.opendaylight.protocol.bgp.parser.AttributeFlags; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; import org.opendaylight.protocol.bgp.parser.BGPError; import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer; +import org.opendaylight.protocol.bgp.parser.spi.AttributeUtil; import org.opendaylight.protocol.bgp.parser.spi.NlriRegistry; -import org.opendaylight.protocol.concepts.Ipv4Util; -import org.opendaylight.protocol.concepts.Ipv6Util; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.DestinationIpv4Case; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.DestinationIpv6Case; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlri; +import org.opendaylight.protocol.bgp.parser.spi.NlriSerializer; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri; import org.opendaylight.yangtools.yang.binding.DataObject; public final class MPUnreachAttributeParser implements AttributeParser, AttributeSerializer { public static final int TYPE = 15; - public static final int MAX_ATTR_LENGTH_FOR_SINGLE_BYTE = 127; private final NlriRegistry reg; @@ -41,55 +35,29 @@ public final class MPUnreachAttributeParser implements AttributeParser, Attribut } @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { + public void parseAttribute(final ByteBuf buffer, final AttributesBuilder builder) throws BGPDocumentedException { try { - final PathAttributes2 a = new PathAttributes2Builder().setMpUnreachNlri(this.reg.parseMpUnreach(buffer)).build(); - builder.addAugmentation(PathAttributes2.class, a); + final Attributes2 a = new Attributes2Builder().setMpUnreachNlri(this.reg.parseMpUnreach(buffer)).build(); + builder.addAugmentation(Attributes2.class, a); } catch (final BGPParsingException e) { throw new BGPDocumentedException("Could not parse MP_UNREACH_NLRI", BGPError.OPT_ATTR_ERROR, e); } } @Override - public void serializeAttribute(DataObject attribute, ByteBuf byteAggregator) { - PathAttributes pathAttributes = (PathAttributes) attribute; - PathAttributes2 pathAttributes2 = pathAttributes.getAugmentation(PathAttributes2.class); + public void serializeAttribute(final DataObject attribute, final ByteBuf byteAggregator) { + Preconditions.checkArgument(attribute instanceof Attributes, "Attribute parameter is not a PathAttribute object."); + final Attributes pathAttributes = (Attributes) attribute; + final Attributes2 pathAttributes2 = pathAttributes.getAugmentation(Attributes2.class); if (pathAttributes2 == null) { return; } - MpUnreachNlri mpUnreachNlri = pathAttributes2.getMpUnreachNlri(); - ByteBuf unreachBuffer = Unpooled.buffer(); + final MpUnreachNlri mpUnreachNlri = pathAttributes2.getMpUnreachNlri(); + final ByteBuf unreachBuffer = Unpooled.buffer(); this.reg.serializeMpUnReach(mpUnreachNlri, unreachBuffer); - - if (mpUnreachNlri.getWithdrawnRoutes() != null) { - if (mpUnreachNlri.getWithdrawnRoutes().getDestinationType() instanceof DestinationIpv4Case) { - DestinationIpv4Case destinationIpv4Case = (DestinationIpv4Case) mpUnreachNlri.getWithdrawnRoutes().getDestinationType(); - if (destinationIpv4Case.getDestinationIpv4().getIpv4Prefixes() != null) { - for (Ipv4Prefix ipv4Prefix : destinationIpv4Case.getDestinationIpv4().getIpv4Prefixes()) { - unreachBuffer.writeByte(Ipv4Util.getPrefixLength(ipv4Prefix.getValue())); - unreachBuffer.writeBytes(Ipv4Util.bytesForPrefixByPrefixLength(ipv4Prefix)); - } - } - } - if (mpUnreachNlri.getWithdrawnRoutes().getDestinationType() instanceof DestinationIpv6Case) { - DestinationIpv6Case destinationIpv6Case = (DestinationIpv6Case) mpUnreachNlri.getWithdrawnRoutes().getDestinationType(); - if (destinationIpv6Case.getDestinationIpv6().getIpv6Prefixes() != null) { - for (Ipv6Prefix ipv6Prefix : destinationIpv6Case.getDestinationIpv6().getIpv6Prefixes()) { - unreachBuffer.writeByte(Ipv4Util.getPrefixLength(ipv6Prefix.getValue())); - unreachBuffer.writeBytes(Ipv6Util.bytesForPrefixByPrefixLength(ipv6Prefix)); - } - } - } - } - if (unreachBuffer.writerIndex() > MAX_ATTR_LENGTH_FOR_SINGLE_BYTE) { - byteAggregator.writeByte(AttributeFlags.OPTIONAL | AttributeFlags.EXTENDED); - byteAggregator.writeByte(TYPE); - byteAggregator.writeShort(unreachBuffer.writerIndex()); - } else { - byteAggregator.writeByte(AttributeFlags.OPTIONAL); - byteAggregator.writeByte(TYPE); - byteAggregator.writeByte(unreachBuffer.writerIndex()); + for (final NlriSerializer nlriSerializer : this.reg.getSerializers()){ + nlriSerializer.serializeAttribute(attribute,unreachBuffer); } - byteAggregator.writeBytes(unreachBuffer); + AttributeUtil.formatAttribute(AttributeUtil.OPTIONAL, TYPE, unreachBuffer, byteAggregator); } }