blob: 154502db93a27bd01a2e5c9bc8c8cfb12a7c49af [file] [log] [blame]
/*
*
* Copyright (c) 2021 Project CHIP Authors
* Copyright (c) 2020 Nest Labs, Inc.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* Provides an implementation for BLE Host NVM functions
*/
#include "assert.h"
#include "ble_constants.h"
#include "fsl_os_abstraction.h"
#include "gap_interface.h"
#include "gatt_database.h"
#include "gatt_db_dynamic.h"
#include "ble_function_mux.h"
/*******************************************************************************
* Variables
******************************************************************************/
ble_func_mux_app_mode_t currentMode = kBleFuncMux_AppMode_Ota;
/**
* Normal BLE variables.
**/
/*! Allocate custom 128-bit UUIDs, if any */
#include "gatt_uuid_def_x.h"
#include "gatt_db_macros.h"
#include "gatt_db_x_macros.h"
/*! Allocate the arrays for Attribute Values */
#include "gatt_alloc_x.h"
/*! Declare the Attribute database */
static gattDbAttribute_t static_gattDatabase[] = {
#ifndef DOXYGEN_SHOULD_SKIP_THIS
#include "gatt_decl_x.h"
#endif
};
/*! Declare structure to compute the database size */
typedef struct sizeCounterStruct_tag
{
#ifndef DOXYGEN_SHOULD_SKIP_THIS
#include "gatt_size_x.h"
#endif
} sizeCounterStruct_t;
/*! *********************************************************************************
* BLE Stack Configuration
********************************************************************************** */
/* Security Manager */
#define smpEdiv 0x1F99
#define mcEncryptionKeySize_c 16
typedef struct
{
uint16_t pdmId;
uint16_t nbRamWrite;
bleBondIdentityHeaderBlob_t aBondingHeader;
bleBondDataDynamicBlob_t aBondingDataDynamic;
bleBondDataStaticBlob_t aBondingDataStatic;
bleBondDataDeviceInfoBlob_t aBondingDataDeviceInfo;
bleBondDataDescriptorBlob_t aBondingDataDescriptor[gcGapMaximumSavedCccds_c];
} bleBondDeviceEntry;
/* LTK */
static uint8_t smpLtk[gcSmpMaxLtkSize_c] = { 0xD6, 0x93, 0xE8, 0xA4, 0x23, 0x55, 0x48, 0x99,
0x1D, 0x77, 0x61, 0xE6, 0x63, 0x2B, 0x10, 0x8E };
/* RAND*/
static uint8_t smpRand[gcSmpMaxRandSize_c] = { 0x26, 0x1E, 0xF6, 0x09, 0x97, 0x2E, 0xAD, 0x7E };
/* IRK */
static uint8_t smpIrk[gcSmpIrkSize_c] = { 0x0A, 0x2D, 0xF4, 0x65, 0xE3, 0xBD, 0x7B, 0x49,
0x1E, 0xB4, 0xC0, 0x95, 0x95, 0x13, 0x46, 0x73 };
/* CSRK */
static uint8_t smpCsrk[gcSmpCsrkSize_c] = { 0x90, 0xD5, 0x06, 0x95, 0x92, 0xED, 0x91, 0xD7,
0xA8, 0x9E, 0x2C, 0xDC, 0x4A, 0x93, 0x5B, 0xF9 };
/*! Compute the database size at compile time */
#define localGattDbAttributeCount_d ((sizeof(sizeCounterStruct_t)) / 4U)
/* Security Manager */
gapSmpKeys_t gSmpKeys = { .cLtkSize = mcEncryptionKeySize_c,
.aLtk = (void *) smpLtk,
.aIrk = (void *) smpIrk,
.aCsrk = (void *) smpCsrk,
.aRand = (void *) smpRand,
.cRandSize = gcSmpMaxRandSize_c,
.ediv = smpEdiv,
.addressType = gBleAddrTypePublic_c,
.aAddress = NULL };
/**
* Needed by the BLE stack.
**/
gattDbAttribute_t * gattDatabase;
uint16_t gGattDbAttributeCount_c;
uint16_t GattDb_GetIndexOfHandle(uint16_t handle);
void App_NvmInit(void);
void App_NvmErase(uint8_t mEntryIdx);
void App_NvmRead(uint8_t mEntryIdx, void * pBondHeader, void * pBondDataDynamic, void * pBondDataStatic, void * pBondDataDeviceInfo,
void * pBondDataDescriptor, uint8_t mDescriptorIndex);
void App_NvmWrite(uint8_t mEntryIdx, void * pBondHeader, void * pBondDataDynamic, void * pBondDataStatic,
void * pBondDataDeviceInfo, void * pBondDataDescriptor, uint8_t mDescriptorIndex);
/*******************************************************************************
* Functions needed by the BLE stack
******************************************************************************/
extern bleResult_t GattDb_Init(void)
{
App_NvmInit();
switch (currentMode)
{
case kBleFuncMux_AppMode_Ota: {
static bool_t mAlreadyInit = FALSE;
if (mAlreadyInit)
{
return gBleAlreadyInitialized_c;
}
mAlreadyInit = TRUE;
gGattDbAttributeCount_c = localGattDbAttributeCount_d;
gattDatabase = static_gattDatabase;
/*! Attribute-specific initialization by X-Macro expansion */
#ifndef DOXYGEN_SHOULD_SKIP_THIS
#include "gatt_init_x.h"
#endif
return gBleSuccess_c;
}
default:
return gGattDbInvalidHandle_c;
}
}
uint16_t GattDb_GetIndexOfHandle(uint16_t handle)
{
uint16_t init = (handle >= gGattDbAttributeCount_c) ? (gGattDbAttributeCount_c - 1) : handle;
for (uint16_t j = init; j != 0xFFFF && gattDatabase[j].handle >= handle; j--)
{
if (gattDatabase[j].handle == handle)
{
return j;
}
}
return gGattDbInvalidHandleIndex_d;
}
void App_NvmInit(void) {}
void App_NvmRead(uint8_t mEntryIdx, void * pBondHeader, void * pBondDataDynamic, void * pBondDataStatic, void * pBondDataDeviceInfo,
void * pBondDataDescriptor, uint8_t mDescriptorIndex)
{
NOT_USED(mEntryIdx);
NOT_USED(pBondHeader);
NOT_USED(pBondDataDynamic);
NOT_USED(pBondDataStatic);
NOT_USED(pBondDataDeviceInfo);
NOT_USED(pBondDataDescriptor);
NOT_USED(mDescriptorIndex);
}
void App_NvmWrite(uint8_t mEntryIdx, void * pBondHeader, void * pBondDataDynamic, void * pBondDataStatic,
void * pBondDataDeviceInfo, void * pBondDataDescriptor, uint8_t mDescriptorIndex)
{
NOT_USED(mEntryIdx);
NOT_USED(pBondHeader);
NOT_USED(pBondDataDynamic);
NOT_USED(pBondDataStatic);
NOT_USED(pBondDataDeviceInfo);
NOT_USED(pBondDataDescriptor);
NOT_USED(mDescriptorIndex);
}
void App_NvmErase(uint8_t mEntryIdx)
{
NOT_USED(mEntryIdx);
}