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

Source Code for Module dpkt.ip6

 1  # $Id: ip6.py 359 2006-04-21 20:12:14Z dugsong $ 
 2   
 3  """Internet Protocol, version 6.""" 
 4   
 5  import dpkt 
 6   
7 -class IP6(dpkt.Packet):
8 __hdr__ = ( 9 ('v_fc_flow', 'I', 0x60000000L), 10 ('plen', 'H', 0), # payload length (not including header) 11 ('nxt', 'B', 0), # next header protocol 12 ('hlim', 'B', 0), # hop limit 13 ('src', '16s', ''), 14 ('dst', '16s', '') 15 ) 16 _protosw = {} # XXX - shared with IP 17
18 - def _get_v(self):
19 return self.v_fc_flow >> 28
20 - def _set_v(self, v):
21 self.v_fc_flow = (self.v_fc_flow & ~0xf0000000L) | (v << 28)
22 v = property(_get_v, _set_v) 23
24 - def _get_fc(self):
25 return (self.v_fc_flow >> 20) & 0xff
26 - def _set_fc(self, v):
27 self.v_fc_flow = (self.v_fc_flow & ~0xff00000L) | (v << 20)
28 fc = property(_get_fc, _set_fc) 29
30 - def _get_flow(self):
31 return self.v_fc_flow & 0xfffff
32 - def _set_flow(self, v):
33 self.v_fc_flow = (self.v_fc_flow & ~0xfffff) | (v & 0xfffff)
34 flow = property(_get_flow, _set_flow) 35
36 - def unpack(self, buf):
37 dpkt.Packet.unpack(self, buf) 38 buf = self.data[:self.plen] 39 try: 40 self.data = self._protosw[self.nxt](buf) 41 setattr(self, self.data.__class__.__name__.lower(), self.data) 42 except (KeyError, dpkt.UnpackError): 43 self.data = buf
44
45 - def __str__(self):
46 if (self.nxt == 6 or self.nxt == 17 or self.nxt == 58) and \ 47 not self.data.sum: 48 # XXX - set TCP, UDP, and ICMPv6 checksums 49 p = str(self.data) 50 s = dpkt.in_cksum_add(0, self.src + self.dst) 51 s = dpkt.in_cksum_add(s, p) 52 try: 53 self.data.sum = dpkt.in_cksum_done(s + self.nxt + len(p)) 54 except AttributeError: 55 pass 56 return dpkt.Packet.__str__(self)
57
58 - def set_proto(cls, p, pktclass):
59 cls._protosw[p] = pktclass
60 set_proto = classmethod(set_proto) 61
62 - def get_proto(cls, p):
63 return cls._protosw[p]
64 get_proto = classmethod(get_proto)
65 66 # XXX - auto-load IP6 dispatch table from IP dispatch table 67 import ip 68 IP6._protosw.update(ip.IP._protosw) 69 70 if __name__ == '__main__': 71 import unittest 72
73 - class IP6TestCase(unittest.TestCase):
74 - def test_IP6(self):
75 s = '`\x00\x00\x00\x00(\x06@\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x11$\xff\xfe\x8c\x11\xde\xfe\x80\x00\x00\x00\x00\x00\x00\x02\xb0\xd0\xff\xfe\xe1\x80r\xcd\xca\x00\x16\x04\x84F\xd5\x00\x00\x00\x00\xa0\x02\xff\xff\xf8\t\x00\x00\x02\x04\x05\xa0\x01\x03\x03\x00\x01\x01\x08\n}\x185?\x00\x00\x00\x00' 76 ip = IP6(s) 77 #print `ip` 78 ip.data.sum = 0 79 s2 = str(ip) 80 ip2 = IP6(s) 81 #print `ip2` 82 assert(s == s2)
83 84 unittest.main() 85