import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlriBuilder;
}
output.writeBytes(nlriOutput);
}
+
+ @Override
+ public boolean convertMpReachToMpUnReach(final MpReachNlri mpReachNlri, final MpUnreachNlriBuilder builder) {
+ final WithdrawnRoutesBuilder withdrawnRoutes = new WithdrawnRoutesBuilder(builder.getWithdrawnRoutes());
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.update.attributes.mp
+ .unreach.nlri.withdrawn.routes.destination.type.DestinationEvpnCaseBuilder destinationType =
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.update
+ .attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationEvpnCaseBuilder(
+ (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329
+ .update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type
+ .DestinationEvpnCase) withdrawnRoutes.getDestinationType());
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.update.attributes.mp
+ .unreach.nlri.withdrawn.routes.destination.type.destination.evpn._case.DestinationEvpnBuilder
+ destinationEvpn = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn
+ .rev180329.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.evpn._case
+ .DestinationEvpnBuilder(destinationType.getDestinationEvpn());
+ List<EvpnDestination> evpnDestination = destinationEvpn.getEvpnDestination();
+ if (evpnDestination == null) {
+ evpnDestination = new ArrayList<>();
+ }
+ evpnDestination.addAll(((DestinationEvpnCase) mpReachNlri.getAdvertizedRoutes().getDestinationType())
+ .getDestinationEvpn().getEvpnDestination());
+ builder.setWithdrawnRoutes(withdrawnRoutes
+ .setDestinationType(destinationType
+ .setDestinationEvpn(destinationEvpn
+ .setEvpnDestination(evpnDestination)
+ .build())
+ .build())
+ .build());
+ return true;
+ }
}
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlriBuilder;
*/
void parseNlri(@Nonnull ByteBuf nlri, @Nonnull MpUnreachNlriBuilder builder,
@Nullable PeerSpecificParserConstraint constraint) throws BGPParsingException;
+
+ /**
+ * Convert MP_REACH attribute and merge it to existing MpUnreachNlriBuilder.
+ *
+ * @param mpReachNlri MP_REACH attribute to be converted
+ * @param builder to which converted routing information should be added
+ * @return True if the conversion was successful, false otherwise
+ */
+ default boolean convertMpReachToMpUnReach(@Nonnull final MpReachNlri mpReachNlri,
+ @Nonnull final MpUnreachNlriBuilder builder) {
+ return false;
+ }
}
package org.opendaylight.protocol.bgp.parser.spi;
import io.netty.buffer.ByteBuf;
+import java.util.Optional;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.opendaylight.protocol.bgp.parser.BGPParsingException;
* @return Iterable of NLRI serializers.
*/
Iterable<NlriSerializer> getSerializers();
+
+ /**
+ * Convert MP_REACH attribute to MP_UNREACH attribute and merge it with original one if it exists.
+ *
+ * <p>
+ * The default implementation rejects the conversion.
+ *
+ * @param mpReachNlri MP_REACH attribute to be converted
+ * @param mpUnreachNlri original MP_UNREACH attribute
+ * @return resulting MP_UNREACH attribute after conversion
+ */
+ Optional<MpUnreachNlri> convertMpReachToMpUnReach(@Nonnull MpReachNlri mpReachNlri,
+ @Nullable MpUnreachNlri mpUnreachNlri);
}
import io.netty.buffer.Unpooled;
import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
+import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.opendaylight.bgp.concepts.NextHopUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.SubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.CNextHop;
}
return builder.build();
}
+
+ @Override
+ public Optional<MpUnreachNlri> convertMpReachToMpUnReach(final MpReachNlri mpReachNlri,
+ final MpUnreachNlri mpUnreachNlri) {
+ if (mpUnreachNlri == null) {
+ return Optional.of(new MpUnreachNlriBuilder()
+ .setWithdrawnRoutes(new WithdrawnRoutesBuilder()
+ .setDestinationType(mpReachNlri.getAdvertizedRoutes().getDestinationType())
+ .build())
+ .build());
+ }
+
+ final BgpTableType key = createKey(mpUnreachNlri.getAfi(), mpUnreachNlri.getSafi());
+ final NlriParser parser = this.handlers.get(key);
+ if (parser == null) {
+ LOG.debug("Parser for {} not found", key);
+ return Optional.empty();
+ }
+
+ final MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder(mpUnreachNlri);
+ return parser.convertMpReachToMpUnReach(mpReachNlri, builder) ? Optional.of(builder.build()) : Optional.empty();
+ }
}