1
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),
11 ('nxt', 'B', 0),
12 ('hlim', 'B', 0),
13 ('src', '16s', ''),
14 ('dst', '16s', '')
15 )
16 _protosw = {}
17
19 return self.v_fc_flow >> 28
21 self.v_fc_flow = (self.v_fc_flow & ~0xf0000000L) | (v << 28)
22 v = property(_get_v, _set_v)
23
25 return (self.v_fc_flow >> 20) & 0xff
27 self.v_fc_flow = (self.v_fc_flow & ~0xff00000L) | (v << 20)
28 fc = property(_get_fc, _set_fc)
29
31 return self.v_fc_flow & 0xfffff
33 self.v_fc_flow = (self.v_fc_flow & ~0xfffff) | (v & 0xfffff)
34 flow = property(_get_flow, _set_flow)
35
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
57
60 set_proto = classmethod(set_proto)
61
64 get_proto = classmethod(get_proto)
65
66
67 import ip
68 IP6._protosw.update(ip.IP._protosw)
69
70 if __name__ == '__main__':
71 import unittest
72
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
78 ip.data.sum = 0
79 s2 = str(ip)
80 ip2 = IP6(s)
81
82 assert(s == s2)
83
84 unittest.main()
85