BUG-5032: BGP Operational State
[bgpcep.git] / bgp / openconfig-state / src / main / java / org / opendaylight / protocol / bgp / state / NeighborUtil.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.protocol.bgp.state;
10
11 import com.google.common.primitives.UnsignedLong;
12 import java.math.BigDecimal;
13 import java.math.BigInteger;
14 import java.util.ArrayList;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Objects;
18 import java.util.Optional;
19 import java.util.Set;
20 import java.util.stream.Collectors;
21 import javax.annotation.Nonnull;
22 import javax.annotation.Nullable;
23 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
24 import org.opendaylight.protocol.bgp.rib.spi.state.BGPAfiSafiState;
25 import org.opendaylight.protocol.bgp.rib.spi.state.BGPErrorHandlingState;
26 import org.opendaylight.protocol.bgp.rib.spi.state.BGPGracelfulRestartState;
27 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerMessagesState;
28 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
29 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
30 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
31 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
32 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
33 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
34 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.BgpNeighborState.SessionState;
35 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.bgp.neighbor.prefix.counters_state.PrefixesBuilder;
36 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestart;
37 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestartBuilder;
38 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
39 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
40 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandling;
41 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
42 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.State;
43 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.StateBuilder;
44 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
45 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.NeighborsBuilder;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ADDPATHS;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ASN32;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.BgpCapability;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.GRACEFULRESTART;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.MPBGP;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ROUTEREFRESH;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Timeticks;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.BgpNeighborStateAugmentation;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.BgpNeighborStateAugmentationBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborAfiSafiGracefulRestartStateAugmentation;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborAfiSafiGracefulRestartStateAugmentationBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborAfiSafiStateAugmentation;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborAfiSafiStateAugmentationBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborErrorHandlingStateAugmentation;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborErrorHandlingStateAugmentationBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborGracefulRestartStateAugmentation;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborGracefulRestartStateAugmentationBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborStateAugmentation;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborStateAugmentationBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborTimersStateAugmentation;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborTimersStateAugmentationBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborTransportStateAugmentation;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.NeighborTransportStateAugmentationBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.MessagesBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.Received;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.ReceivedBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.Sent;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.SentBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
82
83 /**
84  * Util for create OpenConfig Neighbor with corresponding openConfig state.
85  */
86 public final class NeighborUtil {
87     private NeighborUtil() {
88         throw new UnsupportedOperationException();
89     }
90
91     /**
92      * Build a Openconfig Neighbors container with all Neighbors Stats from a list of
93      * BGPPeerGroupState
94      *
95      * @param peerStats List of BGPPeerState containing Neighbor state counters
96      * @param bgpTableTypeRegistry BGP TableType Registry
97      * @return Openconfig Neighbors Stats
98      */
99     @Nullable
100     public static Neighbors buildNeighbors(@Nonnull final List<BGPPeerState> peerStats,
101         @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
102         if (peerStats.isEmpty()) {
103             return null;
104         }
105         return new NeighborsBuilder().setNeighbor(peerStats.stream()
106             .filter(Objects::nonNull)
107             .map(neighbor -> buildNeighbor(neighbor, bgpTableTypeRegistry))
108             .collect(Collectors.toList())).build();
109     }
110
111     /**
112      * Build a list of neighbors containing Operational State from a list of BGPPeerState
113      *
114      * @param neighbor containing Neighbor state counters
115      * @return neighbor containing Neighbor State
116      */
117     @Nullable
118     public static Neighbor buildNeighbor(@Nonnull final BGPPeerState neighbor,
119         @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
120         return new NeighborBuilder()
121             .setNeighborAddress(neighbor.getNeighborAddress())
122             .setState(buildNeighborState(neighbor.getBGPSessionState(), neighbor.getBGPPeerMessagesState()))
123             .setTimers(buildTimer(neighbor.getBGPTimersState()))
124             .setTransport(buildTransport(neighbor.getBGPTransportState()))
125             .setErrorHandling(buildErrorHandling(neighbor.getBGPErrorHandlingState()))
126             .setGracefulRestart(buildGracefulRestart(neighbor.getBGPGracelfulRestart()))
127             .setAfiSafis(buildAfisSafis(neighbor, bgpTableTypeRegistry))
128             .build();
129     }
130
131     /**
132      * Builds Neighbor State from BGPPeerState counters
133      *
134      * @param sessionState BGPPeerState containing Operational state counters
135      * @param bgpPeerMessagesState
136      * @return Neighbor State
137      */
138     @Nullable
139     public static State buildNeighborState(@Nullable final BGPSessionState sessionState,
140         final BGPPeerMessagesState bgpPeerMessagesState) {
141         if (sessionState == null && bgpPeerMessagesState == null) {
142             return null;
143         }
144         final StateBuilder builder = new StateBuilder();
145         if (sessionState != null) {
146             builder.addAugmentation(NeighborStateAugmentation.class, buildCapabilityState(sessionState));
147         }
148         if (bgpPeerMessagesState != null) {
149             builder.addAugmentation(BgpNeighborStateAugmentation.class, buildMessageState(bgpPeerMessagesState));
150         }
151         return builder.build();
152     }
153
154     /**
155      * Builds Neighbor State from BGPPeerState counters
156      *
157      * @param neighbor BGPPeerState containing Operational state counters
158      * @return Timer State
159      */
160     @Nullable
161     public static Timers buildTimer(@Nullable final BGPTimersState neighbor) {
162         if (neighbor == null) {
163             return null;
164         }
165         final NeighborTimersStateAugmentation timerState = new NeighborTimersStateAugmentationBuilder()
166             .setNegotiatedHoldTime(BigDecimal.valueOf(neighbor.getNegotiatedHoldTime()))
167             .setUptime(new Timeticks(neighbor.getUpTime())).build();
168
169         return new TimersBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
170             .neighbor.group.timers.StateBuilder()
171             .addAugmentation(NeighborTimersStateAugmentation.class, timerState).build()).build();
172     }
173
174     /**
175      * Builds Transport State from BGPTransportState counters
176      *
177      * @param neighbor BGPPeerState containing Operational state counters
178      * @return Transport State
179      */
180     @Nullable
181     public static Transport buildTransport(@Nullable final BGPTransportState neighbor) {
182         if (neighbor == null) {
183             return null;
184         }
185         final NeighborTransportStateAugmentation transportState = new NeighborTransportStateAugmentationBuilder()
186             .setLocalPort(neighbor.getLocalPort()).setRemoteAddress(neighbor.getRemoteAddress())
187             .setRemotePort(neighbor.getRemotePort()).build();
188
189         return new TransportBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
190             .bgp.neighbor.group.transport.StateBuilder()
191             .addAugmentation(NeighborTransportStateAugmentation.class, transportState).build()).build();
192     }
193
194     /**
195      * Builds Error Handling State from BGPPeerState counters
196      *
197      * @param errorHandlingState BGPErrorHandlingState containing ErrorHandlingState Operational state counters
198      * @return Error Handling State
199      */
200     public static ErrorHandling buildErrorHandling(@Nullable final BGPErrorHandlingState errorHandlingState) {
201         if (errorHandlingState == null) {
202             return null;
203         }
204         return new ErrorHandlingBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.
205             rev151009.bgp.neighbor.group.error.handling.StateBuilder()
206             .addAugmentation(NeighborErrorHandlingStateAugmentation.class,
207                 buildErrorHandlingState(errorHandlingState.getErroneousUpdateReceivedCount())).build()).build();
208     }
209
210     /**
211      * Builds Graceful Restart containing Graceful Restart State from BGPGracelfulRestartState counters
212      *
213      * @param neighbor BGPPeerState containing Operational state counters
214      * @return Graceful Restart
215      */
216     @Nonnull
217     public static GracefulRestart buildGracefulRestart(@Nonnull final BGPGracelfulRestartState neighbor) {
218         final NeighborGracefulRestartStateAugmentation gracefulRestartState =
219             new NeighborGracefulRestartStateAugmentationBuilder()
220             .setLocalRestarting(neighbor.isLocalRestarting())
221             .setPeerRestartTime(neighbor.getPeerRestartTime())
222             //.setMode(mode) TBD once implemented
223             .setPeerRestarting(neighbor.isPeerRestarting()).build();
224
225         return new GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
226             .rev151009.bgp.graceful.restart.graceful.restart.StateBuilder()
227             .addAugmentation(NeighborGracefulRestartStateAugmentation.class, gracefulRestartState).build()).build();
228     }
229
230     /**
231      * Builds  Neighbor Afi Safi containing AfiSafi State
232      *
233      * @param neighbor BGPPeerState containing Operational state counters
234      * @return Afi Safis
235      */
236     public static AfiSafis buildAfisSafis(@Nonnull final BGPPeerState neighbor,
237         @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
238         return new AfiSafisBuilder().setAfiSafi(buildAfisSafisState(neighbor.getBGPAfiSafiState(), bgpTableTypeRegistry)).build();
239     }
240
241     /**
242      * Builds  Neighbor State containing Capabilities State, session State
243      *
244      * @return Neighbor State
245      */
246     public static NeighborStateAugmentation buildCapabilityState(@Nonnull final BGPSessionState neighbor) {
247
248         final List<Class<? extends BgpCapability>> supportedCapabilities = buildSupportedCapabilities(neighbor);
249         SessionState sessionState = null;
250         switch (neighbor.getSessionState()) {
251         case IDLE:
252             sessionState = SessionState.IDLE;
253             break;
254         case UP:
255             sessionState = SessionState.ESTABLISHED;
256             break;
257         case OPEN_CONFIRM:
258             sessionState = SessionState.OPENCONFIRM;
259             break;
260         default:
261         }
262         return new NeighborStateAugmentationBuilder().setSupportedCapabilities(supportedCapabilities)
263             .setSessionState(sessionState).build();
264     }
265
266     /**
267      * Builds Bgp Neighbor State containing Message State
268      *
269      * @return BgpNeighborState containing Message State
270      */
271     @Nonnull
272     public static BgpNeighborStateAugmentation buildMessageState(@Nonnull final BGPPeerMessagesState neighbor) {
273         return new BgpNeighborStateAugmentationBuilder()
274             .setMessages(new MessagesBuilder()
275                 .setReceived(buildMessagesReceived(neighbor))
276                 .setSent(buildMessagesSent(neighbor)).build()).build();
277     }
278
279     private static Received buildMessagesReceived(@Nonnull final BGPPeerMessagesState neighbor) {
280         return new ReceivedBuilder()
281             .setUPDATE(toBigInteger(neighbor.getUpdateMessagesReceivedCount()))
282             .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesReceivedCount()))
283             .build();
284     }
285
286     public static BigInteger toBigInteger(final long updateReceivedCounter) {
287         return UnsignedLong.valueOf(updateReceivedCounter).bigIntegerValue();
288     }
289
290     private static Sent buildMessagesSent(@Nonnull final BGPPeerMessagesState neighbor) {
291         return new SentBuilder()
292             .setUPDATE(toBigInteger(neighbor.getUpdateMessagesSentCount()))
293             .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesSentCount()))
294             .build();
295     }
296
297     /**
298      * Builds Neighbor Error Handling State
299      *
300      * @param erroneousUpdateCount erroneous Update Count
301      * @return Error Handling State
302      */
303     @Nonnull
304     public static NeighborErrorHandlingStateAugmentation buildErrorHandlingState(final long erroneousUpdateCount) {
305         return new NeighborErrorHandlingStateAugmentationBuilder()
306             .setErroneousUpdateMessages(erroneousUpdateCount).build();
307     }
308
309     /**
310      * Build List of afi safi containing State per Afi Safi
311      *
312      * @return AfiSafi List
313      */
314     @Nonnull
315     public static List<AfiSafi> buildAfisSafisState(@Nonnull final BGPAfiSafiState neighbor,
316         @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
317         final Set<TablesKey> afiSafiJoin = new HashSet<>(neighbor.getAfiSafisAdvertized());
318         afiSafiJoin.addAll(neighbor.getAfiSafisReceived());
319         return afiSafiJoin.stream().map(tableKey -> buildAfiSafi(neighbor, tableKey, bgpTableTypeRegistry))
320             .filter(Objects::nonNull)
321             .collect(Collectors.toList());
322     }
323
324     private static AfiSafi buildAfiSafi(@Nonnull final BGPAfiSafiState neighbor,
325         @Nonnull final TablesKey tablesKey, @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
326         final Optional<Class<? extends AfiSafiType>> afiSafi = bgpTableTypeRegistry.getAfiSafiType(tablesKey);
327         if (!afiSafi.isPresent()) {
328             return null;
329         }
330
331         return new AfiSafiBuilder().setAfiSafiName(afiSafi.get())
332             .setState(buildAfiSafiState(neighbor, tablesKey, neighbor.isAfiSafiSupported(tablesKey)))
333             .setGracefulRestart(buildAfiSafiGracefulRestartState(neighbor, tablesKey)).build();
334     }
335
336     private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.
337         safi.list.afi.safi.State buildAfiSafiState(@Nonnull final BGPAfiSafiState neighbor,
338         @Nonnull final TablesKey tablesKey, final boolean afiSafiSupported) {
339         final NeighborAfiSafiStateAugmentationBuilder builder = new NeighborAfiSafiStateAugmentationBuilder();
340         builder.setActive(afiSafiSupported);
341         if (afiSafiSupported) {
342             builder.setPrefixes(new PrefixesBuilder()
343                 .setInstalled(neighbor.getPrefixesInstalledCount(tablesKey))
344                 .setReceived(neighbor.getPrefixesReceivedCount(tablesKey))
345                 .setSent(neighbor.getPrefixesSentCount(tablesKey)).build());
346         }
347         return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
348             .safi.list.afi.safi.StateBuilder().addAugmentation(NeighborAfiSafiStateAugmentation.class, builder.build()).build();
349     }
350
351     private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
352         .safi.list.afi.safi.GracefulRestart buildAfiSafiGracefulRestartState(@Nonnull final BGPGracelfulRestartState neighbor,
353         @Nonnull final TablesKey tablesKey) {
354         final NeighborAfiSafiGracefulRestartStateAugmentation builder =
355             new NeighborAfiSafiGracefulRestartStateAugmentationBuilder()
356             .setAdvertised(neighbor.isGracefulRestartAdvertized(tablesKey))
357                 .setReceived(neighbor.isGracefulRestartReceived(tablesKey)).build();
358         return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
359             .safi.list.afi.safi.GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig
360             .net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.StateBuilder()
361             .addAugmentation(NeighborAfiSafiGracefulRestartStateAugmentation.class, builder).build()).build();
362     }
363
364     /**
365      * Builds List of BgpCapability supported capabilities
366      *
367      * @return List containing supported capabilities
368      */
369     @Nonnull
370     public static List<Class<? extends BgpCapability>> buildSupportedCapabilities(@Nonnull final BGPSessionState neighbor) {
371         final List<Class<? extends BgpCapability>> supportedCapabilities = new ArrayList<>();
372         if (neighbor.isAddPathCapabilitySupported()) {
373             supportedCapabilities.add(ADDPATHS.class);
374         }
375         if (neighbor.isAsn32CapabilitySupported()) {
376             supportedCapabilities.add(ASN32.class);
377         }
378         if (neighbor.isGracefulRestartCapabilitySupported()) {
379             supportedCapabilities.add(GRACEFULRESTART.class);
380         }
381         if (neighbor.isMultiProtocolCapabilitySupported()) {
382             supportedCapabilities.add(MPBGP.class);
383         }
384         if (neighbor.isRouterRefreshCapabilitySupported()) {
385             supportedCapabilities.add(ROUTEREFRESH.class);
386         }
387         return supportedCapabilities;
388     }
389 }