* Doc: add package docs Add short package level docs to make godoc looks nicer. Add some badges to the README. * correct url
46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
// Package edns provides function usefull for adding/inspecting OPT records to/in messages.
|
|
package edns
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
// Version checks the EDNS version in the request. If error
|
|
// is nil everything is OK and we can invoke the middleware. If non-nil, the
|
|
// returned Msg is valid to be returned to the client (and should). For some
|
|
// reason this response should not contain a question RR in the question section.
|
|
func Version(req *dns.Msg) (*dns.Msg, error) {
|
|
opt := req.IsEdns0()
|
|
if opt == nil {
|
|
return nil, nil
|
|
}
|
|
if opt.Version() == 0 {
|
|
return nil, nil
|
|
}
|
|
m := new(dns.Msg)
|
|
m.SetReply(req)
|
|
// zero out question section, wtf.
|
|
m.Question = nil
|
|
|
|
o := new(dns.OPT)
|
|
o.Hdr.Name = "."
|
|
o.Hdr.Rrtype = dns.TypeOPT
|
|
o.SetVersion(0)
|
|
o.SetExtendedRcode(dns.RcodeBadVers)
|
|
m.Extra = []dns.RR{o}
|
|
|
|
return m, errors.New("EDNS0 BADVERS")
|
|
}
|
|
|
|
// Size returns a normalized size based on proto.
|
|
func Size(proto string, size int) int {
|
|
if proto == "tcp" {
|
|
return dns.MaxMsgSize
|
|
}
|
|
if size < dns.MinMsgSize {
|
|
return dns.MinMsgSize
|
|
}
|
|
return size
|
|
}
|