kopia lustrzana https://github.com/micropython/micropython-lib
79 wiersze
1.6 KiB
Python
79 wiersze
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
|