1/**
2 * @file
3 * MQTT client (private interface)
4 */
5
6/*
7 * Copyright (c) 2016 Erik Andersson
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without modification,
11 * are permitted provided that the following conditions are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright notice,
14 *    this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright notice,
16 *    this list of conditions and the following disclaimer in the documentation
17 *    and/or other materials provided with the distribution.
18 * 3. The name of the author may not be used to endorse or promote products
19 *    derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30 * OF SUCH DAMAGE.
31 *
32 * This file is part of the lwIP TCP/IP stack.
33 *
34 * Author: Erik Andersson
35 *
36 */
37#ifndef LWIP_HDR_APPS_MQTT_PRIV_H
38#define LWIP_HDR_APPS_MQTT_PRIV_H
39
40#include "lwip/apps/mqtt.h"
41#include "lwip/altcp.h"
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47/** Pending request item, binds application callback to pending server requests */
48struct mqtt_request_t
49{
50  /** Next item in list, NULL means this is the last in chain,
51      next pointing at itself means request is unallocated */
52  struct mqtt_request_t *next;
53  /** Callback to upper layer */
54  mqtt_request_cb_t cb;
55  void *arg;
56  /** MQTT packet identifier */
57  u16_t pkt_id;
58  /** Expire time relative to element before this  */
59  u16_t timeout_diff;
60};
61
62/** Ring buffer */
63struct mqtt_ringbuf_t {
64  u16_t put;
65  u16_t get;
66  u8_t buf[MQTT_OUTPUT_RINGBUF_SIZE];
67};
68
69/** MQTT client */
70struct mqtt_client_s
71{
72  /** Timers and timeouts */
73  u16_t cyclic_tick;
74  u16_t keep_alive;
75  u16_t server_watchdog;
76  /** Packet identifier generator*/
77  u16_t pkt_id_seq;
78  /** Packet identifier of pending incoming publish */
79  u16_t inpub_pkt_id;
80  /** Connection state */
81  u8_t conn_state;
82  struct altcp_pcb *conn;
83  /** Connection callback */
84  void *connect_arg;
85  mqtt_connection_cb_t connect_cb;
86  /** Pending requests to server */
87  struct mqtt_request_t *pend_req_queue;
88  struct mqtt_request_t req_list[MQTT_REQ_MAX_IN_FLIGHT];
89  void *inpub_arg;
90  /** Incoming data callback */
91  mqtt_incoming_data_cb_t data_cb;
92  mqtt_incoming_publish_cb_t pub_cb;
93  /** Input */
94  u32_t msg_idx;
95  u8_t rx_buffer[MQTT_VAR_HEADER_BUFFER_LEN];
96  /** Output ring-buffer */
97  struct mqtt_ringbuf_t output;
98};
99
100#ifdef __cplusplus
101}
102#endif
103
104#endif /* LWIP_HDR_APPS_MQTT_PRIV_H */
105