| /* |
| * include/haproxy/mqtt.h |
| * This file contains structure declarations for MQTT protocol. |
| * |
| * Copyright 2020 Baptiste Assmann <bedis9@gmail.com> |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation, version 2.1 |
| * exclusively. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #ifndef _HAPROXY_MQTT_T_H |
| #define _HAPROXY_MQTT_T_H |
| |
| #include <import/ist.h> |
| |
| /* MQTT protocol version |
| * In MQTT 3.1.1, version is called "level" |
| */ |
| #define MQTT_VERSION_3_1_1 4 |
| #define MQTT_VERSION_5_0 5 |
| |
| /* |
| * return code when parsing / validating MQTT messages |
| */ |
| #define MQTT_INVALID_MESSAGE -1 |
| #define MQTT_NEED_MORE_DATA 0 |
| #define MQTT_VALID_MESSAGE 1 |
| |
| |
| /* |
| * MQTT Control Packet Type: MQTT_CPT_* |
| * |
| * Part of the fixed headers, encoded on the first packet byte : |
| * |
| * +-------+-----------+-----------+-----------+---------+----------+----------+---------+------------+ |
| * | bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| * +-------+-----------+-----------+-----------+---------+----------+----------+---------+------------+ |
| * | field | MQTT Control Packet Type | Flags specific to each Control Packet type | |
| * +-------+---------------------------------------------+--------------------------------------------+ |
| * |
| * Don't forget to "left offset by 4 bits (<< 4)" the values below when matching against the fixed |
| * header collected in a MQTT packet. |
| * |
| * value 0x0 is reserved and forbidden |
| */ |
| enum { |
| MQTT_CPT_INVALID = 0, |
| |
| MQTT_CPT_CONNECT, |
| MQTT_CPT_CONNACK, |
| MQTT_CPT_PUBLISH, |
| MQTT_CPT_PUBACK, |
| MQTT_CPT_PUBREC, |
| MQTT_CPT_PUBREL, |
| MQTT_CPT_PUBCOMP, |
| MQTT_CPT_SUBSCRIBE, |
| MQTT_CPT_SUBACK, |
| MQTT_CPT_UNSUBSCRIBE, |
| MQTT_CPT_UNSUBACK, |
| MQTT_CPT_PINGREQ, |
| MQTT_CPT_PINGRESP, |
| MQTT_CPT_DISCONNECT, |
| MQTT_CPT_AUTH, |
| MQTT_CPT_ENTRIES /* used to mark the end/size of our MQTT_CPT_* list */ |
| }; |
| |
| /* MQTT CONNECT packet flags */ |
| #define MQTT_CONNECT_FL_RESERVED 0x01 |
| #define MQTT_CONNECT_FL_CLEAN_SESSION 0x02 |
| #define MQTT_CONNECT_FL_WILL 0x04 |
| #define MQTT_CONNECT_FL_WILL_QOS 0x18 /* covers 2 bits 00011000 */ |
| #define MQTT_CONNECT_FL_WILL_RETAIN 0x20 |
| #define MQTT_CONNECT_FL_PASSWORD 0x40 |
| #define MQTT_CONNECT_FL_USERNAME 0x80 |
| |
| /* MQTT packet properties indentifiers |
| * https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901029 |
| */ |
| #define MQTT_PROP_PAYLOAD_FORMAT_INDICATOR 0x01 |
| #define MQTT_PROP_MESSAGE_EXPIRY_INTERVAL 0x02 |
| #define MQTT_PROP_CONTENT_TYPE 0x03 |
| #define MQTT_PROP_RESPONSE_TOPIC 0x08 |
| #define MQTT_PROP_CORRELATION_DATA 0x09 |
| #define MQTT_PROP_SESSION_EXPIRY_INTERVAL 0x11 |
| #define MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER 0x12 |
| #define MQTT_PROP_SERVER_KEEPALIVE 0x13 |
| #define MQTT_PROP_AUTHENTICATION_METHOD 0x15 |
| #define MQTT_PROP_AUTHENTICATION_DATA 0x16 |
| #define MQTT_PROP_REQUEST_PROBLEM_INFORMATION 0x17 |
| #define MQTT_PROP_WILL_DELAY_INTERVAL 0x18 |
| #define MQTT_PROP_REQUEST_RESPONSE_INFORMATION 0x19 |
| #define MQTT_PROP_RESPONSE_INFORMATION 0x1A |
| #define MQTT_PROP_SERVER_REFERENCE 0x1C |
| #define MQTT_PROP_RECEIVE_MAXIMUM 0x21 |
| #define MQTT_PROP_TOPIC_ALIAS_MAXIMUM 0x22 |
| #define MQTT_PROP_MAXIMUM_QOS 0x24 |
| #define MQTT_PROP_RETAIN_AVAILABLE 0x25 |
| #define MQTT_PROP_USER_PROPERTIES 0x26 |
| #define MQTT_PROP_MAXIMUM_PACKET_SIZE 0x27 |
| #define MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE 0x28 |
| #define MQTT_PROP_SUBSCRIPTION_IDENTIFIERS_AVAILABLE 0x29 |
| #define MQTT_PROP_SHARED_SUBSRIPTION_AVAILABLE 0x2A |
| #define MQTT_PROP_REASON_STRING 0x1F |
| #define MQTT_PROP_LAST 0xFF |
| |
| /* MQTT minimal packet size */ |
| #define MQTT_MIN_PKT_SIZE 2 |
| #define MQTT_REMAINING_LENGHT_MAX_SIZE 4 |
| |
| /* list of supported capturable Field Names and configuration file string */ |
| enum { |
| MQTT_FN_INVALID = 0, |
| |
| MQTT_FN_FLAGS, |
| MQTT_FN_REASON_CODE, |
| MQTT_FN_PROTOCOL_NAME, |
| MQTT_FN_PROTOCOL_VERSION, |
| MQTT_FN_CLIENT_IDENTIFIER, |
| MQTT_FN_WILL_TOPIC, |
| MQTT_FN_WILL_PAYLOAD, |
| MQTT_FN_USERNAME, |
| MQTT_FN_PASSWORD, |
| MQTT_FN_KEEPALIVE, |
| |
| /* MQTT 5.0 properties |
| * https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901029 |
| */ |
| MQTT_FN_PAYLOAD_FORMAT_INDICATOR, |
| MQTT_FN_MESSAGE_EXPIRY_INTERVAL, |
| MQTT_FN_CONTENT_TYPE, |
| MQTT_FN_RESPONSE_TOPIC, |
| MQTT_FN_CORRELATION_DATA, |
| MQTT_FN_SUBSCRIPTION_IDENTIFIER, |
| MQTT_FN_SESSION_EXPIRY_INTERVAL, |
| MQTT_FN_ASSIGNED_CLIENT_IDENTIFIER, |
| MQTT_FN_SERVER_KEEPALIVE, |
| MQTT_FN_AUTHENTICATION_METHOD, |
| MQTT_FN_AUTHENTICATION_DATA, |
| MQTT_FN_REQUEST_PROBLEM_INFORMATION, |
| MQTT_FN_DELAY_INTERVAL, |
| MQTT_FN_REQUEST_RESPONSE_INFORMATION, |
| MQTT_FN_RESPONSE_INFORMATION, |
| MQTT_FN_SERVER_REFERENCE, |
| MQTT_FN_REASON_STRING, |
| MQTT_FN_RECEIVE_MAXIMUM, |
| MQTT_FN_TOPIC_ALIAS_MAXIMUM, |
| MQTT_FN_TOPIC_ALIAS, |
| MQTT_FN_MAXIMUM_QOS, |
| MQTT_FN_RETAIN_AVAILABLE, |
| MQTT_FN_USER_PROPERTY, |
| MQTT_FN_MAXIMUM_PACKET_SIZE, |
| MQTT_FN_WILDCARD_SUBSCRIPTION_AVAILABLE, |
| MQTT_FN_SUBSCRIPTION_IDENTIFIERS_AVAILABLE, |
| MQTT_FN_SHARED_SUBSCRIPTION_AVAILABLE, |
| |
| MQTT_FN_ENTRIES /* this one must always be the latest one */ |
| }; |
| |
| /* MQTT field string bit, for easy match using bitmasks |
| * ATTENTION: "user-properties" are not supported for now |
| */ |
| enum { |
| MQTT_FN_BIT_FLAGS = (1ULL << MQTT_FN_FLAGS), |
| MQTT_FN_BIT_REASON_CODE = (1ULL << MQTT_FN_REASON_CODE), |
| MQTT_FN_BIT_PROTOCOL_NAME = (1ULL << MQTT_FN_PROTOCOL_NAME), |
| MQTT_FN_BIT_PROTOCOL_VERSION = (1ULL << MQTT_FN_PROTOCOL_VERSION), |
| MQTT_FN_BIT_CLIENT_IDENTIFIER = (1ULL << MQTT_FN_CLIENT_IDENTIFIER), |
| MQTT_FN_BIT_WILL_TOPIC = (1ULL << MQTT_FN_WILL_TOPIC), |
| MQTT_FN_BIT_WILL_PAYLOAD = (1ULL << MQTT_FN_WILL_PAYLOAD), |
| MQTT_FN_BIT_USERNAME = (1ULL << MQTT_FN_USERNAME), |
| MQTT_FN_BIT_PASSWORD = (1ULL << MQTT_FN_PASSWORD), |
| MQTT_FN_BIT_KEEPALIVE = (1ULL << MQTT_FN_KEEPALIVE), |
| MQTT_FN_BIT_PAYLOAD_FORMAT_INDICATOR = (1ULL << MQTT_FN_PAYLOAD_FORMAT_INDICATOR), |
| MQTT_FN_BIT_MESSAGE_EXPIRY_INTERVAL = (1ULL << MQTT_FN_MESSAGE_EXPIRY_INTERVAL), |
| MQTT_FN_BIT_CONTENT_TYPE = (1ULL << MQTT_FN_CONTENT_TYPE), |
| MQTT_FN_BIT_RESPONSE_TOPIC = (1ULL << MQTT_FN_RESPONSE_TOPIC), |
| MQTT_FN_BIT_CORRELATION_DATA = (1ULL << MQTT_FN_CORRELATION_DATA), |
| MQTT_FN_BIT_SUBSCRIPTION_IDENTIFIER = (1ULL << MQTT_FN_SUBSCRIPTION_IDENTIFIER), |
| MQTT_FN_BIT_SESSION_EXPIRY_INTERVAL = (1ULL << MQTT_FN_SESSION_EXPIRY_INTERVAL), |
| MQTT_FN_BIT_ASSIGNED_CLIENT_IDENTIFIER = (1ULL << MQTT_FN_ASSIGNED_CLIENT_IDENTIFIER), |
| MQTT_FN_BIT_SERVER_KEEPALIVE = (1ULL << MQTT_FN_SERVER_KEEPALIVE), |
| MQTT_FN_BIT_AUTHENTICATION_METHOD = (1ULL << MQTT_FN_AUTHENTICATION_METHOD), |
| MQTT_FN_BIT_AUTHENTICATION_DATA = (1ULL << MQTT_FN_AUTHENTICATION_DATA), |
| MQTT_FN_BIT_REQUEST_PROBLEM_INFORMATION = (1ULL << MQTT_FN_REQUEST_PROBLEM_INFORMATION), |
| MQTT_FN_BIT_DELAY_INTERVAL = (1ULL << MQTT_FN_DELAY_INTERVAL), |
| MQTT_FN_BIT_REQUEST_RESPONSE_INFORMATION = (1ULL << MQTT_FN_REQUEST_RESPONSE_INFORMATION), |
| MQTT_FN_BIT_RESPONSE_INFORMATION = (1ULL << MQTT_FN_RESPONSE_INFORMATION), |
| MQTT_FN_BIT_SERVER_REFERENCE = (1ULL << MQTT_FN_SERVER_REFERENCE), |
| MQTT_FN_BIT_REASON_STRING = (1ULL << MQTT_FN_REASON_STRING), |
| MQTT_FN_BIT_RECEIVE_MAXIMUM = (1ULL << MQTT_FN_RECEIVE_MAXIMUM), |
| MQTT_FN_BIT_TOPIC_ALIAS_MAXIMUM = (1ULL << MQTT_FN_TOPIC_ALIAS_MAXIMUM), |
| MQTT_FN_BIT_TOPIC_ALIAS = (1ULL << MQTT_FN_TOPIC_ALIAS), |
| MQTT_FN_BIT_MAXIMUM_QOS = (1ULL << MQTT_FN_MAXIMUM_QOS), |
| MQTT_FN_BIT_RETAIN_AVAILABLE = (1ULL << MQTT_FN_RETAIN_AVAILABLE), |
| MQTT_FN_BIT_USER_PROPERTY = (1ULL << MQTT_FN_USER_PROPERTY), |
| MQTT_FN_BIT_MAXIMUM_PACKET_SIZE = (1ULL << MQTT_FN_MAXIMUM_PACKET_SIZE), |
| MQTT_FN_BIT_WILDCARD_SUBSCRIPTION_AVAILABLE = (1ULL << MQTT_FN_WILDCARD_SUBSCRIPTION_AVAILABLE), |
| MQTT_FN_BIT_SUBSCRIPTION_IDENTIFIERS_AVAILABLE= (1ULL << MQTT_FN_SUBSCRIPTION_IDENTIFIERS_AVAILABLE), |
| MQTT_FN_BIT_SHARED_SUBSCRIPTION_AVAILABLE = (1ULL << MQTT_FN_SHARED_SUBSCRIPTION_AVAILABLE), |
| }; |
| |
| /* structure to host fields for a MQTT CONNECT packet */ |
| #define MQTT_PROP_USER_PROPERTY_ENTRIES 5 |
| struct connect { |
| struct { |
| struct ist protocol_name; |
| uint8_t protocol_version; |
| uint8_t flags; |
| uint16_t keepalive; |
| |
| struct { |
| uint32_t session_expiry_interval; |
| uint16_t receive_maximum; |
| uint32_t maximum_packet_size; |
| uint16_t topic_alias_maximum; |
| uint8_t request_response_information; |
| uint8_t request_problem_information; |
| struct { |
| struct ist name; |
| struct ist value; |
| } user_props[MQTT_PROP_USER_PROPERTY_ENTRIES]; |
| struct ist authentication_method; |
| struct ist authentication_data; |
| } props; |
| } var_hdr; |
| struct { |
| struct ist client_identifier; |
| struct { |
| uint32_t delay_interval; |
| uint8_t payload_format_indicator; |
| uint32_t message_expiry_interval; |
| struct ist content_type; |
| struct ist response_topic; |
| struct ist correlation_data; |
| struct { |
| struct ist name; |
| struct ist value; |
| } user_props[MQTT_PROP_USER_PROPERTY_ENTRIES]; |
| } will_props; |
| struct ist will_topic; |
| struct ist will_payload; |
| struct ist username; |
| struct ist password; |
| } payload; |
| }; |
| |
| /* structure to host fields for a MQTT CONNACK packet */ |
| struct connack { |
| struct { |
| uint8_t protocol_version; |
| uint8_t flags; |
| uint8_t reason_code; |
| struct { |
| uint32_t session_expiry_interval; |
| uint16_t receive_maximum; |
| uint8_t maximum_qos; |
| uint8_t retain_available; |
| uint32_t maximum_packet_size; |
| struct ist assigned_client_identifier; |
| uint16_t topic_alias_maximum; |
| struct ist reason_string; |
| struct { |
| struct ist name; |
| struct ist value; |
| } user_props[MQTT_PROP_USER_PROPERTY_ENTRIES]; |
| uint8_t wildcard_subscription_available; |
| uint8_t subscription_identifiers_available; |
| uint8_t shared_subsription_available; |
| uint16_t server_keepalive; |
| struct ist response_information; |
| struct ist server_reference; |
| struct ist authentication_method; |
| struct ist authentication_data; |
| } props; |
| } var_hdr; |
| }; |
| |
| /* structure to host a MQTT packet */ |
| struct mqtt_pkt { |
| struct { |
| uint8_t type; /* MQTT_CPT_* */ |
| uint8_t flags; /* MQTT_CPT_FL* */ |
| uint32_t remaining_length; |
| } fixed_hdr; |
| union { |
| struct connect connect; |
| struct connack connack; |
| } data; |
| }; |
| |
| #endif /* _HAPROXY_MQTT_T_H */ |
| |
| /* |
| * Local variables: |
| * c-indent-level: 8 |
| * c-basic-offset: 8 |
| * End: |
| */ |