async_mqtt 4.1.0
Loading...
Searching...
No Matches
control_packet_type.hpp
1// Copyright Takatoshi Kondo 2022
2//
3// Distributed under the Boost Software License, Version 1.0.
4// (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7#if !defined(ASYNC_MQTT_CONTROL_PACKET_TYPE_HPP)
8#define ASYNC_MQTT_CONTROL_PACKET_TYPE_HPP
9
10#include <cstdint>
11#include <ostream>
12
13#include <async_mqtt/util/optional.hpp>
14
15namespace async_mqtt {
16
17enum class control_packet_type : std::uint8_t {
18
19 // reserved = 0b0000000,
20 connect = 0b00010000, // 1
21 connack = 0b00100000, // 2
22 publish = 0b00110000, // 3
23 puback = 0b01000000, // 4
24 pubrec = 0b01010000, // 5
25 pubrel = 0b01100000, // 6
26 pubcomp = 0b01110000, // 7
27 subscribe = 0b10000000, // 8
28 suback = 0b10010000, // 9
29 unsubscribe = 0b10100000, // 10
30 unsuback = 0b10110000, // 11
31 pingreq = 0b11000000, // 12
32 pingresp = 0b11010000, // 13、
33 disconnect = 0b11100000, // 14
34 auth = 0b11110000, // 15
35
36};
37
38constexpr control_packet_type get_control_packet_type(std::uint8_t v) {
39 return static_cast<control_packet_type>(v & 0b11110000);
40}
41
42constexpr
43char const* control_packet_type_to_str(control_packet_type v) {
44 switch(v)
45 {
46 // case control_packet_type::reserved: return "reserved";
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";
63 }
64}
65
66inline
67std::ostream& operator<<(std::ostream& os, control_packet_type val)
68{
69 os << control_packet_type_to_str(val);
70 return os;
71}
72
73enum class control_packet_reserved_bits : std::uint8_t {
74 connect = 0b00000000,
75 connack = 0b00000000,
76 // publish = dup qos retain,
77 puback = 0b00000000,
78 pubrec = 0b00000000,
79 pubrel = 0b00000010,
80 pubcomp = 0b00000000,
81 subscribe = 0b00000010,
82 suback = 0b00000000,
83 unsubscribe = 0b00000010,
84 unsuback = 0b00000000,
85 pingreq = 0b00000000,
86 pingresp = 0b00000000,
87 disconnect = 0b00000000,
88 auth = 0b00000000,
89};
90
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);
93 auto valid =
94 [&] {
95 auto rsv = static_cast<control_packet_reserved_bits>(v & 0b00001111);
96 switch (cpt) {
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:
102 return true;
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;
127 default:
128 return false;
129 }
130 } ();
131 if (valid) return cpt;
132 return nullopt;
133}
134
135} // namespace async_mqtt
136
137#endif // ASYNC_MQTT_CONTROL_PACKET_TYPE_HPP