EMF_Camp_Badge/upip/udnspkt.py

79 lines
1.6 KiB
Python

import uio
def write_fqdn(buf, name):
parts = name.split(".")
for p in parts:
buf.writebin("B", len(p))
buf.write(p)
buf.writebin("B", 0)
def skip_fqdn(buf):
while True:
sz = buf.readbin("B")
if not sz:
break
if sz >= 0xc0:
buf.readbin("B")
break
buf.read(sz)
def make_req(buf, fqdn, is_ipv6):
typ = 1 # A
if is_ipv6:
typ = 28 # AAAA
buf.writebin(">H", 0)
buf.writebin(">H", 0x100)
# q count
buf.writebin(">H", 1)
buf.writebin(">H", 0)
# squashed together
buf.writebin(">I", 0)
write_fqdn(buf, fqdn)
buf.writebin(">H", typ)
buf.writebin(">H", 1) # Class
def parse_resp(buf, is_ipv6):
typ = 1 # A
if is_ipv6:
typ = 28 # AAAA
id = buf.readbin(">H")
flags = buf.readbin(">H")
assert flags & 0x8000
qcnt = buf.readbin(">H")
acnt = buf.readbin(">H")
nscnt = buf.readbin(">H")
addcnt = buf.readbin(">H")
#print(qcnt, acnt, nscnt, addcnt)
skip_fqdn(buf)
v = buf.readbin(">H")
#print(v)
v = buf.readbin(">H")
#print(v)
for i in range(acnt):
#print("Resp #%d" % i)
#v = read_fqdn(buf)
#print(v)
skip_fqdn(buf)
t = buf.readbin(">H")
#print("Type", t)
v = buf.readbin(">H")
#print("Class", v)
v = buf.readbin(">I")
#print("TTL", v)
rlen = buf.readbin(">H")
#print("rlen", rlen)
rval = buf.read(rlen)
#print(rval)
if t == typ:
return rval