7#if !defined(ASYNC_MQTT_CONTROL_PACKET_TYPE_HPP)
8#define ASYNC_MQTT_CONTROL_PACKET_TYPE_HPP
13#include <async_mqtt/util/optional.hpp>
17enum class control_packet_type : std::uint8_t {
27 subscribe = 0b10000000,
29 unsubscribe = 0b10100000,
30 unsuback = 0b10110000,
32 pingresp = 0b11010000,
33 disconnect = 0b11100000,
38constexpr control_packet_type get_control_packet_type(std::uint8_t v) {
39 return static_cast<control_packet_type
>(v & 0b11110000);
43char const* control_packet_type_to_str(control_packet_type v) {
47 case control_packet_type::connect:
return "connect";
48 case control_packet_type::connack:
return "connack";
49 case control_packet_type::publish:
return "publish";
50 case control_packet_type::puback:
return "puback";
51 case control_packet_type::pubrec:
return "pubrec";
52 case control_packet_type::pubrel:
return "pubrel";
53 case control_packet_type::pubcomp:
return "pubcomp";
54 case control_packet_type::subscribe:
return "subscribe";
55 case control_packet_type::suback:
return "suback";
56 case control_packet_type::unsubscribe:
return "unsubscribe";
57 case control_packet_type::unsuback:
return "unsuback";
58 case control_packet_type::pingreq:
return "pingreq";
59 case control_packet_type::pingresp:
return "pingresp";
60 case control_packet_type::disconnect:
return "disconnect";
61 case control_packet_type::auth:
return "auth";
62 default:
return "unknown_control_packet_type";
67std::ostream& operator<<(std::ostream& os, control_packet_type val)
69 os << control_packet_type_to_str(val);
73enum class control_packet_reserved_bits : std::uint8_t {
81 subscribe = 0b00000010,
83 unsubscribe = 0b00000010,
84 unsuback = 0b00000000,
86 pingresp = 0b00000000,
87 disconnect = 0b00000000,
91inline optional<control_packet_type> get_control_packet_type_with_check(std::uint8_t v) {
92 auto cpt =
static_cast<control_packet_type
>(v & 0b11110000);
95 auto rsv =
static_cast<control_packet_reserved_bits
>(v & 0b00001111);
97 case control_packet_type::connect:
98 return rsv == control_packet_reserved_bits::connect;
99 case control_packet_type::connack:
100 return rsv == control_packet_reserved_bits::connack;
101 case control_packet_type::publish:
103 case control_packet_type::puback:
104 return rsv == control_packet_reserved_bits::puback;
105 case control_packet_type::pubrec:
106 return rsv == control_packet_reserved_bits::pubrec;
107 case control_packet_type::pubrel:
108 return rsv == control_packet_reserved_bits::pubrel;
109 case control_packet_type::pubcomp:
110 return rsv == control_packet_reserved_bits::pubcomp;
111 case control_packet_type::subscribe:
112 return rsv == control_packet_reserved_bits::subscribe;
113 case control_packet_type::suback:
114 return rsv == control_packet_reserved_bits::suback;
115 case control_packet_type::unsubscribe:
116 return rsv == control_packet_reserved_bits::unsubscribe;
117 case control_packet_type::unsuback:
118 return rsv == control_packet_reserved_bits::unsuback;
119 case control_packet_type::pingreq:
120 return rsv == control_packet_reserved_bits::pingreq;
121 case control_packet_type::pingresp:
122 return rsv == control_packet_reserved_bits::pingresp;
123 case control_packet_type::disconnect:
124 return rsv == control_packet_reserved_bits::disconnect;
125 case control_packet_type::auth:
126 return rsv == control_packet_reserved_bits::auth;
131 if (valid)
return cpt;