Skip to content

Commit 2c28f06

Browse files
martijntheguedou
authored andcommitted
Bluetooth: Add LE Connection Update command & event types (#234)
1 parent 42b7c20 commit 2c28f06

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

scapy/layers/bluetooth.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,16 @@ class HCI_Cmd_LE_Connection_Update(Packet):
538538
class HCI_Cmd_LE_Create_Connection_Cancel(Packet):
539539
name = "LE Create Connection Cancel"
540540

541+
class HCI_Cmd_LE_Connection_Update(Packet):
542+
name = "LE Connection Update"
543+
fields_desc = [ XLEShortField("handle", 0),
544+
XLEShortField("min_interval", 0),
545+
XLEShortField("max_interval", 0),
546+
XLEShortField("latency", 0),
547+
XLEShortField("timeout", 0),
548+
LEShortField("min_ce", 0),
549+
LEShortField("max_ce", 0xffff), ]
550+
541551
class HCI_Cmd_LE_Read_Buffer_Size(Packet):
542552
name = "LE Read Buffer Size"
543553

@@ -639,6 +649,14 @@ class HCI_LE_Meta_Connection_Complete(Packet):
639649
LEShortField("supervision", 42),
640650
XByteField("clock_latency", 5), ]
641651

652+
class HCI_LE_Meta_Connection_Update_Complete(Packet):
653+
name = "Connection Update Complete"
654+
fields_desc = [ ByteEnumField("status", 0, {0:"success"}),
655+
LEShortField("handle", 0),
656+
LEShortField("interval", 54),
657+
LEShortField("latency", 0),
658+
LEShortField("timeout", 42), ]
659+
642660
class HCI_LE_Meta_Advertising_Report(Packet):
643661
name = "Advertising Report"
644662
fields_desc = [ ByteField("number", 0),
@@ -693,10 +711,12 @@ class HCI_LE_Meta_Long_Term_Key_Request(Packet):
693711
bind_layers( HCI_Event_Hdr, HCI_Event_Command_Status, code=0xf)
694712
bind_layers( HCI_Event_Hdr, HCI_Event_Number_Of_Completed_Packets, code=0x13)
695713
bind_layers( HCI_Event_Hdr, HCI_Event_LE_Meta, code=0x3e)
714+
696715
bind_layers( HCI_Event_Command_Complete, HCI_Cmd_Complete_Read_BD_Addr, opcode=0x1009)
697716

698717
bind_layers( HCI_Event_LE_Meta, HCI_LE_Meta_Connection_Complete, event=1)
699718
bind_layers( HCI_Event_LE_Meta, HCI_LE_Meta_Advertising_Report, event=2)
719+
bind_layers( HCI_Event_LE_Meta, HCI_LE_Meta_Connection_Update_Complete, event=3)
700720
bind_layers( HCI_Event_LE_Meta, HCI_LE_Meta_Long_Term_Key_Request, event=5)
701721

702722
bind_layers(EIR_Hdr, EIR_Flags, type=0x01)

test/bluetooth.uts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,25 @@ expected_cmd_raw_data = "01060403341213".decode('hex')
1212
cmd_raw_data = str(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Disconnect(handle=0x1234))
1313
assert(expected_cmd_raw_data == cmd_raw_data)
1414

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+
1534
+ Bluetooth LE Advertising / Scan Response Data Parsing
1635
= Parse EIR_Flags, EIR_CompleteList16BitServiceUUIDs, EIR_CompleteLocalName and EIR_TX_Power_Level
1736

0 commit comments

Comments
 (0)