2 # -*- coding: utf-8 -*-
8 def ipv4_dot2mask(mask):
9 mask = mask.split('.',4) # a.b.c.d -> [a,b,c,d]
10 mask = map(int,mask) # to ints
13 while mask and mask[0] == 0xff:
21 mask = (mask << 1) & 0xff
25 def ipv4_mask2dot(mask):
26 mask = ((1L << mask)-1) << (32 - mask)
27 mask = struct.pack(">I",mask)
28 mask = '.'.join(map(str,map(ord,mask)))
32 a = struct.unpack('!L',socket.inet_aton(a))[0]
33 b = struct.unpack('!L',socket.inet_aton(b))[0]
35 while d and (b&0x80000000)==(a&0x80000000):
43 while d and (b&0x80000000)==(a&0x80000000):
49 def inet_cksum(packet):
50 words = array.array('H')
51 words.fromstring(packet[:len(packet)&~0x1])
57 cksum += ord(packet[-1])
59 cksum = (cksum >> 16) + (cksum & 0xffff)
60 cksum += (cksum >> 16)
63 def iphdr(src, dst, datalen, ttl, proto, tos=0, nocksum=False, ipid=0):
65 src = socket.inet_aton(src)
66 dst = socket.inet_aton(dst)
67 hdr = struct.pack('!BBHHHBBH4s4s',
68 0x45, tos, datalen + 5*4, ipid, 0,
69 ttl, proto, cksum & 0xffff, src, dst)
71 cksum = inet_cksum(hdr)
72 hdr = struct.pack('!BBHHHBBH4s4s',
73 0x45, tos, datalen + 5*4, ipid, 0,
74 ttl, proto, cksum & 0xffff, src, dst)
77 def igmp(type, mxrt, grp, nocksum=False):
79 grp = socket.inet_aton(grp)
80 ighdr = struct.pack('!BBH4s', type, mxrt, cksum & 0xffff, grp)
82 cksum = inet_cksum(ighdr)
83 ighdr = struct.pack('!BBH4s', type, mxrt, cksum & 0xffff, grp)
86 def ipigmp(src, dst, ttl, type, mxrt, grp, noipcksum=False, noigmpcksum=False):
87 igmpp = igmp(type, mxrt, grp, nocksum=noigmpcksum)
88 iph = iphdr(src, dst, len(igmpp), ttl, 2, tos=0xc0, nocksum=noipcksum)