2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.protocol.bgp.state;
11 import com.google.common.primitives.UnsignedInteger;
12 import com.google.common.primitives.UnsignedLong;
13 import java.math.BigDecimal;
14 import java.math.BigInteger;
15 import java.util.ArrayList;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Objects;
19 import java.util.Optional;
21 import java.util.stream.Collectors;
22 import org.eclipse.jdt.annotation.NonNull;
23 import org.eclipse.jdt.annotation.Nullable;
24 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
25 import org.opendaylight.protocol.bgp.rib.spi.state.BGPAfiSafiState;
26 import org.opendaylight.protocol.bgp.rib.spi.state.BGPErrorHandlingState;
27 import org.opendaylight.protocol.bgp.rib.spi.state.BGPGracelfulRestartState;
28 import org.opendaylight.protocol.bgp.rib.spi.state.BGPLlGracelfulRestartState;
29 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerMessagesState;
30 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
31 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
32 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
33 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
34 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
35 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
36 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.BgpNeighborState.SessionState;
37 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.bgp.neighbor.prefix.counters_state.PrefixesBuilder;
38 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestart;
39 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestartBuilder;
40 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
41 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
42 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandling;
43 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
44 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.State;
45 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.StateBuilder;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.NeighborsBuilder;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ADDPATHS;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ASN32;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.BgpCapability;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.GRACEFULRESTART;
59 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.MPBGP;
60 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ROUTEREFRESH;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Timeticks;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.BgpNeighborStateAugmentation;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.BgpNeighborStateAugmentationBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiGracefulRestartStateAugmentation;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiGracefulRestartStateAugmentationBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiStateAugmentation;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAfiSafiStateAugmentationBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborErrorHandlingStateAugmentation;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborErrorHandlingStateAugmentationBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborGracefulRestartStateAugmentation;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborGracefulRestartStateAugmentationBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborStateAugmentation;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborStateAugmentationBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTimersStateAugmentation;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTimersStateAugmentationBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportStateAugmentation;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportStateAugmentationBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.MessagesBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.Received;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.ReceivedBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.Sent;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.SentBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
87 import org.opendaylight.yangtools.yang.common.Uint32;
90 * Util for create OpenConfig Neighbor with corresponding openConfig state.
92 public final class NeighborUtil {
93 private static final long TIMETICK_ROLLOVER_VALUE = UnsignedInteger.MAX_VALUE.longValue() + 1;
95 private NeighborUtil() {
100 * Build a Openconfig Neighbors container with all Neighbors Stats from a list of
103 * @param peerStats List of BGPPeerState containing Neighbor state counters
104 * @param bgpTableTypeRegistry BGP TableType Registry
105 * @return Openconfig Neighbors Stats
107 public static @Nullable Neighbors buildNeighbors(final @NonNull List<BGPPeerState> peerStats,
108 final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
109 if (peerStats.isEmpty()) {
112 return new NeighborsBuilder().setNeighbor(peerStats.stream()
113 .filter(Objects::nonNull)
114 .map(neighbor -> buildNeighbor(neighbor, bgpTableTypeRegistry))
115 .collect(Collectors.toList())).build();
119 * Build a list of neighbors containing Operational State from a list of BGPPeerState.
121 * @param neighbor containing Neighbor state counters
122 * @return neighbor containing Neighbor State
124 public static @NonNull Neighbor buildNeighbor(final @NonNull BGPPeerState neighbor,
125 final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
126 return new NeighborBuilder()
127 .setNeighborAddress(convertIpAddress(neighbor.getNeighborAddress()))
128 .setState(buildNeighborState(neighbor.getBGPSessionState(), neighbor.getBGPPeerMessagesState()))
129 .setTimers(buildTimer(neighbor.getBGPTimersState()))
130 .setTransport(buildTransport(neighbor.getBGPTransportState()))
131 .setErrorHandling(buildErrorHandling(neighbor.getBGPErrorHandlingState()))
132 .setGracefulRestart(buildGracefulRestart(neighbor.getBGPGracelfulRestart()))
133 .setAfiSafis(buildAfisSafis(neighbor, bgpTableTypeRegistry))
137 private static IpAddress convertIpAddress(final IpAddressNoZone addr) {
141 final Ipv4AddressNoZone ipv4 = addr.getIpv4AddressNoZone();
143 return new IpAddress(ipv4);
145 return new IpAddress(addr.getIpv6AddressNoZone());
149 * Builds Neighbor State from BGPPeerState counters.
151 * @param sessionState BGPPeerState containing Operational state counters
152 * @param bgpPeerMessagesState message state
153 * @return Neighbor State
155 public static @Nullable State buildNeighborState(final @Nullable BGPSessionState sessionState,
156 final BGPPeerMessagesState bgpPeerMessagesState) {
157 if (sessionState == null && bgpPeerMessagesState == null) {
160 final StateBuilder builder = new StateBuilder();
161 if (sessionState != null) {
162 builder.addAugmentation(NeighborStateAugmentation.class, buildCapabilityState(sessionState));
164 if (bgpPeerMessagesState != null) {
165 builder.addAugmentation(BgpNeighborStateAugmentation.class, buildMessageState(bgpPeerMessagesState));
167 return builder.build();
171 * Builds Neighbor State from BGPPeerState counters.
173 * @param neighbor BGPPeerState containing Operational state counters
174 * @return Timer State
176 public static @Nullable Timers buildTimer(final @Nullable BGPTimersState neighbor) {
177 if (neighbor == null) {
180 // convert neighbor uptime which is in milliseconds to time-ticks which is
181 // hundredth of a second, and handle roll-over scenario
182 final long uptimeTicks = neighbor.getUpTime() / 10 % TIMETICK_ROLLOVER_VALUE;
183 final NeighborTimersStateAugmentation timerState = new NeighborTimersStateAugmentationBuilder()
184 .setNegotiatedHoldTime(BigDecimal.valueOf(neighbor.getNegotiatedHoldTime()))
185 .setUptime(new Timeticks(Uint32.valueOf(uptimeTicks))).build();
187 return new TimersBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
188 .neighbor.group.timers.StateBuilder()
189 .addAugmentation(NeighborTimersStateAugmentation.class, timerState).build()).build();
193 * Builds Transport State from BGPTransportState counters.
195 * @param neighbor BGPPeerState containing Operational state counters
196 * @return Transport State
198 public static @Nullable Transport buildTransport(final @Nullable BGPTransportState neighbor) {
199 if (neighbor == null) {
202 final NeighborTransportStateAugmentation transportState = new NeighborTransportStateAugmentationBuilder()
203 .setLocalPort(neighbor.getLocalPort()).setRemoteAddress(convertIpAddress(neighbor.getRemoteAddress()))
204 .setRemotePort(neighbor.getRemotePort()).build();
206 return new TransportBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
207 .bgp.neighbor.group.transport.StateBuilder()
208 .addAugmentation(NeighborTransportStateAugmentation.class, transportState).build()).build();
212 * Builds Error Handling State from BGPPeerState counters.
214 * @param errorHandlingState BGPErrorHandlingState containing ErrorHandlingState Operational state counters
215 * @return Error Handling State
217 public static ErrorHandling buildErrorHandling(final @Nullable BGPErrorHandlingState errorHandlingState) {
218 if (errorHandlingState == null) {
221 return new ErrorHandlingBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
222 .rev151009.bgp.neighbor.group.error.handling.StateBuilder()
223 .addAugmentation(NeighborErrorHandlingStateAugmentation.class,
224 buildErrorHandlingState(errorHandlingState.getErroneousUpdateReceivedCount())).build()).build();
228 * Builds Graceful Restart containing Graceful Restart State from BGPGracelfulRestartState counters.
230 * @param neighbor BGPPeerState containing Operational state counters
231 * @return Graceful Restart
233 public static @NonNull GracefulRestart buildGracefulRestart(final @NonNull BGPGracelfulRestartState neighbor) {
234 final NeighborGracefulRestartStateAugmentation gracefulRestartState =
235 new NeighborGracefulRestartStateAugmentationBuilder()
236 .setLocalRestarting(neighbor.isLocalRestarting())
237 .setPeerRestartTime(neighbor.getPeerRestartTime())
238 .setMode(neighbor.getMode())
239 .setPeerRestarting(neighbor.isPeerRestarting()).build();
241 return new GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
242 .rev151009.bgp.graceful.restart.graceful.restart.StateBuilder()
243 .addAugmentation(NeighborGracefulRestartStateAugmentation.class, gracefulRestartState).build()).build();
247 * Builds Neighbor Afi Safi containing AfiSafi State.
249 * @param neighbor BGPPeerState containing Operational state counters
252 public static AfiSafis buildAfisSafis(final @NonNull BGPPeerState neighbor,
253 final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
254 return new AfiSafisBuilder().setAfiSafi(buildAfisSafisState(neighbor.getBGPAfiSafiState(),
255 bgpTableTypeRegistry)).build();
259 * Builds Neighbor State containing Capabilities State, session State.
261 * @return Neighbor State
263 public static NeighborStateAugmentation buildCapabilityState(final @NonNull BGPSessionState neighbor) {
265 final List<Class<? extends BgpCapability>> supportedCapabilities = buildSupportedCapabilities(neighbor);
266 SessionState sessionState = null;
267 switch (neighbor.getSessionState()) {
269 sessionState = SessionState.IDLE;
272 sessionState = SessionState.ESTABLISHED;
275 sessionState = SessionState.OPENCONFIRM;
279 return new NeighborStateAugmentationBuilder().setSupportedCapabilities(supportedCapabilities)
280 .setSessionState(sessionState).build();
284 * Builds Bgp Neighbor State containing Message State.
286 * @return BgpNeighborState containing Message State
288 public static @NonNull BgpNeighborStateAugmentation buildMessageState(
289 final @NonNull BGPPeerMessagesState neighbor) {
290 return new BgpNeighborStateAugmentationBuilder()
291 .setMessages(new MessagesBuilder()
292 .setReceived(buildMessagesReceived(neighbor))
293 .setSent(buildMessagesSent(neighbor)).build()).build();
296 private static Received buildMessagesReceived(final @NonNull BGPPeerMessagesState neighbor) {
297 return new ReceivedBuilder()
298 .setUPDATE(toBigInteger(neighbor.getUpdateMessagesReceivedCount()))
299 .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesReceivedCount()))
303 public static BigInteger toBigInteger(final long updateReceivedCounter) {
304 return UnsignedLong.valueOf(updateReceivedCounter).bigIntegerValue();
307 private static Sent buildMessagesSent(final @NonNull BGPPeerMessagesState neighbor) {
308 return new SentBuilder()
309 .setUPDATE(toBigInteger(neighbor.getUpdateMessagesSentCount()))
310 .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesSentCount()))
315 * Builds Neighbor Error Handling State.
317 * @param erroneousUpdateCount erroneous Update Count
318 * @return Error Handling State
320 public static @NonNull NeighborErrorHandlingStateAugmentation buildErrorHandlingState(
321 final long erroneousUpdateCount) {
322 return new NeighborErrorHandlingStateAugmentationBuilder()
323 .setErroneousUpdateMessages(erroneousUpdateCount).build();
327 * Build List of afi safi containing State per Afi Safi.
329 * @return AfiSafi List
331 public static @NonNull List<AfiSafi> buildAfisSafisState(final @NonNull BGPAfiSafiState neighbor,
332 final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
333 final Set<TablesKey> afiSafiJoin = new HashSet<>(neighbor.getAfiSafisAdvertized());
334 afiSafiJoin.addAll(neighbor.getAfiSafisReceived());
335 return afiSafiJoin.stream().map(tableKey -> buildAfiSafi(neighbor, tableKey, bgpTableTypeRegistry))
336 .filter(Objects::nonNull)
337 .collect(Collectors.toList());
340 private static AfiSafi buildAfiSafi(final @NonNull BGPAfiSafiState neighbor,
341 final @NonNull TablesKey tablesKey, final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
342 final Optional<Class<? extends AfiSafiType>> afiSafi = bgpTableTypeRegistry.getAfiSafiType(tablesKey);
343 return afiSafi.map(aClass -> new AfiSafiBuilder().setAfiSafiName(aClass)
344 .setState(buildAfiSafiState(neighbor, tablesKey, neighbor.isAfiSafiSupported(tablesKey)))
345 .setGracefulRestart(buildAfiSafiGracefulRestartState(neighbor, tablesKey)).build()).orElse(null);
349 private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
350 .safi.list.afi.safi.State buildAfiSafiState(final @NonNull BGPAfiSafiState neighbor,
351 final @NonNull TablesKey tablesKey, final boolean afiSafiSupported) {
352 final NeighborAfiSafiStateAugmentationBuilder builder = new NeighborAfiSafiStateAugmentationBuilder();
353 builder.setActive(afiSafiSupported);
354 if (afiSafiSupported) {
355 builder.setPrefixes(new PrefixesBuilder()
356 .setInstalled(neighbor.getPrefixesInstalledCount(tablesKey))
357 .setReceived(neighbor.getPrefixesReceivedCount(tablesKey))
358 .setSent(neighbor.getPrefixesSentCount(tablesKey)).build());
360 return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
361 .safi.list.afi.safi.StateBuilder().addAugmentation(NeighborAfiSafiStateAugmentation.class,
362 builder.build()).build();
365 private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
366 .safi.list.afi.safi.GracefulRestart buildAfiSafiGracefulRestartState(
367 final @NonNull BGPLlGracelfulRestartState neighbor, final @NonNull TablesKey tablesKey) {
368 final NeighborAfiSafiGracefulRestartStateAugmentation builder =
369 new NeighborAfiSafiGracefulRestartStateAugmentationBuilder()
370 .setAdvertised(neighbor.isGracefulRestartAdvertized(tablesKey))
371 .setReceived(neighbor.isGracefulRestartReceived(tablesKey))
372 .setLlAdvertised(neighbor.isLlGracefulRestartAdvertised(tablesKey))
373 .setLlReceived(neighbor.isLlGracefulRestartReceived(tablesKey))
374 .setLlStaleTimer(Uint32.valueOf(neighbor.getLlGracefulRestartTimer(tablesKey))).build();
375 return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
376 .safi.list.afi.safi.GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig
377 .net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.StateBuilder()
378 .addAugmentation(NeighborAfiSafiGracefulRestartStateAugmentation.class, builder).build()).build();
382 * Builds List of BgpCapability supported capabilities.
384 * @return List containing supported capabilities
386 public static @NonNull List<Class<? extends BgpCapability>> buildSupportedCapabilities(
387 final @NonNull BGPSessionState neighbor) {
388 final List<Class<? extends BgpCapability>> supportedCapabilities = new ArrayList<>();
389 if (neighbor.isAddPathCapabilitySupported()) {
390 supportedCapabilities.add(ADDPATHS.class);
392 if (neighbor.isAsn32CapabilitySupported()) {
393 supportedCapabilities.add(ASN32.class);
395 if (neighbor.isGracefulRestartCapabilitySupported()) {
396 supportedCapabilities.add(GRACEFULRESTART.class);
398 if (neighbor.isMultiProtocolCapabilitySupported()) {
399 supportedCapabilities.add(MPBGP.class);
401 if (neighbor.isRouterRefreshCapabilitySupported()) {
402 supportedCapabilities.add(ROUTEREFRESH.class);
404 return supportedCapabilities;