aboutsummaryrefslogtreecommitdiff
path: root/plugin/dnstap/msg/msg.go
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2020-10-12 19:10:35 +0200
committerGravatar GitHub <noreply@github.com> 2020-10-12 19:10:35 +0200
commitb3b8a7e4b7d5a6f18b10b0abba9ec9f84049fa3e (patch)
treeca31deecb7848046a75724ae0979089ed5aa6904 /plugin/dnstap/msg/msg.go
parent02f247482416bd257ae4d972b148e57e7e608972 (diff)
downloadcoredns-b3b8a7e4b7d5a6f18b10b0abba9ec9f84049fa3e.tar.gz
coredns-b3b8a7e4b7d5a6f18b10b0abba9ec9f84049fa3e.tar.zst
coredns-b3b8a7e4b7d5a6f18b10b0abba9ec9f84049fa3e.zip
plugin/dnstap: various cleanups (#4179)
* plugin/dnstap: various cleanups A recent issue made me look into this plugin, I suspect various other cleanups (hopefully deletion of code) can be made as well Remove identical functions ToClientQuery etc, and just use tap.Message as the base type in plugin. Keep msg/ for a few helper functions that may proof useful. This remove the whole test directory as we will just check the things we are interested in which gives much better feedback and keeps that code closer together. tapwr dir is also not needed, writer_test.go was just duplicating the tests already done. This moves writer.go to the top directory. Make the only user of dnstap, the forward plugin, use the newer code also remove the test, a better test there would be a full e2e test to see the correct thing happens. Cleanup the Tapper interface and move it to dnstapio where it belongs, remove higher level interfaces that are not used. This remove dnstap.Tapper and dnstap.IORoutines. Use the standard mechanism for getting access to a plugin and remove shuffling the plugin into the context. Signed-off-by: Miek Gieben <miek@miek.nl> * use opts to get the correct proto Signed-off-by: Miek Gieben <miek@miek.nl> * Various fixes Signed-off-by: Miek Gieben <miek@miek.nl> * Remove bad addr test, as dnstap is only called from within coredns where these fields have been preparsed Signed-off-by: Miek Gieben <miek@miek.nl> * dnstap: remove saving the error all these fields have been preparsed, no need for dnstap to be pedantic and check (and save!) this error again. Simplifies it a bit more. Signed-off-by: Miek Gieben <miek@miek.nl> * Update plugin/forward/dnstap.go Co-authored-by: Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com> * Code review Signed-off-by: Miek Gieben <miek@miek.nl> * add back in preferUDP Signed-off-by: Miek Gieben <miek@miek.nl> * nit Signed-off-by: Miek Gieben <miek@miek.nl> Co-authored-by: Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com>
Diffstat (limited to 'plugin/dnstap/msg/msg.go')
-rw-r--r--plugin/dnstap/msg/msg.go200
1 files changed, 69 insertions, 131 deletions
diff --git a/plugin/dnstap/msg/msg.go b/plugin/dnstap/msg/msg.go
index d96fc6c9a..f9d84c45a 100644
--- a/plugin/dnstap/msg/msg.go
+++ b/plugin/dnstap/msg/msg.go
@@ -1,159 +1,97 @@
package msg
import (
- "errors"
+ "fmt"
"net"
- "strconv"
"time"
tap "github.com/dnstap/golang-dnstap"
- "github.com/miekg/dns"
)
-// Builder helps to build a Dnstap message.
-type Builder struct {
- Packed []byte
- SocketProto tap.SocketProtocol
- SocketFam tap.SocketFamily
- Address net.IP
- Port uint32
- TimeSec uint64
- TimeNsec uint32
-
- err error
-}
+var (
+ protoUDP = tap.SocketProtocol_UDP
+ protoTCP = tap.SocketProtocol_TCP
+ familyINET = tap.SocketFamily_INET
+ familyINET6 = tap.SocketFamily_INET6
+)
-// New returns a new Builder
-func New() *Builder {
- return &Builder{}
-}
+// SetQueryAddress adds the query address to the message. This also sets the SocketFamily and SocketProtocol.
+func SetQueryAddress(t *tap.Message, addr net.Addr) error {
+ t.SocketFamily = &familyINET
+ switch a := addr.(type) {
+ case *net.TCPAddr:
+ t.SocketProtocol = &protoTCP
+ t.QueryAddress = a.IP
-// Addr adds the remote address to the message.
-func (b *Builder) Addr(remote net.Addr) *Builder {
- if b.err != nil {
- return b
- }
+ p := uint32(a.Port)
+ t.QueryPort = &p
- switch addr := remote.(type) {
- case *net.TCPAddr:
- b.Address = addr.IP
- b.Port = uint32(addr.Port)
- b.SocketProto = tap.SocketProtocol_TCP
+ if a.IP.To4() == nil {
+ t.SocketFamily = &familyINET6
+ }
+ return nil
case *net.UDPAddr:
- b.Address = addr.IP
- b.Port = uint32(addr.Port)
- b.SocketProto = tap.SocketProtocol_UDP
- default:
- b.err = errors.New("unknown remote address type")
- return b
- }
+ t.SocketProtocol = &protoUDP
+ t.QueryAddress = a.IP
+
+ p := uint32(a.Port)
+ t.QueryPort = &p
- if b.Address.To4() != nil {
- b.SocketFam = tap.SocketFamily_INET
- } else {
- b.SocketFam = tap.SocketFamily_INET6
+ if a.IP.To4() == nil {
+ t.SocketFamily = &familyINET6
+ }
+ return nil
+ default:
+ return fmt.Errorf("unknown address type: %T", a)
}
- return b
}
-// Msg adds the raw DNS message to the dnstap message.
-func (b *Builder) Msg(m *dns.Msg) *Builder {
- if b.err != nil {
- return b
- }
+// SetResponseAddress the response address to the message. This also sets the SocketFamily and SocketProtocol.
+func SetResponseAddress(t *tap.Message, addr net.Addr) error {
+ t.SocketFamily = &familyINET
+ switch a := addr.(type) {
+ case *net.TCPAddr:
+ t.SocketProtocol = &protoTCP
+ t.ResponseAddress = a.IP
- b.Packed, b.err = m.Pack()
- return b
-}
+ p := uint32(a.Port)
+ t.ResponsePort = &p
-// HostPort adds the remote address as encoded by dnsutil.ParseHostPortOrFile to the message.
-func (b *Builder) HostPort(addr string) *Builder {
- ip, port, err := net.SplitHostPort(addr)
- if err != nil {
- b.err = err
- return b
- }
- p, err := strconv.ParseUint(port, 10, 32)
- if err != nil {
- b.err = err
- return b
- }
- b.Port = uint32(p)
-
- if ip := net.ParseIP(ip); ip != nil {
- b.Address = []byte(ip)
- if ip := ip.To4(); ip != nil {
- b.SocketFam = tap.SocketFamily_INET
- } else {
- b.SocketFam = tap.SocketFamily_INET6
+ if a.IP.To4() == nil {
+ t.SocketFamily = &familyINET6
}
- return b
- }
- b.err = errors.New("not an ip address")
- return b
-}
+ return nil
+ case *net.UDPAddr:
+ t.SocketProtocol = &protoUDP
+ t.ResponseAddress = a.IP
-// Time adds the timestamp to the message.
-func (b *Builder) Time(ts time.Time) *Builder {
- b.TimeSec = uint64(ts.Unix())
- b.TimeNsec = uint32(ts.Nanosecond())
- return b
-}
+ p := uint32(a.Port)
+ t.ResponsePort = &p
-// ToClientResponse transforms Data into a client response message.
-func (b *Builder) ToClientResponse() (*tap.Message, error) {
- t := tap.Message_CLIENT_RESPONSE
- return &tap.Message{
- Type: &t,
- SocketFamily: &b.SocketFam,
- SocketProtocol: &b.SocketProto,
- ResponseTimeSec: &b.TimeSec,
- ResponseTimeNsec: &b.TimeNsec,
- ResponseMessage: b.Packed,
- QueryAddress: b.Address,
- QueryPort: &b.Port,
- }, b.err
+ if a.IP.To4() == nil {
+ t.SocketFamily = &familyINET6
+ }
+ return nil
+ default:
+ return fmt.Errorf("unknown address type: %T", a)
+ }
}
-// ToClientQuery transforms Data into a client query message.
-func (b *Builder) ToClientQuery() (*tap.Message, error) {
- t := tap.Message_CLIENT_QUERY
- return &tap.Message{
- Type: &t,
- SocketFamily: &b.SocketFam,
- SocketProtocol: &b.SocketProto,
- QueryTimeSec: &b.TimeSec,
- QueryTimeNsec: &b.TimeNsec,
- QueryMessage: b.Packed,
- QueryAddress: b.Address,
- QueryPort: &b.Port,
- }, b.err
+// SetQueryTime sets the time of the query in t.
+func SetQueryTime(t *tap.Message, ti time.Time) {
+ qts := uint64(ti.Unix())
+ qtn := uint32(ti.Nanosecond())
+ t.QueryTimeSec = &qts
+ t.QueryTimeNsec = &qtn
}
-// ToOutsideQuery transforms the data into a forwarder or resolver query message.
-func (b *Builder) ToOutsideQuery(t tap.Message_Type) (*tap.Message, error) {
- return &tap.Message{
- Type: &t,
- SocketFamily: &b.SocketFam,
- SocketProtocol: &b.SocketProto,
- QueryTimeSec: &b.TimeSec,
- QueryTimeNsec: &b.TimeNsec,
- QueryMessage: b.Packed,
- ResponseAddress: b.Address,
- ResponsePort: &b.Port,
- }, b.err
+// SetResponseTime sets the time of the response in t.
+func SetResponseTime(t *tap.Message, ti time.Time) {
+ rts := uint64(ti.Unix())
+ rtn := uint32(ti.Nanosecond())
+ t.ResponseTimeSec = &rts
+ t.ResponseTimeNsec = &rtn
}
-// ToOutsideResponse transforms the data into a forwarder or resolver response message.
-func (b *Builder) ToOutsideResponse(t tap.Message_Type) (*tap.Message, error) {
- return &tap.Message{
- Type: &t,
- SocketFamily: &b.SocketFam,
- SocketProtocol: &b.SocketProto,
- ResponseTimeSec: &b.TimeSec,
- ResponseTimeNsec: &b.TimeNsec,
- ResponseMessage: b.Packed,
- ResponseAddress: b.Address,
- ResponsePort: &b.Port,
- }, b.err
-}
+// SetType sets the type in t.
+func SetType(t *tap.Message, typ tap.Message_Type) { t.Type = &typ }