Logging classqueue
[nepi.git] / src / nepi / util / ipaddr2.py
index a01067d..436979f 100644 (file)
@@ -1,6 +1,9 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 import struct
+import random
+import socket
+import array
 
 def ipv4_dot2mask(mask):
     mask = mask.split('.',4) # a.b.c.d -> [a,b,c,d]
@@ -43,3 +46,46 @@ def ipdistn(a,b):
         d -= 1
     return d
 
+def inet_cksum(packet):
+    words = array.array('H')
+    words.fromstring(packet[:len(packet)&~0x1])
+    htons = socket.htons
+    cksum = 0
+    for word in words:
+        cksum += htons(word)
+    if len(packet)&0x1:
+        cksum += ord(packet[-1])
+    cksum &= 0xffffffff
+    cksum = (cksum >> 16) + (cksum & 0xffff)
+    cksum += (cksum >> 16)
+    return ~cksum
+
+def iphdr(src, dst, datalen, ttl, proto, tos=0, nocksum=False, ipid=0):
+    cksum = 0
+    src = socket.inet_aton(src)
+    dst = socket.inet_aton(dst)
+    hdr = struct.pack('!BBHHHBBH4s4s', 
+        0x45, tos, datalen + 5*4, ipid, 0, 
+        ttl, proto, cksum & 0xffff, src, dst)
+    if not nocksum:
+        cksum = inet_cksum(hdr)
+        hdr = struct.pack('!BBHHHBBH4s4s', 
+            0x45, tos, datalen + 5*4, ipid, 0, 
+            ttl, proto, cksum & 0xffff, src, dst)
+    return hdr
+
+def igmp(type, mxrt, grp, nocksum=False):
+    cksum = 0
+    grp = socket.inet_aton(grp)
+    ighdr = struct.pack('!BBH4s', type, mxrt, cksum & 0xffff, grp)
+    if not nocksum:
+        cksum = inet_cksum(ighdr)
+        ighdr = struct.pack('!BBH4s', type, mxrt, cksum & 0xffff, grp)
+    return ighdr
+
+def ipigmp(src, dst, ttl, type, mxrt, grp, noipcksum=False, noigmpcksum=False):
+    igmpp = igmp(type, mxrt, grp, nocksum=noigmpcksum)
+    iph = iphdr(src, dst, len(igmpp), ttl, 2, tos=0xc0, nocksum=noipcksum)
+    return iph+igmpp
+
+