final List<Uri> odlHelloCapabilities = cfg.getOdlHelloCapabilities();
if (odlHelloCapabilities == null || odlHelloCapabilities.isEmpty()) {
return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
- cfg.getConnectionTimeoutMillis());
+ cfg.getConnectionTimeoutMillis(), cfg.getMaximumIncomingChunkSize());
}
// LinkedHashSet since perhaps the device cares about order of hello message capabilities.
import java.util.Set;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
+import org.checkerframework.checker.index.qual.NonNegative;
import org.opendaylight.netconf.api.NetconfDocumentedException;
import org.opendaylight.netconf.api.NetconfMessage;
import org.opendaylight.netconf.api.messages.NetconfHelloMessage;
NetconfClientSessionNegotiator(final NetconfHelloMessage hello, final NetconfStartExiMessage startExi,
final Promise<NetconfClientSession> promise, final Channel channel, final Timer timer,
- final NetconfClientSessionListener sessionListener, final long connectionTimeoutMillis) {
- super(hello, promise, channel, timer, sessionListener, connectionTimeoutMillis,
- DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE);
+ final NetconfClientSessionListener sessionListener, final long connectionTimeoutMillis,
+ final @NonNegative int maximumIncomingChunkSize) {
+ super(hello, promise, channel, timer, sessionListener, connectionTimeoutMillis, maximumIncomingChunkSize);
this.startExi = startExi;
}
import io.netty.util.concurrent.Promise;
import java.util.Optional;
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.messages.NetconfHelloMessageAdditionalHeader;
import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
+import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator;
import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory;
import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters;
import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
}
private final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader;
+ private final @NonNegative int maximumIncomingChunkSize;
private final Set<String> clientCapabilities;
private final long connectionTimeoutMillis;
private final Timer timer;
this(timer, additionalHeader, connectionTimeoutMillis, DEFAULT_OPTIONS);
}
+ public NetconfClientSessionNegotiatorFactory(final Timer timer,
+ final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
+ final long connectionTimeoutMillis,
+ final @NonNegative int maximumIncomingChunkSize) {
+ this(timer, additionalHeader, connectionTimeoutMillis, DEFAULT_OPTIONS, EXI_CLIENT_CAPABILITIES,
+ maximumIncomingChunkSize);
+ }
+
public NetconfClientSessionNegotiatorFactory(final Timer timer,
final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
final long connectionTimeoutMillis, final Set<String> capabilities) {
final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
final long connectionTimeoutMillis, final EXIParameters exiOptions,
final Set<String> capabilities) {
+ this(timer, additionalHeader, connectionTimeoutMillis, exiOptions, capabilities,
+ AbstractNetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE);
+ }
+
+ public NetconfClientSessionNegotiatorFactory(final Timer timer,
+ final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
+ final long connectionTimeoutMillis, final EXIParameters exiOptions,
+ final Set<String> capabilities,
+ final @NonNegative int maximumIncomingChunkSize) {
this.timer = requireNonNull(timer);
this.additionalHeader = additionalHeader;
this.connectionTimeoutMillis = connectionTimeoutMillis;
options = exiOptions;
clientCapabilities = capabilities;
+ this.maximumIncomingChunkSize = maximumIncomingChunkSize;
}
public long getConnectionTimeoutMillis() {
return new NetconfClientSessionNegotiator(
NetconfHelloMessage.createClientHello(clientCapabilities, additionalHeader),
NetconfStartExiMessage.create(options, START_EXI_MESSAGE_ID), promise, channel, timer,
- sessionListenerFactory.getSessionListener(), connectionTimeoutMillis);
+ sessionListenerFactory.getSessionListener(), connectionTimeoutMillis, maximumIncomingChunkSize);
}
}
import java.net.InetSocketAddress;
import java.util.List;
import java.util.Optional;
+import org.checkerframework.checker.index.qual.NonNegative;
import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
import org.opendaylight.netconf.client.NetconfClientSessionListener;
import org.opendaylight.netconf.client.SslHandlerFactory;
import org.slf4j.LoggerFactory;
public class NetconfClientConfiguration {
-
private static final Logger LOG = LoggerFactory.getLogger(NetconfClientConfiguration.class);
private final NetconfClientProtocol clientProtocol;
private final NetconfSshClient sshClient;
private final List<Uri> odlHelloCapabilities;
+ private final @NonNegative int maximumIncomingChunkSize;
NetconfClientConfiguration(final NetconfClientProtocol protocol, final InetSocketAddress address,
final Long connectionTimeoutMillis,
final NetconfClientSessionListener sessionListener,
final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler,
final SslHandlerFactory sslHandlerFactory, final NetconfSshClient sshClient,
- final List<Uri> odlHelloCapabilities) {
+ final List<Uri> odlHelloCapabilities, final @NonNegative int maximumIncomingChunkSize) {
this.address = address;
this.connectionTimeoutMillis = connectionTimeoutMillis;
this.additionalHeader = additionalHeader;
this.sslHandlerFactory = sslHandlerFactory;
this.sshClient = sshClient;
this.odlHelloCapabilities = odlHelloCapabilities;
+ this.maximumIncomingChunkSize = maximumIncomingChunkSize;
validateConfiguration();
}
return odlHelloCapabilities;
}
+ public @NonNegative int getMaximumIncomingChunkSize() {
+ return maximumIncomingChunkSize;
+ }
+
private void validateConfiguration() {
switch (requireNonNull(clientProtocol)) {
case TLS:
*/
package org.opendaylight.netconf.client.conf;
+import static com.google.common.base.Preconditions.checkArgument;
+
import java.net.InetSocketAddress;
import java.util.List;
+import org.checkerframework.checker.index.qual.NonNegative;
import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
import org.opendaylight.netconf.client.NetconfClientSessionListener;
import org.opendaylight.netconf.client.SslHandlerFactory;
+import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator;
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
private SslHandlerFactory sslHandlerFactory;
private NetconfSshClient sshClient;
private List<Uri> odlHelloCapabilities;
-
+ private @NonNegative int maximumIncomingChunkSize =
+ AbstractNetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE;
protected NetconfClientConfigurationBuilder() {
}
return this;
}
+ @SuppressWarnings("checkstyle:hiddenField")
+ public NetconfClientConfigurationBuilder withMaximumIncomingChunkSize(
+ final @NonNegative int maximumIncomingChunkSize) {
+ checkArgument(maximumIncomingChunkSize > 0);
+ this.maximumIncomingChunkSize = maximumIncomingChunkSize;
+ return this;
+ }
+
final InetSocketAddress getAddress() {
return address;
}
return odlHelloCapabilities;
}
+ final @NonNegative int getMaximumIncomingChunkSize() {
+ return maximumIncomingChunkSize;
+ }
+
public NetconfClientConfiguration build() {
return new NetconfClientConfiguration(clientProtocol, address, connectionTimeoutMillis, additionalHeader,
- sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities);
+ sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities,
+ maximumIncomingChunkSize);
}
}
import com.google.common.base.MoreObjects.ToStringHelper;
import java.net.InetSocketAddress;
import java.util.List;
+import org.checkerframework.checker.index.qual.NonNegative;
import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
import org.opendaylight.netconf.client.NetconfClientSessionListener;
import org.opendaylight.netconf.client.SslHandlerFactory;
final AuthenticationHandler authHandler,
final SslHandlerFactory sslHandlerFactory,
final NetconfSshClient sshClient,
- final List<Uri> odlHelloCapabilities) {
+ final List<Uri> odlHelloCapabilities,
+ final @NonNegative int maximumIncomingChunkSize) {
super(clientProtocol, address, connectionTimeoutMillis, additionalHeader, sessionListener, reconnectStrategy,
- authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities);
+ authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities, maximumIncomingChunkSize);
this.connectStrategyFactory = connectStrategyFactory;
validateReconnectConfiguration();
}
public NetconfReconnectingClientConfiguration build() {
return new NetconfReconnectingClientConfiguration(getProtocol(), getAddress(), getConnectionTimeoutMillis(),
getAdditionalHeader(), getSessionListener(), getReconnectStrategy(), connectStrategyFactory,
- getAuthHandler(), getSslHandlerFactory(), getSshClient(), getOdlHelloCapabilities());
+ getAuthHandler(), getSslHandlerFactory(), getSshClient(), getOdlHelloCapabilities(),
+ getMaximumIncomingChunkSize());
}
// Override setter methods to return subtype
@Override
public NetconfReconnectingClientConfigurationBuilder withProtocol(
- NetconfClientConfiguration.NetconfClientProtocol clientProtocol) {
+ final NetconfClientConfiguration.NetconfClientProtocol clientProtocol) {
return (NetconfReconnectingClientConfigurationBuilder) super.withProtocol(clientProtocol);
}
}
@Override
- public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities(List<Uri> odlHelloCapabilities) {
+ public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities(
+ final List<Uri> odlHelloCapabilities) {
return (NetconfReconnectingClientConfigurationBuilder) super.withOdlHelloCapabilities(odlHelloCapabilities);
}
}
import org.w3c.dom.Document;
public class NetconfClientSessionNegotiatorTest {
-
private NetconfHelloMessage helloMessage;
private ChannelPipeline pipeline;
private ChannelPromise future;
NetconfClientSessionListener sessionListener = mock(NetconfClientSessionListener.class);
Timer timer = new HashedWheelTimer();
return new NetconfClientSessionNegotiator(helloMessage, startExi, promise, channel, timer, sessionListener,
- timeout);
+ timeout, 16384);
}
private static NetconfHelloMessage createHelloMsg(final String name) throws Exception {
verify(promise).setSuccess(any());
}
-
@Test
public void testNetconfClientSessionNegotiatorWithEXI() throws Exception {
Promise<NetconfClientSession> promise = mock(Promise.class);