chiark / gitweb /
ee844cd53faa83b09602c3231043b2d9fb588861
[hippotat.git] / hippotat / __init__.py
1 # -*- python -*-
2
3 import hippotat.slip as slip
4
5 import ipaddress
6 from ipaddress import AddressValueError
7
8 #---------- packet parsing ----------
9
10 def packet_addrs(packet):
11   version = packet[0] >> 4
12   if version == 4:
13     addrlen = 4
14     saddroff = 3*4
15     factory = ipaddress.IPv4Address
16   elif version == 6:
17     addrlen = 16
18     saddroff = 2*4
19     factory = ipaddress.IPv6Address
20   else:
21     raise ValueError('unsupported IP version %d' % version)
22   saddr = factory(packet[ saddroff           : saddroff + addrlen   ])
23   daddr = factory(packet[ saddroff + addrlen : saddroff + addrlen*2 ])
24   return (saddr, daddr)
25
26 #---------- address handling ----------
27
28 def ipaddr(input):
29   try:
30     r = ipaddress.IPv4Address(input)
31   except AddressValueError:
32     r = ipaddress.IPv6Address(input)
33   return r
34
35 def ipnetwork(input):
36   try:
37     r = ipaddress.IPv4Network(input)
38   except NetworkValueError:
39     r = ipaddress.IPv6Network(input)
40   return r