mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-03 18:53:13 -05:00 
			
		
		
		
	
		
			
	
	
		
			62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								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
							 | 
						||
| 
								 | 
							
								}
							 |