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