MCPcopy Create free account
hub / github.com/encodeous/nylon / dnsStreamRoundTrip

Function dnsStreamRoundTrip

polyamide/tun/netstack/tun.go:622–651  ·  view source on GitHub ↗
(c net.Conn, id uint16, query dnsmessage.Question, b []byte)

Source from the content-addressed store, hash-verified

620}
621
622func dnsStreamRoundTrip(c net.Conn, id uint16, query dnsmessage.Question, b []byte) (dnsmessage.Parser, dnsmessage.Header, error) {
623 if _, err := c.Write(b); err != nil {
624 return dnsmessage.Parser{}, dnsmessage.Header{}, err
625 }
626 b = make([]byte, 1280)
627 if _, err := io.ReadFull(c, b[:2]); err != nil {
628 return dnsmessage.Parser{}, dnsmessage.Header{}, err
629 }
630 l := int(b[0])<<8 | int(b[1])
631 if l > len(b) {
632 b = make([]byte, l)
633 }
634 n, err := io.ReadFull(c, b[:l])
635 if err != nil {
636 return dnsmessage.Parser{}, dnsmessage.Header{}, err
637 }
638 var p dnsmessage.Parser
639 h, err := p.Start(b[:n])
640 if err != nil {
641 return dnsmessage.Parser{}, dnsmessage.Header{}, errCannotUnmarshalDNSMessage
642 }
643 q, err := p.Question()
644 if err != nil {
645 return dnsmessage.Parser{}, dnsmessage.Header{}, errCannotUnmarshalDNSMessage
646 }
647 if !checkResponse(id, query, h, q) {
648 return dnsmessage.Parser{}, dnsmessage.Header{}, errInvalidDNSResponse
649 }
650 return p, h, nil
651}
652
653func (tnet *Net) exchange(ctx context.Context, server netip.Addr, q dnsmessage.Question, timeout time.Duration) (dnsmessage.Parser, dnsmessage.Header, error) {
654 q.Class = dnsmessage.ClassINET

Callers 1

exchangeMethod · 0.85

Calls 3

checkResponseFunction · 0.85
WriteMethod · 0.65
StartMethod · 0.65

Tested by

no test coverage detected