Skip to content

Commit b94953d

Browse files
authored
CDP: add CDPMsgPowerRequest and CDPMsgPowerAvailable (#3805)
* CDP: add CDPMsgPowerRequest and CDPMsgPowerAvailable * add test for CDPMsgPowerRequest and CDPMsgPowerAvailable
1 parent 0591d24 commit b94953d

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

scapy/contrib/cdp.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
ByteEnumField,
2020
ByteField,
2121
FieldLenField,
22+
FieldListField,
2223
FlagsField,
24+
IntField,
2325
IP6Field,
2426
IPField,
2527
OUIField,
@@ -63,8 +65,8 @@
6365
# 0x0015: "CDPMsgSystemOID",
6466
0x0016: "CDPMsgMgmtAddr",
6567
# 0x0017: "CDPMsgLocation",
66-
0x0019: "CDPMsgUnknown19",
67-
# 0x001a: "CDPPowerAvailable"
68+
0x0019: "CDPMsgPowerRequest",
69+
0x001a: "CDPMsgPowerAvailable"
6870
}
6971

7072
_cdp_tlv_types = {0x0001: "Device ID",
@@ -91,7 +93,7 @@
9193
0x0016: "Management Address",
9294
0x0017: "Location",
9395
0x0018: "CDP Unknown command (send us a pcap file)",
94-
0x0019: "CDP Unknown command (send us a pcap file)",
96+
0x0019: "Power Request",
9597
0x001a: "Power Available"}
9698

9799

@@ -351,9 +353,28 @@ class CDPMsgMgmtAddr(CDPMsgAddr):
351353
type = 0x0016
352354

353355

354-
class CDPMsgUnknown19(CDPMsgGeneric):
355-
name = "Unknown CDP Message"
356-
type = 0x0019
356+
class CDPMsgPowerRequest(CDPMsgGeneric):
357+
name = "Power Request"
358+
fields_desc = [XShortEnumField("type", 0x0019, _cdp_tlv_types),
359+
FieldLenField("len", None, "power_requested_list", fmt="!H",
360+
adjust=lambda pkt, x: x + 8),
361+
ShortField("req_id", 0),
362+
ShortField("mgmt_id", 0),
363+
FieldListField("power_requested_list", [],
364+
IntField("power_requested", 0),
365+
count_from=lambda pkt: (pkt.len - 8) // 4)]
366+
367+
368+
class CDPMsgPowerAvailable(CDPMsgGeneric):
369+
name = "Power Available"
370+
fields_desc = [XShortEnumField("type", 0x001a, _cdp_tlv_types),
371+
FieldLenField("len", None, "power_available_list", fmt="!H",
372+
adjust=lambda pkt, x: x + 8),
373+
ShortField("req_id", 0),
374+
ShortField("mgmt_id", 0),
375+
FieldListField("power_available_list", [],
376+
IntField("power_available", 0),
377+
count_from=lambda pkt: (pkt.len - 8) // 4)]
357378

358379

359380
class CDPMsg(CDPMsgGeneric):

test/contrib/cdp.uts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,27 @@ assert cdp_msg_addr.haslayer(CDPAddrRecordIPv6)
8989
assert len(cdp_msg_addr.addr) == 2
9090

9191
assert raw(cdp_msg_addr)[4:8] == b'\x00\x00\x00\x02'
92+
93+
= CDPv2 - CDPMsgPowerRequest and CDPMsgPowerAvailable Packet
94+
s = b'\x02\xb4\x39\xfa\x00\x01\x00\x09\x53\x63\x61\x70\x79\x00\x02\x00\x11\x00\x00\x00\x01\x01\x01\xcc\x00\x04\x7f\x00\x00\x01\x00\x10\x00\x06\x00\x10\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x1a\x00\x14\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07'
95+
cdpv2 = CDPv2_HDR(s)
96+
assert cdpv2.vers == 2
97+
assert cdpv2.ttl == 180
98+
assert cdpv2.cksum == 0x39fa
99+
assert cdpv2.haslayer(CDPMsgDeviceID)
100+
assert cdpv2.haslayer(CDPMsgAddr)
101+
assert cdpv2.haslayer(CDPMsgPower)
102+
assert cdpv2.haslayer(CDPMsgPowerRequest)
103+
assert cdpv2.haslayer(CDPMsgPowerAvailable)
104+
assert cdpv2[CDPMsgPowerRequest].type == 0x0019
105+
assert cdpv2[CDPMsgPowerRequest].len == 24
106+
assert cdpv2[CDPMsgPowerRequest].req_id == 0
107+
assert cdpv2[CDPMsgPowerRequest].mgmt_id == 0
108+
assert len(cdpv2[CDPMsgPowerRequest].power_requested_list) == 4
109+
assert cdpv2[CDPMsgPowerRequest].power_requested_list == [1, 2, 3, 4]
110+
assert cdpv2[CDPMsgPowerAvailable].type == 0x001a
111+
assert cdpv2[CDPMsgPowerAvailable].len == 20
112+
assert cdpv2[CDPMsgPowerAvailable].req_id == 0
113+
assert cdpv2[CDPMsgPowerAvailable].mgmt_id == 0
114+
assert len(cdpv2[CDPMsgPowerAvailable].power_available_list) == 3
115+
assert cdpv2[CDPMsgPowerAvailable].power_available_list == [5, 6, 7]

0 commit comments

Comments
 (0)