From b7c2821326112ef7cf62ad39816ae20cbfc5153f Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Sat, 25 Aug 2018 16:07:57 +0800 Subject: [PATCH] Make reason codes of SUBACK be compatible with MQTT V3.1.1 --- src/emqx_protocol.erl | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/emqx_protocol.erl b/src/emqx_protocol.erl index 650da4d1c..3faa7781a 100644 --- a/src/emqx_protocol.erl +++ b/src/emqx_protocol.erl @@ -391,8 +391,13 @@ deliver({pubrel, PacketId}, PState) -> deliver({pubrec, PacketId, ReasonCode}, PState) -> send(?PUBREC_PACKET(PacketId, ReasonCode), PState); -deliver({suback, PacketId, ReasonCodes}, PState) -> - send(?SUBACK_PACKET(PacketId, ReasonCodes), PState); +deliver({suback, PacketId, ReasonCodes}, PState = #pstate{proto_ver = ProtoVer}) -> + send(?SUBACK_PACKET(PacketId, + if ProtoVer =:= ?MQTT_PROTO_V5 -> + ReasonCodes; + true -> + [emqx_reason_codes:compat(suback, RC) || RC <- ReasonCodes] + end), PState); deliver({unsuback, PacketId, ReasonCodes}, PState) -> send(?UNSUBACK_PACKET(PacketId, ReasonCodes), PState); @@ -408,12 +413,12 @@ deliver({disconnect, _ReasonCode}, PState) -> %% Send Packet to Client -spec(send(mqtt_packet(), state()) -> {ok, state()} | {error, term()}). -send(Packet = ?PACKET(Type), PState = #pstate{proto_ver = Ver, - sendfun = SendFun}) -> +send(Packet = ?PACKET(Type), PState = #pstate{proto_ver = Ver, sendfun = SendFun}) -> + trace(send, Packet, PState), case SendFun(emqx_frame:serialize(Packet, #{version => Ver})) of - ok -> emqx_metrics:sent(Packet), - trace(send, Packet, PState), - {ok, inc_stats(send, Type, PState)}; + ok -> + emqx_metrics:sent(Packet), + {ok, inc_stats(send, Type, PState)}; {error, Reason} -> {error, Reason} end.