Martijn Thé | db75882 | 2016-04-12 14:31:36 +0200 | [diff] [blame] | 1 | % Scapy Bluetooth layer tests |
| 2 | |
Martijn Thé | aa46295 | 2016-04-25 16:53:51 +0200 | [diff] [blame] | 3 | + HCI Commands |
| 4 | = LE Create Connection Cancel |
| 5 | |
| 6 | expected_cmd_raw_data = "010e2000".decode('hex') |
| 7 | cmd_raw_data = str(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_LE_Create_Connection_Cancel()) |
| 8 | assert(expected_cmd_raw_data == cmd_raw_data) |
| 9 | |
Martijn Thé | 1a99f35 | 2016-04-25 22:33:06 +0200 | [diff] [blame] | 10 | = Disconnect |
| 11 | expected_cmd_raw_data = "01060403341213".decode('hex') |
| 12 | cmd_raw_data = str(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Disconnect(handle=0x1234)) |
| 13 | assert(expected_cmd_raw_data == cmd_raw_data) |
| 14 | |
Martijn Thé | 2c28f06 | 2016-07-30 15:47:42 +0200 | [diff] [blame] | 15 | = LE Connection Update Command |
| 16 | expected_cmd_raw_data = "0113200e47000a00140001003c000100ffff".decode('hex') |
| 17 | cmd_raw_data = str( |
| 18 | HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_LE_Connection_Update( |
| 19 | handle=0x47, min_interval=10, max_interval=20, latency=1, timeout=60, |
| 20 | min_ce=1, max_ce=0xffff)) |
| 21 | assert(expected_cmd_raw_data == cmd_raw_data) |
| 22 | |
| 23 | |
| 24 | + HCI Events |
| 25 | = LE Connection Update Event |
| 26 | evt_raw_data = "043e0a03004800140001003c00".decode('hex') |
| 27 | evt_pkt = HCI_Hdr(evt_raw_data) |
| 28 | assert(evt_pkt[HCI_LE_Meta_Connection_Update_Complete].handle == 0x48) |
| 29 | assert(evt_pkt[HCI_LE_Meta_Connection_Update_Complete].interval == 20) |
| 30 | assert(evt_pkt[HCI_LE_Meta_Connection_Update_Complete].latency == 1) |
| 31 | assert(evt_pkt[HCI_LE_Meta_Connection_Update_Complete].timeout == 60) |
| 32 | |
| 33 | |
Martijn Thé | db75882 | 2016-04-12 14:31:36 +0200 | [diff] [blame] | 34 | + Bluetooth LE Advertising / Scan Response Data Parsing |
| 35 | = Parse EIR_Flags, EIR_CompleteList16BitServiceUUIDs, EIR_CompleteLocalName and EIR_TX_Power_Level |
| 36 | |
| 37 | ad_report_raw_data = \ |
| 38 | "043e2b020100016522c00181781f0201020303d9fe1409" \ |
| 39 | "506562626c652054696d65204c452037314536020a0cde".decode('hex') |
| 40 | scapy_packet = HCI_Hdr(ad_report_raw_data) |
| 41 | |
| 42 | assert(scapy_packet[EIR_Flags].flags == 0x02) |
| 43 | assert(scapy_packet[EIR_CompleteList16BitServiceUUIDs].svc_uuids == [0xfed9]) |
| 44 | assert(scapy_packet[EIR_CompleteLocalName].local_name == 'Pebble Time LE 71E6') |
| 45 | assert(scapy_packet[EIR_TX_Power_Level].level == 12) |
| 46 | |
| 47 | = Parse EIR_Manufacturer_Specific_Data |
| 48 | |
| 49 | scan_resp_raw_data = \ |
| 50 | "043e2302010401be5e0eb9f04f1716ff5401005f423331" \ |
| 51 | "3134374432343631fc00030c0000de".decode('hex') |
| 52 | scapy_packet = HCI_Hdr(scan_resp_raw_data) |
| 53 | |
| 54 | assert(scapy_packet[EIR_Manufacturer_Specific_Data].data == '\x00_B31147D2461\xfc\x00\x03\x0c\x00\x00') |
| 55 | assert(scapy_packet[EIR_Manufacturer_Specific_Data].company_id == 0x154) |