Fallback to DHCPDISCOVER after 4 failed timeouts

This commit is contained in:
lordwelch 2020-09-01 22:16:14 -07:00
parent 1789f1e94c
commit 68105841c6

View File

@ -51,6 +51,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
} }
@ -130,9 +132,11 @@ func (c *Client) ObtainOrRenew() bool {
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)") c.err = fmt.Errorf("DHCP: timeout (server(s) unreachable)")
c.timeoutCount++
return true // temporary error return true // temporary error
} }
if err == errNAK { if err == errNAK || c.timeoutCount > 3 {
c.timeoutCount = 0
c.Ack = nil // start over at DHCPDISCOVER c.Ack = nil // start over at DHCPDISCOVER
} }
c.err = fmt.Errorf("DHCP: %v", err) c.err = fmt.Errorf("DHCP: %v", err)