2 Commits

Author SHA1 Message Date
b801bf699f Re-Add DHCP discover fallback for ISPs that don't advertise DHCP 2021-05-23 19:38:38 -07:00
e34b880a55 Final fix
Add the domain as it is needed (multiple domains on a home net is niche)
Only replace the record if a local one was found
Use proper slice updating
2021-05-23 19:34:59 -07:00
2 changed files with 19 additions and 5 deletions

View File

@ -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
} }

View File

@ -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 {