diff options
Diffstat (limited to 'plugin/forward/dnstap.go')
-rw-r--r-- | plugin/forward/dnstap.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/plugin/forward/dnstap.go b/plugin/forward/dnstap.go new file mode 100644 index 000000000..7866aa39b --- /dev/null +++ b/plugin/forward/dnstap.go @@ -0,0 +1,61 @@ +package forward + +import ( + "context" + "time" + + "github.com/coredns/coredns/plugin/dnstap" + "github.com/coredns/coredns/plugin/dnstap/msg" + "github.com/coredns/coredns/request" + + tap "github.com/dnstap/golang-dnstap" + "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 + } + // Query + b := msg.New().Time(start).HostPort(host) + opts := f.opts + t := "" + switch { + case opts.forceTCP: // TCP flag has precedence over UDP flag + 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 + } + + if tapper.Pack() { + b.Msg(state.Req) + } + m, err := b.ToOutsideQuery(tap.Message_FORWARDER_QUERY) + if err != nil { + return err + } + tapper.TapMessage(m) + + // Response + if reply != nil { + if tapper.Pack() { + b.Msg(reply) + } + m, err := b.Time(time.Now()).ToOutsideResponse(tap.Message_FORWARDER_RESPONSE) + if err != nil { + return err + } + tapper.TapMessage(m) + } + + return nil +} |