From 749ca82871b9c17e40e6e3e3bca326f9889e0025 Mon Sep 17 00:00:00 2001 From: DanielCV Date: Wed, 7 Sep 2022 16:21:21 +0530 Subject: [PATCH] Teach netconf-impl about maximum incoming chunk size Negotiators can specify custom maximum chunk size, this patch teaches netconf-impl's configuration to take advantage of that. JIRA: NETCONF-898 Change-Id: I1532a7e56e496c55af0d510e0259479fe2508eb4 Signed-off-by: DanielCV Signed-off-by: Robert Varga --- .../impl/NetconfServerSessionNegotiator.java | 6 ++-- ...NetconfServerSessionNegotiatorFactory.java | 29 +++++++++++++------ ...ServerSessionNegotiatorFactoryBuilder.java | 13 +++++++-- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiator.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiator.java index 407f663deb..efd48b0831 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiator.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiator.java @@ -15,6 +15,7 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Map; +import org.checkerframework.checker.index.qual.NonNegative; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.api.messages.NetconfHelloMessage; import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader; @@ -31,9 +32,10 @@ public final class NetconfServerSessionNegotiator NetconfServerSessionNegotiator(final NetconfHelloMessage hello, final long sessionId, final Promise promise, final Channel channel, final Timer timer, - final NetconfServerSessionListener sessionListener, final long connectionTimeoutMillis) { + final NetconfServerSessionListener sessionListener, final long connectionTimeoutMillis, + final @NonNegative int maximumIncomingChunkSize) { super(hello, promise, channel, timer, sessionListener, connectionTimeoutMillis, - DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE); + maximumIncomingChunkSize); this.sessionId = sessionId; } diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactory.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactory.java index 38df10178b..385f20fc7b 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactory.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactory.java @@ -16,6 +16,7 @@ import io.netty.util.Timer; import io.netty.util.concurrent.Promise; import java.net.SocketAddress; import java.util.Set; +import org.checkerframework.checker.index.qual.NonNegative; import org.opendaylight.netconf.api.NetconfSessionListenerFactory; import org.opendaylight.netconf.api.messages.NetconfHelloMessage; import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService; @@ -24,6 +25,7 @@ import org.opendaylight.netconf.impl.osgi.NetconfOperationRouter; import org.opendaylight.netconf.impl.osgi.NetconfOperationRouterImpl; import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; +import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator; import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities; @@ -38,31 +40,40 @@ public class NetconfServerSessionNegotiatorFactory XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0 ); + private final @NonNegative int maximumIncomingChunkSize; private final Timer timer; - private final SessionIdProvider idProvider; private final NetconfOperationServiceFactory aggregatedOpService; private final long connectionTimeoutMillis; private final NetconfMonitoringService monitoringService; private final Set baseCapabilities; + // FIXME: 5.0.0: protected public NetconfServerSessionNegotiatorFactory(final Timer timer, - final NetconfOperationServiceFactory netconfOperationProvider, - final SessionIdProvider idProvider, final long connectionTimeoutMillis, - final NetconfMonitoringService monitoringService) { + final NetconfOperationServiceFactory netconfOperationProvider, final SessionIdProvider idProvider, + final long connectionTimeoutMillis, final NetconfMonitoringService monitoringService) { this(timer, netconfOperationProvider, idProvider, connectionTimeoutMillis, monitoringService, null); } + // FIXME: 5.0.0: protected public NetconfServerSessionNegotiatorFactory(final Timer timer, - final NetconfOperationServiceFactory netconfOperationProvider, - final SessionIdProvider idProvider, final long connectionTimeoutMillis, - final NetconfMonitoringService monitoringService, - final Set baseCapabilities) { + final NetconfOperationServiceFactory netconfOperationProvider, final SessionIdProvider idProvider, + final long connectionTimeoutMillis, final NetconfMonitoringService monitoringService, + final Set baseCapabilities) { + this(timer, netconfOperationProvider, idProvider, connectionTimeoutMillis, monitoringService, baseCapabilities, + AbstractNetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE); + } + + protected NetconfServerSessionNegotiatorFactory(final Timer timer, + final NetconfOperationServiceFactory netconfOperationProvider, final SessionIdProvider idProvider, + final long connectionTimeoutMillis, final NetconfMonitoringService monitoringService, + final Set baseCapabilities, final @NonNegative int maximumIncomingChunkSize) { this.timer = timer; aggregatedOpService = netconfOperationProvider; this.idProvider = idProvider; this.connectionTimeoutMillis = connectionTimeoutMillis; this.monitoringService = monitoringService; + this.maximumIncomingChunkSize = maximumIncomingChunkSize; this.baseCapabilities = validateBaseCapabilities(baseCapabilities == null ? DEFAULT_BASE_CAPABILITIES : baseCapabilities); } @@ -100,7 +111,7 @@ public class NetconfServerSessionNegotiatorFactory return new NetconfServerSessionNegotiator(createHelloMessage(sessionId, monitoringService), sessionId, promise, channel, timer, getListener(Long.toString(sessionId), channel.parent().localAddress()), - connectionTimeoutMillis); + connectionTimeoutMillis, maximumIncomingChunkSize); } private NetconfServerSessionListener getListener(final String netconfSessionIdForReporting, diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactoryBuilder.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactoryBuilder.java index cfbb7481ed..03d4687c93 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactoryBuilder.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSessionNegotiatorFactoryBuilder.java @@ -12,8 +12,10 @@ import static java.util.Objects.requireNonNull; import io.netty.util.Timer; import java.util.Set; +import org.checkerframework.checker.index.qual.NonNegative; import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; +import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator; public class NetconfServerSessionNegotiatorFactoryBuilder { private Timer timer; @@ -22,6 +24,8 @@ public class NetconfServerSessionNegotiatorFactoryBuilder { private long connectionTimeoutMillis; private NetconfMonitoringService monitoringService; private Set baseCapabilities; + private @NonNegative int maximumIncomingChunkSize = + AbstractNetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE; public NetconfServerSessionNegotiatorFactoryBuilder() { } @@ -58,14 +62,19 @@ public class NetconfServerSessionNegotiatorFactoryBuilder { return this; } + public NetconfServerSessionNegotiatorFactoryBuilder setMaximumIncomingChunkSize( + final @NonNegative int maximumIncomingChunkSize) { + checkArgument(maximumIncomingChunkSize > 0); + this.maximumIncomingChunkSize = maximumIncomingChunkSize; + return this; + } public NetconfServerSessionNegotiatorFactory build() { validate(); return new NetconfServerSessionNegotiatorFactory(timer, aggregatedOpService, idProvider, - connectionTimeoutMillis, monitoringService, baseCapabilities); + connectionTimeoutMillis, monitoringService, baseCapabilities, maximumIncomingChunkSize); } - private void validate() { requireNonNull(timer, "timer not initialized"); requireNonNull(aggregatedOpService, "NetconfOperationServiceFactory not initialized"); -- 2.36.6