Package dpkt :: Module cdp
[hide private]
[frames] | no frames]

Source Code for Module dpkt.cdp

 1  # $Id: cdp.py 23 2006-11-08 15:45:33Z dugsong $ 
 2   
 3  """Cisco Discovery Protocol.""" 
 4   
 5  import struct 
 6  import dpkt 
 7   
 8  CDP_DEVID               = 1     # string 
 9  CDP_ADDRESS             = 2 
10  CDP_PORTID              = 3     # string 
11  CDP_CAPABILITIES        = 4     # 32-bit bitmask 
12  CDP_VERSION             = 5     # string 
13  CDP_PLATFORM            = 6     # string 
14  CDP_IPPREFIX            = 7      
15   
16  CDP_VTP_MGMT_DOMAIN     = 9     # string 
17  CDP_NATIVE_VLAN         = 10    # 16-bit integer 
18  CDP_DUPLEX              = 11    # 8-bit boolean 
19  CDP_TRUST_BITMAP        = 18    # 8-bit bitmask0x13 
20  CDP_UNTRUST_COS         = 19    # 8-bit port 
21  CDP_SYSTEM_NAME         = 20    # string 
22  CDP_SYSTEM_OID          = 21    # 10-byte binary string 
23  CDP_MGMT_ADDRESS        = 22    # 32-bit number of addrs, Addresses 
24  CDP_LOCATION            = 23    # string 
25   
26 -class CDP(dpkt.Packet):
27 __hdr__ = ( 28 ('version', 'B', 2), 29 ('ttl', 'B', 180), 30 ('sum', 'H', 0) 31 )
32 - class Address(dpkt.Packet):
33 # XXX - only handle NLPID/IP for now 34 __hdr__ = ( 35 ('ptype', 'B', 1), # protocol type (NLPID) 36 ('plen', 'B', 1), # protocol length 37 ('p', 'B', 0xcc), # IP 38 ('alen', 'H', 4) # address length 39 )
40 - def unpack(self, buf):
41 dpkt.Packet.unpack(self, buf) 42 self.data = self.data[:self.alen]
43
44 - class TLV(dpkt.Packet):
45 __hdr__ = ( 46 ('type', 'H', 0), 47 ('len', 'H', 4) 48 )
49 - def unpack(self, buf):
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
62 - def __len__(self):
63 if self.type == CDP_ADDRESS: 64 n = 4 + sum(map(len, self.data)) 65 else: 66 n = len(self.data) 67 return self.__hdr_len__ + n
68
69 - def __str__(self):
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
78 - def unpack(self, buf):
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
88 - def __len__(self):
89 return self.__hdr_len__ + sum(map(len, self.data))
90
91 - def __str__(self):
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