anchor.diff:      end;
   pre_connect_auth(#mqtt5_disconnect{properties=Properties,
                                      reason_code = RC}, State) ->
  -    _ = vmq_metrics:incr({?MQTT5_DISCONNECT_RECEIVED, rc2rcn(RC)}),
  +    _ = vmq_metrics:incr({?MQTT5_DISCONNECT_RECEIVED, disconnect_rc2rcn(RC)}),
       terminate_by_client(Properties, State);
   pre_connect_auth(_, State) ->
       terminate(?PROTOCOL_ERROR, State).
  
positive.code: ret_val(Item, Vals, Default) ->
      proplists:get_value(Item, Vals, Default).
  
  -spec rcn2rc(reason_code_name()) -> reason_code().
  rcn2rc(RCN) ->
      vmq_parser_mqtt5:rcn2rc(RCN).
  
negative.code:     _ = vmq_metrics:incr(?MQTT5_PINGRESP_SENT),
      {State, [serialise_frame(Frame)]};
  connected(#mqtt5_disconnect{properties=Properties, reason_code=RC}, State) ->
      _ = vmq_metrics:incr({?MQTT5_DISCONNECT_RECEIVED, disconnect_rc2rcn(RC)}),
      terminate_by_client(Properties, State);
  connected({disconnect, Reason}, State) ->
      lager:debug("stop due to disconnect", []),
  