Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
b801bf699f | |||
e34b880a55 |
@ -52,6 +52,8 @@ type Client struct {
|
|||||||
timeNow func() time.Time
|
timeNow func() time.Time
|
||||||
generateXID func() uint32
|
generateXID func() uint32
|
||||||
|
|
||||||
|
timeoutCount int
|
||||||
|
|
||||||
// last DHCPACK packet for renewal/release
|
// last DHCPACK packet for renewal/release
|
||||||
Ack *layers.DHCPv4
|
Ack *layers.DHCPv4
|
||||||
}
|
}
|
||||||
@ -129,7 +131,18 @@ func (c *Client) ObtainOrRenew() bool {
|
|||||||
ack, err := c.dhcpRequest()
|
ack, err := c.dhcpRequest()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errno, ok := err.(syscall.Errno); ok && errno == syscall.EAGAIN {
|
if errno, ok := err.(syscall.Errno); ok && errno == syscall.EAGAIN {
|
||||||
c.err = fmt.Errorf("DHCP: timeout (server(s) unreachable)")
|
var serverip net.IP
|
||||||
|
for _, opt := range c.Ack.Options {
|
||||||
|
if opt.Type == layers.DHCPOptServerID {
|
||||||
|
serverip = opt.Data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.err = fmt.Errorf("DHCP: timeout (server(s) unreachable: %v)", serverip)
|
||||||
|
c.timeoutCount++
|
||||||
|
if c.timeoutCount > 3 {
|
||||||
|
c.timeoutCount = 0
|
||||||
|
c.Ack = nil // start over at DHCPDISCOVER it has failed 3 times
|
||||||
|
}
|
||||||
return true // temporary error
|
return true // temporary error
|
||||||
}
|
}
|
||||||
if err == errNAK {
|
if err == errNAK {
|
||||||
@ -154,6 +167,7 @@ func (c *Client) ObtainOrRenew() bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.cfg.RenewAfter = c.timeNow().Add(lease.RenewalTime)
|
c.cfg.RenewAfter = c.timeNow().Add(lease.RenewalTime)
|
||||||
|
c.timeoutCount = 0
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,15 +546,15 @@ func (s *Server) handleRequest(w dns.ResponseWriter, r *dns.Msg) {
|
|||||||
}
|
}
|
||||||
if len(in.Answer) > 1 {
|
if len(in.Answer) > 1 {
|
||||||
if in.Answer[0].Header().Rrtype == dns.TypeCNAME {
|
if in.Answer[0].Header().Rrtype == dns.TypeCNAME {
|
||||||
for _, rr := range in.Answer {
|
for i, rr := range in.Answer {
|
||||||
if rr != nil && rr.Header() != nil && rr.Header().Rrtype == dns.TypeA {
|
if rr != nil && rr.Header() != nil && rr.Header().Rrtype == dns.TypeA {
|
||||||
if newRR, err := s.resolveSubname("", dns.Question{strings.ToLower(rr.Header().Name), dns.TypeA, dns.ClassINET}); err == nil {
|
newRR, err := s.resolveSubname(string(s.domain), dns.Question{strings.ToLower(rr.Header().Name), dns.TypeA, dns.ClassINET})
|
||||||
in.Answer[len(in.Answer)-1] = newRR
|
if err == nil && newRR != nil {
|
||||||
|
in.Answer[i] = newRR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
w.WriteMsg(in)
|
w.WriteMsg(in)
|
||||||
if idx > 0 {
|
if idx > 0 {
|
||||||
|
Reference in New Issue
Block a user