diff --git a/Stack/Opc.Ua.Core/Stack/Tcp/TcpMessageType.cs b/Stack/Opc.Ua.Core/Stack/Tcp/TcpMessageType.cs index 49ff28045..d0bdd3c51 100644 --- a/Stack/Opc.Ua.Core/Stack/Tcp/TcpMessageType.cs +++ b/Stack/Opc.Ua.Core/Stack/Tcp/TcpMessageType.cs @@ -301,5 +301,14 @@ public static class TcpMessageLimits /// The certificates that have the key size larger than KeySizeExtraPadding need an extra padding byte in the transport message /// public const int KeySizeExtraPadding = 2048; + + /// + /// Aligns the max message size to the nearest min buffer size. + /// + public static int AlignRoundMaxMessageSize(int value) + { + int alignmentMask = MinBufferSize - 1; + return (value + alignmentMask) & ~alignmentMask; + } } } diff --git a/Stack/Opc.Ua.Core/Stack/Tcp/TcpTransportListener.cs b/Stack/Opc.Ua.Core/Stack/Tcp/TcpTransportListener.cs index 4f76e1e72..4c9df3f16 100644 --- a/Stack/Opc.Ua.Core/Stack/Tcp/TcpTransportListener.cs +++ b/Stack/Opc.Ua.Core/Stack/Tcp/TcpTransportListener.cs @@ -138,12 +138,12 @@ protected virtual void Dispose(bool disposing) { m_inactivityDetectPeriod = configuration.ChannelLifetime / 2; m_quotas.MaxBufferSize = configuration.MaxBufferSize; - m_quotas.MaxMessageSize = configuration.MaxMessageSize; + m_quotas.MaxMessageSize = TcpMessageLimits.AlignRoundMaxMessageSize(configuration.MaxMessageSize); m_quotas.ChannelLifetime = configuration.ChannelLifetime; m_quotas.SecurityTokenLifetime = configuration.SecurityTokenLifetime; messageContext.MaxArrayLength = configuration.MaxArrayLength; messageContext.MaxByteStringLength = configuration.MaxByteStringLength; - messageContext.MaxMessageSize = configuration.MaxMessageSize; + messageContext.MaxMessageSize = TcpMessageLimits.AlignRoundMaxMessageSize(configuration.MaxMessageSize); messageContext.MaxStringLength = configuration.MaxStringLength; messageContext.MaxEncodingNestingLevels = configuration.MaxEncodingNestingLevels; messageContext.MaxDecoderRecoveries = configuration.MaxDecoderRecoveries; diff --git a/Stack/Opc.Ua.Core/Stack/Tcp/UaSCBinaryTransportChannel.cs b/Stack/Opc.Ua.Core/Stack/Tcp/UaSCBinaryTransportChannel.cs index c002e7dbd..e1f82b34a 100644 --- a/Stack/Opc.Ua.Core/Stack/Tcp/UaSCBinaryTransportChannel.cs +++ b/Stack/Opc.Ua.Core/Stack/Tcp/UaSCBinaryTransportChannel.cs @@ -423,13 +423,13 @@ private void SaveSettings(Uri url, TransportChannelSettings settings) EndpointConfiguration configuration = m_settings.Configuration; m_quotas = new ChannelQuotas { MaxBufferSize = configuration.MaxBufferSize, - MaxMessageSize = configuration.MaxMessageSize, + MaxMessageSize = TcpMessageLimits.AlignRoundMaxMessageSize(configuration.MaxMessageSize), ChannelLifetime = configuration.ChannelLifetime, SecurityTokenLifetime = configuration.SecurityTokenLifetime, MessageContext = new ServiceMessageContext() { MaxArrayLength = configuration.MaxArrayLength, MaxByteStringLength = configuration.MaxByteStringLength, - MaxMessageSize = configuration.MaxMessageSize, + MaxMessageSize = TcpMessageLimits.AlignRoundMaxMessageSize(configuration.MaxMessageSize), MaxStringLength = configuration.MaxStringLength, MaxEncodingNestingLevels = configuration.MaxEncodingNestingLevels, MaxDecoderRecoveries = configuration.MaxDecoderRecoveries,