Skip to content

Commit db0362f

Browse files
committed
Add HCI_LE_Meta_Extended_Advertising_Report
1 parent 874abdc commit db0362f

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

scapy/layers/bluetooth.py

+65
Original file line numberDiff line numberDiff line change
@@ -2518,6 +2518,70 @@ class HCI_LE_Meta_Long_Term_Key_Request(Packet):
25182518
XLEShortField("ediv", 0), ]
25192519

25202520

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

25232587
bind_layers(HCI_Hdr, HCI_Command_Hdr, type=1)
@@ -2648,6 +2712,7 @@ class HCI_LE_Meta_Long_Term_Key_Request(Packet):
26482712
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Advertising_Reports, event=0x02)
26492713
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Connection_Update_Complete, event=0x03)
26502714
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Long_Term_Key_Request, event=0x05)
2715+
bind_layers(HCI_Event_LE_Meta, HCI_LE_Meta_Extended_Advertising_Reports, event=0x0d)
26512716

26522717
bind_layers(EIR_Hdr, EIR_Flags, type=0x01)
26532718
bind_layers(EIR_Hdr, EIR_IncompleteList16BitServiceUUIDs, type=0x02)

test/scapy/layers/bluetooth.uts

+53
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,59 @@ assert b[EIR_CompleteList128BitServiceUUIDs].svc_uuids[0] == UUID("01234567-89ab
705705

706706
assert a.summary() == "HCI Event / HCI_Event_Hdr / HCI_Event_LE_Meta / HCI_LE_Meta_Advertising_Reports"
707707

708+
= EIR_Hdr - HCI_LE_Meta_Extended_Advertising_Report
709+
a = HCI_Hdr()/HCI_Event_Hdr()/HCI_Event_LE_Meta()/HCI_LE_Meta_Extended_Advertising_Reports(reports=[
710+
HCI_LE_Meta_Extended_Advertising_Report(
711+
#event_type = 0x0012,
712+
scannable = 1,
713+
legacy = 1,
714+
address_type = 0x01,
715+
address="a1:b2:c3:d4:e5:f6",
716+
primary_phy = 1,
717+
rssi = -85,
718+
data=[
719+
EIR_Hdr()/EIR_CompleteList16BitServiceUUIDs(
720+
svc_uuids = [0xffff],
721+
),
722+
EIR_Hdr()/EIR_ServiceData16BitUUID(
723+
svc_uuid = 0xffff
724+
)/Raw(b"scapy\x00\x00\x00")
725+
]
726+
),
727+
HCI_LE_Meta_Extended_Advertising_Report(
728+
#event_type = 0x001a,
729+
scannable = 1,
730+
scan_response = 1,
731+
legacy = 1,
732+
address_type = 0x01,
733+
address="a1:b2:c3:d4:e5:f6",
734+
primary_phy = 1,
735+
rssi = -85,
736+
data=[
737+
EIR_Hdr()/EIR_Manufacturer_Specific_Data(
738+
company_id = 0xffff,
739+
) / Raw(b"scapy\x00\x01\x02\x03\x04")
740+
]
741+
),
742+
])
743+
744+
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"
745+
746+
b = HCI_Hdr(raw(a))
747+
b.show()
748+
assert b[HCI_Event_Hdr].len > 0
749+
assert b[HCI_LE_Meta_Extended_Advertising_Reports].num_reports == 2
750+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].address == "a1:b2:c3:d4:e5:f6"
751+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].tx_power == 0x7f
752+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].rssi == -85
753+
assert b[HCI_LE_Meta_Extended_Advertising_Report][0].data_length > 0
754+
assert b[EIR_CompleteList16BitServiceUUIDs].svc_uuids == [0xffff]
755+
assert b[EIR_ServiceData16BitUUID].svc_uuid == 0xffff
756+
assert raw(b[EIR_ServiceData16BitUUID].payload) == b"scapy\x00\x00\x00"
757+
assert b[EIR_Manufacturer_Specific_Data].company_id == 0xffff
758+
assert raw(b[EIR_Manufacturer_Specific_Data].payload) == b"scapy\x00\x01\x02\x03\x04"
759+
760+
708761
= ATT_Hdr - misc
709762
a = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/ATT_Hdr()/ATT_Read_By_Type_Request_128bit(uuid1=0xa14, uuid2=0xa24)
710763
a = HCI_Hdr(raw(a))

0 commit comments

Comments
 (0)