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:
parent
b10a60cddb
commit
6c77fa1bf7
|
@ -181,8 +181,7 @@
|
||||||
-define(MAX_PACKET_ID, 16#FFFF).
|
-define(MAX_PACKET_ID, 16#FFFF).
|
||||||
-define(MAX_PACKET_SIZE, 16#FFFFFFF).
|
-define(MAX_PACKET_SIZE, 16#FFFFFFF).
|
||||||
-define(MAX_TOPIC_AlIAS, 16#FFFF).
|
-define(MAX_TOPIC_AlIAS, 16#FFFF).
|
||||||
|
-define(RECEIVE_MAXIMUM_LIMIT, ?MAX_PACKET_ID).
|
||||||
-define(MAX_INFLIGHT_HARD_LIMIT, 32767).
|
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% MQTT Frame Mask
|
%% MQTT Frame Mask
|
||||||
|
|
|
@ -937,7 +937,7 @@ end}.
|
||||||
{mapping, "zone.$name.max_inflight", "emqx.zones", [
|
{mapping, "zone.$name.max_inflight", "emqx.zones", [
|
||||||
{default, 0},
|
{default, 0},
|
||||||
{datatype, integer},
|
{datatype, integer},
|
||||||
{validators, ["range:1-32767"]}
|
{validators, ["range:1-65535"]}
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
%% @doc Retry interval for redelivering QoS1/2 messages.
|
%% @doc Retry interval for redelivering QoS1/2 messages.
|
||||||
|
|
|
@ -1119,7 +1119,6 @@ enrich_conninfo(ConnPkt = #mqtt_packet_connect{
|
||||||
clientinfo = #{zone := Zone}
|
clientinfo = #{zone := Zone}
|
||||||
}) ->
|
}) ->
|
||||||
ExpiryInterval = expiry_interval(Zone, ConnPkt),
|
ExpiryInterval = expiry_interval(Zone, ConnPkt),
|
||||||
ReceiveMaximum = receive_maximum(Zone, ConnProps),
|
|
||||||
NConnInfo = ConnInfo#{proto_name => ProtoName,
|
NConnInfo = ConnInfo#{proto_name => ProtoName,
|
||||||
proto_ver => ProtoVer,
|
proto_ver => ProtoVer,
|
||||||
clean_start => CleanStart,
|
clean_start => CleanStart,
|
||||||
|
@ -1128,7 +1127,7 @@ enrich_conninfo(ConnPkt = #mqtt_packet_connect{
|
||||||
username => Username,
|
username => Username,
|
||||||
conn_props => ConnProps,
|
conn_props => ConnProps,
|
||||||
expiry_interval => ExpiryInterval,
|
expiry_interval => ExpiryInterval,
|
||||||
receive_maximum => ReceiveMaximum
|
receive_maximum => receive_maximum(Zone, ConnProps)
|
||||||
},
|
},
|
||||||
{ok, Channel#channel{conninfo = NConnInfo}}.
|
{ok, Channel#channel{conninfo = NConnInfo}}.
|
||||||
|
|
||||||
|
@ -1144,11 +1143,14 @@ expiry_interval(_Zone, #mqtt_packet_connect{clean_start = true}) ->
|
||||||
|
|
||||||
receive_maximum(Zone, ConnProps) ->
|
receive_maximum(Zone, ConnProps) ->
|
||||||
MaxInflightConfig = case emqx_zone:max_inflight(Zone) of
|
MaxInflightConfig = case emqx_zone:max_inflight(Zone) of
|
||||||
0 -> ?MAX_INFLIGHT_HARD_LIMIT;
|
0 -> ?RECEIVE_MAXIMUM_LIMIT;
|
||||||
N -> N
|
N -> N
|
||||||
end,
|
end,
|
||||||
MaxByClient = emqx_mqtt_props:get('Receive-Maximum', ConnProps, MaxInflightConfig),
|
%% Received might be zero which should be a protocol error
|
||||||
erlang:min(MaxByClient, MaxInflightConfig).
|
%% 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
|
%% Run Connect Hooks
|
||||||
|
|
Loading…
Reference in New Issue