Based on myBlueUSB reference ver. http://mbed.org/users/networker/programs/myBlueUSB/lsm1ui
Dependencies: mbed myUSBHost AvailableMemory rfcomm myBlueUSB sdp
neighbourhood.h@0:8d8481ed6d49, 2011-07-05 (annotated)
- Committer:
- kenbumono
- Date:
- Tue Jul 05 08:25:59 2011 +0000
- Revision:
- 0:8d8481ed6d49
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenbumono | 0:8d8481ed6d49 | 1 | #ifndef NEIGHBOURHOOD_H |
kenbumono | 0:8d8481ed6d49 | 2 | #define NEIGHBOURHOOD_H |
kenbumono | 0:8d8481ed6d49 | 3 | |
kenbumono | 0:8d8481ed6d49 | 4 | #include <list> |
kenbumono | 0:8d8481ed6d49 | 5 | #include "hci.h" |
kenbumono | 0:8d8481ed6d49 | 6 | |
kenbumono | 0:8d8481ed6d49 | 7 | //#define STRICT_MRU |
kenbumono | 0:8d8481ed6d49 | 8 | |
kenbumono | 0:8d8481ed6d49 | 9 | /****************************************************************************************** |
kenbumono | 0:8d8481ed6d49 | 10 | call 'read' as part of the startup |
kenbumono | 0:8d8481ed6d49 | 11 | on HCI_READ-STORED-LINK-KEY -COMPLETED event, call 'set_cap' |
kenbumono | 0:8d8481ed6d49 | 12 | on RETURN_LINK_KEYS_EVENT call 'add' for each key with init=true |
kenbumono | 0:8d8481ed6d49 | 13 | on LINK_KEY_NOTIFICATION_EVENT call 'add' with init=false (default) |
kenbumono | 0:8d8481ed6d49 | 14 | on LINK_KEY_REQUEST_EVENT call 'get' and send the proper reply |
kenbumono | 0:8d8481ed6d49 | 15 | call 'write' as part of shutdown |
kenbumono | 0:8d8481ed6d49 | 16 | |
kenbumono | 0:8d8481ed6d49 | 17 | a simpler approach could be to check for a link if it exists (single read) and try to add it. |
kenbumono | 0:8d8481ed6d49 | 18 | when it fails just delete all. |
kenbumono | 0:8d8481ed6d49 | 19 | ********************************************************************************************/ |
kenbumono | 0:8d8481ed6d49 | 20 | |
kenbumono | 0:8d8481ed6d49 | 21 | #define HCI_DELETE_STORED_LINK_KEY 0x0C12 |
kenbumono | 0:8d8481ed6d49 | 22 | #define HCI_WRITE_STORED_LINK_KEY 0x0C11 |
kenbumono | 0:8d8481ed6d49 | 23 | #define HCI_READ_STORED_LINK_KEY 0x0C0D |
kenbumono | 0:8d8481ed6d49 | 24 | |
kenbumono | 0:8d8481ed6d49 | 25 | void printf(const BD_ADDR* addr); |
kenbumono | 0:8d8481ed6d49 | 26 | |
kenbumono | 0:8d8481ed6d49 | 27 | class neighbourhood { |
kenbumono | 0:8d8481ed6d49 | 28 | static const int lksize = 16; |
kenbumono | 0:8d8481ed6d49 | 29 | struct item { |
kenbumono | 0:8d8481ed6d49 | 30 | BD_ADDR a; |
kenbumono | 0:8d8481ed6d49 | 31 | unsigned char lk[lksize]; |
kenbumono | 0:8d8481ed6d49 | 32 | bool used; |
kenbumono | 0:8d8481ed6d49 | 33 | item (BD_ADDR *ad, const unsigned char *k, bool d) { |
kenbumono | 0:8d8481ed6d49 | 34 | memcpy(&a, ad, sizeof(BD_ADDR)); |
kenbumono | 0:8d8481ed6d49 | 35 | memcpy(lk, k, lksize); |
kenbumono | 0:8d8481ed6d49 | 36 | used=d; |
kenbumono | 0:8d8481ed6d49 | 37 | } |
kenbumono | 0:8d8481ed6d49 | 38 | }; |
kenbumono | 0:8d8481ed6d49 | 39 | int cap, initsize, used; |
kenbumono | 0:8d8481ed6d49 | 40 | list<item> keys; |
kenbumono | 0:8d8481ed6d49 | 41 | bool dirty; |
kenbumono | 0:8d8481ed6d49 | 42 | HCI *hci; |
kenbumono | 0:8d8481ed6d49 | 43 | void delete_link_key(BD_ADDR *a) { |
kenbumono | 0:8d8481ed6d49 | 44 | unsigned char param[sizeof(BD_ADDR)+1]; |
kenbumono | 0:8d8481ed6d49 | 45 | memcpy(param, a, sizeof(BD_ADDR)); |
kenbumono | 0:8d8481ed6d49 | 46 | param[sizeof(BD_ADDR)] = 0; |
kenbumono | 0:8d8481ed6d49 | 47 | hci->SendCmd(HCI_DELETE_STORED_LINK_KEY, param, sizeof(param)); |
kenbumono | 0:8d8481ed6d49 | 48 | } |
kenbumono | 0:8d8481ed6d49 | 49 | void write_link_keys(unsigned char param[]) { |
kenbumono | 0:8d8481ed6d49 | 50 | hci->SendCmd(HCI_WRITE_STORED_LINK_KEY, param, param[0]*(sizeof(BD_ADDR)+lksize)+1); |
kenbumono | 0:8d8481ed6d49 | 51 | } |
kenbumono | 0:8d8481ed6d49 | 52 | public: |
kenbumono | 0:8d8481ed6d49 | 53 | neighbourhood(HCI *h): hci(h) { |
kenbumono | 0:8d8481ed6d49 | 54 | dirty = false; |
kenbumono | 0:8d8481ed6d49 | 55 | used = 0; |
kenbumono | 0:8d8481ed6d49 | 56 | cap=0; |
kenbumono | 0:8d8481ed6d49 | 57 | initsize=0; |
kenbumono | 0:8d8481ed6d49 | 58 | } |
kenbumono | 0:8d8481ed6d49 | 59 | void read() { |
kenbumono | 0:8d8481ed6d49 | 60 | unsigned char param[sizeof(BD_ADDR)+1]; |
kenbumono | 0:8d8481ed6d49 | 61 | memset(param, 0, sizeof(BD_ADDR)); |
kenbumono | 0:8d8481ed6d49 | 62 | param[sizeof(BD_ADDR)] = 1; |
kenbumono | 0:8d8481ed6d49 | 63 | hci->SendCmd(HCI_READ_STORED_LINK_KEY, param, sizeof(param)); |
kenbumono | 0:8d8481ed6d49 | 64 | } |
kenbumono | 0:8d8481ed6d49 | 65 | void write(); |
kenbumono | 0:8d8481ed6d49 | 66 | void set_cap(int c, int s) { |
kenbumono | 0:8d8481ed6d49 | 67 | cap = c; |
kenbumono | 0:8d8481ed6d49 | 68 | initsize = s; |
kenbumono | 0:8d8481ed6d49 | 69 | printf("Neighbourhood: capacity=%d, used=%d\n", c, s); |
kenbumono | 0:8d8481ed6d49 | 70 | } |
kenbumono | 0:8d8481ed6d49 | 71 | int get(BD_ADDR *a, unsigned char *key); |
kenbumono | 0:8d8481ed6d49 | 72 | int add(BD_ADDR *a, const unsigned char *key, bool init=false); |
kenbumono | 0:8d8481ed6d49 | 73 | }; |
kenbumono | 0:8d8481ed6d49 | 74 | |
kenbumono | 0:8d8481ed6d49 | 75 | extern neighbourhood *neighbors; |
kenbumono | 0:8d8481ed6d49 | 76 | |
kenbumono | 0:8d8481ed6d49 | 77 | #endif |