xref: /btstack/src/mesh/mesh_upper_transport.h (revision 832a0cf57be747a0e1c6c016a8aae12c578ee168)
177ba3d3fSMatthias Ringwald /*
277ba3d3fSMatthias Ringwald  * Copyright (C) 2018 BlueKitchen GmbH
377ba3d3fSMatthias Ringwald  *
477ba3d3fSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
577ba3d3fSMatthias Ringwald  * modification, are permitted provided that the following conditions
677ba3d3fSMatthias Ringwald  * are met:
777ba3d3fSMatthias Ringwald  *
877ba3d3fSMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
977ba3d3fSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
1077ba3d3fSMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
1177ba3d3fSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
1277ba3d3fSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
1377ba3d3fSMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
1477ba3d3fSMatthias Ringwald  *    contributors may be used to endorse or promote products derived
1577ba3d3fSMatthias Ringwald  *    from this software without specific prior written permission.
1677ba3d3fSMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
1777ba3d3fSMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
1877ba3d3fSMatthias Ringwald  *    monetary gain.
1977ba3d3fSMatthias Ringwald  *
2077ba3d3fSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
2177ba3d3fSMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2277ba3d3fSMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2377ba3d3fSMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
2477ba3d3fSMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2577ba3d3fSMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2677ba3d3fSMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2777ba3d3fSMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2877ba3d3fSMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2977ba3d3fSMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
3077ba3d3fSMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3177ba3d3fSMatthias Ringwald  * SUCH DAMAGE.
3277ba3d3fSMatthias Ringwald  *
3377ba3d3fSMatthias Ringwald  * Please inquire about commercial licensing options at
3477ba3d3fSMatthias Ringwald  * [email protected]
3577ba3d3fSMatthias Ringwald  *
3677ba3d3fSMatthias Ringwald  */
3777ba3d3fSMatthias Ringwald 
3877ba3d3fSMatthias Ringwald #ifndef __MESH_TRANSPORT_H
3977ba3d3fSMatthias Ringwald #define __MESH_TRANSPORT_H
4077ba3d3fSMatthias Ringwald 
4177ba3d3fSMatthias Ringwald #include <stdint.h>
4277ba3d3fSMatthias Ringwald 
43f4854a5eSMatthias Ringwald #include "mesh/mesh_network.h"
44f4854a5eSMatthias Ringwald #include "mesh/mesh_lower_transport.h"
45f4854a5eSMatthias Ringwald 
4677ba3d3fSMatthias Ringwald #ifdef __cplusplus
4777ba3d3fSMatthias Ringwald extern "C"
4877ba3d3fSMatthias Ringwald {
4977ba3d3fSMatthias Ringwald #endif
5077ba3d3fSMatthias Ringwald 
51f1219446SMatthias Ringwald // upper transport message builder
52f1219446SMatthias Ringwald typedef struct {
53f1219446SMatthias Ringwald     mesh_upper_transport_pdu_t  * pdu;
54ce16a729SMatthias Ringwald     mesh_network_pdu_t * segment;
55f1219446SMatthias Ringwald } mesh_upper_transport_builder_t;
56f1219446SMatthias Ringwald 
57*832a0cf5SMatthias Ringwald /*
58*832a0cf5SMatthias Ringwald  * @brief reserve 1 x mesh_upper_transport_pdu_t and 14 x mesh_network_pdu_t to allow composition of max access/control message
59*832a0cf5SMatthias Ringwald  * @returns true if enough buffer allocated
60*832a0cf5SMatthias Ringwald  */
61*832a0cf5SMatthias Ringwald bool mesh_upper_transport_message_reserve(void);
62*832a0cf5SMatthias Ringwald 
63*832a0cf5SMatthias Ringwald /*
64*832a0cf5SMatthias Ringwald  * @brief init message builder for unsegmented access, segmented access, and segmented control messages
65*832a0cf5SMatthias Ringwald  * @note uses buffers reserved by mesh_upper_transport_message_reserve
66*832a0cf5SMatthias Ringwald  */
67f1219446SMatthias Ringwald void mesh_upper_transport_message_init(mesh_upper_transport_builder_t * builder, mesh_pdu_type_t pdu_type);
68*832a0cf5SMatthias Ringwald 
69*832a0cf5SMatthias Ringwald /**
70*832a0cf5SMatthias Ringwald  * @brief append data to message
71*832a0cf5SMatthias Ringwald  * @param builder
72*832a0cf5SMatthias Ringwald  * @param data
73*832a0cf5SMatthias Ringwald  * @param data_len
74*832a0cf5SMatthias Ringwald  */
75f1219446SMatthias Ringwald void mesh_upper_transport_message_add_data(mesh_upper_transport_builder_t * builder, const uint8_t * data, uint16_t data_len);
76*832a0cf5SMatthias Ringwald 
77*832a0cf5SMatthias Ringwald /**
78*832a0cf5SMatthias Ringwald  * @brief append single byte
79*832a0cf5SMatthias Ringwald  * @param builder
80*832a0cf5SMatthias Ringwald  * @param value
81*832a0cf5SMatthias Ringwald  */
82f1219446SMatthias Ringwald void mesh_upper_transport_message_add_uint8(mesh_upper_transport_builder_t * builder, uint8_t value);
83*832a0cf5SMatthias Ringwald /**
84*832a0cf5SMatthias Ringwald  * @brief append uint16
85*832a0cf5SMatthias Ringwald  * @param builder
86*832a0cf5SMatthias Ringwald  * @param value
87*832a0cf5SMatthias Ringwald  */
88f1219446SMatthias Ringwald void mesh_upper_transport_message_add_uint16(mesh_upper_transport_builder_t * builder, uint16_t value);
89*832a0cf5SMatthias Ringwald /**
90*832a0cf5SMatthias Ringwald  * @brief append uint24
91*832a0cf5SMatthias Ringwald  * @param builder
92*832a0cf5SMatthias Ringwald  * @param value
93*832a0cf5SMatthias Ringwald  */
94f1219446SMatthias Ringwald void mesh_upper_transport_message_add_uint24(mesh_upper_transport_builder_t * builder, uint16_t value);
95*832a0cf5SMatthias Ringwald /**
96*832a0cf5SMatthias Ringwald  * @brief append uint32
97*832a0cf5SMatthias Ringwald  * @param builder
98*832a0cf5SMatthias Ringwald  * @param value
99*832a0cf5SMatthias Ringwald  */
100f1219446SMatthias Ringwald void mesh_upper_transport_message_add_uint32(mesh_upper_transport_builder_t * builder, uint16_t value);
101*832a0cf5SMatthias Ringwald /**
102*832a0cf5SMatthias Ringwald  * @brief finalize message
103*832a0cf5SMatthias Ringwald  * @param builder
104*832a0cf5SMatthias Ringwald  * @returns upper_transport_pdu if message was successfully constructed
105*832a0cf5SMatthias Ringwald  */
106f1219446SMatthias Ringwald mesh_upper_transport_pdu_t * mesh_upper_transport_message_finalize(mesh_upper_transport_builder_t * builder);
107f1219446SMatthias Ringwald 
108*832a0cf5SMatthias Ringwald /**
109*832a0cf5SMatthias Ringwald  * @brief Initialize Upper Transport Layer
110*832a0cf5SMatthias Ringwald  */
1114407d0bbSMatthias Ringwald void mesh_upper_transport_init(void);
11277ba3d3fSMatthias Ringwald 
113*832a0cf5SMatthias Ringwald /**
114*832a0cf5SMatthias Ringwald  * @brief Register for control messages and events
115*832a0cf5SMatthias Ringwald  * @param callback
116*832a0cf5SMatthias Ringwald  */
117404d2482SMatthias Ringwald void mesh_upper_transport_register_control_message_handler(void (*callback)(mesh_transport_callback_type_t callback_type, mesh_transport_status_t status, mesh_pdu_t * pdu));
11877ba3d3fSMatthias Ringwald 
119*832a0cf5SMatthias Ringwald /**
120*832a0cf5SMatthias Ringwald  * @brief Register for access messages and events
121*832a0cf5SMatthias Ringwald  * @param callback
122*832a0cf5SMatthias Ringwald  */
123404d2482SMatthias Ringwald void mesh_upper_transport_register_access_message_handler(void (*callback)(mesh_transport_callback_type_t callback_type, mesh_transport_status_t status, mesh_pdu_t * pdu));
12477ba3d3fSMatthias Ringwald 
125*832a0cf5SMatthias Ringwald /**
126*832a0cf5SMatthias Ringwald  * @brief Report received PDU as processed
127*832a0cf5SMatthias Ringwald  * @param pdu
128*832a0cf5SMatthias Ringwald  * @note pdu cannot be accessed after call
129*832a0cf5SMatthias Ringwald  */
1304802c66dSMatthias Ringwald void mesh_upper_transport_message_processed_by_higher_layer(mesh_pdu_t * pdu);
1314802c66dSMatthias Ringwald 
132*832a0cf5SMatthias Ringwald /**
133*832a0cf5SMatthias Ringwald  * @brief Free any PDU type
134*832a0cf5SMatthias Ringwald  * @param pdu
135*832a0cf5SMatthias Ringwald  */
1364802c66dSMatthias Ringwald void mesh_upper_transport_pdu_free(mesh_pdu_t * pdu);
1374802c66dSMatthias Ringwald 
1384802c66dSMatthias Ringwald // Control PDUs: setup and send
139*832a0cf5SMatthias Ringwald 
140*832a0cf5SMatthias Ringwald /**
141*832a0cf5SMatthias Ringwald  * @brief Setup Unsegmented Control Pdu provided by network_pdu param
142*832a0cf5SMatthias Ringwald  * @param network_pdu
143*832a0cf5SMatthias Ringwald  * @param netkey_index
144*832a0cf5SMatthias Ringwald  * @param ttl
145*832a0cf5SMatthias Ringwald  * @param src
146*832a0cf5SMatthias Ringwald  * @param dest
147*832a0cf5SMatthias Ringwald  * @param opcode
148*832a0cf5SMatthias Ringwald  * @param control_pdu_data
149*832a0cf5SMatthias Ringwald  * @param control_pdu_len
150*832a0cf5SMatthias Ringwald  * @return 0 on success
151*832a0cf5SMatthias Ringwald  */
1524802c66dSMatthias Ringwald uint8_t mesh_upper_transport_setup_unsegmented_control_pdu(mesh_network_pdu_t * network_pdu, uint16_t netkey_index, uint8_t ttl, uint16_t src, uint16_t dest, uint8_t opcode,
1534802c66dSMatthias Ringwald                                                            const uint8_t * control_pdu_data, uint16_t control_pdu_len);
1544802c66dSMatthias Ringwald 
155*832a0cf5SMatthias Ringwald /**
156*832a0cf5SMatthias Ringwald  * @brief Setup header of Segmented Control PDU created with mesh_upper_transport_message_finalize
157*832a0cf5SMatthias Ringwald  * @param upper_pdu
158*832a0cf5SMatthias Ringwald  * @param netkey_index
159*832a0cf5SMatthias Ringwald  * @param ttl
160*832a0cf5SMatthias Ringwald  * @param src
161*832a0cf5SMatthias Ringwald  * @param dest
162*832a0cf5SMatthias Ringwald  * @param opcode
163*832a0cf5SMatthias Ringwald  * @return 0 on success
164*832a0cf5SMatthias Ringwald  */
1654802c66dSMatthias Ringwald uint8_t mesh_upper_transport_setup_segmented_control_pdu_header(mesh_upper_transport_pdu_t * upper_pdu, uint16_t netkey_index, uint8_t ttl, uint16_t src, uint16_t dest, uint8_t opcode);
1664802c66dSMatthias Ringwald 
167*832a0cf5SMatthias Ringwald /**
168*832a0cf5SMatthias Ringwald  * @brief Send Control PDU
169*832a0cf5SMatthias Ringwald  * @param pdu
170*832a0cf5SMatthias Ringwald  */
1714802c66dSMatthias Ringwald void mesh_upper_transport_send_control_pdu(mesh_pdu_t * pdu);
1724802c66dSMatthias Ringwald 
1734802c66dSMatthias Ringwald // Access PDUs: setup and send
174*832a0cf5SMatthias Ringwald /**
175*832a0cf5SMatthias Ringwald  * @brief Setup header of Access PDU created with mesh_upper_transport_message_finalize
176*832a0cf5SMatthias Ringwald  * @param pdu
177*832a0cf5SMatthias Ringwald  * @param netkey_index
178*832a0cf5SMatthias Ringwald  * @param appkey_index
179*832a0cf5SMatthias Ringwald  * @param ttl
180*832a0cf5SMatthias Ringwald  * @param src
181*832a0cf5SMatthias Ringwald  * @param dest
182*832a0cf5SMatthias Ringwald  * @param szmic
183*832a0cf5SMatthias Ringwald  * @return
184*832a0cf5SMatthias Ringwald  */
18577ba3d3fSMatthias Ringwald uint8_t mesh_upper_transport_setup_access_pdu_header(mesh_pdu_t * pdu, uint16_t netkey_index, uint16_t appkey_index,
18677ba3d3fSMatthias Ringwald                                                                uint8_t ttl, uint16_t src, uint16_t dest, uint8_t szmic);
18777ba3d3fSMatthias Ringwald 
188*832a0cf5SMatthias Ringwald /**
189*832a0cf5SMatthias Ringwald  * @brief Send Access PDU
190*832a0cf5SMatthias Ringwald  * @param pdu
191*832a0cf5SMatthias Ringwald  */
19277ba3d3fSMatthias Ringwald void mesh_upper_transport_send_access_pdu(mesh_pdu_t * pdu);
193b551f24dSMatthias Ringwald 
19477ba3d3fSMatthias Ringwald 
195dd729594SMatthias Ringwald // test
196dd729594SMatthias Ringwald void mesh_upper_transport_dump(void);
197dd729594SMatthias Ringwald void mesh_upper_transport_reset(void);
198dd729594SMatthias Ringwald 
19977ba3d3fSMatthias Ringwald #ifdef __cplusplus
20077ba3d3fSMatthias Ringwald } /* end of extern "C" */
20177ba3d3fSMatthias Ringwald #endif
20277ba3d3fSMatthias Ringwald 
20377ba3d3fSMatthias Ringwald #endif
204