diff options
Diffstat (limited to 'plugin/forward/dnstap.go')
-rw-r--r-- | plugin/forward/dnstap.go | 62 |
1 files changed, 30 insertions, 32 deletions
diff --git a/plugin/forward/dnstap.go b/plugin/forward/dnstap.go index 7866aa39b..e005cc02a 100644 --- a/plugin/forward/dnstap.go +++ b/plugin/forward/dnstap.go @@ -1,10 +1,10 @@ package forward import ( - "context" + "net" + "strconv" "time" - "github.com/coredns/coredns/plugin/dnstap" "github.com/coredns/coredns/plugin/dnstap/msg" "github.com/coredns/coredns/request" @@ -12,50 +12,48 @@ import ( "github.com/miekg/dns" ) -func toDnstap(ctx context.Context, host string, f *Forward, state request.Request, reply *dns.Msg, start time.Time) error { - tapper := dnstap.TapperFromContext(ctx) - if tapper == nil { - return nil - } +// toDnstap will send the forward and received message to the dnstap plugin. +func toDnstap(f *Forward, host string, state request.Request, opts options, reply *dns.Msg, start time.Time) { // Query - b := msg.New().Time(start).HostPort(host) - opts := f.opts - t := "" + q := new(tap.Message) + msg.SetQueryTime(q, start) + h, p, _ := net.SplitHostPort(host) // this is preparsed and can't err here + port, _ := strconv.ParseUint(p, 10, 32) // same here + ip := net.ParseIP(h) + + var ta net.Addr = &net.UDPAddr{IP: ip, Port: int(port)} + t := state.Proto() switch { - case opts.forceTCP: // TCP flag has precedence over UDP flag + case opts.forceTCP: t = "tcp" case opts.preferUDP: t = "udp" - default: - t = state.Proto() } if t == "tcp" { - b.SocketProto = tap.SocketProtocol_TCP - } else { - b.SocketProto = tap.SocketProtocol_UDP + ta = &net.TCPAddr{IP: ip, Port: int(port)} } - if tapper.Pack() { - b.Msg(state.Req) - } - m, err := b.ToOutsideQuery(tap.Message_FORWARDER_QUERY) - if err != nil { - return err + msg.SetQueryAddress(q, ta) + + if f.tapPlugin.IncludeRawMessage { + buf, _ := state.Req.Pack() + q.QueryMessage = buf } - tapper.TapMessage(m) + msg.SetType(q, tap.Message_FORWARDER_QUERY) + f.tapPlugin.TapMessage(q) // Response if reply != nil { - if tapper.Pack() { - b.Msg(reply) + r := new(tap.Message) + if f.tapPlugin.IncludeRawMessage { + buf, _ := reply.Pack() + r.ResponseMessage = buf } - m, err := b.Time(time.Now()).ToOutsideResponse(tap.Message_FORWARDER_RESPONSE) - if err != nil { - return err - } - tapper.TapMessage(m) + msg.SetQueryTime(r, start) + msg.SetQueryAddress(r, ta) + msg.SetResponseTime(r, time.Now()) + msg.SetType(r, tap.Message_FORWARDER_RESPONSE) + f.tapPlugin.TapMessage(r) } - - return nil } |