kopia lustrzana https://github.com/micropython/micropython-lib
udnspkt: A module to create/parse DNS packets to resolve hostnames.
This module implements "Sans I/O" approach, where packets are created/ parsed using BytesIO objects, and all networking happens outside the module. The module implements enough functionality to resolve a domain name into IP address, for both IPv4 and IPv6. Other DNS functionality is outside the scope of this module, that's why it's called *u*dnspkt. The API is experimental and subject to change. This module requires .readbin()/.writebin() methods on a stream.pull/234/merge
rodzic
7e643f6365
commit
7e334411c2
|
@ -0,0 +1,78 @@
|
||||||
|
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
|
Ładowanie…
Reference in New Issue