mesh_configuraiton_client: implement netkey and appkey messages

This commit is contained in:
Milanka Ringwald 2020-01-23 14:59:12 +01:00
parent 5c0b28ef04
commit b629980d78
4 changed files with 563 additions and 43 deletions

View File

@ -3010,9 +3010,9 @@ typedef uint8_t sm_key_t[16];
* @param foundation_status
* @param address
* @param model_identifier
* @param num_subscription_ddresses
* @param subscription_address_index
* @param subscription_address
* @param num_subscription_addresses
* @param subscription_address_pos
* @param subscription_address_item
*/
#define MESH_SUBEVENT_CONFIGURATION_SIG_MODEL_SUBSCRIPTION_LIST_ITEM 0x43
@ -3023,10 +3023,54 @@ typedef uint8_t sm_key_t[16];
* @param foundation_status
* @param address
* @param model_identifier
* @param num_subscription_ddresses
* @param subscription_address_index
* @param subscription_address
* @param num_subscription_addresses
* @param subscription_address_pos
* @param subscription_address_item
*/
#define MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM 0x43
#define MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM 0x44
/**
* @format 121
* @param subevent_code
* @param dest
* @param foundation_status
*/
#define MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX 0x45
/**
* @format 121112
* @param subevent_code
* @param dest
* @param foundation_status
* @param num_netkey_indexes
* @param netkey_index_pos
* @param netkey_index_item
*/
#define MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX_LIST_ITEM 0x46
/**
* @format 12122
* @param subevent_code
* @param dest
* @param foundation_status
* @param netkey_index_item
* @param appkey_index_item
*/
#define MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX 0x47
/**
* @format 12121122
* @param subevent_code
* @param dest
* @param foundation_status
* @param netkey_index
* @param num_appkey_indexes
* @param appkey_index_pos
* @param netkey_index_item
* @param appkey_index_item
*/
#define MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM 0x48
#endif

View File

@ -8304,30 +8304,30 @@ static inline uint32_t mesh_subevent_configuration_sig_model_subscription_list_i
return little_endian_read_32(event, 8);
}
/**
* @brief Get field num_subscription_ddresses from event MESH_SUBEVENT_CONFIGURATION_SIG_MODEL_SUBSCRIPTION_LIST_ITEM
* @brief Get field num_subscription_addresses from event MESH_SUBEVENT_CONFIGURATION_SIG_MODEL_SUBSCRIPTION_LIST_ITEM
* @param event packet
* @return num_subscription_ddresses
* @return num_subscription_addresses
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_sig_model_subscription_list_item_get_num_subscription_ddresses(const uint8_t * event){
static inline uint8_t mesh_subevent_configuration_sig_model_subscription_list_item_get_num_subscription_addresses(const uint8_t * event){
return event[12];
}
/**
* @brief Get field subscription_address_index from event MESH_SUBEVENT_CONFIGURATION_SIG_MODEL_SUBSCRIPTION_LIST_ITEM
* @brief Get field subscription_address_pos from event MESH_SUBEVENT_CONFIGURATION_SIG_MODEL_SUBSCRIPTION_LIST_ITEM
* @param event packet
* @return subscription_address_index
* @return subscription_address_pos
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_sig_model_subscription_list_item_get_subscription_address_index(const uint8_t * event){
static inline uint8_t mesh_subevent_configuration_sig_model_subscription_list_item_get_subscription_address_pos(const uint8_t * event){
return event[13];
}
/**
* @brief Get field subscription_address from event MESH_SUBEVENT_CONFIGURATION_SIG_MODEL_SUBSCRIPTION_LIST_ITEM
* @brief Get field subscription_address_item from event MESH_SUBEVENT_CONFIGURATION_SIG_MODEL_SUBSCRIPTION_LIST_ITEM
* @param event packet
* @return subscription_address
* @return subscription_address_item
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_sig_model_subscription_list_item_get_subscription_address(const uint8_t * event){
static inline uint16_t mesh_subevent_configuration_sig_model_subscription_list_item_get_subscription_address_item(const uint8_t * event){
return little_endian_read_16(event, 14);
}
@ -8368,33 +8368,199 @@ static inline uint32_t mesh_subevent_configuration_vendor_model_subscription_lis
return little_endian_read_32(event, 8);
}
/**
* @brief Get field num_subscription_ddresses from event MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM
* @brief Get field num_subscription_addresses from event MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM
* @param event packet
* @return num_subscription_ddresses
* @return num_subscription_addresses
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_vendor_model_subscription_list_item_get_num_subscription_ddresses(const uint8_t * event){
static inline uint8_t mesh_subevent_configuration_vendor_model_subscription_list_item_get_num_subscription_addresses(const uint8_t * event){
return event[12];
}
/**
* @brief Get field subscription_address_index from event MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM
* @brief Get field subscription_address_pos from event MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM
* @param event packet
* @return subscription_address_index
* @return subscription_address_pos
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_vendor_model_subscription_list_item_get_subscription_address_index(const uint8_t * event){
static inline uint8_t mesh_subevent_configuration_vendor_model_subscription_list_item_get_subscription_address_pos(const uint8_t * event){
return event[13];
}
/**
* @brief Get field subscription_address from event MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM
* @brief Get field subscription_address_item from event MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM
* @param event packet
* @return subscription_address
* @return subscription_address_item
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_vendor_model_subscription_list_item_get_subscription_address(const uint8_t * event){
static inline uint16_t mesh_subevent_configuration_vendor_model_subscription_list_item_get_subscription_address_item(const uint8_t * event){
return little_endian_read_16(event, 14);
}
/**
* @brief Get field dest from event MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX
* @param event packet
* @return dest
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_netkey_index_get_dest(const uint8_t * event){
return little_endian_read_16(event, 3);
}
/**
* @brief Get field foundation_status from event MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX
* @param event packet
* @return foundation_status
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_netkey_index_get_foundation_status(const uint8_t * event){
return event[5];
}
/**
* @brief Get field dest from event MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX_LIST_ITEM
* @param event packet
* @return dest
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_netkey_index_list_item_get_dest(const uint8_t * event){
return little_endian_read_16(event, 3);
}
/**
* @brief Get field foundation_status from event MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX_LIST_ITEM
* @param event packet
* @return foundation_status
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_netkey_index_list_item_get_foundation_status(const uint8_t * event){
return event[5];
}
/**
* @brief Get field num_netkey_indexes from event MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX_LIST_ITEM
* @param event packet
* @return num_netkey_indexes
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_netkey_index_list_item_get_num_netkey_indexes(const uint8_t * event){
return event[6];
}
/**
* @brief Get field netkey_index_pos from event MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX_LIST_ITEM
* @param event packet
* @return netkey_index_pos
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_netkey_index_list_item_get_netkey_index_pos(const uint8_t * event){
return event[7];
}
/**
* @brief Get field netkey_index_item from event MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX_LIST_ITEM
* @param event packet
* @return netkey_index_item
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_netkey_index_list_item_get_netkey_index_item(const uint8_t * event){
return little_endian_read_16(event, 8);
}
/**
* @brief Get field dest from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX
* @param event packet
* @return dest
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_appkey_index_get_dest(const uint8_t * event){
return little_endian_read_16(event, 3);
}
/**
* @brief Get field foundation_status from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX
* @param event packet
* @return foundation_status
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_appkey_index_get_foundation_status(const uint8_t * event){
return event[5];
}
/**
* @brief Get field netkey_index_item from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX
* @param event packet
* @return netkey_index_item
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_appkey_index_get_netkey_index_item(const uint8_t * event){
return little_endian_read_16(event, 6);
}
/**
* @brief Get field appkey_index_item from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX
* @param event packet
* @return appkey_index_item
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_appkey_index_get_appkey_index_item(const uint8_t * event){
return little_endian_read_16(event, 8);
}
/**
* @brief Get field dest from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM
* @param event packet
* @return dest
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_appkey_index_list_item_get_dest(const uint8_t * event){
return little_endian_read_16(event, 3);
}
/**
* @brief Get field foundation_status from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM
* @param event packet
* @return foundation_status
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_appkey_index_list_item_get_foundation_status(const uint8_t * event){
return event[5];
}
/**
* @brief Get field netkey_index from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM
* @param event packet
* @return netkey_index
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_appkey_index_list_item_get_netkey_index(const uint8_t * event){
return little_endian_read_16(event, 6);
}
/**
* @brief Get field num_appkey_indexes from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM
* @param event packet
* @return num_appkey_indexes
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_appkey_index_list_item_get_num_appkey_indexes(const uint8_t * event){
return event[8];
}
/**
* @brief Get field appkey_index_pos from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM
* @param event packet
* @return appkey_index_pos
* @note: btstack_type 1
*/
static inline uint8_t mesh_subevent_configuration_appkey_index_list_item_get_appkey_index_pos(const uint8_t * event){
return event[9];
}
/**
* @brief Get field netkey_index_item from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM
* @param event packet
* @return netkey_index_item
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_appkey_index_list_item_get_netkey_index_item(const uint8_t * event){
return little_endian_read_16(event, 10);
}
/**
* @brief Get field appkey_index_item from event MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM
* @param event packet
* @return appkey_index_item
* @note: btstack_type 2
*/
static inline uint16_t mesh_subevent_configuration_appkey_index_list_item_get_appkey_index_item(const uint8_t * event){
return little_endian_read_16(event, 12);
}
/* API_END */

View File

@ -229,6 +229,33 @@ static const mesh_access_message_t mesh_configuration_client_vendor_model_subscr
MESH_FOUNDATION_OPERATION_VENDOR_MODEL_SUBSCRIPTION_GET, "24"
};
static const mesh_access_message_t mesh_configuration_client_netkey_add = {
MESH_FOUNDATION_OPERATION_NETKEY_ADD, "2P"
};
static const mesh_access_message_t mesh_configuration_client_netkey_update = {
MESH_FOUNDATION_OPERATION_NETKEY_UPDATE, "2P"
};
static const mesh_access_message_t mesh_configuration_client_netkey_delete = {
MESH_FOUNDATION_OPERATION_NETKEY_DELETE, "2"
};
static const mesh_access_message_t mesh_configuration_client_netkey_get = {
MESH_FOUNDATION_OPERATION_NETKEY_GET, ""
};
static const mesh_access_message_t mesh_configuration_client_appkey_add = {
MESH_FOUNDATION_OPERATION_APPKEY_ADD, "3P"
};
static const mesh_access_message_t mesh_configuration_client_appkey_update = {
MESH_FOUNDATION_OPERATION_APPKEY_UPDATE, "3P"
};
static const mesh_access_message_t mesh_configuration_client_appkey_delete = {
MESH_FOUNDATION_OPERATION_APPKEY_DELETE, "3"
};
static const mesh_access_message_t mesh_configuration_client_appkey_get = {
MESH_FOUNDATION_OPERATION_APPKEY_GET, "2"
};
static void mesh_configuration_client_send_acknowledged(uint16_t src, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, mesh_pdu_t *pdu, uint32_t ack_opcode){
uint8_t ttl = mesh_foundation_default_ttl_get();
mesh_upper_transport_setup_access_pdu_header(pdu, netkey_index, appkey_index, ttl, src, dest, 0);
@ -277,7 +304,7 @@ uint8_t mesh_configuration_client_send_composition_data_get(mesh_model_t * mesh_
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_composition_data_get, page);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_COMPOSITION_DATA_GET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_COMPOSITION_DATA_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -288,7 +315,7 @@ uint8_t mesh_configuration_client_send_default_ttl_get(mesh_model_t * mesh_model
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_default_ttl_get);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_DEFAULT_TTL_GET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_DEFAULT_TTL_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -301,7 +328,7 @@ uint8_t mesh_configuration_client_send_default_ttl_set(mesh_model_t * mesh_model
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_default_ttl_set, ttl);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_DEFAULT_TTL_SET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_DEFAULT_TTL_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -312,7 +339,7 @@ uint8_t mesh_configuration_client_send_gatt_proxy_get(mesh_model_t * mesh_model,
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_gatt_proxy_get);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_GATT_PROXY_GET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_GATT_PROXY_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -325,7 +352,7 @@ uint8_t mesh_configuration_client_send_gatt_proxy_set(mesh_model_t * mesh_model,
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_gatt_proxy_set, gatt_proxy_state);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_GATT_PROXY_SET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_GATT_PROXY_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -336,7 +363,7 @@ uint8_t mesh_configuration_client_send_relay_get(mesh_model_t * mesh_model, uint
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_relay_get);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_RELAY_GET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_RELAY_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -361,7 +388,7 @@ uint8_t mesh_configuration_client_send_model_publication_get(mesh_model_t * mesh
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_model_publication_get, dest, model_id);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_GET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -393,7 +420,7 @@ uint8_t mesh_configuration_client_send_model_publication_set(mesh_model_t * mesh
model_id);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_SET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -417,7 +444,7 @@ uint8_t mesh_configuration_client_send_model_publication_virtual_address_set(mes
model_id);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_VIRTUAL_ADDRESS_SET);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -429,7 +456,7 @@ uint8_t mesh_configuration_client_send_model_subscription_add(mesh_model_t * mes
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_model_subscription_add, dest, address, model_id);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_ADD);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -440,7 +467,7 @@ uint8_t mesh_configuration_client_send_model_subscription_virtual_address_add(me
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_model_subscription_virtual_address_add, dest, address, model_id);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_ADD);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -451,7 +478,7 @@ uint8_t mesh_configuration_client_send_model_subscription_delete(mesh_model_t *
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_model_subscription_delete, dest, address, model_id);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_DELETE);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -462,7 +489,7 @@ uint8_t mesh_configuration_client_send_model_subscription_virtual_address_delete
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_model_subscription_virtual_address_delete, dest, address, model_id);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_DELETE);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -473,7 +500,7 @@ uint8_t mesh_configuration_client_send_model_subscription_overwrite(mesh_model_t
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_model_subscription_overwrite, dest, address, model_id);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_OVERWRITE);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -484,7 +511,7 @@ uint8_t mesh_configuration_client_send_model_subscription_virtual_address_overwr
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_model_subscription_virtual_address_overwrite, dest, address, model_id);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_OVERWRITE);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -495,7 +522,7 @@ uint8_t mesh_configuration_client_send_model_subscription_delete_all(mesh_model_
mesh_network_pdu_t * network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_model_subscription_delete_all, dest, address, model_id);
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_DELETE_ALL);
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) network_pdu, MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS);
return ERROR_CODE_SUCCESS;
}
@ -504,13 +531,13 @@ uint8_t mesh_configuration_client_send_model_subscription_get(mesh_model_t * mes
if (status != ERROR_CODE_SUCCESS) return status;
mesh_network_pdu_t * network_pdu = NULL;
uint32_t ack_opcode = MESH_FOUNDATION_OPERATION_SIG_MODEL_SUBSCRIPTION_GET;
uint32_t ack_opcode = MESH_FOUNDATION_OPERATION_SIG_MODEL_SUBSCRIPTION_LIST;
if (mesh_model_is_bluetooth_sig(model_id)){
network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_sig_model_subscription_get, dest, model_id);
} else {
network_pdu = mesh_access_setup_unsegmented_message(&mesh_configuration_client_vendor_model_subscription_get, dest, model_id);
ack_opcode = MESH_FOUNDATION_OPERATION_VENDOR_MODEL_SUBSCRIPTION_GET;
ack_opcode = MESH_FOUNDATION_OPERATION_VENDOR_MODEL_SUBSCRIPTION_LIST;
}
if (!network_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
@ -519,6 +546,94 @@ uint8_t mesh_configuration_client_send_model_subscription_get(mesh_model_t * mes
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_netkey_add(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t index, uint8_t * netkey){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_netkey_add, index, netkey);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_NETKEY_STATUS);
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_netkey_update(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t index, uint8_t * netkey){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_netkey_update, index, netkey);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_NETKEY_STATUS);
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_netkey_delete(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t index){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_netkey_delete, index);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_NETKEY_STATUS);
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_netkey_get(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_netkey_get);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_NETKEY_LIST);
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_appkey_add(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index, uint16_t appk_index, uint8_t * appkey){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_appkey_add, netk_index << 12 | appk_index, appkey);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_APPKEY_STATUS);
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_appkey_update(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index, uint16_t appk_index, uint8_t * appkey){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_appkey_update, netk_index << 12 | appk_index, appkey);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_APPKEY_STATUS);
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_appkey_delete(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index, uint16_t appk_index){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_appkey_delete, netk_index << 12 | appk_index);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_APPKEY_STATUS);
return ERROR_CODE_SUCCESS;
}
uint8_t mesh_configuration_client_send_appkey_get(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index){
uint8_t status = mesh_access_validate_envelop_params(mesh_model, dest, netkey_index, appkey_index);
if (status != ERROR_CODE_SUCCESS) return status;
mesh_transport_pdu_t * transport_pdu = mesh_access_setup_segmented_message(&mesh_configuration_client_appkey_get, netk_index);
if (!transport_pdu) return BTSTACK_MEMORY_ALLOC_FAILED;
mesh_configuration_client_send_acknowledged(mesh_access_get_element_address(mesh_model), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu, MESH_FOUNDATION_OPERATION_APPKEY_LIST);
return ERROR_CODE_SUCCESS;
}
// Model Operations
static void mesh_configuration_client_composition_data_status_handler(mesh_model_t *mesh_model, mesh_pdu_t * pdu){
// Composition Data has variable of element descriptions, with two lists of model lists
@ -745,6 +860,104 @@ static void mesh_configuration_client_vendor_model_subscription_handler(mesh_mod
mesh_configuration_client_model_subscription_event(mesh_model, pdu, MESH_SUBEVENT_CONFIGURATION_VENDOR_MODEL_SUBSCRIPTION_LIST_ITEM);
}
static void mesh_configuration_client_netkey_handler(mesh_model_t *mesh_model, mesh_pdu_t * pdu){
mesh_access_parser_state_t parser;
mesh_access_parser_init(&parser, (mesh_pdu_t*) pdu);
uint8_t status = mesh_access_parser_get_u8(&parser);
uint8_t event[6];
int pos = 0;
event[pos++] = HCI_EVENT_MESH_META;
event[pos++] = sizeof(event) - 2;
event[pos++] = MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX;
// dest
little_endian_store_16(event, pos, mesh_pdu_src(pdu));
pos += 2;
event[pos++] = status;
(*mesh_model->model_packet_handler)(HCI_EVENT_PACKET, 0, event, pos);
mesh_access_message_processed(pdu);
}
static void mesh_configuration_client_netkey_list_handler(mesh_model_t *mesh_model, mesh_pdu_t * pdu){
mesh_access_parser_state_t parser;
mesh_access_parser_init(&parser, (mesh_pdu_t*) pdu);
uint8_t status = 0;
uint8_t list_size = mesh_access_parser_available(&parser)/2;
uint8_t event[10];
int pos = 0;
event[pos++] = HCI_EVENT_MESH_META;
event[pos++] = sizeof(event) - 2;
event[pos++] = MESH_SUBEVENT_CONFIGURATION_NETKEY_INDEX_LIST_ITEM;
// dest
little_endian_store_16(event, pos, mesh_pdu_src(pdu));
pos += 2;
event[pos++] = status;
event[pos++] = list_size;
uint8_t i;
for (i = 0; i < list_size; i++){
event[pos++] = i;
little_endian_store_16(event, pos, mesh_access_parser_get_u16(&parser));
(*mesh_model->model_packet_handler)(HCI_EVENT_PACKET, 0, event, pos + 2);
}
mesh_access_message_processed(pdu);
}
static void mesh_configuration_client_appkey_handler(mesh_model_t *mesh_model, mesh_pdu_t * pdu){
mesh_access_parser_state_t parser;
mesh_access_parser_init(&parser, (mesh_pdu_t*) pdu);
uint8_t status = mesh_access_parser_get_u8(&parser);
uint32_t netappkey_index = mesh_access_parser_get_u24(&parser);
uint16_t netkey_index = netappkey_index >> 12;
uint16_t appkey_index = netappkey_index & 0xFFF;
uint8_t event[10];
int pos = 0;
event[pos++] = HCI_EVENT_MESH_META;
event[pos++] = sizeof(event) - 2;
event[pos++] = MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX;
// dest
little_endian_store_16(event, pos, mesh_pdu_src(pdu));
pos += 2;
event[pos++] = status;
little_endian_store_16(event, pos, netkey_index);
pos += 2;
little_endian_store_16(event, pos, appkey_index);
pos += 2;
(*mesh_model->model_packet_handler)(HCI_EVENT_PACKET, 0, event, pos);
mesh_access_message_processed(pdu);
}
static void mesh_configuration_client_appkey_list_handler(mesh_model_t *mesh_model, mesh_pdu_t * pdu){
mesh_access_parser_state_t parser;
mesh_access_parser_init(&parser, (mesh_pdu_t*) pdu);
uint8_t status = 0;
uint8_t list_size = mesh_access_parser_available(&parser)/2;
uint8_t event[12];
int pos = 0;
event[pos++] = HCI_EVENT_MESH_META;
event[pos++] = sizeof(event) - 2;
event[pos++] = MESH_SUBEVENT_CONFIGURATION_APPKEY_INDEX_LIST_ITEM;
// dest
little_endian_store_16(event, pos, mesh_pdu_src(pdu));
pos += 2;
event[pos++] = status;
event[pos++] = list_size;
uint8_t i;
for (i = 0; i < list_size; i++){
event[pos++] = i;
uint32_t netappkey_index = mesh_access_parser_get_u24(&parser);
little_endian_store_16(event, pos, netappkey_index >> 12);
little_endian_store_16(event, pos + 2, netappkey_index & 0xFFF);
(*mesh_model->model_packet_handler)(HCI_EVENT_PACKET, 0, event, pos + 4);
}
mesh_access_message_processed(pdu);
}
const static mesh_operation_t mesh_configuration_client_model_operations[] = {
{ MESH_FOUNDATION_OPERATION_BEACON_STATUS, 1, mesh_configuration_client_beacon_status_handler },
{ MESH_FOUNDATION_OPERATION_COMPOSITION_DATA_STATUS, 10, mesh_configuration_client_composition_data_status_handler },
@ -755,6 +968,10 @@ const static mesh_operation_t mesh_configuration_client_model_operations[] = {
{ MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS, 7, mesh_configuration_client_model_subscription_handler },
{ MESH_FOUNDATION_OPERATION_SIG_MODEL_SUBSCRIPTION_LIST, 5, mesh_configuration_client_sig_model_subscription_handler},
{ MESH_FOUNDATION_OPERATION_VENDOR_MODEL_SUBSCRIPTION_LIST, 7, mesh_configuration_client_vendor_model_subscription_handler},
{ MESH_FOUNDATION_OPERATION_NETKEY_STATUS, 3, mesh_configuration_client_netkey_handler },
{ MESH_FOUNDATION_OPERATION_NETKEY_LIST, 0, mesh_configuration_client_netkey_list_handler },
{ MESH_FOUNDATION_OPERATION_APPKEY_STATUS, 4, mesh_configuration_client_appkey_handler },
{ MESH_FOUNDATION_OPERATION_APPKEY_LIST, 3, mesh_configuration_client_appkey_list_handler },
{ 0, 0, NULL }
};

View File

@ -406,6 +406,99 @@ uint8_t mesh_configuration_client_send_model_subscription_delete_all(mesh_model_
uint8_t mesh_configuration_client_send_model_subscription_get(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint32_t model_id);
/**
* @brief Add a NetKey to a NetKey List on a node.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param appkey_index
* @param index
* @param netkey
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_netkey_add(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t index, uint8_t * netkey);
/**
* @brief Update NetKey in a NetKey List on a node.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param appkey_index
* @param index
* @param netkey
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_netkey_update(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t index, uint8_t * netkey);
/**
* @brief Delete a NetKey from a NetKey List on a node.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param appkey_index
* @param index
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_netkey_delete(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t index);
/**
* @brief Get NetKey List on a node.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param appkey_index
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_netkey_get(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index);
/**
* @brief Add a AppKey to a AppKey List on a node.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param appkey_index
* @param netk_index
* @param appk_index
* @param appkey
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_appkey_add(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index, uint16_t appk_index, uint8_t * appkey);
/**
* @brief Update AppKey in a AppKey List on a node.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param appkey_index
* @param netk_index
* @param appk_index
* @param appkey
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_appkey_update(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index, uint16_t appk_index, uint8_t * appkey);
/**
* @brief Delete a AppKey from a AppKey List on a node.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param netk_index
* @param appk_index
* @param index
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_appkey_delete(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index, uint16_t appk_index);
/**
* @brief Get AppKey List on a node that is bound to the NetKey.
* @param mesh_model
* @param dest element_address
* @param netkey_index
* @param netk_index
* @return status ERROR_CODE_SUCCESS if successful, otherwise BTSTACK_MEMORY_ALLOC_FAILED or ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE
*/
uint8_t mesh_configuration_client_send_appkey_get(mesh_model_t * mesh_model, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint16_t netk_index);
#ifdef __cplusplus
} /* end of extern "C" */
#endif