Bump upstreams to 2022.09
[bgpcep.git] / bgp / openconfig-state / src / main / java / org / opendaylight / protocol / bgp / state / NeighborUtil.java
index aee7a33afe1a288ec978bb2e0829b0e22f3265c0..f78c9e2f292509d22e6456f5630c431792f188cd 100644 (file)
@@ -8,22 +8,20 @@
 
 package org.opendaylight.protocol.bgp.state;
 
-import com.google.common.primitives.UnsignedLong;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.ArrayList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.primitives.UnsignedInteger;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
-import java.util.stream.Collectors;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPAfiSafiState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPErrorHandlingState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPGracelfulRestartState;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPLlGracelfulRestartState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerMessagesState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
@@ -31,6 +29,7 @@ import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.BgpNeighborState.SessionState;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.operational.rev151009.bgp.neighbor.prefix.counters_state.PrefixesBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestart;
@@ -56,36 +55,43 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.GRACEFULRESTART;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.MPBGP;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.ROUTEREFRESH;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Timeticks;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.BgpNeighborStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.BgpNeighborStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborAfiSafiGracefulRestartStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborAfiSafiGracefulRestartStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborAfiSafiStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborAfiSafiStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborErrorHandlingStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborErrorHandlingStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborGracefulRestartStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborGracefulRestartStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborTimersStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborTimersStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborTransportStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.NeighborTransportStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.MessagesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.Received;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.ReceivedBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.Sent;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.network.instances.network.instance.protocols.protocol.bgp.neighbors.neighbor.state.messages.SentBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.BgpNeighborStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.BgpNeighborStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAfiSafiGracefulRestartStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAfiSafiGracefulRestartStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAfiSafiStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborErrorHandlingStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborErrorHandlingStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborGracefulRestartStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborGracefulRestartStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborTimersStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborTransportStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.MessagesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.Received;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.ReceivedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.Sent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.bgp.neighbor_state.augmentation.messages.SentBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
+import org.opendaylight.yangtools.yang.binding.util.BindingMap;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
 
 /**
  * Util for create OpenConfig Neighbor with corresponding openConfig state.
  */
 public final class NeighborUtil {
+    private static final long TIMETICK_ROLLOVER_VALUE = UnsignedInteger.MAX_VALUE.longValue() + 1;
+
     private NeighborUtil() {
-        throw new UnsupportedOperationException();
+        // Hidden on purpose
     }
 
     /**
@@ -96,16 +102,15 @@ public final class NeighborUtil {
      * @param bgpTableTypeRegistry BGP TableType Registry
      * @return Openconfig Neighbors Stats
      */
-    @Nullable
-    public static Neighbors buildNeighbors(@Nonnull final List<BGPPeerState> peerStats,
-            @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
+    public static @Nullable Neighbors buildNeighbors(final @NonNull List<BGPPeerState> peerStats,
+            final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
         if (peerStats.isEmpty()) {
             return null;
         }
         return new NeighborsBuilder().setNeighbor(peerStats.stream()
                 .filter(Objects::nonNull)
                 .map(neighbor -> buildNeighbor(neighbor, bgpTableTypeRegistry))
-                .collect(Collectors.toList())).build();
+                .collect(BindingMap.toMap())).build();
     }
 
     /**
@@ -114,11 +119,10 @@ public final class NeighborUtil {
      * @param neighbor containing Neighbor state counters
      * @return neighbor containing Neighbor State
      */
-    @Nullable
-    public static Neighbor buildNeighbor(@Nonnull final BGPPeerState neighbor,
-            @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
+    public static @NonNull Neighbor buildNeighbor(final @NonNull BGPPeerState neighbor,
+            final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
         return new NeighborBuilder()
-                .setNeighborAddress(neighbor.getNeighborAddress())
+                .setNeighborAddress(convertIpAddress(neighbor.getNeighborAddress()))
                 .setState(buildNeighborState(neighbor.getBGPSessionState(), neighbor.getBGPPeerMessagesState()))
                 .setTimers(buildTimer(neighbor.getBGPTimersState()))
                 .setTransport(buildTransport(neighbor.getBGPTransportState()))
@@ -128,6 +132,17 @@ public final class NeighborUtil {
                 .build();
     }
 
+    private static IpAddress convertIpAddress(final IpAddressNoZone addr) {
+        if (addr == null) {
+            return null;
+        }
+        final Ipv4AddressNoZone ipv4 = addr.getIpv4AddressNoZone();
+        if (ipv4 != null) {
+            return new IpAddress(ipv4);
+        }
+        return new IpAddress(addr.getIpv6AddressNoZone());
+    }
+
     /**
      * Builds Neighbor State from BGPPeerState counters.
      *
@@ -135,18 +150,17 @@ public final class NeighborUtil {
      * @param bgpPeerMessagesState message state
      * @return Neighbor State
      */
-    @Nullable
-    public static State buildNeighborState(@Nullable final BGPSessionState sessionState,
+    public static @Nullable State buildNeighborState(final @Nullable BGPSessionState sessionState,
             final BGPPeerMessagesState bgpPeerMessagesState) {
         if (sessionState == null && bgpPeerMessagesState == null) {
             return null;
         }
         final StateBuilder builder = new StateBuilder();
         if (sessionState != null) {
-            builder.addAugmentation(NeighborStateAugmentation.class, buildCapabilityState(sessionState));
+            builder.addAugmentation(buildCapabilityState(sessionState));
         }
         if (bgpPeerMessagesState != null) {
-            builder.addAugmentation(BgpNeighborStateAugmentation.class, buildMessageState(bgpPeerMessagesState));
+            builder.addAugmentation(buildMessageState(bgpPeerMessagesState));
         }
         return builder.build();
     }
@@ -157,18 +171,22 @@ public final class NeighborUtil {
      * @param neighbor BGPPeerState containing Operational state counters
      * @return Timer State
      */
-    @Nullable
-    public static Timers buildTimer(@Nullable final BGPTimersState neighbor) {
+    public static @Nullable Timers buildTimer(final @Nullable BGPTimersState neighbor) {
         if (neighbor == null) {
             return null;
         }
-        final NeighborTimersStateAugmentation timerState = new NeighborTimersStateAugmentationBuilder()
-                .setNegotiatedHoldTime(BigDecimal.valueOf(neighbor.getNegotiatedHoldTime()))
-                .setUptime(new Timeticks(neighbor.getUpTime())).build();
+        // convert neighbor uptime which is in milliseconds to time-ticks which is
+        // hundredth of a second, and handle roll-over scenario
+        final long uptimeTicks = neighbor.getUpTime() / 10 % TIMETICK_ROLLOVER_VALUE;
 
-        return new TimersBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
-                .neighbor.group.timers.StateBuilder()
-                .addAugmentation(NeighborTimersStateAugmentation.class, timerState).build()).build();
+        return new TimersBuilder()
+                .setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
+                    .timers.StateBuilder()
+                        .addAugmentation(new NeighborTimersStateAugmentationBuilder()
+                            .setNegotiatedHoldTime(Decimal64.valueOf(2, neighbor.getNegotiatedHoldTime()))
+                            .setUptime(new Timeticks(Uint32.valueOf(uptimeTicks))).build())
+                        .build())
+                .build();
     }
 
     /**
@@ -177,18 +195,20 @@ public final class NeighborUtil {
      * @param neighbor BGPPeerState containing Operational state counters
      * @return Transport State
      */
-    @Nullable
-    public static Transport buildTransport(@Nullable final BGPTransportState neighbor) {
+    public static @Nullable Transport buildTransport(final @Nullable BGPTransportState neighbor) {
         if (neighbor == null) {
             return null;
         }
-        final NeighborTransportStateAugmentation transportState = new NeighborTransportStateAugmentationBuilder()
-                .setLocalPort(neighbor.getLocalPort()).setRemoteAddress(neighbor.getRemoteAddress())
-                .setRemotePort(neighbor.getRemotePort()).build();
 
         return new TransportBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
                 .bgp.neighbor.group.transport.StateBuilder()
-                .addAugmentation(NeighborTransportStateAugmentation.class, transportState).build()).build();
+                    .addAugmentation(new NeighborTransportStateAugmentationBuilder()
+                        .setLocalPort(neighbor.getLocalPort())
+                        .setRemoteAddress(convertIpAddress(neighbor.getRemoteAddress()))
+                        .setRemotePort(neighbor.getRemotePort())
+                        .build())
+                    .build())
+                .build();
     }
 
     /**
@@ -197,14 +217,16 @@ public final class NeighborUtil {
      * @param errorHandlingState BGPErrorHandlingState containing ErrorHandlingState Operational state counters
      * @return Error Handling State
      */
-    public static ErrorHandling buildErrorHandling(@Nullable final BGPErrorHandlingState errorHandlingState) {
+    public static ErrorHandling buildErrorHandling(final @Nullable BGPErrorHandlingState errorHandlingState) {
         if (errorHandlingState == null) {
             return null;
         }
-        return new ErrorHandlingBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
-                .rev151009.bgp.neighbor.group.error.handling.StateBuilder()
-                .addAugmentation(NeighborErrorHandlingStateAugmentation.class,
-                        buildErrorHandlingState(errorHandlingState.getErroneousUpdateReceivedCount())).build()).build();
+        return new ErrorHandlingBuilder()
+                .setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
+                    .error.handling.StateBuilder()
+                        .addAugmentation(buildErrorHandlingState(errorHandlingState.getErroneousUpdateReceivedCount()))
+                        .build())
+                .build();
     }
 
     /**
@@ -213,18 +235,17 @@ public final class NeighborUtil {
      * @param neighbor BGPPeerState containing Operational state counters
      * @return Graceful Restart
      */
-    @Nonnull
-    public static GracefulRestart buildGracefulRestart(@Nonnull final BGPGracelfulRestartState neighbor) {
+    public static @NonNull GracefulRestart buildGracefulRestart(final @NonNull BGPGracelfulRestartState neighbor) {
         final NeighborGracefulRestartStateAugmentation gracefulRestartState =
                 new NeighborGracefulRestartStateAugmentationBuilder()
                         .setLocalRestarting(neighbor.isLocalRestarting())
-                        .setPeerRestartTime(neighbor.getPeerRestartTime())
-                        //.setMode(mode) TBD once implemented
+                        .setPeerRestartTime(Uint16.valueOf(neighbor.getPeerRestartTime()))
+                        .setMode(neighbor.getMode())
                         .setPeerRestarting(neighbor.isPeerRestarting()).build();
 
         return new GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
                 .rev151009.bgp.graceful.restart.graceful.restart.StateBuilder()
-                .addAugmentation(NeighborGracefulRestartStateAugmentation.class, gracefulRestartState).build()).build();
+                .addAugmentation(gracefulRestartState).build()).build();
     }
 
     /**
@@ -233,8 +254,8 @@ public final class NeighborUtil {
      * @param neighbor BGPPeerState containing Operational state counters
      * @return Afi Safis
      */
-    public static AfiSafis buildAfisSafis(@Nonnull final BGPPeerState neighbor,
-            @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
+    public static AfiSafis buildAfisSafis(final @NonNull BGPPeerState neighbor,
+            final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
         return new AfiSafisBuilder().setAfiSafi(buildAfisSafisState(neighbor.getBGPAfiSafiState(),
                 bgpTableTypeRegistry)).build();
     }
@@ -244,9 +265,9 @@ public final class NeighborUtil {
      *
      * @return Neighbor State
      */
-    public static NeighborStateAugmentation buildCapabilityState(@Nonnull final BGPSessionState neighbor) {
+    public static NeighborStateAugmentation buildCapabilityState(final @NonNull BGPSessionState neighbor) {
 
-        final List<Class<? extends BgpCapability>> supportedCapabilities = buildSupportedCapabilities(neighbor);
+        final Set<BgpCapability> supportedCapabilities = buildSupportedCapabilities(neighbor);
         SessionState sessionState = null;
         switch (neighbor.getSessionState()) {
             case IDLE:
@@ -269,29 +290,25 @@ public final class NeighborUtil {
      *
      * @return BgpNeighborState containing Message State
      */
-    @Nonnull
-    public static BgpNeighborStateAugmentation buildMessageState(@Nonnull final BGPPeerMessagesState neighbor) {
+    public static @NonNull BgpNeighborStateAugmentation buildMessageState(
+            final @NonNull BGPPeerMessagesState neighbor) {
         return new BgpNeighborStateAugmentationBuilder()
                 .setMessages(new MessagesBuilder()
                         .setReceived(buildMessagesReceived(neighbor))
                         .setSent(buildMessagesSent(neighbor)).build()).build();
     }
 
-    private static Received buildMessagesReceived(@Nonnull final BGPPeerMessagesState neighbor) {
+    private static Received buildMessagesReceived(final @NonNull BGPPeerMessagesState neighbor) {
         return new ReceivedBuilder()
-                .setUPDATE(toBigInteger(neighbor.getUpdateMessagesReceivedCount()))
-                .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesReceivedCount()))
+                .setUPDATE(Uint64.valueOf(neighbor.getUpdateMessagesReceivedCount()))
+                .setNOTIFICATION(Uint64.valueOf(neighbor.getNotificationMessagesReceivedCount()))
                 .build();
     }
 
-    public static BigInteger toBigInteger(final long updateReceivedCounter) {
-        return UnsignedLong.valueOf(updateReceivedCounter).bigIntegerValue();
-    }
-
-    private static Sent buildMessagesSent(@Nonnull final BGPPeerMessagesState neighbor) {
+    private static Sent buildMessagesSent(final @NonNull BGPPeerMessagesState neighbor) {
         return new SentBuilder()
-                .setUPDATE(toBigInteger(neighbor.getUpdateMessagesSentCount()))
-                .setNOTIFICATION(toBigInteger(neighbor.getNotificationMessagesSentCount()))
+                .setUPDATE(Uint64.valueOf(neighbor.getUpdateMessagesSentCount()))
+                .setNOTIFICATION(Uint64.valueOf(neighbor.getNotificationMessagesSentCount()))
                 .build();
     }
 
@@ -301,10 +318,10 @@ public final class NeighborUtil {
      * @param erroneousUpdateCount erroneous Update Count
      * @return Error Handling State
      */
-    @Nonnull
-    public static NeighborErrorHandlingStateAugmentation buildErrorHandlingState(final long erroneousUpdateCount) {
+    public static @NonNull NeighborErrorHandlingStateAugmentation buildErrorHandlingState(
+            final long erroneousUpdateCount) {
         return new NeighborErrorHandlingStateAugmentationBuilder()
-                .setErroneousUpdateMessages(erroneousUpdateCount).build();
+                .setErroneousUpdateMessages(saturatedUint32(erroneousUpdateCount)).build();
     }
 
     /**
@@ -312,55 +329,59 @@ public final class NeighborUtil {
      *
      * @return AfiSafi List
      */
-    @Nonnull
-    public static List<AfiSafi> buildAfisSafisState(@Nonnull final BGPAfiSafiState neighbor,
-            @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
+    public static @NonNull Map<AfiSafiKey, AfiSafi> buildAfisSafisState(final @NonNull BGPAfiSafiState neighbor,
+            final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
         final Set<TablesKey> afiSafiJoin = new HashSet<>(neighbor.getAfiSafisAdvertized());
         afiSafiJoin.addAll(neighbor.getAfiSafisReceived());
         return afiSafiJoin.stream().map(tableKey -> buildAfiSafi(neighbor, tableKey, bgpTableTypeRegistry))
                 .filter(Objects::nonNull)
-                .collect(Collectors.toList());
+                .collect(BindingMap.toMap());
     }
 
-    private static AfiSafi buildAfiSafi(@Nonnull final BGPAfiSafiState neighbor,
-            @Nonnull final TablesKey tablesKey, @Nonnull final BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
-        final Optional<Class<? extends AfiSafiType>> afiSafi = bgpTableTypeRegistry.getAfiSafiType(tablesKey);
-        if (!afiSafi.isPresent()) {
-            return null;
-        }
-
-        return new AfiSafiBuilder().setAfiSafiName(afiSafi.get())
-                .setState(buildAfiSafiState(neighbor, tablesKey, neighbor.isAfiSafiSupported(tablesKey)))
-                .setGracefulRestart(buildAfiSafiGracefulRestartState(neighbor, tablesKey)).build();
+    private static @Nullable AfiSafi buildAfiSafi(final @NonNull BGPAfiSafiState neighbor,
+            final @NonNull TablesKey tablesKey, final @NonNull BGPTableTypeRegistryConsumer bgpTableTypeRegistry) {
+        final AfiSafiType afiSafi = bgpTableTypeRegistry.getAfiSafiType(tablesKey);
+        return afiSafi == null ? null : new AfiSafiBuilder()
+            .setAfiSafiName(afiSafi)
+            .setState(buildAfiSafiState(neighbor, tablesKey, neighbor.isAfiSafiSupported(tablesKey)))
+            .setGracefulRestart(buildAfiSafiGracefulRestartState(neighbor, tablesKey))
+            .build();
     }
 
     private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
-            .safi.list.afi.safi.State buildAfiSafiState(@Nonnull final BGPAfiSafiState neighbor,
-            @Nonnull final TablesKey tablesKey, final boolean afiSafiSupported) {
+            .safi.list.afi.safi.State buildAfiSafiState(final @NonNull BGPAfiSafiState neighbor,
+            final @NonNull TablesKey tablesKey, final boolean afiSafiSupported) {
         final NeighborAfiSafiStateAugmentationBuilder builder = new NeighborAfiSafiStateAugmentationBuilder();
         builder.setActive(afiSafiSupported);
         if (afiSafiSupported) {
             builder.setPrefixes(new PrefixesBuilder()
-                    .setInstalled(neighbor.getPrefixesInstalledCount(tablesKey))
-                    .setReceived(neighbor.getPrefixesReceivedCount(tablesKey))
-                    .setSent(neighbor.getPrefixesSentCount(tablesKey)).build());
+                    .setInstalled(saturatedUint32(neighbor.getPrefixesInstalledCount(tablesKey)))
+                    .setReceived(saturatedUint32(neighbor.getPrefixesReceivedCount(tablesKey)))
+                    .setSent(saturatedUint32(neighbor.getPrefixesSentCount(tablesKey))).build());
         }
         return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
-                .safi.list.afi.safi.StateBuilder().addAugmentation(NeighborAfiSafiStateAugmentation.class,
-                builder.build()).build();
+                .safi.list.afi.safi.StateBuilder().addAugmentation(builder.build()).build();
+    }
+
+    // FIXME: remove this with YANGTOOLS-5.0.7+
+    private static Uint32 saturatedUint32(final long value) {
+        return value < 4294967295L ? Uint32.valueOf(value) : Uint32.MAX_VALUE;
     }
 
     private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
             .safi.list.afi.safi.GracefulRestart buildAfiSafiGracefulRestartState(
-            @Nonnull final BGPGracelfulRestartState neighbor, @Nonnull final TablesKey tablesKey) {
+            final @NonNull BGPLlGracelfulRestartState neighbor, final @NonNull TablesKey tablesKey) {
         final NeighborAfiSafiGracefulRestartStateAugmentation builder =
                 new NeighborAfiSafiGracefulRestartStateAugmentationBuilder()
                         .setAdvertised(neighbor.isGracefulRestartAdvertized(tablesKey))
-                        .setReceived(neighbor.isGracefulRestartReceived(tablesKey)).build();
+                        .setReceived(neighbor.isGracefulRestartReceived(tablesKey))
+                        .setLlAdvertised(neighbor.isLlGracefulRestartAdvertised(tablesKey))
+                        .setLlReceived(neighbor.isLlGracefulRestartReceived(tablesKey))
+                        .setLlStaleTimer(Uint32.valueOf(neighbor.getLlGracefulRestartTimer(tablesKey))).build();
         return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi
                 .safi.list.afi.safi.GracefulRestartBuilder().setState(new org.opendaylight.yang.gen.v1.http.openconfig
                 .net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.StateBuilder()
-                .addAugmentation(NeighborAfiSafiGracefulRestartStateAugmentation.class, builder).build()).build();
+                .addAugmentation(builder).build()).build();
     }
 
     /**
@@ -368,25 +389,23 @@ public final class NeighborUtil {
      *
      * @return List containing supported capabilities
      */
-    @Nonnull
-    public static List<Class<? extends BgpCapability>> buildSupportedCapabilities(
-            @Nonnull final BGPSessionState neighbor) {
-        final List<Class<? extends BgpCapability>> supportedCapabilities = new ArrayList<>();
+    public static @NonNull Set<BgpCapability> buildSupportedCapabilities(final @NonNull BGPSessionState neighbor) {
+        final var supportedCapabilities = ImmutableSet.<BgpCapability>builder();
         if (neighbor.isAddPathCapabilitySupported()) {
-            supportedCapabilities.add(ADDPATHS.class);
+            supportedCapabilities.add(ADDPATHS.VALUE);
         }
         if (neighbor.isAsn32CapabilitySupported()) {
-            supportedCapabilities.add(ASN32.class);
+            supportedCapabilities.add(ASN32.VALUE);
         }
         if (neighbor.isGracefulRestartCapabilitySupported()) {
-            supportedCapabilities.add(GRACEFULRESTART.class);
+            supportedCapabilities.add(GRACEFULRESTART.VALUE);
         }
         if (neighbor.isMultiProtocolCapabilitySupported()) {
-            supportedCapabilities.add(MPBGP.class);
+            supportedCapabilities.add(MPBGP.VALUE);
         }
         if (neighbor.isRouterRefreshCapabilitySupported()) {
-            supportedCapabilities.add(ROUTEREFRESH.class);
+            supportedCapabilities.add(ROUTEREFRESH.VALUE);
         }
-        return supportedCapabilities;
+        return supportedCapabilities.build();
     }
 }