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  # -*- coding: utf-8 -*- 
  3  """Cisco Discovery Protocol.""" 
  4  from __future__ import absolute_import 
  5   
  6  import struct 
  7   
  8  from . import dpkt 
  9   
 10  CDP_DEVID = 1  # string 
 11  CDP_ADDRESS = 2 
 12  CDP_PORTID = 3  # string 
 13  CDP_CAPABILITIES = 4  # 32-bit bitmask 
 14  CDP_VERSION = 5  # string 
 15  CDP_PLATFORM = 6  # string 
 16  CDP_IPPREFIX = 7 
 17   
 18  CDP_VTP_MGMT_DOMAIN = 9  # string 
 19  CDP_NATIVE_VLAN = 10  # 16-bit integer 
 20  CDP_DUPLEX = 11  # 8-bit boolean 
 21  CDP_TRUST_BITMAP = 18  # 8-bit bitmask0x13 
 22  CDP_UNTRUST_COS = 19  # 8-bit port 
 23  CDP_SYSTEM_NAME = 20  # string 
 24  CDP_SYSTEM_OID = 21  # 10-byte binary string 
 25  CDP_MGMT_ADDRESS = 22  # 32-bit number of addrs, Addresses 
 26  CDP_LOCATION = 23  # string 
 27   
 28   
29 -class CDP(dpkt.Packet):
30 """Cisco Discovery Protocol. 31 32 See more about the BGP on \ 33 https://en.wikipedia.org/wiki/Cisco_Discovery_Protocol 34 35 Attributes: 36 __hdr__: Header fields of CDP. 37 #TODO 38 """ 39 40 __hdr__ = ( 41 ('version', 'B', 2), 42 ('ttl', 'B', 180), 43 ('sum', 'H', 0) 44 ) 45
46 - class Address(dpkt.Packet):
47 # XXX - only handle NLPID/IP for now 48 __hdr__ = ( 49 ('ptype', 'B', 1), # protocol type (NLPID) 50 ('plen', 'B', 1), # protocol length 51 ('p', 'B', 0xcc), # IP 52 ('alen', 'H', 4) # address length 53 ) 54
55 - def unpack(self, buf):
56 dpkt.Packet.unpack(self, buf) 57 self.data = self.data[:self.alen]
58
59 - class TLV(dpkt.Packet):
60 __hdr__ = ( 61 ('type', 'H', 0), 62 ('len', 'H', 4) 63 ) 64
65 - def unpack(self, buf):
66 dpkt.Packet.unpack(self, buf) 67 self.data = self.data[:self.len - 4] 68 if self.type == CDP_ADDRESS: 69 n = struct.unpack('>I', self.data[:4])[0] 70 buf = self.data[4:] 71 l = [] 72 for i in range(n): 73 a = CDP.Address(buf) 74 l.append(a) 75 buf = buf[len(a):] 76 self.data = l
77
78 - def __len__(self):
79 if self.type == CDP_ADDRESS: 80 n = 4 + sum(map(len, self.data)) 81 else: 82 n = len(self.data) 83 return self.__hdr_len__ + n
84
85 - def __bytes__(self):
86 self.len = len(self) 87 if self.type == CDP_ADDRESS: 88 s = struct.pack('>I', len(self.data)) + \ 89 b''.join(map(bytes, self.data)) 90 else: 91 s = self.data 92 return self.pack_hdr() + s
93
94 - def unpack(self, buf):
95 dpkt.Packet.unpack(self, buf) 96 buf = self.data 97 l = [] 98 while buf: 99 tlv = self.TLV(buf) 100 l.append(tlv) 101 buf = buf[len(tlv):] 102 self.data = l
103
104 - def __len__(self):
105 return self.__hdr_len__ + sum(map(len, self.data))
106
107 - def __bytes__(self):
108 data = b''.join(map(bytes, self.data)) 109 if not self.sum: 110 self.sum = dpkt.in_cksum(self.pack_hdr() + data) 111 return self.pack_hdr() + data
112