| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | package proxy | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-04-22 08:34:35 +01:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/dnstap" | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	"github.com/coredns/coredns/plugin/dnstap/msg" | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	"github.com/coredns/coredns/request" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tap "github.com/dnstap/golang-dnstap" | 
					
						
							|  |  |  | 	"github.com/miekg/dns" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func toDnstap(ctx context.Context, host string, ex Exchanger, state request.Request, reply *dns.Msg, start time.Time) error { | 
					
						
							|  |  |  | 	tapper := dnstap.TapperFromContext(ctx) | 
					
						
							|  |  |  | 	if tapper == nil { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Query | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	b := msg.New().Time(start).HostPort(host) | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	t := ex.Transport() | 
					
						
							|  |  |  | 	if t == "" { | 
					
						
							|  |  |  | 		t = state.Proto() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if t == "tcp" { | 
					
						
							|  |  |  | 		b.SocketProto = tap.SocketProtocol_TCP | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		b.SocketProto = tap.SocketProtocol_UDP | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	if tapper.Pack() { | 
					
						
							|  |  |  | 		b.Msg(state.Req) | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	m, err := b.ToOutsideQuery(tap.Message_FORWARDER_QUERY) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	tapper.TapMessage(m) | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Response | 
					
						
							|  |  |  | 	if reply != nil { | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 		if tapper.Pack() { | 
					
						
							|  |  |  | 			b.Msg(reply) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		m, err := b.Time(time.Now()).ToOutsideResponse(tap.Message_FORWARDER_RESPONSE) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 		tapper.TapMessage(m) | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } |