xref: /btstack/src/mesh/mesh_upper_transport.h (revision 2fca4dad957cd7b88f4657ed51e89c12615dda72)
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
23*2fca4dadSMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24*2fca4dadSMilanka Ringwald  * GMBH 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 
57832a0cf5SMatthias Ringwald /*
58832a0cf5SMatthias 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
596b65794dSMilanka Ringwald  * @return true if enough buffer allocated
60832a0cf5SMatthias Ringwald  */
61832a0cf5SMatthias Ringwald bool mesh_upper_transport_message_reserve(void);
62832a0cf5SMatthias Ringwald 
63832a0cf5SMatthias Ringwald /*
64832a0cf5SMatthias Ringwald  * @brief init message builder for unsegmented access, segmented access, and segmented control messages
65832a0cf5SMatthias Ringwald  * @note uses buffers reserved by mesh_upper_transport_message_reserve
66832a0cf5SMatthias Ringwald  */
67f1219446SMatthias Ringwald void mesh_upper_transport_message_init(mesh_upper_transport_builder_t * builder, mesh_pdu_type_t pdu_type);
68832a0cf5SMatthias Ringwald 
69832a0cf5SMatthias Ringwald /**
70832a0cf5SMatthias Ringwald  * @brief append data to message
71832a0cf5SMatthias Ringwald  * @param builder
72832a0cf5SMatthias Ringwald  * @param data
73832a0cf5SMatthias Ringwald  * @param data_len
74832a0cf5SMatthias Ringwald  */
75f1219446SMatthias Ringwald void mesh_upper_transport_message_add_data(mesh_upper_transport_builder_t * builder, const uint8_t * data, uint16_t data_len);
76832a0cf5SMatthias Ringwald 
77832a0cf5SMatthias Ringwald /**
78832a0cf5SMatthias Ringwald  * @brief append single byte
79832a0cf5SMatthias Ringwald  * @param builder
80832a0cf5SMatthias Ringwald  * @param value
81832a0cf5SMatthias Ringwald  */
82f1219446SMatthias Ringwald void mesh_upper_transport_message_add_uint8(mesh_upper_transport_builder_t * builder, uint8_t value);
83832a0cf5SMatthias Ringwald /**
84832a0cf5SMatthias Ringwald  * @brief append uint16
85832a0cf5SMatthias Ringwald  * @param builder
86832a0cf5SMatthias Ringwald  * @param value
87832a0cf5SMatthias Ringwald  */
88f1219446SMatthias Ringwald void mesh_upper_transport_message_add_uint16(mesh_upper_transport_builder_t * builder, uint16_t value);
89832a0cf5SMatthias Ringwald /**
90832a0cf5SMatthias Ringwald  * @brief append uint24
91832a0cf5SMatthias Ringwald  * @param builder
92832a0cf5SMatthias Ringwald  * @param value
93832a0cf5SMatthias Ringwald  */
94f644c3aeSMatthias Ringwald void mesh_upper_transport_message_add_uint24(mesh_upper_transport_builder_t * builder, uint32_t value);
95832a0cf5SMatthias Ringwald /**
96832a0cf5SMatthias Ringwald  * @brief append uint32
97832a0cf5SMatthias Ringwald  * @param builder
98832a0cf5SMatthias Ringwald  * @param value
99832a0cf5SMatthias Ringwald  */
100f644c3aeSMatthias Ringwald void mesh_upper_transport_message_add_uint32(mesh_upper_transport_builder_t * builder, uint32_t value);
101832a0cf5SMatthias Ringwald /**
102832a0cf5SMatthias Ringwald  * @brief finalize message
103832a0cf5SMatthias Ringwald  * @param builder
1046b65794dSMilanka Ringwald  * @return upper_transport_pdu if message was successfully constructed
105832a0cf5SMatthias Ringwald  */
106f1219446SMatthias Ringwald mesh_upper_transport_pdu_t * mesh_upper_transport_message_finalize(mesh_upper_transport_builder_t * builder);
107f1219446SMatthias Ringwald 
108832a0cf5SMatthias Ringwald /**
109832a0cf5SMatthias Ringwald  * @brief Initialize Upper Transport Layer
110832a0cf5SMatthias Ringwald  */
1114407d0bbSMatthias Ringwald void mesh_upper_transport_init(void);
11277ba3d3fSMatthias Ringwald 
113832a0cf5SMatthias Ringwald /**
114832a0cf5SMatthias Ringwald  * @brief Register for control messages and events
115832a0cf5SMatthias Ringwald  * @param callback
116832a0cf5SMatthias 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 
119832a0cf5SMatthias Ringwald /**
120832a0cf5SMatthias Ringwald  * @brief Register for access messages and events
121832a0cf5SMatthias Ringwald  * @param callback
122832a0cf5SMatthias 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 
125832a0cf5SMatthias Ringwald /**
126832a0cf5SMatthias Ringwald  * @brief Report received PDU as processed
127832a0cf5SMatthias Ringwald  * @param pdu
128832a0cf5SMatthias Ringwald  * @note pdu cannot be accessed after call
129832a0cf5SMatthias Ringwald  */
1304802c66dSMatthias Ringwald void mesh_upper_transport_message_processed_by_higher_layer(mesh_pdu_t * pdu);
1314802c66dSMatthias Ringwald 
132832a0cf5SMatthias Ringwald /**
133132f11c0SMatthias Ringwald  * @brief Request to send upper transport PDU
134132f11c0SMatthias Ringwald  * @param request
135132f11c0SMatthias Ringwald  */
136132f11c0SMatthias Ringwald void mesh_upper_transport_request_to_send(btstack_context_callback_registration_t * request);
137132f11c0SMatthias Ringwald 
138132f11c0SMatthias Ringwald /**
139832a0cf5SMatthias Ringwald  * @brief Free any PDU type
140832a0cf5SMatthias Ringwald  * @param pdu
141832a0cf5SMatthias Ringwald  */
1424802c66dSMatthias Ringwald void mesh_upper_transport_pdu_free(mesh_pdu_t * pdu);
1434802c66dSMatthias Ringwald 
1444802c66dSMatthias Ringwald // Control PDUs: setup and send
145832a0cf5SMatthias Ringwald 
146832a0cf5SMatthias Ringwald /**
147832a0cf5SMatthias Ringwald  * @brief Setup Unsegmented Control Pdu provided by network_pdu param
148832a0cf5SMatthias Ringwald  * @param network_pdu
149832a0cf5SMatthias Ringwald  * @param netkey_index
150832a0cf5SMatthias Ringwald  * @param ttl
151832a0cf5SMatthias Ringwald  * @param src
152832a0cf5SMatthias Ringwald  * @param dest
153832a0cf5SMatthias Ringwald  * @param opcode
154832a0cf5SMatthias Ringwald  * @param control_pdu_data
155832a0cf5SMatthias Ringwald  * @param control_pdu_len
156832a0cf5SMatthias Ringwald  * @return 0 on success
157832a0cf5SMatthias Ringwald  */
1584802c66dSMatthias 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,
1594802c66dSMatthias Ringwald                                                            const uint8_t * control_pdu_data, uint16_t control_pdu_len);
1604802c66dSMatthias Ringwald 
161832a0cf5SMatthias Ringwald /**
162832a0cf5SMatthias Ringwald  * @brief Setup header of Segmented Control PDU created with mesh_upper_transport_message_finalize
163832a0cf5SMatthias Ringwald  * @param upper_pdu
164832a0cf5SMatthias Ringwald  * @param netkey_index
165832a0cf5SMatthias Ringwald  * @param ttl
166832a0cf5SMatthias Ringwald  * @param src
167832a0cf5SMatthias Ringwald  * @param dest
168832a0cf5SMatthias Ringwald  * @param opcode
169832a0cf5SMatthias Ringwald  * @return 0 on success
170832a0cf5SMatthias Ringwald  */
1714802c66dSMatthias 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);
1724802c66dSMatthias Ringwald 
173832a0cf5SMatthias Ringwald /**
174832a0cf5SMatthias Ringwald  * @brief Send Control PDU
175832a0cf5SMatthias Ringwald  * @param pdu
176832a0cf5SMatthias Ringwald  */
1774802c66dSMatthias Ringwald void mesh_upper_transport_send_control_pdu(mesh_pdu_t * pdu);
1784802c66dSMatthias Ringwald 
1794802c66dSMatthias Ringwald // Access PDUs: setup and send
180832a0cf5SMatthias Ringwald /**
181832a0cf5SMatthias Ringwald  * @brief Setup header of Access PDU created with mesh_upper_transport_message_finalize
182832a0cf5SMatthias Ringwald  * @param pdu
183832a0cf5SMatthias Ringwald  * @param netkey_index
184832a0cf5SMatthias Ringwald  * @param appkey_index
185832a0cf5SMatthias Ringwald  * @param ttl
186832a0cf5SMatthias Ringwald  * @param src
187832a0cf5SMatthias Ringwald  * @param dest
188832a0cf5SMatthias Ringwald  * @param szmic
189832a0cf5SMatthias Ringwald  * @return
190832a0cf5SMatthias Ringwald  */
19177ba3d3fSMatthias Ringwald uint8_t mesh_upper_transport_setup_access_pdu_header(mesh_pdu_t * pdu, uint16_t netkey_index, uint16_t appkey_index,
19277ba3d3fSMatthias Ringwald                                                                uint8_t ttl, uint16_t src, uint16_t dest, uint8_t szmic);
19377ba3d3fSMatthias Ringwald 
194832a0cf5SMatthias Ringwald /**
195832a0cf5SMatthias Ringwald  * @brief Send Access PDU
196832a0cf5SMatthias Ringwald  * @param pdu
197832a0cf5SMatthias Ringwald  */
19877ba3d3fSMatthias Ringwald void mesh_upper_transport_send_access_pdu(mesh_pdu_t * pdu);
199b551f24dSMatthias Ringwald 
20077ba3d3fSMatthias Ringwald 
201dd729594SMatthias Ringwald // test
202dd729594SMatthias Ringwald void mesh_upper_transport_dump(void);
203dd729594SMatthias Ringwald void mesh_upper_transport_reset(void);
204dd729594SMatthias Ringwald 
20577ba3d3fSMatthias Ringwald #ifdef __cplusplus
20677ba3d3fSMatthias Ringwald } /* end of extern "C" */
20777ba3d3fSMatthias Ringwald #endif
20877ba3d3fSMatthias Ringwald 
20977ba3d3fSMatthias Ringwald #endif
210