Add remote address too
This commit is contained in:
parent
d36ee08216
commit
c96d86da1f
|
@ -5,7 +5,6 @@ need to be fixed.
|
||||||
|
|
||||||
* Speed, we can always go faster. A simple reflect server now hits 35/45K qps
|
* Speed, we can always go faster. A simple reflect server now hits 35/45K qps
|
||||||
* go test; only works correct on my machine
|
* go test; only works correct on my machine
|
||||||
|
|
||||||
* privatekey.Precompute() when signing?
|
* privatekey.Precompute() when signing?
|
||||||
|
|
||||||
## Examples to add
|
## Examples to add
|
||||||
|
|
16
client.go
16
client.go
|
@ -220,7 +220,11 @@ func ListenAndQuery(request chan *Request, handler QueryHandler) {
|
||||||
// Write returns the original question and the answer on the
|
// Write returns the original question and the answer on the
|
||||||
// reply channel of the client.
|
// reply channel of the client.
|
||||||
func (w *reply) Write(m *Msg) error {
|
func (w *reply) Write(m *Msg) error {
|
||||||
w.Client().ReplyChan <- &Exchange{Request: w.req, Reply: m, Rtt: w.rtt}
|
if w.conn == nil {
|
||||||
|
w.Client().ReplyChan <- &Exchange{Request: w.req, Reply: m, Rtt: w.rtt}
|
||||||
|
} else {
|
||||||
|
w.Client().ReplyChan <- &Exchange{Request: w.req, Reply: m, Rtt: w.rtt, RemoteAddr: w.conn.RemoteAddr()}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,12 +262,12 @@ func (c *Client) exchangeBuffer(inbuf []byte, a string, outbuf []byte) (n int, w
|
||||||
|
|
||||||
// Exchange performs an synchronous query. It sends the message m to the address
|
// Exchange performs an synchronous query. It sends the message m to the address
|
||||||
// contained in a and waits for an reply.
|
// contained in a and waits for an reply.
|
||||||
func (c *Client) Exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err error) {
|
func (c *Client) Exchange(m *Msg, a string) (r *Msg, rtt time.Duration, addr net.Addr, err error) {
|
||||||
var n int
|
var n int
|
||||||
var w *reply
|
var w *reply
|
||||||
out, ok := m.Pack()
|
out, ok := m.Pack()
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, 0, ErrPack
|
return nil, 0, nil, ErrPack
|
||||||
}
|
}
|
||||||
var in []byte
|
var in []byte
|
||||||
switch c.Net {
|
switch c.Net {
|
||||||
|
@ -279,13 +283,13 @@ func (c *Client) Exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err erro
|
||||||
in = make([]byte, size)
|
in = make([]byte, size)
|
||||||
}
|
}
|
||||||
if n, w, err = c.exchangeBuffer(out, a, in); err != nil {
|
if n, w, err = c.exchangeBuffer(out, a, in); err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, w.conn.RemoteAddr(), err
|
||||||
}
|
}
|
||||||
r = new(Msg)
|
r = new(Msg)
|
||||||
if ok := r.Unpack(in[:n]); !ok {
|
if ok := r.Unpack(in[:n]); !ok {
|
||||||
return nil, w.rtt, ErrUnpack
|
return nil, w.rtt, w.conn.RemoteAddr(), ErrUnpack
|
||||||
}
|
}
|
||||||
return r, w.rtt, nil
|
return r, w.rtt, w.conn.RemoteAddr(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial connects to the address addr for the network set in c.Net
|
// Dial connects to the address addr for the network set in c.Net
|
||||||
|
|
9
dns.go
9
dns.go
|
@ -117,10 +117,11 @@ type RR interface {
|
||||||
|
|
||||||
// Exchange is used in communicating with the resolver.
|
// Exchange is used in communicating with the resolver.
|
||||||
type Exchange struct {
|
type Exchange struct {
|
||||||
Request *Msg // the question sent
|
Request *Msg // the question sent
|
||||||
Reply *Msg // the answer to the question that was sent
|
Reply *Msg // the answer to the question that was sent
|
||||||
Rtt time.Duration // Round trip time
|
Rtt time.Duration // Round trip time
|
||||||
Error error // if something went wrong, this contains the error
|
RemoteAddr net.Addr // Client address
|
||||||
|
Error error // if something went wrong, this contains the error
|
||||||
}
|
}
|
||||||
|
|
||||||
// DNS resource records.
|
// DNS resource records.
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
// Print the MX records of a domain
|
// Print the MX records of a domain
|
||||||
// (c) Miek Gieben - 2011
|
// (c) Miek Gieben - 2011
|
||||||
import (
|
import (
|
||||||
|
@ -22,7 +23,7 @@ func main() {
|
||||||
m.MsgHdr.RecursionDesired = true
|
m.MsgHdr.RecursionDesired = true
|
||||||
|
|
||||||
// Simple sync query, nothing fancy
|
// Simple sync query, nothing fancy
|
||||||
r, _, err := c.Exchange(m, config.Servers[0] + ":" + config.Port)
|
r, _, _, err := c.Exchange(m, config.Servers[0]+":"+config.Port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("%s\n", err.Error())
|
fmt.Printf("%s\n", err.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
10
ex/q/q.go
10
ex/q/q.go
|
@ -36,7 +36,7 @@ func main() {
|
||||||
short := flag.Bool("short", false, "abbreviate long DNSSEC records")
|
short := flag.Bool("short", false, "abbreviate long DNSSEC records")
|
||||||
check := flag.Bool("check", false, "check internal DNSSEC consistency")
|
check := flag.Bool("check", false, "check internal DNSSEC consistency")
|
||||||
anchor := flag.String("anchor", "", "use the DNSKEY in this file for interal DNSSEC consistency")
|
anchor := flag.String("anchor", "", "use the DNSKEY in this file for interal DNSSEC consistency")
|
||||||
tsig := flag.String("tsig", "", "request tsig with key: [hmac:]name:key")
|
tsig := flag.String("tsig", "", "request tsig with key: [hmac:]name:key")
|
||||||
port := flag.Int("port", 53, "port number to use")
|
port := flag.Int("port", 53, "port number to use")
|
||||||
aa := flag.Bool("aa", false, "set AA flag in query")
|
aa := flag.Bool("aa", false, "set AA flag in query")
|
||||||
ad := flag.Bool("ad", false, "set AD flag in query")
|
ad := flag.Bool("ad", false, "set AD flag in query")
|
||||||
|
@ -191,7 +191,7 @@ forever:
|
||||||
}
|
}
|
||||||
if r.Reply.MsgHdr.Truncated && *fallback {
|
if r.Reply.MsgHdr.Truncated && *fallback {
|
||||||
if c.Net != "tcp" {
|
if c.Net != "tcp" {
|
||||||
if ! *dnssec {
|
if !*dnssec {
|
||||||
fmt.Printf(";; Truncated, trying %d bytes bufsize\n", dns.DefaultMsgSize)
|
fmt.Printf(";; Truncated, trying %d bytes bufsize\n", dns.DefaultMsgSize)
|
||||||
o := new(dns.RR_OPT)
|
o := new(dns.RR_OPT)
|
||||||
o.Hdr.Name = "."
|
o.Hdr.Name = "."
|
||||||
|
@ -222,7 +222,7 @@ forever:
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("%v", r.Reply)
|
fmt.Printf("%v", r.Reply)
|
||||||
fmt.Printf("\n;; Query time: %.3d µs\n", r.Rtt/1e3)
|
fmt.Printf("\n;; query time: %.3d µs, server: %s(%s)\n", r.Rtt/1e3, r.RemoteAddr, r.RemoteAddr.Network())
|
||||||
// Server maybe
|
// Server maybe
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
|
@ -270,7 +270,7 @@ func sectionCheck(set []dns.RR, server string, tcp bool) {
|
||||||
where = "disk"
|
where = "disk"
|
||||||
}
|
}
|
||||||
if err := rr.(*dns.RR_RRSIG).Verify(key, rrset); err != nil {
|
if err := rr.(*dns.RR_RRSIG).Verify(key, rrset); err != nil {
|
||||||
fmt.Printf(";- Bogus signature, %s does not validate (DNSKEY %s/%d/%s) [%s]\n",
|
fmt.Printf(";- Bogus signature, %s does not validate (DNSKEY %s/%d/%s) [%s]\n",
|
||||||
shortSig(rr.(*dns.RR_RRSIG)), key.Header().Name, key.KeyTag(), where, err.Error())
|
shortSig(rr.(*dns.RR_RRSIG)), key.Header().Name, key.KeyTag(), where, err.Error())
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf(";+ Secure signature, %s validates (DNSKEY %s/%d/%s)\n", shortSig(rr.(*dns.RR_RRSIG)), key.Header().Name, key.KeyTag(), where)
|
fmt.Printf(";+ Secure signature, %s validates (DNSKEY %s/%d/%s)\n", shortSig(rr.(*dns.RR_RRSIG)), key.Header().Name, key.KeyTag(), where)
|
||||||
|
@ -341,7 +341,7 @@ func getKey(name string, keytag uint16, server string, tcp bool) *dns.RR_DNSKEY
|
||||||
m := new(dns.Msg)
|
m := new(dns.Msg)
|
||||||
m.SetQuestion(name, dns.TypeDNSKEY)
|
m.SetQuestion(name, dns.TypeDNSKEY)
|
||||||
m.SetEdns0(4096, true)
|
m.SetEdns0(4096, true)
|
||||||
r, _, err := c.Exchange(m, server)
|
r, _, _, err := c.Exchange(m, server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
20
xfr.go
20
xfr.go
|
@ -33,16 +33,16 @@ func (w *reply) axfrReceive() {
|
||||||
for {
|
for {
|
||||||
in, err := w.Receive()
|
in, err := w.Receive()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, err}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), err}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if w.req.Id != in.Id {
|
if w.req.Id != in.Id {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, ErrId}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), ErrId}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if first {
|
if first {
|
||||||
if !checkXfrSOA(in, true) {
|
if !checkXfrSOA(in, true) {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, ErrXfrSoa}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), ErrXfrSoa}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
first = !first
|
first = !first
|
||||||
|
@ -51,10 +51,10 @@ func (w *reply) axfrReceive() {
|
||||||
if !first {
|
if !first {
|
||||||
w.tsigTimersOnly = true // Subsequent envelopes use this.
|
w.tsigTimersOnly = true // Subsequent envelopes use this.
|
||||||
if checkXfrSOA(in, false) {
|
if checkXfrSOA(in, false) {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, ErrXfrLast}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), ErrXfrLast}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.Client().ReplyChan <- &Exchange{Request: w.req, Reply: in}
|
w.Client().ReplyChan <- &Exchange{Request: w.req, Reply: in, Rtt: w.rtt, RemoteAddr: w.conn.RemoteAddr(), Error: nil}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
panic("not reached")
|
panic("not reached")
|
||||||
|
@ -68,24 +68,24 @@ func (w *reply) ixfrReceive() {
|
||||||
for {
|
for {
|
||||||
in, err := w.Receive()
|
in, err := w.Receive()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, err}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), err}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if w.req.Id != in.Id {
|
if w.req.Id != in.Id {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, ErrId}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), ErrId}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if first {
|
if first {
|
||||||
// A single SOA RR signals "no changes"
|
// A single SOA RR signals "no changes"
|
||||||
if len(in.Answer) == 1 && checkXfrSOA(in, true) {
|
if len(in.Answer) == 1 && checkXfrSOA(in, true) {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, ErrXfrLast}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), ErrXfrLast}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the returned answer is ok
|
// Check if the returned answer is ok
|
||||||
if !checkXfrSOA(in, true) {
|
if !checkXfrSOA(in, true) {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, ErrXfrSoa}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), ErrXfrSoa}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// This serial is important
|
// This serial is important
|
||||||
|
@ -99,7 +99,7 @@ func (w *reply) ixfrReceive() {
|
||||||
// If the last record in the IXFR contains the servers' SOA, we should quit
|
// If the last record in the IXFR contains the servers' SOA, we should quit
|
||||||
if v, ok := in.Answer[len(in.Answer)-1].(*RR_SOA); ok {
|
if v, ok := in.Answer[len(in.Answer)-1].(*RR_SOA); ok {
|
||||||
if v.Serial == serial {
|
if v.Serial == serial {
|
||||||
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, ErrXfrLast}
|
w.Client().ReplyChan <- &Exchange{w.req, in, w.rtt, w.conn.RemoteAddr(), ErrXfrLast}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue