dhcp4: drop last ack to restart with DISCOVER upon receiving NAK

fixes #13
This commit is contained in:
Michael Stapelberg 2018-12-25 14:09:45 +01:00
parent 725262d376
commit ddcdd39737

View File

@ -17,6 +17,7 @@ package dhcp4
import (
"bytes"
"errors"
"fmt"
"net"
"sync"
@ -78,6 +79,8 @@ func (c *Client) packet(xid uint32, opts []layers.DHCPOption) *layers.DHCPv4 {
}
}
var errNAK = errors.New("received DHCPNAK")
// ObtainOrRenew returns false when encountering a permanent error.
func (c *Client) ObtainOrRenew() bool {
var onceErr error
@ -125,6 +128,9 @@ func (c *Client) ObtainOrRenew() bool {
c.err = fmt.Errorf("DHCP: timeout (server(s) unreachable)")
return true // temporary error
}
if err == errNAK {
c.Ack = nil // start over at DHCPDISCOVER
}
c.err = fmt.Errorf("DHCP: %v", err)
return true // temporary error
}
@ -237,6 +243,9 @@ func (c *Client) dhcpRequest() (*layers.DHCPv4, error) {
continue // broadcast reply for different DHCP transaction
}
if !dhcp4.HasMessageType(ack.Options, layers.DHCPMsgTypeAck) {
if dhcp4.HasMessageType(ack.Options, layers.DHCPMsgTypeNak) {
return nil, errNAK
}
continue
}
return ack, nil