4242#define SVC_CONTEXT_FLAG (BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS | BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS)
4343
4444#if CFG_DEBUG >= 2
45- #define printBondDir () dbgPrintDir(CFG_BOND_NFFS_DIR )
45+ #define printBondDir (role ) dbgPrintDir( role == BLE_GAP_ROLE_PERIPH ? BOND_DIR_PRPH : BOND_DIR_CNTR )
4646#else
47- #define printBondDir ()
47+ #define printBondDir (role )
4848#endif
4949
5050/* ------------------------------------------------------------------*/
@@ -58,16 +58,24 @@ void bond_init(void)
5858{
5959 // Initialize nffs for bonding (it is safe to call nffs_pkg_init() multiple time)
6060 Nffs.begin ();
61- (void ) Nffs.mkdir_p (CFG_BOND_NFFS_DIR);
61+
62+ (void ) Nffs.mkdir_p (BOND_DIR_PRPH);
63+ (void ) Nffs.mkdir_p (BOND_DIR_CNTR);
6264}
6365
6466/* ------------------------------------------------------------------*/
6567/* Keys
6668 *------------------------------------------------------------------*/
67- static void bond_save_keys_dfr (uint16_t conn_hdl, bond_data_t * bdata)
69+ static void bond_save_keys_dfr (uint8_t role, uint16_t conn_hdl, bond_data_t * bdata)
6870{
69- char filename[BOND_FILENAME_LEN];
70- sprintf (filename, BOND_FILENAME, bdata->own_enc .master_id .ediv );
71+ char filename[BOND_FNAME_LEN];
72+ if ( role == BLE_GAP_ROLE_PERIPH )
73+ {
74+ sprintf (filename, BOND_FNAME_PRPH, bdata->own_enc .master_id .ediv );
75+ }else
76+ {
77+ sprintf (filename, BOND_FNAME_CNTR, bdata->own_enc .master_id .ediv );
78+ }
7179
7280 char devname[CFG_MAX_DEVNAME_LEN] = { 0 };
7381 Bluefruit.Gap .getPeerName (conn_hdl, devname, CFG_MAX_DEVNAME_LEN);
@@ -84,12 +92,15 @@ static void bond_save_keys_dfr(uint16_t conn_hdl, bond_data_t* bdata)
8492 result = false ;
8593 }
8694
87- // write device name
88- if ( strlen (devname) && !file. write (( uint8_t *) devname, CFG_MAX_DEVNAME_LEN ) )
95+ // If couldn't get devname use peer mac address
96+ if ( ! strlen (devname) )
8997 {
90- result = false ;
98+ uint8_t * mac = bdata->peer_id .id_addr_info .addr ;
99+ sprintf (devname, " %02X:%02X:%02X:%02X:%02X:%02X" , mac[5 ], mac[4 ], mac[3 ], mac[2 ], mac[1 ], mac[0 ]);
91100 }
92101
102+ file.write ((uint8_t *) devname, CFG_MAX_DEVNAME_LEN);
103+
93104 file.close ();
94105
95106 if (result)
@@ -100,24 +111,30 @@ static void bond_save_keys_dfr(uint16_t conn_hdl, bond_data_t* bdata)
100111 LOG_LV1 (" BOND" , " Failed to save keys for \" %s\" " , devname);
101112 }
102113
103- printBondDir ();
114+ printBondDir (role );
104115}
105116
106- void bond_save_keys (uint16_t conn_hdl, bond_data_t * bdata)
117+ void bond_save_keys (uint8_t role, uint16_t conn_hdl, bond_data_t * bdata)
107118{
108119 uint8_t * buf = (uint8_t *) rtos_malloc ( sizeof (bond_data_t ) );
109120 VERIFY (buf, );
110121
111122 memcpy (buf, bdata, sizeof (bond_data_t ));
112123
113124 // queue to execute in Ada Callback thread
114- ada_callback (buf, bond_save_keys_dfr, conn_hdl, buf);
125+ ada_callback (buf, bond_save_keys_dfr, role, conn_hdl, buf);
115126}
116127
117- bool bond_load_keys (uint16_t ediv, bond_data_t * bdata)
128+ bool bond_load_keys (uint8_t role, uint16_t ediv, bond_data_t * bdata)
118129{
119- char filename[BOND_FILENAME_LEN];
120- sprintf (filename, BOND_FILENAME, ediv);
130+ char filename[BOND_FNAME_LEN];
131+ if ( role == BLE_GAP_ROLE_PERIPH )
132+ {
133+ sprintf (filename, BOND_FNAME_PRPH, ediv);
134+ }else
135+ {
136+ sprintf (filename, BOND_FNAME_CNTR, ediv);
137+ }
121138
122139 bool result = (Nffs.readFile (filename, bdata, sizeof (bond_data_t )) > 0 );
123140
@@ -136,7 +153,7 @@ bool bond_load_keys(uint16_t ediv, bond_data_t* bdata)
136153/* ------------------------------------------------------------------*/
137154/* CCCD
138155 *------------------------------------------------------------------*/
139- static void bond_save_cccd_dfr (uint16_t conn_hdl, uint16_t ediv)
156+ static void bond_save_cccd_dfr (uint8_t role, uint16_t conn_hdl, uint16_t ediv)
140157{
141158 uint16_t len=0 ;
142159 sd_ble_gatts_sys_attr_get (conn_hdl, NULL , &len, SVC_CONTEXT_FLAG);
@@ -147,8 +164,14 @@ static void bond_save_cccd_dfr (uint16_t conn_hdl, uint16_t ediv)
147164 if ( ERROR_NONE == sd_ble_gatts_sys_attr_get (conn_hdl, sys_attr, &len, SVC_CONTEXT_FLAG) )
148165 {
149166 // save to file
150- char filename[BOND_FILENAME_LEN];
151- sprintf (filename, BOND_FILENAME, ediv);
167+ char filename[BOND_FNAME_LEN];
168+ if ( role == BLE_GAP_ROLE_PERIPH )
169+ {
170+ sprintf (filename, BOND_FNAME_PRPH, ediv);
171+ }else
172+ {
173+ sprintf (filename, BOND_FNAME_CNTR, ediv);
174+ }
152175
153176 if ( Nffs.writeFile (filename, sys_attr, len, BOND_FILE_CCCD_OFFSET) )
154177 {
@@ -161,24 +184,30 @@ static void bond_save_cccd_dfr (uint16_t conn_hdl, uint16_t ediv)
161184 }
162185
163186 rtos_free (sys_attr);
164- printBondDir ();
187+ printBondDir (role );
165188}
166189
167- void bond_save_cccd (uint16_t cond_hdl, uint16_t ediv)
190+ void bond_save_cccd (uint8_t role, uint16_t cond_hdl, uint16_t ediv)
168191{
169192 VERIFY ( ediv != 0xFFFF , );
170193
171194 // queue to execute in Ada Callback thread
172- ada_callback (NULL , bond_save_cccd_dfr, cond_hdl, ediv);
195+ ada_callback (NULL , bond_save_cccd_dfr, role, cond_hdl, ediv);
173196}
174197
175198
176- bool bond_load_cccd (uint16_t cond_hdl, uint16_t ediv)
199+ bool bond_load_cccd (uint8_t role, uint16_t cond_hdl, uint16_t ediv)
177200{
178201 bool loaded = false ;
179202
180- char filename[BOND_FILENAME_LEN];
181- sprintf (filename, BOND_FILENAME, ediv);
203+ char filename[BOND_FNAME_LEN];
204+ if ( role == BLE_GAP_ROLE_PERIPH )
205+ {
206+ sprintf (filename, BOND_FNAME_PRPH, ediv);
207+ }else
208+ {
209+ sprintf (filename, BOND_FNAME_CNTR, ediv);
210+ }
182211
183212 NffsFile file (filename, FS_ACCESS_READ);
184213
@@ -222,16 +251,68 @@ bool bond_load_cccd(uint16_t cond_hdl, uint16_t ediv)
222251 return loaded;
223252}
224253
254+ void bond_print_list (uint8_t role)
255+ {
256+ const char * dpath = (role == BLE_GAP_ROLE_PERIPH ? BOND_DIR_PRPH : BOND_DIR_CNTR);
257+
258+ NffsDir dir (dpath);
259+ NffsDirEntry dirEntry;
260+
261+ while ( dir.read (&dirEntry) )
262+ {
263+ if ( !dirEntry.isDirectory () )
264+ {
265+ char name[64 ];
266+ dirEntry.getName (name, sizeof (name));
267+
268+ cprintf (" %s : " , name);
269+
270+ // open file to read device name
271+ NffsFile file (dpath, dirEntry, FS_ACCESS_READ);
272+
273+ varclr (name);
274+
275+ file.seek (BOND_FILE_DEVNAME_OFFSET);
276+ if ( file.read (name, CFG_MAX_DEVNAME_LEN) )
277+ {
278+ cprintf (name);
279+ }
280+
281+ cprintf (" \n " );
282+ file.close ();
283+ }
284+ }
285+ cprintf (" \n " );
286+ }
287+
225288/* ------------------------------------------------------------------*/
226289/* DELETE
227290 *------------------------------------------------------------------*/
228- void bond_clear (void )
291+ void bond_clear_prph (void )
229292{
230293 // Detele bonds dir
231- Nffs.remove (CFG_BOND_NFFS_DIR );
294+ Nffs.remove (BOND_DIR_PRPH );
232295
233296 // Create an empty one
234- Nffs.mkdir_p (CFG_BOND_NFFS_DIR);
297+ (void ) Nffs.mkdir_p (BOND_DIR_PRPH);
298+ }
299+
300+ void bond_clear_cntr (void )
301+ {
302+ // Detele bonds dir
303+ Nffs.remove (BOND_DIR_CNTR);
304+
305+ // Create an empty one
306+ (void ) Nffs.mkdir_p (BOND_DIR_CNTR);
307+ }
308+
309+
310+ void bond_clear_all (void )
311+ {
312+ // Detele bonds dir
313+ Nffs.remove (BOND_DIR_ROOT);
235314
236- printBondDir ();
315+ // Create an empty one for prph and central
316+ (void ) Nffs.mkdir_p (BOND_DIR_PRPH);
317+ (void ) Nffs.mkdir_p (BOND_DIR_CNTR);
237318}
0 commit comments