Add mdns package and Client implementation (#55)

* add mdns

* define mdns.Client

* fix some mdns stuff

* refine dns package for use with mdns

* remove Querier and Responder and replace with Client

* add record setting methods on dns.record to reuse record buffer

* protect against unbounded client answer growth

* round off sharp mdns edges; reduce allocs

* add mutlicast to stacks; add xnet tests for mdns

* fix documentation on acceptmulticast field

* mdns working
This commit is contained in:
Pat Whittingslow
2026-03-16 19:48:17 +01:00
committed by GitHub
parent 376e1a0b4f
commit bd645b5e1e
14 changed files with 1402 additions and 67 deletions
+40 -2
View File
@@ -19,6 +19,7 @@ import (
"github.com/soypat/lneto/ipv4"
"github.com/soypat/lneto/ipv4/icmpv4"
"github.com/soypat/lneto/ipv6"
"github.com/soypat/lneto/mdns"
"github.com/soypat/lneto/ntp"
"github.com/soypat/lneto/tcp"
"github.com/soypat/lneto/udp"
@@ -359,7 +360,7 @@ func (pc *PacketBreakdown) CaptureUDP(dst []Frame, pkt []byte, bitOffset int) ([
srcport := ufrm.SourcePort()
if dhcpv4.PayloadIsDHCPv4(payload) {
dst, err = pc.CaptureDHCPv4(dst, pkt, end)
} else if dstport == dns.ServerPort || srcport == dns.ServerPort {
} else if dstport == dns.ServerPort || srcport == dns.ServerPort || dstport == mdns.Port || srcport == mdns.Port {
dst, err = pc.CaptureDNS(dst, pkt, end)
} else if dstport == ntp.ServerPort || srcport == ntp.ServerPort {
dst, err = pc.CaptureNTP(dst, pkt, end)
@@ -437,7 +438,7 @@ func (pc *PacketBreakdown) CaptureDNS(dst []Frame, pkt []byte, bitOffset int) ([
return dst, errNotByteAligned
}
dnsData := pkt[bitOffset/8:]
pc.dmsg.LimitResourceDecoding(20, 20, 20, 20)
pc.dmsg.LimitResourceDecoding(4, 4, 4, 4)
off, incomplete, err := pc.dmsg.Decode(dnsData)
if err != nil && !incomplete {
return dst, err
@@ -1265,6 +1266,43 @@ var baseDHCPv4Fields = [...]FrameField{
},
}
var baseDNSFields = [...]FrameField{
{
Class: FieldClassID,
FrameBitOffset: 0,
BitLength: 2 * octet,
},
{
Class: FieldClassFlags,
FrameBitOffset: 2 * octet,
BitLength: 2 * octet,
},
{
Name: "Questions",
Class: FieldClassSize,
FrameBitOffset: 4 * octet,
BitLength: 2 * octet,
},
{
Name: "Answers",
Class: FieldClassSize,
FrameBitOffset: 6 * octet,
BitLength: 2 * octet,
},
{
Name: "Authorities",
Class: FieldClassSize,
FrameBitOffset: 8 * octet,
BitLength: 2 * octet,
},
{
Name: "Additionals",
Class: FieldClassSize,
FrameBitOffset: 10 * octet,
BitLength: 2 * octet,
},
}
var baseNTPFields = [...]FrameField{
{
Name: "Mode",