2222#include <controller/ble_ll.h>
2323#include <controller/ble_ll_addr.h>
2424
25- /* FIXME: both should be static and accessible only via dedicated set/get APIs;
26- * extern declared in nimble/ble.h should be removed
27- */
28- uint8_t g_dev_addr [BLE_DEV_ADDR_LEN ];
29- uint8_t g_random_addr [BLE_DEV_ADDR_LEN ];
30-
31- static uint8_t g_dev_addr_hci [BLE_DEV_ADDR_LEN ];
25+ static struct {
26+ uint8_t public_addr [BLE_DEV_ADDR_LEN ];
27+ uint8_t random_addr [BLE_DEV_ADDR_LEN ];
28+ uint8_t public_addr_hci [BLE_DEV_ADDR_LEN ];
29+ } g_ble_ll_addr ;
3230
3331static bool
3432is_addr_empty (const uint8_t * addr )
@@ -39,11 +37,82 @@ is_addr_empty(const uint8_t *addr)
3937int
4038ble_ll_addr_public_set (const uint8_t * addr )
4139{
42- memcpy (g_dev_addr_hci , addr , BLE_DEV_ADDR_LEN );
40+ memcpy (g_ble_ll_addr . public_addr_hci , addr , BLE_DEV_ADDR_LEN );
4341
4442 return 0 ;
4543}
4644
45+ const uint8_t *
46+ ble_ll_addr_get (uint8_t addr_type )
47+ {
48+ const uint8_t * addr ;
49+
50+ if (addr_type ) {
51+ addr = g_ble_ll_addr .random_addr ;
52+ } else {
53+ addr = g_ble_ll_addr .public_addr ;
54+ }
55+
56+ return addr ;
57+ }
58+
59+ const uint8_t *
60+ ble_ll_addr_public_get (void )
61+ {
62+ return g_ble_ll_addr .public_addr ;
63+ }
64+
65+
66+ const uint8_t *
67+ ble_ll_addr_random_get (void )
68+ {
69+ return g_ble_ll_addr .random_addr ;
70+ }
71+
72+ int
73+ ble_ll_addr_random_set (const uint8_t * addr )
74+ {
75+ memcpy (g_ble_ll_addr .random_addr , addr , BLE_DEV_ADDR_LEN );
76+
77+ return 0 ;
78+ }
79+
80+ bool
81+ ble_ll_addr_is_our (int addr_type , const uint8_t * addr )
82+ {
83+ const uint8_t * our_addr ;
84+
85+ our_addr = ble_ll_addr_get (addr_type );
86+
87+ return memcmp (our_addr , addr , BLE_DEV_ADDR_LEN ) == 0 ;
88+ }
89+
90+ bool
91+ ble_ll_addr_is_valid_own_addr_type (uint8_t addr_type ,
92+ const uint8_t * random_addr )
93+ {
94+ const uint8_t * addr ;
95+
96+ switch (addr_type ) {
97+ case BLE_HCI_ADV_OWN_ADDR_PUBLIC :
98+ #if MYNEWT_VAL (BLE_LL_CFG_FEAT_LL_PRIVACY )
99+ case BLE_HCI_ADV_OWN_ADDR_PRIV_PUB :
100+ #endif
101+ addr = ble_ll_addr_public_get ();
102+ break ;
103+ case BLE_HCI_ADV_OWN_ADDR_RANDOM :
104+ #if MYNEWT_VAL (BLE_LL_CFG_FEAT_LL_PRIVACY )
105+ case BLE_HCI_ADV_OWN_ADDR_PRIV_RAND :
106+ #endif
107+ addr = random_addr ? random_addr : ble_ll_addr_random_get ();
108+ break ;
109+ default :
110+ return false;
111+ }
112+
113+ return !is_addr_empty (addr );
114+ }
115+
47116int
48117ble_ll_addr_init (void )
49118{
@@ -55,24 +124,24 @@ ble_ll_addr_init(void)
55124 */
56125 pub_dev_addr = MYNEWT_VAL (BLE_LL_PUBLIC_DEV_ADDR );
57126 for (i = 0 ; i < BLE_DEV_ADDR_LEN ; i ++ ) {
58- g_dev_addr [i ] = pub_dev_addr & 0xff ;
127+ g_ble_ll_addr . public_addr [i ] = pub_dev_addr & 0xff ;
59128 pub_dev_addr >>= 8 ;
60129 }
61130
62- if (!is_addr_empty (g_dev_addr_hci )) {
131+ if (!is_addr_empty (g_ble_ll_addr . public_addr_hci )) {
63132 /* Use public address set externally */
64- memcpy (g_dev_addr , g_dev_addr_hci , BLE_DEV_ADDR_LEN );
133+ memcpy (g_ble_ll_addr . public_addr , g_ble_ll_addr . public_addr_hci , BLE_DEV_ADDR_LEN );
65134 } else {
66135 /* Set public address from provider API, if available */
67136#if MYNEWT_API_ble_addr_provider_public
68- ble_ll_addr_provide_public (g_dev_addr );
137+ ble_ll_addr_provide_public (g_ble_ll_addr . public_addr );
69138#endif
70139 }
71140
72141#if MYNEWT_VAL (BLE_LL_ADDR_INIT_RANDOM )
73142 /* Set random address from provider API, if available */
74143#if MYNEWT_API_ble_addr_provider_random
75- ble_ll_addr_provide_static (g_random_addr );
144+ ble_ll_addr_provide_static (g_ble_ll_addr . random_addr );
76145#endif
77146#endif
78147
0 commit comments