fix(emqx_channel): Receive Maximum spec compliance

According to MQTT 5.0 specification
If the Receive Maximum value is absent then its value defaults to
65,535.
This commit is contained in:
Zaiming Shi 2021-03-25 15:11:03 +01:00 committed by Zaiming (Stone) Shi
parent b10a60cddb
commit 6c77fa1bf7
3 changed files with 9 additions and 8 deletions

View File

@ -181,8 +181,7 @@
-define(MAX_PACKET_ID, 16#FFFF).
-define(MAX_PACKET_SIZE, 16#FFFFFFF).
-define(MAX_TOPIC_AlIAS, 16#FFFF).
-define(MAX_INFLIGHT_HARD_LIMIT, 32767).
-define(RECEIVE_MAXIMUM_LIMIT, ?MAX_PACKET_ID).
%%--------------------------------------------------------------------
%% MQTT Frame Mask

View File

@ -937,7 +937,7 @@ end}.
{mapping, "zone.$name.max_inflight", "emqx.zones", [
{default, 0},
{datatype, integer},
{validators, ["range:1-32767"]}
{validators, ["range:1-65535"]}
]}.
%% @doc Retry interval for redelivering QoS1/2 messages.

View File

@ -1119,7 +1119,6 @@ enrich_conninfo(ConnPkt = #mqtt_packet_connect{
clientinfo = #{zone := Zone}
}) ->
ExpiryInterval = expiry_interval(Zone, ConnPkt),
ReceiveMaximum = receive_maximum(Zone, ConnProps),
NConnInfo = ConnInfo#{proto_name => ProtoName,
proto_ver => ProtoVer,
clean_start => CleanStart,
@ -1128,7 +1127,7 @@ enrich_conninfo(ConnPkt = #mqtt_packet_connect{
username => Username,
conn_props => ConnProps,
expiry_interval => ExpiryInterval,
receive_maximum => ReceiveMaximum
receive_maximum => receive_maximum(Zone, ConnProps)
},
{ok, Channel#channel{conninfo = NConnInfo}}.
@ -1144,11 +1143,14 @@ expiry_interval(_Zone, #mqtt_packet_connect{clean_start = true}) ->
receive_maximum(Zone, ConnProps) ->
MaxInflightConfig = case emqx_zone:max_inflight(Zone) of
0 -> ?MAX_INFLIGHT_HARD_LIMIT;
0 -> ?RECEIVE_MAXIMUM_LIMIT;
N -> N
end,
MaxByClient = emqx_mqtt_props:get('Receive-Maximum', ConnProps, MaxInflightConfig),
erlang:min(MaxByClient, MaxInflightConfig).
%% Received might be zero which should be a protocol error
%% we do not validate MQTT properties here
%% it is to be caught later
Received = emqx_mqtt_props:get('Receive-Maximum', ConnProps, MaxInflightConfig),
erlang:min(Received, MaxInflightConfig).
%%--------------------------------------------------------------------
%% Run Connect Hooks