Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
François Revol
firmware
Commits
c0a3ed9e
Commit
c0a3ed9e
authored
Jul 17, 2020
by
schneider
Browse files
Merge branch 'schneider/mp-bonding' into 'master'
Bonding dialog See merge request
card10/firmware!390
parents
2c026ff2
7ea488c6
Changes
21
Hide whitespace changes
Inline
Side-by-side
epicardium/ble/app/app_main.c
deleted
100644 → 0
View file @
2c026ff2
/*************************************************************************************************/
/*!
* \file
*
* \brief Application framework main module.
*
* Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved.
* ARM Ltd. confidential and proprietary.
*
* IMPORTANT. Your use of this file is governed by a Software License Agreement
* ("Agreement") that must be accepted in order to download or otherwise receive a
* copy of this file. You may not use or copy this file for any purpose other than
* as described in the Agreement. If you do not agree to all of the terms of the
* Agreement do not use this file and delete all copies in your possession or control;
* if you do not have a copy of the Agreement, you must contact ARM Ltd. prior
* to any use, copying or further distribution of this software.
*/
/*************************************************************************************************/
/* card10:
* copied from: lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/app_main.c
*
* Reason: we need to correctly implement AppHandleNumericComparison
*/
/* clang-format off */
/* clang-formet turned off for easier diffing against orginal file */
#include
<string.h>
#include
"wsf_types.h"
#include
"wsf_msg.h"
#include
"sec_api.h"
#include
"wsf_trace.h"
#include
"wsf_timer.h"
#include
"wsf_assert.h"
#include
"util/bstream.h"
#include
"dm_api.h"
#include
"app_api.h"
#include
"app_main.h"
#include
"app_ui.h"
#include
"modules/log.h"
/**************************************************************************************************
Global Variables
**************************************************************************************************/
/*! Configuration pointer for advertising */
appAdvCfg_t
*
pAppAdvCfg
;
/*! Configuration pointer for extended and periodic advertising */
appExtAdvCfg_t
*
pAppExtAdvCfg
;
/*! Configuration pointer for slave */
appSlaveCfg_t
*
pAppSlaveCfg
;
/*! Configuration pointer for master */
appMasterCfg_t
*
pAppMasterCfg
;
/*! Configuration pointer for extended master */
appExtMasterCfg_t
*
pAppExtMasterCfg
;
/*! Configuration pointer for security */
appSecCfg_t
*
pAppSecCfg
;
/*! Configuration pointer for connection parameter update */
appUpdateCfg_t
*
pAppUpdateCfg
;
/*! Configuration pointer for discovery */
appDiscCfg_t
*
pAppDiscCfg
;
/*! Configuration pointer for application */
appCfg_t
*
pAppCfg
;
/*! Connection control block array */
appConnCb_t
appConnCb
[
DM_CONN_MAX
];
/*! WSF handler ID */
wsfHandlerId_t
appHandlerId
;
/*! Main control block */
appCb_t
appCb
;
/*! Configuration structure for incoming request actions */
const
appReqActCfg_t
appReqActCfg
=
{
APP_ACT_ACCEPT
/*! Action for the remote connection parameter request */
};
/*! Configuration pointer for incoming request actions on master */
appReqActCfg_t
*
pAppMasterReqActCfg
=
(
appReqActCfg_t
*
)
&
appReqActCfg
;
/*! Configurable pointer for incoming request actions on slave */
appReqActCfg_t
*
pAppSlaveReqActCfg
=
(
appReqActCfg_t
*
)
&
appReqActCfg
;
/*************************************************************************************************/
/*!
* \brief Process messages from the event handler.
*
* \param pMsg Pointer to message.
*
* \return None.
*/
/*************************************************************************************************/
static
void
appProcMsg
(
wsfMsgHdr_t
*
pMsg
)
{
switch
(
pMsg
->
event
)
{
case
APP_BTN_POLL_IND
:
appUiBtnPoll
();
break
;
case
APP_UI_TIMER_IND
:
appUiTimerExpired
(
pMsg
);
break
;
default:
break
;
}
}
/*************************************************************************************************/
/*!
* \brief Check the bonded state of a connection.
*
* \param connId DM connection ID.
*
* \return Bonded state.
*/
/*************************************************************************************************/
bool_t
appCheckBonded
(
dmConnId_t
connId
)
{
WSF_ASSERT
((
connId
>
0
)
&&
(
connId
<=
DM_CONN_MAX
));
return
appConnCb
[
connId
-
1
].
bonded
;
}
/*************************************************************************************************/
/*!
* \brief Check the bond-by-LTK state of a connection.
*
* \param connId DM connection ID.
*
* \return Bond-by-LTK state.
*/
/*************************************************************************************************/
bool_t
appCheckBondByLtk
(
dmConnId_t
connId
)
{
WSF_ASSERT
((
connId
>
0
)
&&
(
connId
<=
DM_CONN_MAX
));
return
appConnCb
[
connId
-
1
].
bondByLtk
;
}
/*************************************************************************************************/
/*!
* \brief Return the number of existing connections of the given role.
*
* \param role Connection role
*
* \return Number of connections.
*/
/*************************************************************************************************/
uint8_t
appNumConns
(
uint8_t
role
)
{
appConnCb_t
*
pCcb
=
appConnCb
;
uint8_t
i
,
j
;
for
(
i
=
DM_CONN_MAX
,
j
=
0
;
i
>
0
;
i
--
,
pCcb
++
)
{
if
((
pCcb
->
connId
!=
DM_CONN_ID_NONE
)
&&
(
DmConnRole
(
pCcb
->
connId
)
==
role
))
{
j
++
;
}
}
return
j
;
}
/*************************************************************************************************/
/*!
* \brief App framework handler init function called during system initialization.
*
* \param handlerID WSF handler ID for App.
*
* \return None.
*/
/*************************************************************************************************/
void
AppInit
(
void
)
{
appHandlerId
=
WsfOsSetNextHandler
(
AppHandler
);
AppDbInit
();
}
/*************************************************************************************************/
/*!
* \brief WSF event handler for app framework.
*
* \param event WSF event mask.
* \param pMsg WSF message.
*
* \return None.
*/
/*************************************************************************************************/
void
AppHandler
(
wsfEventMask_t
event
,
wsfMsgHdr_t
*
pMsg
)
{
if
(
pMsg
!=
NULL
)
{
APP_TRACE_INFO1
(
"App got evt %d"
,
pMsg
->
event
);
if
(
pMsg
->
event
>=
APP_MASTER_MSG_START
)
{
/* pass event to master handler */
(
*
appCb
.
masterCback
)(
pMsg
);
}
else
if
(
pMsg
->
event
>=
APP_SLAVE_MSG_START
)
{
/* pass event to slave handler */
(
*
appCb
.
slaveCback
)(
pMsg
);
}
else
{
appProcMsg
(
pMsg
);
}
}
else
{
if
(
event
&
APP_BTN_DOWN_EVT
)
{
AppUiBtnPressed
();
}
}
}
/*************************************************************************************************/
/*!
* \brief Handle a passkey request during pairing. If the passkey is to displayed, a
* random passkey is generated and displayed. If the passkey is to be entered
* the user is prompted to enter the passkey.
*
* \param pAuthReq DM authentication requested event structure.
*
* \return None.
*/
/*************************************************************************************************/
void
AppHandlePasskey
(
dmSecAuthReqIndEvt_t
*
pAuthReq
)
{
uint32_t
passkey
;
uint8_t
buf
[
SMP_PIN_LEN
];
if
(
pAuthReq
->
display
)
{
/* generate random passkey, limit to 6 digit max */
SecRand
((
uint8_t
*
)
&
passkey
,
sizeof
(
uint32_t
));
passkey
%=
1000000
;
/* convert to byte buffer */
buf
[
0
]
=
UINT32_TO_BYTE0
(
passkey
);
buf
[
1
]
=
UINT32_TO_BYTE1
(
passkey
);
buf
[
2
]
=
UINT32_TO_BYTE2
(
passkey
);
/* send authentication response to DM */
DmSecAuthRsp
((
dmConnId_t
)
pAuthReq
->
hdr
.
param
,
SMP_PIN_LEN
,
buf
);
/* display passkey */
AppUiDisplayPasskey
(
passkey
);
}
else
{
/* prompt user to enter passkey */
AppUiAction
(
APP_UI_PASSKEY_PROMPT
);
}
}
/*************************************************************************************************/
/*!
* \brief Handle a numeric comparison indication during pairing. The confirmation value is
* displayed and the user is prompted to verify that the local and peer confirmation
* values match.
*
* \param pCnfInd DM confirmation indication event structure.
*
* \return None.
*/
/*************************************************************************************************/
void
AppHandleNumericComparison
(
dmSecCnfIndEvt_t
*
pCnfInd
)
{
uint32_t
confirm
=
DmSecGetCompareValue
(
pCnfInd
->
confirm
);
LOG_INFO
(
"ble"
,
"Confirm Value: %ld"
,
confirm
);
/* display confirmation value */
AppUiDisplayConfirmValue
(
confirm
);
/* TODO: Verify that local and peer confirmation values match */
DmSecCompareRsp
((
dmConnId_t
)
pCnfInd
->
hdr
.
param
,
TRUE
);
}
/*************************************************************************************************/
/*!
* \brief Close the connection with the give connection identifier.
*
* \param connId Connection identifier.
*
* \return None.
*/
/*************************************************************************************************/
void
AppConnClose
(
dmConnId_t
connId
)
{
DmConnClose
(
DM_CLIENT_ID_APP
,
connId
,
HCI_ERR_REMOTE_TERMINATED
);
}
/*************************************************************************************************/
/*!
* \brief Get a list of connection identifiers of open connections.
*
* \param pConnIdList Buffer to hold connection IDs (must be DM_CONN_MAX bytes).
*
* \return Number of open connections.
*
*/
/*************************************************************************************************/
uint8_t
AppConnOpenList
(
dmConnId_t
*
pConnIdList
)
{
appConnCb_t
*
pCcb
=
appConnCb
;
uint8_t
i
;
uint8_t
pos
=
0
;
memset
(
pConnIdList
,
DM_CONN_ID_NONE
,
DM_CONN_MAX
);
for
(
i
=
DM_CONN_MAX
;
i
>
0
;
i
--
,
pCcb
++
)
{
if
(
pCcb
->
connId
!=
DM_CONN_ID_NONE
)
{
pConnIdList
[
pos
++
]
=
pCcb
->
connId
;
}
}
return
pos
;
}
/*************************************************************************************************/
/*!
* \brief Check if a connection is open.
*
* \return Connection ID of open connection or DM_CONN_ID_NONE if no open connections.
*/
/*************************************************************************************************/
dmConnId_t
AppConnIsOpen
(
void
)
{
appConnCb_t
*
pCcb
=
appConnCb
;
uint8_t
i
;
for
(
i
=
DM_CONN_MAX
;
i
>
0
;
i
--
,
pCcb
++
)
{
if
(
pCcb
->
connId
!=
DM_CONN_ID_NONE
)
{
return
pCcb
->
connId
;
}
}
return
DM_CONN_ID_NONE
;
}
/*************************************************************************************************/
/*!
* \brief Get the device database record handle associated with an open connection.
*
* \param connId Connection identifier.
*
* \return Database record handle or APP_DB_HDL_NONE.
*/
/*************************************************************************************************/
appDbHdl_t
AppDbGetHdl
(
dmConnId_t
connId
)
{
return
appConnCb
[
connId
-
1
].
dbHdl
;
}
/*************************************************************************************************/
/*!
* \brief Add device to resolving list.
*
* \param pMsg Pointer to DM callback event message.
* \param connId Connection identifier.
*
* \return None.
*/
/*************************************************************************************************/
void
AppAddDevToResList
(
dmEvt_t
*
pMsg
,
dmConnId_t
connId
)
{
dmSecKey_t
*
pPeerKey
;
appDbHdl_t
hdl
=
appConnCb
[
connId
-
1
].
dbHdl
;
/* if LL Privacy is supported and the peer device has distributed its IRK */
if
(
HciLlPrivacySupported
()
&&
((
pPeerKey
=
AppDbGetKey
(
hdl
,
DM_KEY_IRK
,
NULL
))
!=
NULL
))
{
/* add peer device to resolving list. If all-zero local or peer IRK is used then
LL will only use or accept local or peer identity address respectively. */
DmPrivAddDevToResList
(
pPeerKey
->
irk
.
addrType
,
pPeerKey
->
irk
.
bdAddr
,
pPeerKey
->
irk
.
key
,
DmSecGetLocalIrk
(),
TRUE
,
pMsg
->
hdr
.
param
);
}
}
/*************************************************************************************************/
/*!
* \brief Update privacy mode for a given peer device.
*
* \param hdl Database record handle.
*
* \return None.
*/
/*************************************************************************************************/
void
AppUpdatePrivacyMode
(
appDbHdl_t
hdl
)
{
/* if peer device's been added to resolving list but RPA Only attribute not found on peer device */
if
((
hdl
!=
APP_DB_HDL_NONE
)
&&
AppDbGetPeerAddedToRl
(
hdl
)
&&
!
AppDbGetPeerRpao
(
hdl
))
{
dmSecKey_t
*
pPeerKey
=
AppDbGetKey
(
hdl
,
DM_KEY_IRK
,
NULL
);
if
(
pPeerKey
!=
NULL
)
{
/* set device privacy mode for this peer device */
DmPrivSetPrivacyMode
(
pPeerKey
->
irk
.
addrType
,
pPeerKey
->
irk
.
bdAddr
,
DM_PRIV_MODE_DEVICE
);
/* make sure resolving list flag cleared */
AppDbSetPeerAddedToRl
(
hdl
,
FALSE
);
}
}
}
/* clang-format on */
epicardium/ble/app/common/app_db.c
View file @
c0a3ed9e
...
...
@@ -95,12 +95,6 @@ static appDb_t appDb;
/*! When all records are allocated use this index to determine which to overwrite */
static
appDbRec_t
*
pAppDbNewRec
=
appDb
.
rec
;
/* Timer to delay writing to persistent storage until a burst of store() calls has finished */
static
TimerHandle_t
store_timer
;
static
StaticTimer_t
store_timer_buffer
;
static
void
store_callback
();
#define STORE_DELAY pdMS_TO_TICKS(5000)
/*************************************************************************************************/
/*!
* \brief Initialize the device database.
...
...
@@ -117,32 +111,12 @@ void AppDbInit(void)
memset
(
&
appDb
,
0
,
sizeof
(
appDb
));
}
epic_file_close
(
fd
);
}
store_timer
=
xTimerCreateStatic
(
"appdb_store_timer"
,
STORE_DELAY
,
pdFALSE
,
NULL
,
store_callback
,
&
store_timer_buffer
);
}
/* TODO this should actually put tasks into a queue. On the other end of the queue */
/* a worker task can read tasks off the queue and execute them */
static
void
store
(
void
)
{
LOG_INFO
(
"appDb"
,
"store() called, resetting timer"
);
if
(
xTimerReset
(
store_timer
,
10
)
!=
pdPASS
)
{
/* (Re)start the timer */
/* Store timer could not be reset, write to persistent storage anyway */
store_callback
();
}
}
static
void
store_callback
(
)
static
void
AppDbStore
(
void
)
{
LOG_INFO
(
"appDb"
,
"
STORE_DELAY passed,
writing to persistent storage"
);
LOG_INFO
(
"appDb"
,
"writing to persistent storage"
);
int
fd
=
epic_file_open
(
"pairings.bin"
,
"w"
);
if
(
fd
>=
0
)
{
...
...
@@ -198,7 +172,6 @@ appDbHdl_t AppDbNewRecord(uint8_t addrType, uint8_t *pAddr)
pRec
->
peerAddedToRl
=
FALSE
;
pRec
->
peerRpao
=
FALSE
;
store
();
return
(
appDbHdl_t
)
pRec
;
}
...
...
@@ -263,7 +236,6 @@ appDbHdl_t AppDbGetNextRecord(appDbHdl_t hdl)
void
AppDbDeleteRecord
(
appDbHdl_t
hdl
)
{
((
appDbRec_t
*
)
hdl
)
->
inUse
=
FALSE
;
store
();
}
/*************************************************************************************************/
...
...
@@ -281,7 +253,7 @@ void AppDbValidateRecord(appDbHdl_t hdl, uint8_t keyMask)
{
((
appDbRec_t
*
)
hdl
)
->
valid
=
TRUE
;
((
appDbRec_t
*
)
hdl
)
->
keyValidMask
=
keyMask
;
s
tore
();
AppDbS
tore
();
}
/*************************************************************************************************/
...
...
@@ -371,7 +343,6 @@ void AppDbDeleteAllRecords(void)
{
pRec
->
inUse
=
FALSE
;
}
store
();
}
/*************************************************************************************************/
...
...
@@ -518,7 +489,6 @@ void AppDbSetKey(appDbHdl_t hdl, dmSecKeyIndEvt_t *pKey)
default:
break
;
}
store
();
}
/*************************************************************************************************/
...
...
@@ -551,7 +521,6 @@ void AppDbSetCccTblValue(appDbHdl_t hdl, uint16_t idx, uint16_t value)
WSF_ASSERT
(
idx
<
APP_DB_NUM_CCCD
);
((
appDbRec_t
*
)
hdl
)
->
cccTbl
[
idx
]
=
value
;
store
();
}
/*************************************************************************************************/
...
...
@@ -581,7 +550,6 @@ uint8_t AppDbGetDiscStatus(appDbHdl_t hdl)
void
AppDbSetDiscStatus
(
appDbHdl_t
hdl
,
uint8_t
status
)
{
((
appDbRec_t
*
)
hdl
)
->
discStatus
=
status
;
store
();
}
/*************************************************************************************************/
...
...
@@ -611,7 +579,6 @@ uint16_t *AppDbGetHdlList(appDbHdl_t hdl)
void
AppDbSetHdlList
(
appDbHdl_t
hdl
,
uint16_t
*
pHdlList
)
{
memcpy
(((
appDbRec_t
*
)
hdl
)
->
hdlList
,
pHdlList
,
sizeof
(((
appDbRec_t
*
)
hdl
)
->
hdlList
));
store
();
}
/*************************************************************************************************/
...
...
@@ -654,7 +621,6 @@ void AppDbSetDevName(uint8_t len, char *pStr)
len
=
(
len
<=
sizeof
(
appDb
.
devName
))
?
len
:
sizeof
(
appDb
.
devName
);
memcpy
(
appDb
.
devName
,
pStr
,
len
);
store
();
}
/*************************************************************************************************/
...
...
@@ -684,7 +650,6 @@ bool_t AppDbGetPeerAddrRes(appDbHdl_t hdl)
void
AppDbSetPeerAddrRes
(
appDbHdl_t
hdl
,
uint8_t
addrRes
)
{
((
appDbRec_t
*
)
hdl
)
->
peerAddrRes
=
addrRes
;
store
();
}
/*************************************************************************************************/
...
...
@@ -715,7 +680,6 @@ void AppDbSetPeerSignCounter(appDbHdl_t hdl, uint32_t signCounter)
{
if
(((
appDbRec_t
*
)
hdl
)
->
peerSignCounter
!=
signCounter
)
{
((
appDbRec_t
*
)
hdl
)
->
peerSignCounter
=
signCounter
;
store
();
}
}
...
...
@@ -746,7 +710,6 @@ bool_t AppDbGetPeerAddedToRl(appDbHdl_t hdl)
void
AppDbSetPeerAddedToRl
(
appDbHdl_t
hdl
,
bool_t
peerAddedToRl
)
{
((
appDbRec_t
*
)
hdl
)
->
peerAddedToRl
=
peerAddedToRl
;
store
();
}
/*************************************************************************************************/
...
...
@@ -776,6 +739,5 @@ bool_t AppDbGetPeerRpao(appDbHdl_t hdl)
void
AppDbSetPeerRpao
(
appDbHdl_t
hdl
,
bool_t
peerRpao
)
{
((
appDbRec_t
*
)
hdl
)
->
peerRpao
=
peerRpao
;
store
();
}
/* clang-format on */
epicardium/ble/app/common/app_ui.c
deleted
100644 → 0
View file @
2c026ff2
/*************************************************************************************************/
/*!
* \file
*
* \brief Application framework user interface.
*
* Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved.
* ARM Ltd. confidential and proprietary.
*
* IMPORTANT. Your use of this file is governed by a Software License Agreement
* ("Agreement") that must be accepted in order to download or otherwise receive a
* copy of this file. You may not use or copy this file for any purpose other than
* as described in the Agreement. If you do not agree to all of the terms of the
* Agreement do not use this file and delete all copies in your possession or control;
* if you do not have a copy of the Agreement, you must contact ARM Ltd. prior
* to any use, copying or further distribution of this software.
*/
/*************************************************************************************************/
#include
"wsf_types.h"
#include
"wsf_os.h"
#include
"wsf_trace.h"
#include
"app_ui.h"
/* card10:
* copied from: lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/common/app_ui.c
*
* Reason: has several user interactions which we likley have to implement
*/
/* clang-format off */
/* clang-formet turned off for easier diffing against orginal file */
/**************************************************************************************************
Global Variables
**************************************************************************************************/
/*! \brief Callback struct */
appUiCback_t
appUiCbackTbl
;
/*************************************************************************************************/
/*!
* \brief card10 - Should disable encryption. MAXIM bug reported to us in current static library. Requires
* this to be called before the BTLE app starts making advertisements. Avoids encryption
* rendering the frame unreadable.
*
* \return None.
*/
/*************************************************************************************************/
void
llc_api_crypto_disable_tx
();
/*************************************************************************************************/
/*!
* \brief Perform a user interface action based on the event value passed to the function.
*
* \param event User interface event value.