blob: 476b83ef9b4eebdcdd063a49dd245316bf326f55 [file] [log] [blame]
/*
* Copyright (c) 2022 René Beckmann
*
* SPDX-License-Identifier: Apache-2.0
*/
/** @file mqtt_sn_msg.h
*
* @brief Function and data structures internal to MQTT-SN module.
*/
#ifndef MQTT_SN_MSG_H_
#define MQTT_SN_MSG_H_
#include <zephyr/net/mqtt_sn.h>
#include <zephyr/net/buf.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MQTT_SN_LENGTH_FIELD_EXTENDED_PREFIX 0x01
#define MQTT_SN_PROTOCOL_ID 0x01
struct mqtt_sn_flags {
bool dup;
enum mqtt_sn_qos qos;
bool retain;
bool will;
bool clean_session;
enum mqtt_sn_topic_type topic_type;
};
enum mqtt_sn_msg_type {
MQTT_SN_MSG_TYPE_ADVERTISE = 0x00,
MQTT_SN_MSG_TYPE_SEARCHGW = 0x01,
MQTT_SN_MSG_TYPE_GWINFO = 0x02,
MQTT_SN_MSG_TYPE_CONNECT = 0x04,
MQTT_SN_MSG_TYPE_CONNACK = 0x05,
MQTT_SN_MSG_TYPE_WILLTOPICREQ = 0x06,
MQTT_SN_MSG_TYPE_WILLTOPIC = 0x07,
MQTT_SN_MSG_TYPE_WILLMSGREQ = 0x08,
MQTT_SN_MSG_TYPE_WILLMSG = 0x09,
MQTT_SN_MSG_TYPE_REGISTER = 0x0A,
MQTT_SN_MSG_TYPE_REGACK = 0x0B,
MQTT_SN_MSG_TYPE_PUBLISH = 0x0C,
MQTT_SN_MSG_TYPE_PUBACK = 0x0D,
MQTT_SN_MSG_TYPE_PUBCOMP = 0x0E,
MQTT_SN_MSG_TYPE_PUBREC = 0x0F,
MQTT_SN_MSG_TYPE_PUBREL = 0x10,
MQTT_SN_MSG_TYPE_SUBSCRIBE = 0x12,
MQTT_SN_MSG_TYPE_SUBACK = 0x13,
MQTT_SN_MSG_TYPE_UNSUBSCRIBE = 0x14,
MQTT_SN_MSG_TYPE_UNSUBACK = 0x15,
MQTT_SN_MSG_TYPE_PINGREQ = 0x16,
MQTT_SN_MSG_TYPE_PINGRESP = 0x17,
MQTT_SN_MSG_TYPE_DISCONNECT = 0x18,
MQTT_SN_MSG_TYPE_WILLTOPICUPD = 0x1A,
MQTT_SN_MSG_TYPE_WILLTOPICRESP = 0x1B,
MQTT_SN_MSG_TYPE_WILLMSGUPD = 0x1C,
MQTT_SN_MSG_TYPE_WILLMSGRESP = 0x1D,
MQTT_SN_MSG_TYPE_ENCAPSULATED = 0xFE,
};
struct mqtt_sn_param_advertise {
uint8_t gw_id;
uint16_t duration;
};
struct mqtt_sn_param_searchgw {
uint8_t radius;
};
struct mqtt_sn_param_gwinfo {
uint8_t gw_id;
struct mqtt_sn_data gw_add;
};
struct mqtt_sn_param_connect {
bool will;
bool clean_session;
uint16_t duration;
struct mqtt_sn_data client_id;
};
struct mqtt_sn_param_connack {
enum mqtt_sn_return_code ret_code;
};
struct mqtt_sn_param_willtopic {
enum mqtt_sn_qos qos;
bool retain;
struct mqtt_sn_data topic;
};
struct mqtt_sn_param_willmsg {
struct mqtt_sn_data msg;
};
struct mqtt_sn_param_register {
uint16_t msg_id;
uint16_t topic_id;
struct mqtt_sn_data topic;
};
struct mqtt_sn_param_regack {
uint16_t msg_id;
uint16_t topic_id;
enum mqtt_sn_return_code ret_code;
};
struct mqtt_sn_param_publish {
bool dup;
bool retain;
enum mqtt_sn_qos qos;
enum mqtt_sn_topic_type topic_type;
uint16_t topic_id;
uint16_t msg_id;
struct mqtt_sn_data data;
};
struct mqtt_sn_param_puback {
uint16_t msg_id;
uint16_t topic_id;
enum mqtt_sn_return_code ret_code;
};
struct mqtt_sn_param_pubrec {
uint16_t msg_id;
};
struct mqtt_sn_param_pubrel {
uint16_t msg_id;
};
struct mqtt_sn_param_pubcomp {
uint16_t msg_id;
};
struct mqtt_sn_param_subscribe {
bool dup;
enum mqtt_sn_qos qos;
enum mqtt_sn_topic_type topic_type;
uint16_t msg_id;
struct {
struct mqtt_sn_data topic_name;
uint16_t topic_id;
} topic;
};
struct mqtt_sn_param_suback {
enum mqtt_sn_qos qos;
uint16_t topic_id;
uint16_t msg_id;
enum mqtt_sn_return_code ret_code;
};
struct mqtt_sn_param_unsubscribe {
enum mqtt_sn_topic_type topic_type;
uint16_t msg_id;
union {
struct mqtt_sn_data topic_name;
uint16_t topic_id;
} topic;
};
struct mqtt_sn_param_unsuback {
uint16_t msg_id;
};
struct mqtt_sn_param_pingreq {
struct mqtt_sn_data client_id;
};
struct mqtt_sn_param_disconnect {
uint16_t duration;
};
struct mqtt_sn_param_willtopicupd {
enum mqtt_sn_qos qos;
bool retain;
struct mqtt_sn_data topic;
};
struct mqtt_sn_param_willmsgupd {
struct mqtt_sn_data msg;
};
struct mqtt_sn_param_willtopicresp {
enum mqtt_sn_return_code ret_code;
};
struct mqtt_sn_param_willmsgresp {
enum mqtt_sn_return_code ret_code;
};
struct mqtt_sn_param {
enum mqtt_sn_msg_type type;
union {
struct mqtt_sn_param_advertise advertise;
struct mqtt_sn_param_searchgw searchgw;
struct mqtt_sn_param_gwinfo gwinfo;
struct mqtt_sn_param_connect connect;
struct mqtt_sn_param_connack connack;
struct mqtt_sn_param_willtopic willtopic;
struct mqtt_sn_param_willmsg willmsg;
struct mqtt_sn_param_register reg;
struct mqtt_sn_param_regack regack;
struct mqtt_sn_param_publish publish;
struct mqtt_sn_param_puback puback;
struct mqtt_sn_param_pubrec pubrec;
struct mqtt_sn_param_pubrel pubrel;
struct mqtt_sn_param_pubcomp pubcomp;
struct mqtt_sn_param_subscribe subscribe;
struct mqtt_sn_param_suback suback;
struct mqtt_sn_param_unsubscribe unsubscribe;
struct mqtt_sn_param_unsuback unsuback;
struct mqtt_sn_param_pingreq pingreq;
struct mqtt_sn_param_disconnect disconnect;
struct mqtt_sn_param_willtopicupd willtopicupd;
struct mqtt_sn_param_willmsgupd willmsgupd;
struct mqtt_sn_param_willtopicresp willtopicresp;
struct mqtt_sn_param_willmsgresp willmsgresp;
} params;
};
/**@brief MQTT-SN Flags-field bitmasks */
#define MQTT_SN_FLAGS_DUP BIT(7)
#define MQTT_SN_FLAGS_QOS_0 0
#define MQTT_SN_FLAGS_QOS_1 BIT(5)
#define MQTT_SN_FLAGS_QOS_2 BIT(6)
#define MQTT_SN_FLAGS_QOS_M1 BIT(5) | BIT(6)
#define MQTT_SN_FLAGS_MASK_QOS (BIT(5) | BIT(6))
#define MQTT_SN_FLAGS_SHIFT_QOS 5
#define MQTT_SN_FLAGS_RETAIN BIT(4)
#define MQTT_SN_FLAGS_WILL BIT(3)
#define MQTT_SN_FLAGS_CLEANSESSION BIT(2)
#define MQTT_SN_FLAGS_TOPICID_TYPE_NORMAL 0
#define MQTT_SN_FLAGS_TOPICID_TYPE_PREDEF BIT(0)
#define MQTT_SN_FLAGS_TOPICID_TYPE_SHORT BIT(1)
#define MQTT_SN_FLAGS_MASK_TOPICID_TYPE (BIT(0) | BIT(1))
#define MQTT_SN_FLAGS_SHIFT_TOPICID_TYPE 0
static inline void *net_buf_simple_add_data(struct net_buf_simple *buf, struct mqtt_sn_data *data)
{
return net_buf_simple_add_mem(buf, data->data, data->size);
}
int mqtt_sn_encode_msg(struct net_buf_simple *buf, struct mqtt_sn_param *params);
int mqtt_sn_decode_msg(struct net_buf_simple *buf, struct mqtt_sn_param *params);
#ifdef __cplusplus
}
#endif
#endif /* MQTT_SN_MSG_H_ */