1*f4854a5eSMatthias Ringwald /* 2*f4854a5eSMatthias Ringwald * Copyright (C) 2018 BlueKitchen GmbH 3*f4854a5eSMatthias Ringwald * 4*f4854a5eSMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*f4854a5eSMatthias Ringwald * modification, are permitted provided that the following conditions 6*f4854a5eSMatthias Ringwald * are met: 7*f4854a5eSMatthias Ringwald * 8*f4854a5eSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*f4854a5eSMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*f4854a5eSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*f4854a5eSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*f4854a5eSMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*f4854a5eSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*f4854a5eSMatthias Ringwald * contributors may be used to endorse or promote products derived 15*f4854a5eSMatthias Ringwald * from this software without specific prior written permission. 16*f4854a5eSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*f4854a5eSMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*f4854a5eSMatthias Ringwald * monetary gain. 19*f4854a5eSMatthias Ringwald * 20*f4854a5eSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*f4854a5eSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*f4854a5eSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*f4854a5eSMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24*f4854a5eSMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*f4854a5eSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*f4854a5eSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*f4854a5eSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*f4854a5eSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*f4854a5eSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*f4854a5eSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*f4854a5eSMatthias Ringwald * SUCH DAMAGE. 32*f4854a5eSMatthias Ringwald * 33*f4854a5eSMatthias Ringwald * Please inquire about commercial licensing options at 34*f4854a5eSMatthias Ringwald * [email protected] 35*f4854a5eSMatthias Ringwald * 36*f4854a5eSMatthias Ringwald */ 37*f4854a5eSMatthias Ringwald 38*f4854a5eSMatthias Ringwald #ifndef __MESH_ACCESS_H 39*f4854a5eSMatthias Ringwald #define __MESH_ACCESS_H 40*f4854a5eSMatthias Ringwald 41*f4854a5eSMatthias Ringwald #include <stdint.h> 42*f4854a5eSMatthias Ringwald #include <stdarg.h> 43*f4854a5eSMatthias Ringwald 44*f4854a5eSMatthias Ringwald #include "bluetooth_company_id.h" 45*f4854a5eSMatthias Ringwald #include "btstack_linked_list.h" 46*f4854a5eSMatthias Ringwald 47*f4854a5eSMatthias Ringwald #include "mesh/mesh_lower_transport.h" 48*f4854a5eSMatthias Ringwald #include "mesh/mesh_keys.h" 49*f4854a5eSMatthias Ringwald #include "mesh/mesh_node.h" 50*f4854a5eSMatthias Ringwald 51*f4854a5eSMatthias Ringwald #ifdef __cplusplus 52*f4854a5eSMatthias Ringwald extern "C" 53*f4854a5eSMatthias Ringwald { 54*f4854a5eSMatthias Ringwald #endif 55*f4854a5eSMatthias Ringwald 56*f4854a5eSMatthias Ringwald #define MAX_NR_MESH_APPKEYS_PER_MODEL 3u 57*f4854a5eSMatthias Ringwald #define MAX_NR_MESH_SUBSCRIPTION_PER_MODEL 3u 58*f4854a5eSMatthias Ringwald 59*f4854a5eSMatthias Ringwald #define MESH_APPKEY_INVALID 0xffffu 60*f4854a5eSMatthias Ringwald 61*f4854a5eSMatthias Ringwald struct mesh_model; 62*f4854a5eSMatthias Ringwald struct mesh_element; 63*f4854a5eSMatthias Ringwald 64*f4854a5eSMatthias Ringwald // function to handle model operation message 65*f4854a5eSMatthias Ringwald typedef void (*mesh_operation_handler)(struct mesh_model * mesh_model, mesh_pdu_t * pdu); 66*f4854a5eSMatthias Ringwald 67*f4854a5eSMatthias Ringwald // function to publish the current state of a model 68*f4854a5eSMatthias Ringwald // @param mesh_model to publish 69*f4854a5eSMatthias Ringwald // @returns mesh_pdu with status message 70*f4854a5eSMatthias Ringwald typedef mesh_pdu_t * (*mesh_publish_state_t)(struct mesh_model * mesh_model); 71*f4854a5eSMatthias Ringwald 72*f4854a5eSMatthias Ringwald typedef enum { 73*f4854a5eSMatthias Ringwald MESH_DEFAULT_TRANSITION_STEP_RESOLUTION_100ms = 0x00u, 74*f4854a5eSMatthias Ringwald MESH_DEFAULT_TRANSITION_STEP_RESOLUTION_1s, 75*f4854a5eSMatthias Ringwald MESH_DEFAULT_TRANSITION_STEP_RESOLUTION_10s, 76*f4854a5eSMatthias Ringwald MESH_DEFAULT_TRANSITION_STEP_RESOLUTION_10min 77*f4854a5eSMatthias Ringwald } mesh_default_transition_step_resolution_t; 78*f4854a5eSMatthias Ringwald 79*f4854a5eSMatthias Ringwald typedef enum { 80*f4854a5eSMatthias Ringwald MODEL_STATE_UPDATE_REASON_SET = 0x00u, 81*f4854a5eSMatthias Ringwald MODEL_STATE_UPDATE_REASON_TRANSITION_START, 82*f4854a5eSMatthias Ringwald // MODEL_STATE_UPDATE_REASON_TRANSITION_ACTIVE, 83*f4854a5eSMatthias Ringwald MODEL_STATE_UPDATE_REASON_TRANSITION_END, 84*f4854a5eSMatthias Ringwald MODEL_STATE_UPDATE_REASON_TRANSITION_ABORT, 85*f4854a5eSMatthias Ringwald // MODEL_STATE_UPDATE_REASON_BOUND_STATE, 86*f4854a5eSMatthias Ringwald MODEL_STATE_UPDATE_REASON_APPLICATION_CHANGE 87*f4854a5eSMatthias Ringwald } model_state_update_reason_t; 88*f4854a5eSMatthias Ringwald 89*f4854a5eSMatthias Ringwald typedef enum { 90*f4854a5eSMatthias Ringwald TRANSITION_START, 91*f4854a5eSMatthias Ringwald TRANSITION_UPDATE 92*f4854a5eSMatthias Ringwald } transition_event_t; 93*f4854a5eSMatthias Ringwald 94*f4854a5eSMatthias Ringwald typedef enum { 95*f4854a5eSMatthias Ringwald MESH_TRANSITION_STATE_IDLE, 96*f4854a5eSMatthias Ringwald MESH_TRANSITION_STATE_DELAYED, 97*f4854a5eSMatthias Ringwald MESH_TRANSITION_STATE_ACTIVE 98*f4854a5eSMatthias Ringwald } mesh_transition_state_t; 99*f4854a5eSMatthias Ringwald 100*f4854a5eSMatthias Ringwald typedef enum { 101*f4854a5eSMatthias Ringwald MODEL_STATE_ID_GENERIC_ON_OFF = (BLUETOOTH_COMPANY_ID_BLUETOOTH_SIG_INC << 16) | 0u, 102*f4854a5eSMatthias Ringwald MODEL_STATE_ID_GENERIC_LEVEL = (BLUETOOTH_COMPANY_ID_BLUETOOTH_SIG_INC << 16) | 1u, 103*f4854a5eSMatthias Ringwald } model_state_id_t; 104*f4854a5eSMatthias Ringwald 105*f4854a5eSMatthias Ringwald typedef enum { 106*f4854a5eSMatthias Ringwald MESH_MODEL_PUBLICATION_STATE_IDLE, 107*f4854a5eSMatthias Ringwald MESH_MODEL_PUBLICATION_STATE_W4_PUBLICATION_MS, 108*f4854a5eSMatthias Ringwald MESH_MODEL_PUBLICATION_STATE_W4_RETRANSMIT_MS, 109*f4854a5eSMatthias Ringwald } mesh_model_publication_state_t; 110*f4854a5eSMatthias Ringwald 111*f4854a5eSMatthias Ringwald typedef struct { 112*f4854a5eSMatthias Ringwald mesh_publish_state_t publish_state_fn; 113*f4854a5eSMatthias Ringwald mesh_model_publication_state_t state; 114*f4854a5eSMatthias Ringwald uint32_t next_publication_ms; 115*f4854a5eSMatthias Ringwald uint32_t next_retransmit_ms; 116*f4854a5eSMatthias Ringwald uint8_t retransmit_count; 117*f4854a5eSMatthias Ringwald uint8_t publish_now; 118*f4854a5eSMatthias Ringwald 119*f4854a5eSMatthias Ringwald uint16_t address; 120*f4854a5eSMatthias Ringwald uint16_t appkey_index; 121*f4854a5eSMatthias Ringwald uint8_t friendship_credential_flag; 122*f4854a5eSMatthias Ringwald uint8_t period; 123*f4854a5eSMatthias Ringwald uint8_t ttl; 124*f4854a5eSMatthias Ringwald uint8_t retransmit; 125*f4854a5eSMatthias Ringwald } mesh_publication_model_t; 126*f4854a5eSMatthias Ringwald 127*f4854a5eSMatthias Ringwald 128*f4854a5eSMatthias Ringwald typedef struct { 129*f4854a5eSMatthias Ringwald uint32_t opcode; 130*f4854a5eSMatthias Ringwald uint16_t minimum_length; 131*f4854a5eSMatthias Ringwald mesh_operation_handler handler; 132*f4854a5eSMatthias Ringwald } mesh_operation_t; 133*f4854a5eSMatthias Ringwald 134*f4854a5eSMatthias Ringwald typedef struct mesh_model { 135*f4854a5eSMatthias Ringwald // linked list item 136*f4854a5eSMatthias Ringwald btstack_linked_item_t item; 137*f4854a5eSMatthias Ringwald 138*f4854a5eSMatthias Ringwald // element 139*f4854a5eSMatthias Ringwald struct mesh_element * element; 140*f4854a5eSMatthias Ringwald 141*f4854a5eSMatthias Ringwald // internal model enumeration 142*f4854a5eSMatthias Ringwald uint16_t mid; 143*f4854a5eSMatthias Ringwald 144*f4854a5eSMatthias Ringwald // vendor_id << 16 | model id, use BLUETOOTH_COMPANY_ID_BLUETOOTH_SIG_INC for SIG models 145*f4854a5eSMatthias Ringwald uint32_t model_identifier; 146*f4854a5eSMatthias Ringwald 147*f4854a5eSMatthias Ringwald // model operations 148*f4854a5eSMatthias Ringwald const mesh_operation_t * operations; 149*f4854a5eSMatthias Ringwald 150*f4854a5eSMatthias Ringwald // publication model if supported 151*f4854a5eSMatthias Ringwald mesh_publication_model_t * publication_model; 152*f4854a5eSMatthias Ringwald 153*f4854a5eSMatthias Ringwald // data 154*f4854a5eSMatthias Ringwald void * model_data; 155*f4854a5eSMatthias Ringwald 156*f4854a5eSMatthias Ringwald // bound appkeys 157*f4854a5eSMatthias Ringwald uint16_t appkey_indices[MAX_NR_MESH_APPKEYS_PER_MODEL]; 158*f4854a5eSMatthias Ringwald 159*f4854a5eSMatthias Ringwald // subscription list 160*f4854a5eSMatthias Ringwald uint16_t subscriptions[MAX_NR_MESH_SUBSCRIPTION_PER_MODEL]; 161*f4854a5eSMatthias Ringwald 162*f4854a5eSMatthias Ringwald // packet handler for transition events in server, event callback handler in client 163*f4854a5eSMatthias Ringwald btstack_packet_handler_t * model_packet_handler; 164*f4854a5eSMatthias Ringwald } mesh_model_t; 165*f4854a5eSMatthias Ringwald 166*f4854a5eSMatthias Ringwald typedef struct { 167*f4854a5eSMatthias Ringwald btstack_linked_list_iterator_t it; 168*f4854a5eSMatthias Ringwald } mesh_model_iterator_t; 169*f4854a5eSMatthias Ringwald 170*f4854a5eSMatthias Ringwald #define MESH_MAX_NUM_FAULTS 3 171*f4854a5eSMatthias Ringwald 172*f4854a5eSMatthias Ringwald typedef struct { 173*f4854a5eSMatthias Ringwald // linked list item 174*f4854a5eSMatthias Ringwald btstack_linked_item_t item; 175*f4854a5eSMatthias Ringwald uint8_t test_id; 176*f4854a5eSMatthias Ringwald uint16_t company_id; 177*f4854a5eSMatthias Ringwald uint16_t num_faults; 178*f4854a5eSMatthias Ringwald uint8_t faults[MESH_MAX_NUM_FAULTS]; 179*f4854a5eSMatthias Ringwald } mesh_fault_t; 180*f4854a5eSMatthias Ringwald 181*f4854a5eSMatthias Ringwald typedef struct { 182*f4854a5eSMatthias Ringwald uint32_t opcode; 183*f4854a5eSMatthias Ringwald uint8_t * data; 184*f4854a5eSMatthias Ringwald uint16_t len; 185*f4854a5eSMatthias Ringwald } mesh_access_parser_state_t; 186*f4854a5eSMatthias Ringwald 187*f4854a5eSMatthias Ringwald typedef struct { 188*f4854a5eSMatthias Ringwald uint32_t opcode; 189*f4854a5eSMatthias Ringwald const char * format; 190*f4854a5eSMatthias Ringwald } mesh_access_message_t; 191*f4854a5eSMatthias Ringwald 192*f4854a5eSMatthias Ringwald typedef enum { 193*f4854a5eSMatthias Ringwald MESH_TRANSACTION_STATUS_NEW = 0, 194*f4854a5eSMatthias Ringwald MESH_TRANSACTION_STATUS_RETRANSMISSION, 195*f4854a5eSMatthias Ringwald MESH_TRANSACTION_STATUS_DIFFERENT_DST_OR_SRC 196*f4854a5eSMatthias Ringwald } mesh_transaction_status_t; 197*f4854a5eSMatthias Ringwald 198*f4854a5eSMatthias Ringwald typedef struct mesh_transition { 199*f4854a5eSMatthias Ringwald btstack_linked_item_t item; 200*f4854a5eSMatthias Ringwald 201*f4854a5eSMatthias Ringwald mesh_transition_state_t state; 202*f4854a5eSMatthias Ringwald 203*f4854a5eSMatthias Ringwald uint8_t transaction_identifier; 204*f4854a5eSMatthias Ringwald uint32_t transaction_timestamp_ms; 205*f4854a5eSMatthias Ringwald uint16_t src_address; 206*f4854a5eSMatthias Ringwald uint16_t dst_address; 207*f4854a5eSMatthias Ringwald 208*f4854a5eSMatthias Ringwald mesh_default_transition_step_resolution_t step_duration_ms; 209*f4854a5eSMatthias Ringwald uint32_t phase_start_ms; 210*f4854a5eSMatthias Ringwald uint32_t remaining_delay_time_ms; 211*f4854a5eSMatthias Ringwald uint32_t remaining_transition_time_ms; 212*f4854a5eSMatthias Ringwald // to send events and/or publish changes 213*f4854a5eSMatthias Ringwald mesh_model_t * mesh_model; 214*f4854a5eSMatthias Ringwald 215*f4854a5eSMatthias Ringwald // to execute transition 216*f4854a5eSMatthias Ringwald void (* transition_callback)(struct mesh_transition * transition, transition_event_t event, uint32_t current_timestamp); 217*f4854a5eSMatthias Ringwald } mesh_transition_t; 218*f4854a5eSMatthias Ringwald 219*f4854a5eSMatthias Ringwald /** 220*f4854a5eSMatthias Ringwald * @brief Init access layer 221*f4854a5eSMatthias Ringwald */ 222*f4854a5eSMatthias Ringwald void mesh_access_init(void); 223*f4854a5eSMatthias Ringwald 224*f4854a5eSMatthias Ringwald /** 225*f4854a5eSMatthias Ringwald * @brief Inform access layer that access message was processed by higher layer 226*f4854a5eSMatthias Ringwald * @param pdu 227*f4854a5eSMatthias Ringwald */ 228*f4854a5eSMatthias Ringwald void mesh_access_message_processed(mesh_pdu_t * pdu); 229*f4854a5eSMatthias Ringwald 230*f4854a5eSMatthias Ringwald /** 231*f4854a5eSMatthias Ringwald * @brief Get number of retransmissions used by default 232*f4854a5eSMatthias Ringwald */ 233*f4854a5eSMatthias Ringwald uint8_t mesh_access_acknowledged_message_retransmissions(void); 234*f4854a5eSMatthias Ringwald 235*f4854a5eSMatthias Ringwald /** 236*f4854a5eSMatthias Ringwald * @brief Get retransmission timeout 237*f4854a5eSMatthias Ringwald */ 238*f4854a5eSMatthias Ringwald uint32_t mesh_access_acknowledged_message_timeout_ms(void); 239*f4854a5eSMatthias Ringwald 240*f4854a5eSMatthias Ringwald /** 241*f4854a5eSMatthias Ringwald * @brief Send unacknowledged message 242*f4854a5eSMatthias Ringwald * @param pdu 243*f4854a5eSMatthias Ringwald */ 244*f4854a5eSMatthias Ringwald void mesh_access_send_unacknowledged_pdu(mesh_pdu_t * pdu); 245*f4854a5eSMatthias Ringwald 246*f4854a5eSMatthias Ringwald /** 247*f4854a5eSMatthias Ringwald * @brief Send acknowledged message. Retransmits message if no acknowledgement with expected opcode is received 248*f4854a5eSMatthias Ringwald * @param pdu 249*f4854a5eSMatthias Ringwald * @param retransmissions 250*f4854a5eSMatthias Ringwald * @param ack_opcode opcode of acknowledgement 251*f4854a5eSMatthias Ringwald */ 252*f4854a5eSMatthias Ringwald void mesh_access_send_acknowledged_pdu(mesh_pdu_t * pdu, uint8_t retransmissions, uint32_t ack_opcode); 253*f4854a5eSMatthias Ringwald 254*f4854a5eSMatthias Ringwald /** 255*f4854a5eSMatthias Ringwald * @brief Get element index for give model 256*f4854a5eSMatthias Ringwald * @param mesh_model 257*f4854a5eSMatthias Ringwald */ 258*f4854a5eSMatthias Ringwald uint8_t mesh_access_get_element_index(mesh_model_t * mesh_model); 259*f4854a5eSMatthias Ringwald 260*f4854a5eSMatthias Ringwald /** 261*f4854a5eSMatthias Ringwald * @brief Get unicast address for give model 262*f4854a5eSMatthias Ringwald * @param mesh_model 263*f4854a5eSMatthias Ringwald */ 264*f4854a5eSMatthias Ringwald uint16_t mesh_access_get_element_address(mesh_model_t * mesh_model); 265*f4854a5eSMatthias Ringwald 266*f4854a5eSMatthias Ringwald /** 267*f4854a5eSMatthias Ringwald * @brief Add model to element 268*f4854a5eSMatthias Ringwald * @param element 269*f4854a5eSMatthias Ringwald * @param mesh_model 270*f4854a5eSMatthias Ringwald */ 271*f4854a5eSMatthias Ringwald void mesh_element_add_model(mesh_element_t * element, mesh_model_t * mesh_model); 272*f4854a5eSMatthias Ringwald 273*f4854a5eSMatthias Ringwald // Mesh Model Iterator 274*f4854a5eSMatthias Ringwald 275*f4854a5eSMatthias Ringwald void mesh_model_iterator_init(mesh_model_iterator_t * iterator, mesh_element_t * element); 276*f4854a5eSMatthias Ringwald 277*f4854a5eSMatthias Ringwald int mesh_model_iterator_has_next(mesh_model_iterator_t * iterator); 278*f4854a5eSMatthias Ringwald 279*f4854a5eSMatthias Ringwald mesh_model_t * mesh_model_iterator_next(mesh_model_iterator_t * iterator); 280*f4854a5eSMatthias Ringwald 281*f4854a5eSMatthias Ringwald // Mesh Model Utility 282*f4854a5eSMatthias Ringwald 283*f4854a5eSMatthias Ringwald mesh_model_t * mesh_model_get_by_identifier(mesh_element_t * element, uint32_t model_identifier); 284*f4854a5eSMatthias Ringwald 285*f4854a5eSMatthias Ringwald uint32_t mesh_model_get_model_identifier_bluetooth_sig(uint16_t model_id); 286*f4854a5eSMatthias Ringwald 287*f4854a5eSMatthias Ringwald int mesh_model_is_bluetooth_sig(uint32_t model_identifier); 288*f4854a5eSMatthias Ringwald 289*f4854a5eSMatthias Ringwald uint16_t mesh_model_get_model_id(uint32_t model_identifier); 290*f4854a5eSMatthias Ringwald 291*f4854a5eSMatthias Ringwald uint32_t mesh_model_get_model_identifier(uint16_t vendor_id, uint16_t model_id); 292*f4854a5eSMatthias Ringwald 293*f4854a5eSMatthias Ringwald mesh_model_t * mesh_model_get_configuration_server(void); 294*f4854a5eSMatthias Ringwald 295*f4854a5eSMatthias Ringwald mesh_model_t * mesh_access_model_for_address_and_model_identifier(uint16_t element_address, uint32_t model_identifier, uint8_t * status); 296*f4854a5eSMatthias Ringwald 297*f4854a5eSMatthias Ringwald uint8_t mesh_access_transitions_num_steps_from_gdtt(uint8_t time_gdtt); 298*f4854a5eSMatthias Ringwald uint32_t mesh_access_time_gdtt2ms(uint8_t time_gdtt); 299*f4854a5eSMatthias Ringwald 300*f4854a5eSMatthias Ringwald void mesh_access_emit_state_update_bool(btstack_packet_handler_t * event_handler, uint8_t element_index, uint32_t model_identifier, 301*f4854a5eSMatthias Ringwald model_state_id_t state_identifier, model_state_update_reason_t reason, uint8_t value); 302*f4854a5eSMatthias Ringwald void mesh_access_emit_state_update_int16(btstack_packet_handler_t * event_handler, uint8_t element_index, uint32_t model_identifier, 303*f4854a5eSMatthias Ringwald model_state_id_t state_identifier, model_state_update_reason_t reason, int16_t value); 304*f4854a5eSMatthias Ringwald 305*f4854a5eSMatthias Ringwald // Mesh Model Transitions 306*f4854a5eSMatthias Ringwald void mesh_access_transitions_setup_transaction(mesh_transition_t * transition, uint8_t transaction_identifier, uint16_t src_address, uint16_t dst_address); 307*f4854a5eSMatthias Ringwald void mesh_access_transitions_abort_transaction(mesh_transition_t * transition); 308*f4854a5eSMatthias Ringwald mesh_transaction_status_t mesh_access_transitions_transaction_status(mesh_transition_t * transition, uint8_t transaction_identifier, uint16_t src_address, uint16_t dst_address); 309*f4854a5eSMatthias Ringwald 310*f4854a5eSMatthias Ringwald void mesh_access_transitions_setup(mesh_transition_t * transition, mesh_model_t * mesh_model, 311*f4854a5eSMatthias Ringwald uint8_t transition_time_gdtt, uint8_t delay_gdtt, 312*f4854a5eSMatthias Ringwald void (* transition_callback)(struct mesh_transition * transition, transition_event_t event, uint32_t current_timestamp)); 313*f4854a5eSMatthias Ringwald 314*f4854a5eSMatthias Ringwald void mesh_access_transitions_add(mesh_transition_t * transition); 315*f4854a5eSMatthias Ringwald void mesh_access_transitions_remove(mesh_transition_t * transition); 316*f4854a5eSMatthias Ringwald uint8_t mesh_access_transactions_get_next_transaction_id(void); 317*f4854a5eSMatthias Ringwald 318*f4854a5eSMatthias Ringwald // Key Refresh 319*f4854a5eSMatthias Ringwald void mesh_access_key_refresh_revoke_keys(mesh_subnet_t * subnet); 320*f4854a5eSMatthias Ringwald 321*f4854a5eSMatthias Ringwald // Mesh Model Publicaation 322*f4854a5eSMatthias Ringwald 323*f4854a5eSMatthias Ringwald /** 324*f4854a5eSMatthias Ringwald * Inform Mesh Access that the state of a model has changed. may trigger state publication 325*f4854a5eSMatthias Ringwald * @param mesh_model 326*f4854a5eSMatthias Ringwald */ 327*f4854a5eSMatthias Ringwald void mesh_access_state_changed(mesh_model_t * mesh_model); 328*f4854a5eSMatthias Ringwald 329*f4854a5eSMatthias Ringwald /** 330*f4854a5eSMatthias Ringwald * Start Model Publication 331*f4854a5eSMatthias Ringwald * @param mesh_model 332*f4854a5eSMatthias Ringwald */ 333*f4854a5eSMatthias Ringwald void mesh_model_publication_start(mesh_model_t * mesh_model); 334*f4854a5eSMatthias Ringwald 335*f4854a5eSMatthias Ringwald /** 336*f4854a5eSMatthias Ringwald * Stop Model Publication 337*f4854a5eSMatthias Ringwald * @param mesh_model 338*f4854a5eSMatthias Ringwald */ 339*f4854a5eSMatthias Ringwald void mesh_model_publication_stop(mesh_model_t * mesh_model); 340*f4854a5eSMatthias Ringwald 341*f4854a5eSMatthias Ringwald // Mesh PDU Getter 342*f4854a5eSMatthias Ringwald uint16_t mesh_pdu_src(mesh_pdu_t * pdu); 343*f4854a5eSMatthias Ringwald uint16_t mesh_pdu_dst(mesh_pdu_t * pdu); 344*f4854a5eSMatthias Ringwald uint16_t mesh_pdu_netkey_index(mesh_pdu_t * pdu); 345*f4854a5eSMatthias Ringwald uint16_t mesh_pdu_appkey_index(mesh_pdu_t * pdu); 346*f4854a5eSMatthias Ringwald uint16_t mesh_pdu_len(mesh_pdu_t * pdu); 347*f4854a5eSMatthias Ringwald uint8_t * mesh_pdu_data(mesh_pdu_t * pdu); 348*f4854a5eSMatthias Ringwald 349*f4854a5eSMatthias Ringwald // Mesh NetKey List 350*f4854a5eSMatthias Ringwald void mesh_store_network_key(mesh_network_key_t * network_key); 351*f4854a5eSMatthias Ringwald void mesh_delete_network_key(uint16_t internal_index); 352*f4854a5eSMatthias Ringwald void mesh_delete_network_keys(void); 353*f4854a5eSMatthias Ringwald void mesh_load_network_keys(void); 354*f4854a5eSMatthias Ringwald 355*f4854a5eSMatthias Ringwald void mesh_access_netkey_finalize(mesh_network_key_t * network_key); 356*f4854a5eSMatthias Ringwald 357*f4854a5eSMatthias Ringwald // Mesh Appkeys 358*f4854a5eSMatthias Ringwald void mesh_store_app_key(mesh_transport_key_t * app_key); 359*f4854a5eSMatthias Ringwald void mesh_delete_app_key(uint16_t internal_index); 360*f4854a5eSMatthias Ringwald void mesh_delete_app_keys(void); 361*f4854a5eSMatthias Ringwald void mesh_load_app_keys(void); 362*f4854a5eSMatthias Ringwald 363*f4854a5eSMatthias Ringwald void mesh_access_appkey_finalize(mesh_transport_key_t * transport_key); 364*f4854a5eSMatthias Ringwald 365*f4854a5eSMatthias Ringwald // Mesh Model Subscriptions 366*f4854a5eSMatthias Ringwald int mesh_model_contains_subscription(mesh_model_t * mesh_model, uint16_t address); 367*f4854a5eSMatthias Ringwald 368*f4854a5eSMatthias Ringwald // Mesh Model to Appkey List 369*f4854a5eSMatthias Ringwald void mesh_load_appkey_lists(void); 370*f4854a5eSMatthias Ringwald void mesh_delete_appkey_lists(void); 371*f4854a5eSMatthias Ringwald void mesh_model_reset_appkeys(mesh_model_t * mesh_model); 372*f4854a5eSMatthias Ringwald uint8_t mesh_model_bind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index); 373*f4854a5eSMatthias Ringwald void mesh_model_unbind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index); 374*f4854a5eSMatthias Ringwald int mesh_model_contains_appkey(mesh_model_t * mesh_model, uint16_t appkey_index); 375*f4854a5eSMatthias Ringwald 376*f4854a5eSMatthias Ringwald // Mesh IV Index and sequence number 377*f4854a5eSMatthias Ringwald void mesh_store_iv_index_after_provisioning(uint32_t iv_index); 378*f4854a5eSMatthias Ringwald void mesh_store_iv_index_and_sequence_number(void); 379*f4854a5eSMatthias Ringwald void mesh_restore_iv_index_and_sequence_number(void); 380*f4854a5eSMatthias Ringwald 381*f4854a5eSMatthias Ringwald // Mesh Access Parser 382*f4854a5eSMatthias Ringwald int mesh_access_pdu_get_opcode(mesh_pdu_t * pdu, uint32_t * opcode, uint16_t * opcode_size); 383*f4854a5eSMatthias Ringwald int mesh_access_parser_init(mesh_access_parser_state_t * state, mesh_pdu_t * pdu); 384*f4854a5eSMatthias Ringwald void mesh_access_parser_skip(mesh_access_parser_state_t * state, uint16_t bytes_to_skip); 385*f4854a5eSMatthias Ringwald uint16_t mesh_access_parser_available(mesh_access_parser_state_t * state); 386*f4854a5eSMatthias Ringwald uint8_t mesh_access_parser_get_u8(mesh_access_parser_state_t * state); 387*f4854a5eSMatthias Ringwald uint16_t mesh_access_parser_get_u16(mesh_access_parser_state_t * state); 388*f4854a5eSMatthias Ringwald uint32_t mesh_access_parser_get_u24(mesh_access_parser_state_t * state); 389*f4854a5eSMatthias Ringwald uint32_t mesh_access_parser_get_u32(mesh_access_parser_state_t * state); 390*f4854a5eSMatthias Ringwald void mesh_access_parser_get_u128(mesh_access_parser_state_t * state, uint8_t * dest); 391*f4854a5eSMatthias Ringwald void mesh_access_parser_get_label_uuid(mesh_access_parser_state_t * state, uint8_t * dest); 392*f4854a5eSMatthias Ringwald void mesh_access_parser_get_key(mesh_access_parser_state_t * state, uint8_t * dest); 393*f4854a5eSMatthias Ringwald uint32_t mesh_access_parser_get_model_identifier(mesh_access_parser_state_t * parser); 394*f4854a5eSMatthias Ringwald 395*f4854a5eSMatthias Ringwald // Foundation state 396*f4854a5eSMatthias Ringwald void mesh_foundation_state_load(void); 397*f4854a5eSMatthias Ringwald void mesh_foundation_state_store(void); 398*f4854a5eSMatthias Ringwald 399*f4854a5eSMatthias Ringwald // message builder transport 400*f4854a5eSMatthias Ringwald mesh_transport_pdu_t * mesh_access_transport_init(uint32_t opcode); 401*f4854a5eSMatthias Ringwald void mesh_access_transport_add_uint8(mesh_transport_pdu_t * pdu, uint8_t value); 402*f4854a5eSMatthias Ringwald void mesh_access_transport_add_uint16(mesh_transport_pdu_t * pdu, uint16_t value); 403*f4854a5eSMatthias Ringwald void mesh_access_transport_add_uint24(mesh_transport_pdu_t * pdu, uint32_t value); 404*f4854a5eSMatthias Ringwald void mesh_access_transport_add_uint32(mesh_transport_pdu_t * pdu, uint32_t value); 405*f4854a5eSMatthias Ringwald void mesh_access_transport_add_model_identifier(mesh_transport_pdu_t * pdu, uint32_t model_identifier); 406*f4854a5eSMatthias Ringwald 407*f4854a5eSMatthias Ringwald // message builder network 408*f4854a5eSMatthias Ringwald mesh_network_pdu_t * mesh_access_network_init(uint32_t opcode); 409*f4854a5eSMatthias Ringwald void mesh_access_network_add_uint8(mesh_network_pdu_t * pdu, uint8_t value); 410*f4854a5eSMatthias Ringwald void mesh_access_network_add_uint16(mesh_network_pdu_t * pdu, uint16_t value); 411*f4854a5eSMatthias Ringwald void mesh_access_network_add_uint24(mesh_network_pdu_t * pdu, uint16_t value); 412*f4854a5eSMatthias Ringwald void mesh_access_network_add_uint32(mesh_network_pdu_t * pdu, uint16_t value); 413*f4854a5eSMatthias Ringwald void mesh_access_network_add_model_identifier(mesh_network_pdu_t * pdu, uint32_t model_identifier); 414*f4854a5eSMatthias Ringwald 415*f4854a5eSMatthias Ringwald // message builder using template 416*f4854a5eSMatthias Ringwald mesh_network_pdu_t * mesh_access_setup_unsegmented_message(const mesh_access_message_t *template, ...); 417*f4854a5eSMatthias Ringwald mesh_transport_pdu_t * mesh_access_setup_segmented_message(const mesh_access_message_t *template, ...); 418*f4854a5eSMatthias Ringwald 419*f4854a5eSMatthias Ringwald // setup 420*f4854a5eSMatthias Ringwald void mesh_access_setup_from_provisioning_data(const mesh_provisioning_data_t * provisioning_data); 421*f4854a5eSMatthias Ringwald void mesh_access_setup_without_provisiong_data(void); 422*f4854a5eSMatthias Ringwald 423*f4854a5eSMatthias Ringwald #ifdef __cplusplus 424*f4854a5eSMatthias Ringwald } /* end of extern "C" */ 425*f4854a5eSMatthias Ringwald #endif 426*f4854a5eSMatthias Ringwald 427*f4854a5eSMatthias Ringwald #endif 428