Skip to content

Commit fa70dbf

Browse files
trygergpotter2
andauthored
BLE: Add HCI_LE_Meta_Extended_Advertising_Report event (#4686)
* Add HCI_LE_Meta_Extended_Advertising_Report * Update scapy/layers/bluetooth.py --------- Co-authored-by: gpotter2 <10530980+gpotter2@users.noreply.github.com>
1 parent d876346 commit fa70dbf

2 files changed

Lines changed: 117 additions & 0 deletions

File tree

scapy/layers/bluetooth.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2531,6 +2531,69 @@ class HCI_LE_Meta_Long_Term_Key_Request(Packet):
25312531
XLEShortField("ediv", 0), ]
25322532

25332533

2534+
class HCI_LE_Meta_Extended_Advertising_Report(Packet):
2535+
name = "Extended Advertising Report"
2536+
fields_desc = [
2537+
BitField("reserved0", 0, 1),
2538+
BitEnumField("data_status", 0, 2, {
2539+
0b00: "complete",
2540+
0b01: "incomplete",
2541+
0b10: "incomplete_truncated",
2542+
0b11: "reserved"
2543+
}),
2544+
BitField("legacy", 0, 1),
2545+
BitField("scan_response", 0, 1),
2546+
BitField("directed", 0, 1),
2547+
BitField("scannable", 0, 1),
2548+
BitField("connectable", 0, 1),
2549+
ByteField("reserved", 0),
2550+
ByteEnumField("address_type", 0, {
2551+
0x00: "public_device_address",
2552+
0x01: "random_device_address",
2553+
0x02: "public_identity_address",
2554+
0x03: "random_identity_address",
2555+
0xff: "anonymous"
2556+
}),
2557+
LEMACField('address', None),
2558+
ByteEnumField("primary_phy", 0, {
2559+
0x01: "le_1m",
2560+
0x03: "le_coded_s8",
2561+
0x04: "le_coded_s2"
2562+
}),
2563+
ByteEnumField("secondary_phy", 0, {
2564+
0x01: "le_1m",
2565+
0x02: "le_2m",
2566+
0x03: "le_coded_s8",
2567+
0x04: "le_coded_s2"
2568+
}),
2569+
ByteField("advertising_sid", 0xff),
2570+
ByteField("tx_power", 0x7f),
2571+
SignedByteField("rssi", 0x00),
2572+
LEShortField("periodic_advertising_interval", 0x0000),
2573+
ByteEnumField("direct_address_type", 0, {
2574+
0x00: "public_device_address",
2575+
0x01: "non_resolvable_private_address",
2576+
0x02: "resolvable_private_address_resolved_0",
2577+
0x03: "resolvable_private_address_resolved_1",
2578+
0xfe: "resolvable_private_address_unable_resolve"}),
2579+
LEMACField("direct_address", None),
2580+
FieldLenField("data_length", None, length_of="data", fmt="B"),
2581+
PacketListField("data", [], EIR_Hdr,
2582+
length_from=lambda pkt: pkt.data_length),
2583+
]
2584+
2585+
def extract_padding(self, s):
2586+
return '', s
2587+
2588+
2589+
class HCI_LE_Meta_Extended_Advertising_Reports(Packet):
2590+
name = "Extended Advertising Reports"
2591+
fields_desc = [FieldLenField("num_reports", None, count_of="reports", fmt="B"),
2592+
PacketListField("reports", None,
2593+
HCI_LE_Meta_Extended_Advertising_Report,
2594+
count_from=lambda pkt: pkt.num_reports)]
2595+
2596+
25342597
bind_layers(HCI_PHDR_Hdr, HCI_Hdr)
25352598

25362599
bind_layers(HCI_Hdr, HCI_Command_Hdr, type=1)
@@ -2661,6 +2724,7 @@ class HCI_LE_Meta_Long_Term_Key_Request(Packet):
26612724
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Advertising_Reports, event=0x02)
26622725
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Connection_Update_Complete, event=0x03)
26632726
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Long_Term_Key_Request, event=0x05)
2727+
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Extended_Advertising_Reports, event=0x0d)
26642728

26652729
bind_layers(EIR_Hdr, EIR_Flags, type=0x01)
26662730
bind_layers(EIR_Hdr, EIR_IncompleteList16BitServiceUUIDs, type=0x02)

test/scapy/layers/bluetooth.uts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,59 @@ assert b[EIR_CompleteList128BitServiceUUIDs].svc_uuids[0] == UUID("01234567-89ab
709709

710710
assert a.summary() == "HCI Event / HCI_Event_Hdr / HCI_Event_LE_Meta / HCI_LE_Meta_Advertising_Reports"
711711

712+
= EIR_Hdr - HCI_LE_Meta_Extended_Advertising_Report
713+
a = HCI_Hdr()/HCI_Event_Hdr()/HCI_Event_LE_Meta()/HCI_LE_Meta_Extended_Advertising_Reports(reports=[
714+
HCI_LE_Meta_Extended_Advertising_Report(
715+
#event_type = 0x0012,
716+
scannable = 1,
717+
legacy = 1,
718+
address_type = 0x01,
719+
address="a1:b2:c3:d4:e5:f6",
720+
primary_phy = 1,
721+
rssi = -85,
722+
data=[
723+
EIR_Hdr()/EIR_CompleteList16BitServiceUUIDs(
724+
svc_uuids = [0xffff],
725+
),
726+
EIR_Hdr()/EIR_ServiceData16BitUUID(
727+
svc_uuid = 0xffff
728+
)/Raw(b"scapy\x00\x00\x00")
729+
]
730+
),
731+
HCI_LE_Meta_Extended_Advertising_Report(
732+
#event_type = 0x001a,
733+
scannable = 1,
734+
scan_response = 1,
735+
legacy = 1,
736+
address_type = 0x01,
737+
address="a1:b2:c3:d4:e5:f6",
738+
primary_phy = 1,
739+
rssi = -85,
740+
data=[
741+
EIR_Hdr()/EIR_Manufacturer_Specific_Data(
742+
company_id = 0xffff,
743+
) / Raw(b"scapy\x00\x01\x02\x03\x04")
744+
]
745+
),
746+
])
747+
748+
assert raw(a) == b"\x04\x3e\x50\x0d\x02\x12\x00\x01\xf6\xe5\xd4\xc3\xb2\xa1\x01\x00\xff\x7f\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x03\xff\xff\x0b\x16\xff\xffscapy\x00\x00\x00\x1a\x00\x01\xf6\xe5\xd4\xc3\xb2\xa1\x01\x00\xff\x7f\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x0d\xff\xff\xffscapy\x00\x01\x02\x03\x04"
749+
750+
b = HCI_Hdr(raw(a))
751+
b.show()
752+
assert b[HCI_Event_Hdr].len > 0
753+
assert b[HCI_LE_Meta_Extended_Advertising_Reports].num_reports == 2
754+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].address == "a1:b2:c3:d4:e5:f6"
755+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].tx_power == 0x7f
756+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].rssi == -85
757+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].data_length > 0
758+
assert b[EIR_CompleteList16BitServiceUUIDs].svc_uuids == [0xffff]
759+
assert b[EIR_ServiceData16BitUUID].svc_uuid == 0xffff
760+
assert raw(b[EIR_ServiceData16BitUUID].payload) == b"scapy\x00\x00\x00"
761+
assert b[EIR_Manufacturer_Specific_Data].company_id == 0xffff
762+
assert raw(b[EIR_Manufacturer_Specific_Data].payload) == b"scapy\x00\x01\x02\x03\x04"
763+
764+
712765
= ATT_Hdr - misc
713766
a = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/ATT_Hdr()/ATT_Read_By_Type_Request_128bit(uuid1=0xa14, uuid2=0xa24)
714767
a = HCI_Hdr(raw(a))

0 commit comments

Comments
 (0)