aboutsummaryrefslogtreecommitdiff
path: root/plugin/forward/dnstap.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/forward/dnstap.go')
-rw-r--r--plugin/forward/dnstap.go62
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
}