mesh: extract mesh_configuration_server

This commit is contained in:
Matthias Ringwald 2019-06-10 22:29:44 +02:00
parent 669135eb20
commit 2ea7db52ab
8 changed files with 2091 additions and 1833 deletions

View File

@ -28,7 +28,7 @@ file(GLOB SOURCES_LIBUSB "../../platform/libusb/*.c" "../../platform/
file(GLOB SOURCES_OFF "../../src/ble/le_device_db_memory.c" "../../src/ble/le_device_db_memory.h" "../../src/ble/le_device_db_tlv.c" "../../src/ble/le_device_db_tlv.h")
list(REMOVE_ITEM SOURCES_BLE ${SOURCES_OFF})
set(SOURCES_MESH_NEW main.c mesh_access.c mesh_access.h mesh_transport.c mesh_transport.h mesh_foundation.c mesh_foundation.h mesh_keys.c mesh_keys.h mesh_virtual_addresses.c mesh_virtual_addresses.h mesh_peer.c mesh_peer.h provisioner.c provisioning.c provisioning.h provisioning_device.c provisioning_device.h provisioning_provisioner.c provisioning_provisioner.h )
set(SOURCES_MESH_NEW main.c mesh_access.c mesh_access.h mesh_configuration_server.c mesh_transport.c mesh_transport.h mesh_foundation.c mesh_foundation.h mesh_keys.c mesh_keys.h mesh_virtual_addresses.c mesh_virtual_addresses.h mesh_peer.c mesh_peer.h provisioner.c provisioning.c provisioning.h provisioning_device.c provisioning_device.h provisioning_provisioner.c provisioning_provisioner.h )
set(SOURCES
${SOURCES_POSIX}

View File

@ -53,7 +53,7 @@ LDFLAGS += $(shell pkg-config libusb-1.0 --libs)
LDFLAGS += -lCppUTest -lCppUTestExt
mesh: mesh.h ${CORE_OBJ} ${COMMON_OBJ} ${ATT_OBJ} ${GATT_SERVER_OBJ} ${SM_OBJ} pb_adv.o pb_gatt.o mesh_foundation.o mesh_provisioning_service_server.o mesh_crypto.o provisioning_device.o mesh_network.o mesh_peer.o mesh_lower_transport.o mesh_transport.o mesh_virtual_addresses.o mesh_keys.o mesh_access.o mesh.o
mesh: mesh.h ${CORE_OBJ} ${COMMON_OBJ} ${ATT_OBJ} ${GATT_SERVER_OBJ} ${SM_OBJ} pb_adv.o pb_gatt.o mesh_foundation.o mesh_provisioning_service_server.o mesh_crypto.o provisioning_device.o mesh_network.o mesh_peer.o mesh_lower_transport.o mesh_transport.o mesh_virtual_addresses.o mesh_keys.o mesh_access.o mesh_configuration_server.o mesh.o
${CC} $(filter-out mesh.h,$^) ${CFLAGS} ${LDFLAGS} -o $@
provisioner: ${CORE_OBJ} ${COMMON_OBJ} ${SM_OBJ} pb_adv.o mesh_crypto.o provisioning_provisioner.o provisioner.o

File diff suppressed because it is too large Load Diff

View File

@ -80,6 +80,10 @@ void mesh_access_set_primary_element_address(uint16_t unicast_address){
primary_element.unicast_address = unicast_address;
}
uint16_t mesh_access_get_primary_element_address(void){
return primary_element.unicast_address;
}
void mesh_access_set_primary_element_location(uint16_t location){
primary_element.loc = location;
}
@ -513,7 +517,7 @@ mesh_transport_pdu_t * mesh_access_setup_segmented_message(const mesh_access_mes
}
static mesh_operation_t * mesh_model_lookup_operation(mesh_model_t * model, mesh_pdu_t * pdu){
static const mesh_operation_t * mesh_model_lookup_operation(mesh_model_t * model, mesh_pdu_t * pdu){
uint32_t opcode = 0;
uint16_t opcode_size = 0;
@ -523,7 +527,7 @@ static mesh_operation_t * mesh_model_lookup_operation(mesh_model_t * model, mesh
uint16_t len = mesh_pdu_len(pdu);
// find opcode in table
mesh_operation_t * operation = model->operations;
const mesh_operation_t * operation = model->operations;
if (operation == NULL) return NULL;
for ( ; operation->handler != NULL ; operation++){
if (operation->opcode != opcode) continue;
@ -570,7 +574,7 @@ static void mesh_access_message_process_handler(mesh_pdu_t * pdu){
while (mesh_model_iterator_has_next(&model_it)){
mesh_model_t * model = mesh_model_iterator_next(&model_it);
// find opcode in table
mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu);
const mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu);
if (operation == NULL) break;
operation->handler(model, pdu);
return;
@ -588,7 +592,7 @@ static void mesh_access_message_process_handler(mesh_pdu_t * pdu){
mesh_model_t * model = mesh_model_iterator_next(&model_it);
if (mesh_model_contains_subscription(model, dst)){
// find opcode in table
mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu);
const mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu);
if (operation == NULL) break;
operation->handler(model, pdu);
return;
@ -649,6 +653,85 @@ int mesh_model_contains_subscription(mesh_model_t * mesh_model, uint16_t address
return 0;
}
static uint32_t mesh_transport_key_tag_for_appkey_index(uint16_t appkey_index){
return ((uint32_t) 'M' << 24) | ((uint32_t) 'A' << 16) | ((uint32_t) appkey_index);
}
// Mesh App Keys
typedef struct {
uint16_t netkey_index;
uint16_t appkey_index;
uint8_t aid;
uint8_t key[16];
} mesh_persistent_app_key_t;
#define MESH_APPKEY_INDEX_MAX (16)
void mesh_store_app_key(uint16_t netkey_index, uint16_t appkey_index, uint8_t aid, const uint8_t * application_key){
mesh_access_setup_tlv();
if (appkey_index >= MESH_APPKEY_INDEX_MAX){
printf("Warning: AppKey with AppKey Index %x (>= %u) are not persisted\n", appkey_index, MESH_APPKEY_INDEX_MAX);
}
mesh_persistent_app_key_t data;
printf("Store AppKey: AppKey Index 0x%06x, AID %02x: ", appkey_index, aid);
printf_hexdump(application_key, 16);
uint32_t tag = mesh_transport_key_tag_for_appkey_index(appkey_index);
data.netkey_index = netkey_index;
data.appkey_index = appkey_index;
data.aid = aid;
memcpy(data.key, application_key, 16);
btstack_tlv_singleton_impl->store_tag(btstack_tlv_singleton_context, tag, (uint8_t *) &data, sizeof(data));
}
void mesh_load_app_key(uint16_t appkey_index){
mesh_access_setup_tlv();
mesh_persistent_app_key_t data;
uint32_t tag = mesh_transport_key_tag_for_appkey_index(appkey_index);
int app_key_len = btstack_tlv_singleton_impl->get_tag(btstack_tlv_singleton_context, tag, (uint8_t *) &data, sizeof(data));
if (app_key_len == 0) return;
mesh_transport_key_t * key = btstack_memory_mesh_transport_key_get();
if (key == NULL) return;
key->appkey_index = data.appkey_index;
key->netkey_index = data.netkey_index;
key->aid = data.aid;
key->akf = 1;
memcpy(key->key, data.key, 16);
mesh_transport_key_add(key);
printf("Load AppKey: AppKey Index 0x%06x, AID %02x: ", key->appkey_index, key->aid);
printf_hexdump(key->key, 16);
}
void mesh_delete_app_key(uint16_t appkey_index){
mesh_access_setup_tlv();
uint32_t tag = mesh_transport_key_tag_for_appkey_index(appkey_index);
btstack_tlv_singleton_impl->delete_tag(btstack_tlv_singleton_context, tag);
}
void mesh_load_app_keys(void){
printf("Load App Keys\n");
// TODO: use TLV iterator
uint16_t appkey_index;
for (appkey_index = 0; appkey_index < MESH_APPKEY_INDEX_MAX; appkey_index++){
mesh_load_app_key(appkey_index);
}
}
void mesh_delete_app_keys(void){
printf("Delete App Keys\n");
// TODO: use TLV iterator
uint16_t appkey_index;
for (appkey_index = 0; appkey_index < MESH_APPKEY_INDEX_MAX; appkey_index++){
mesh_delete_app_key(appkey_index);
}
}
// Model to Appkey List
#define MESH_MODEL_INDEX_MAX (16)

View File

@ -83,7 +83,7 @@ typedef struct mesh_model {
uint32_t model_identifier;
// model operations
mesh_operation_t * operations;
const mesh_operation_t * operations;
// publication model if supported
mesh_publication_model_t * publication_model;
@ -145,6 +145,8 @@ mesh_element_t * mesh_primary_element(void);
void mesh_access_set_primary_element_address(uint16_t unicast_address);
uint16_t mesh_access_get_primary_element_address(void);
void mesh_access_set_primary_element_location(uint16_t location);
void mesh_element_add(mesh_element_t * element);
@ -173,6 +175,8 @@ mesh_model_t * mesh_model_iterator_next(mesh_model_iterator_t * iterator);
mesh_model_t * mesh_model_get_by_identifier(mesh_element_t * element, uint32_t model_identifier);
uint32_t mesh_model_get_model_identifier_bluetooth_sig(uint16_t model_id);
int mesh_model_is_bluetooth_sig(uint32_t model_identifier);
uint16_t mesh_model_get_model_id(uint32_t model_identifier);
@ -186,6 +190,13 @@ uint16_t mesh_pdu_netkey_index(mesh_pdu_t * pdu);
uint16_t mesh_pdu_len(mesh_pdu_t * pdu);
uint8_t * mesh_pdu_data(mesh_pdu_t * pdu);
// Mesh Appkeys
void mesh_store_app_key(uint16_t netkey_index, uint16_t appkey_index, uint8_t aid, const uint8_t * application_key);
void mesh_load_app_key(uint16_t appkey_index);
void mesh_delete_app_key(uint16_t appkey_index);
void mesh_load_app_keys(void);
void mesh_delete_app_keys(void);
// Mesh Model Subscriptions
uint8_t mesh_model_add_subscription(mesh_model_t * mesh_model, uint16_t address);
void mesh_model_delete_subscription(mesh_model_t * mesh_model, uint16_t address);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,55 @@
/*
* Copyright (C) 2018 BlueKitchen GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* 4. Any redistribution, use, or modification is done solely for
* personal benefit and not for any commercial purpose or for
* monetary gain.
*
* THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Please inquire about commercial licensing options at
* contact@bluekitchen-gmbh.com
*
*/
#ifndef __MESH_CONFIGURATION_SERVER_H
#define __MESH_CONFIGURATION_SERVER_H
#include <stdint.h>
#include "mesh_access.h"
#ifdef __cplusplus
extern "C"
{
#endif
const mesh_operation_t * mesh_configuration_server_get_operations(void);
#ifdef __cplusplus
} /* end of extern "C" */
#endif
#endif

View File

@ -52,6 +52,122 @@ extern "C"
#define MESH_TTL_MAX 0x7f
#define MESH_FOUNDATION_STATE_NOT_SUPPORTED 2
// Mesh Model Identifiers
#define MESH_SIG_MODEL_ID_CONFIGURATION_SERVER 0x0000u
#define MESH_SIG_MODEL_ID_CONFIGURATION_CLIENT 0x0001u
#define MESH_SIG_MODEL_ID_HEALTH_SERVER 0x0002u
#define MESH_SIG_MODEL_ID_HEALTH_CLIENT 0x0003u
#define MESH_SIG_MODEL_ID_GENERIC_ON_OFF_SERVER 0x1000u
#define MESH_SIG_MODEL_ID_GENERIC_ON_OFF_CLIENT 0x1001u
// Foundation Model Operations
#define MESH_FOUNDATION_OPERATION_APPKEY_ADD 0x00
#define MESH_FOUNDATION_OPERATION_APPKEY_UPDATE 0x01
#define MESH_FOUNDATION_OPERATION_COMPOSITION_DATA_STATUS 0x02
#define MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_SET 0x03
#define MESH_FOUNDATION_OPERATION_HEALTH_CURRENT_STATUS 0x04
#define MESH_FOUNDATION_OPERATION_HEALTH_FAULT_STATUS 0x05
#define MESH_FOUNDATION_OPERATION_HEARTBEAT_PUBLICATION_STATUS 0x06
#define MESH_FOUNDATION_OPERATION_APPKEY_DELETE 0x8000
#define MESH_FOUNDATION_OPERATION_APPKEY_GET 0x8001
#define MESH_FOUNDATION_OPERATION_APPKEY_LIST 0x8002
#define MESH_FOUNDATION_OPERATION_APPKEY_STATUS 0x8003
#define MESH_FOUNDATION_OPERATION_ATTENTION_GET 0x8004
#define MESH_FOUNDATION_OPERATION_ATTENTION_SET 0x8005
#define MESH_FOUNDATION_OPERATION_ATTENTION_SET_UNACKNOWLEDGED 0x8006
#define MESH_FOUNDATION_OPERATION_ATTENTION_STATUS 0x8007
#define MESH_FOUNDATION_OPERATION_COMPOSITION_DATA_GET 0x8008
#define MESH_FOUNDATION_OPERATION_BEACON_GET 0x8009
#define MESH_FOUNDATION_OPERATION_BEACON_SET 0x800a
#define MESH_FOUNDATION_OPERATION_BEACON_STATUS 0x800b
#define MESH_FOUNDATION_OPERATION_DEFAULT_TTL_GET 0x800c
#define MESH_FOUNDATION_OPERATION_DEFAULT_TTL_SET 0x800d
#define MESH_FOUNDATION_OPERATION_DEFAULT_TTL_STATUS 0x800e
#define MESH_FOUNDATION_OPERATION_FRIEND_GET 0x800f
#define MESH_FOUNDATION_OPERATION_FRIEND_SET 0x8010
#define MESH_FOUNDATION_OPERATION_FRIEND_STATUS 0x8011
#define MESH_FOUNDATION_OPERATION_GATT_PROXY_GET 0x8012
#define MESH_FOUNDATION_OPERATION_GATT_PROXY_SET 0x8013
#define MESH_FOUNDATION_OPERATION_GATT_PROXY_STATUS 0x8014
#define MESH_FOUNDATION_OPERATION_KEY_REFRESH_PHASE_GET 0x8015
#define MESH_FOUNDATION_OPERATION_KEY_REFRESH_PHASE_SET 0x8016
#define MESH_FOUNDATION_OPERATION_KEY_REFRESH_PHASE_STATUS 0x8017
#define MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_GET 0x8018
#define MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_STATUS 0x8019
#define MESH_FOUNDATION_OPERATION_MODEL_PUBLICATION_VIRTUAL_ADDRESS_SET 0x801a
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_ADD 0x801b
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_DELETE 0x801c
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_DELETE_ALL 0x801d
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_OVERWRITE 0x801e
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_STATUS 0x801f
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_ADD 0x8020
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_DELETE 0x8021
#define MESH_FOUNDATION_OPERATION_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_OVERWRITE 0x8022
#define MESH_FOUNDATION_OPERATION_NETWORK_TRANSMIT_GET 0x8023
#define MESH_FOUNDATION_OPERATION_NETWORK_TRANSMIT_SET 0x8024
#define MESH_FOUNDATION_OPERATION_NETWORK_TRANSMIT_STATUS 0x8025
#define MESH_FOUNDATION_OPERATION_RELAY_GET 0x8026
#define MESH_FOUNDATION_OPERATION_RELAY_SET 0x8027
#define MESH_FOUNDATION_OPERATION_RELAY_STATUS 0x8028
#define MESH_FOUNDATION_OPERATION_SIG_MODEL_SUBSCRIPTION_GET 0x8029
#define MESH_FOUNDATION_OPERATION_SIG_MODEL_SUBSCRIPTION_LIST 0x802a
#define MESH_FOUNDATION_OPERATION_VENDOR_MODEL_SUBSCRIPTION_GET 0x802b
#define MESH_FOUNDATION_OPERATION_VENDOR_MODEL_SUBSCRIPTION_LIST 0x802c
#define MESH_FOUNDATION_OPERATION_LOW_POWER_NODE_POLL_TIMEOUT_GET 0x802d
#define MESH_FOUNDATION_OPERATION_LOW_POWER_NODE_POLL_TIMEOUT_STATUS 0x802e
#define MESH_FOUNDATION_OPERATION_HEALTH_FAULT_CLEAR 0x802f
#define MESH_FOUNDATION_OPERATION_HEALTH_FAULT_CLEAR_UNACKNOWLEDGED 0x8030
#define MESH_FOUNDATION_OPERATION_HEALTH_FAULT_GET 0x8031
#define MESH_FOUNDATION_OPERATION_HEALTH_FAULT_TEST 0x8032
#define MESH_FOUNDATION_OPERATION_HEALTH_FAULT_TEST_UNACKNOWLEDGED 0x8033
#define MESH_FOUNDATION_OPERATION_HEALTH_PERIOD_GET 0x8034
#define MESH_FOUNDATION_OPERATION_HEALTH_PERIOD_SET 0x8035
#define MESH_FOUNDATION_OPERATION_HEALTH_PERIOD_SET_UNACKNOWLEDGED 0x8036
#define MESH_FOUNDATION_OPERATION_HEALTH_PERIOD_STATUS 0x8037
#define MESH_FOUNDATION_OPERATION_HEARTBEAT_PUBLICATION_GET 0x8038
#define MESH_FOUNDATION_OPERATION_HEARTBEAT_PUBLICATION_SET 0x8039
#define MESH_FOUNDATION_OPERATION_HEARTBEAT_SUBSCRIPTION_GET 0x803a
#define MESH_FOUNDATION_OPERATION_HEARTBEAT_SUBSCRIPTION_SET 0x803b
#define MESH_FOUNDATION_OPERATION_HEARTBEAT_SUBSCRIPTION_STATUS 0x803c
#define MESH_FOUNDATION_OPERATION_MODEL_APP_BIND 0x803d
#define MESH_FOUNDATION_OPERATION_MODEL_APP_STATUS 0x803e
#define MESH_FOUNDATION_OPERATION_MODEL_APP_UNBIND 0x803f
#define MESH_FOUNDATION_OPERATION_NETKEY_ADD 0x8040
#define MESH_FOUNDATION_OPERATION_NETKEY_DELETE 0x8041
#define MESH_FOUNDATION_OPERATION_NETKEY_GET 0x8042
#define MESH_FOUNDATION_OPERATION_NETKEY_LIST 0x8043
#define MESH_FOUNDATION_OPERATION_NETKEY_STATUS 0x8044
#define MESH_FOUNDATION_OPERATION_NETKEY_UPDATE 0x8045
#define MESH_FOUNDATION_OPERATION_NODE_IDENTITY_GET 0x8046
#define MESH_FOUNDATION_OPERATION_NODE_IDENTITY_SET 0x8047
#define MESH_FOUNDATION_OPERATION_NODE_IDENTITY_STATUS 0x8048
#define MESH_FOUNDATION_OPERATION_NODE_RESET 0x8049
#define MESH_FOUNDATION_OPERATION_NODE_RESET_STATUS 0x804a
#define MESH_FOUNDATION_OPERATION_SIG_MODEL_APP_GET 0x804b
#define MESH_FOUNDATION_OPERATION_SIG_MODEL_APP_LIST 0x804c
#define MESH_FOUNDATION_OPERATION_VENDOR_MODEL_APP_GET 0x804d
#define MESH_FOUNDATION_OPERATION_VENDOR_MODEL_APP_LIST 0x804e
// Foundation Models Status Codes
#define MESH_FOUNDATION_STATUS_SUCCESS 0x00
#define MESH_FOUNDATION_STATUS_INVALID_ADDRESS 0x01
#define MESH_FOUNDATION_STATUS_INVALID_MODEL 0x02
#define MESH_FOUNDATION_STATUS_INVALID_APPKEY_INDEX 0x03
#define MESH_FOUNDATION_STATUS_INVALID_NETKEY_INDEX 0x04
#define MESH_FOUNDATION_STATUS_INSUFFICIENT_RESOURCES 0x05
#define MESH_FOUNDATION_STATUS_KEY_INDEX_ALREADY_STORED 0x06
#define MESH_FOUNDATION_STATUS_INVALID_PUBLISH_PARAMETER 0x07
#define MESH_FOUNDATION_STATUS_NOT_A_SUBSCRIPTION_MODEL 0x08
#define MESH_FOUNDATION_STATUS_STORAGE_FAILURE 0x09
#define MESH_FOUNDATION_STATUS_FEATURE_NOT_SUPPORTED 0x0a
#define MESH_FOUNDATION_STATUS_CANNOT_UPDATE 0x0b
#define MESH_FOUNDATION_STATUS_CANNOT_REMOVE 0x0c
#define MESH_FOUNDATION_STATUS_CANNOT_BIND 0x0d
#define MESH_FOUNDATION_STATUS_TEMPORARILY_UNABLE_TO_CHANGE_STATE 0x0e
#define MESH_FOUNDATION_STATUS_CANNOT_SET 0x0f
#define MESH_FOUNDATION_STATUS_UNSPECIFIED_ERROR 0x10
#define MESH_FOUNDATION_STATUS_INVALID_BINDING 0x11
/**
*
* @param ttl