42
42
#define SVC_CONTEXT_FLAG (BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS | BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS)
43
43
44
44
#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 )
46
46
#else
47
- #define printBondDir ()
47
+ #define printBondDir (role )
48
48
#endif
49
49
50
50
/* ------------------------------------------------------------------*/
@@ -58,16 +58,24 @@ void bond_init(void)
58
58
{
59
59
// Initialize nffs for bonding (it is safe to call nffs_pkg_init() multiple time)
60
60
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);
62
64
}
63
65
64
66
/* ------------------------------------------------------------------*/
65
67
/* Keys
66
68
*------------------------------------------------------------------*/
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)
68
70
{
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
+ }
71
79
72
80
char devname[CFG_MAX_DEVNAME_LEN] = { 0 };
73
81
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)
84
92
result = false ;
85
93
}
86
94
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) )
89
97
{
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 ]);
91
100
}
92
101
102
+ file.write ((uint8_t *) devname, CFG_MAX_DEVNAME_LEN);
103
+
93
104
file.close ();
94
105
95
106
if (result)
@@ -100,24 +111,30 @@ static void bond_save_keys_dfr(uint16_t conn_hdl, bond_data_t* bdata)
100
111
LOG_LV1 (" BOND" , " Failed to save keys for \" %s\" " , devname);
101
112
}
102
113
103
- printBondDir ();
114
+ printBondDir (role );
104
115
}
105
116
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)
107
118
{
108
119
uint8_t * buf = (uint8_t *) rtos_malloc ( sizeof (bond_data_t ) );
109
120
VERIFY (buf, );
110
121
111
122
memcpy (buf, bdata, sizeof (bond_data_t ));
112
123
113
124
// 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);
115
126
}
116
127
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)
118
129
{
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
+ }
121
138
122
139
bool result = (Nffs.readFile (filename, bdata, sizeof (bond_data_t )) > 0 );
123
140
@@ -136,7 +153,7 @@ bool bond_load_keys(uint16_t ediv, bond_data_t* bdata)
136
153
/* ------------------------------------------------------------------*/
137
154
/* CCCD
138
155
*------------------------------------------------------------------*/
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)
140
157
{
141
158
uint16_t len=0 ;
142
159
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)
147
164
if ( ERROR_NONE == sd_ble_gatts_sys_attr_get (conn_hdl, sys_attr, &len, SVC_CONTEXT_FLAG) )
148
165
{
149
166
// 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
+ }
152
175
153
176
if ( Nffs.writeFile (filename, sys_attr, len, BOND_FILE_CCCD_OFFSET) )
154
177
{
@@ -161,24 +184,30 @@ static void bond_save_cccd_dfr (uint16_t conn_hdl, uint16_t ediv)
161
184
}
162
185
163
186
rtos_free (sys_attr);
164
- printBondDir ();
187
+ printBondDir (role );
165
188
}
166
189
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)
168
191
{
169
192
VERIFY ( ediv != 0xFFFF , );
170
193
171
194
// 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);
173
196
}
174
197
175
198
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)
177
200
{
178
201
bool loaded = false ;
179
202
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
+ }
182
211
183
212
NffsFile file (filename, FS_ACCESS_READ);
184
213
@@ -222,16 +251,68 @@ bool bond_load_cccd(uint16_t cond_hdl, uint16_t ediv)
222
251
return loaded;
223
252
}
224
253
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
+
225
288
/* ------------------------------------------------------------------*/
226
289
/* DELETE
227
290
*------------------------------------------------------------------*/
228
- void bond_clear (void )
291
+ void bond_clear_prph (void )
229
292
{
230
293
// Detele bonds dir
231
- Nffs.remove (CFG_BOND_NFFS_DIR );
294
+ Nffs.remove (BOND_DIR_PRPH );
232
295
233
296
// 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);
235
314
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);
237
318
}
0 commit comments