attempt to save recently used BT devices with their link keys in the BT dongle link key storage

Dependents:   ftusbClass

Committer:
networker
Date:
Sun Jun 19 12:51:41 2011 +0000
Revision:
0:6707543df242
initial (untested)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 0:6707543df242 1 #include "Utils.h"
networker 0:6707543df242 2 #include "neighbourhood.h"
networker 0:6707543df242 3
networker 0:6707543df242 4 neighbourhood *neighbors = 0;
networker 0:6707543df242 5
networker 0:6707543df242 6 int neighbourhood::get(BD_ADDR *a, unsigned char *key) {
networker 0:6707543df242 7 for (list<item>::iterator i = keys.begin(); i != keys.end(); i++)
networker 0:6707543df242 8 if (memcmp(a, &(*i).a, sizeof(BD_ADDR)) == 0) {
networker 0:6707543df242 9 memcpy(key, (*i).lk, lksize);
networker 0:6707543df242 10 #ifdef STRICT_MRU
networker 0:6707543df242 11 if (i != keys.begin()) {
networker 0:6707543df242 12 keys.push_front(*i);
networker 0:6707543df242 13 keys.erase(i);
networker 0:6707543df242 14 dirty = true;
networker 0:6707543df242 15 }
networker 0:6707543df242 16 #endif
networker 0:6707543df242 17 return 1;
networker 0:6707543df242 18 }
networker 0:6707543df242 19 return 0;
networker 0:6707543df242 20 }
networker 0:6707543df242 21
networker 0:6707543df242 22 int neighbourhood::add(BD_ADDR *a, const unsigned char *key, bool init) {
networker 0:6707543df242 23 for (list<item>::iterator i = keys.begin(); i != keys.end(); i++)
networker 0:6707543df242 24 if (memcmp(a, &(*i).a, sizeof(BD_ADDR)) == 0) {
networker 0:6707543df242 25 memcpy((*i).lk, key, lksize); //assume key has changed, update key
networker 0:6707543df242 26 (*i).used = true;
networker 0:6707543df242 27 return 1;
networker 0:6707543df242 28 }
networker 0:6707543df242 29 //new key
networker 0:6707543df242 30 printf("Neighbourhood: "); printf(a); printf("\n");
networker 0:6707543df242 31 if (keys.size() < cap) {
networker 0:6707543df242 32 keys.push_back(item(a, key, !init));//append as long as there is space
networker 0:6707543df242 33 } else {
networker 0:6707543df242 34 keys.push_front(item(a, key, true));//otherwise prepend
networker 0:6707543df242 35 dirty = true;
networker 0:6707543df242 36 }
networker 0:6707543df242 37 return 0;
networker 0:6707543df242 38 }
networker 0:6707543df242 39
networker 0:6707543df242 40 void neighbourhood::write() {
networker 0:6707543df242 41 int n = 0;
networker 0:6707543df242 42 static const int maxkey = 11;
networker 0:6707543df242 43 unsigned char param[maxkey*(lksize+sizeof(BD_ADDR))+1];
networker 0:6707543df242 44 int k = keys.size()-cap;
networker 0:6707543df242 45 list<item>::iterator i = keys.begin();
networker 0:6707543df242 46 while (i != keys.end()) {
networker 0:6707543df242 47 if (k>0) {
networker 0:6707543df242 48 if (!(*i).used) {
networker 0:6707543df242 49 delete_link_key(&(*i).a);//try to make some room
networker 0:6707543df242 50 keys.erase(i);
networker 0:6707543df242 51 k--;
networker 0:6707543df242 52 } else
networker 0:6707543df242 53 i++;
networker 0:6707543df242 54 } else
networker 0:6707543df242 55 break;
networker 0:6707543df242 56 }
networker 0:6707543df242 57 //hci->delete_link_keys();
networker 0:6707543df242 58 unsigned char *p = &param[1];
networker 0:6707543df242 59 for (list<item>::iterator i = keys.begin(); i != keys.end() && n<maxkey; i++, n++) {
networker 0:6707543df242 60 memcpy(p, &(*i).a, sizeof(BD_ADDR));
networker 0:6707543df242 61 p += sizeof(BD_ADDR);
networker 0:6707543df242 62 memcpy(p, (*i).lk, lksize);
networker 0:6707543df242 63 p += lksize;
networker 0:6707543df242 64 }
networker 0:6707543df242 65 param[0] = n;
networker 0:6707543df242 66 if (n > 0)
networker 0:6707543df242 67 write_link_keys(param);
networker 0:6707543df242 68 }
networker 0:6707543df242 69