1
2
3 """Cisco Discovery Protocol."""
4
5 import struct
6 import dpkt
7
8 CDP_DEVID = 1
9 CDP_ADDRESS = 2
10 CDP_PORTID = 3
11 CDP_CAPABILITIES = 4
12 CDP_VERSION = 5
13 CDP_PLATFORM = 6
14 CDP_IPPREFIX = 7
15
16 CDP_VTP_MGMT_DOMAIN = 9
17 CDP_NATIVE_VLAN = 10
18 CDP_DUPLEX = 11
19 CDP_TRUST_BITMAP = 18
20 CDP_UNTRUST_COS = 19
21 CDP_SYSTEM_NAME = 20
22 CDP_SYSTEM_OID = 21
23 CDP_MGMT_ADDRESS = 22
24 CDP_LOCATION = 23
25
26 -class CDP(dpkt.Packet):
27 __hdr__ = (
28 ('version', 'B', 2),
29 ('ttl', 'B', 180),
30 ('sum', 'H', 0)
31 )
33
34 __hdr__ = (
35 ('ptype', 'B', 1),
36 ('plen', 'B', 1),
37 ('p', 'B', 0xcc),
38 ('alen', 'H', 4)
39 )
43
44 - class TLV(dpkt.Packet):
45 __hdr__ = (
46 ('type', 'H', 0),
47 ('len', 'H', 4)
48 )
50 dpkt.Packet.unpack(self, buf)
51 self.data = self.data[:self.len - 4]
52 if self.type == CDP_ADDRESS:
53 n = struct.unpack('>I', self.data[:4])[0]
54 buf = self.data[4:]
55 l = []
56 for i in range(n):
57 a = CDP.Address(buf)
58 l.append(a)
59 buf = buf[len(a):]
60 self.data = l
61
68
70 self.len = len(self)
71 if self.type == CDP_ADDRESS:
72 s = struct.pack('>I', len(self.data)) + \
73 ''.join(map(str, self.data))
74 else:
75 s = self.data
76 return self.pack_hdr() + s
77
79 dpkt.Packet.unpack(self, buf)
80 buf = self.data
81 l = []
82 while buf:
83 tlv = self.TLV(buf)
84 l.append(tlv)
85 buf = buf[len(tlv):]
86 self.data = l
87
90
92 data = ''.join(map(str, self.data))
93 if not self.sum:
94 self.sum = dpkt.in_cksum(self.pack_hdr() + data)
95 return self.pack_hdr() + data
96