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 ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"net" "net"
"sync" "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. // ObtainOrRenew returns false when encountering a permanent error.
func (c *Client) ObtainOrRenew() bool { func (c *Client) ObtainOrRenew() bool {
var onceErr error var onceErr error
@ -125,6 +128,9 @@ func (c *Client) ObtainOrRenew() bool {
c.err = fmt.Errorf("DHCP: timeout (server(s) unreachable)") c.err = fmt.Errorf("DHCP: timeout (server(s) unreachable)")
return true // temporary error return true // temporary error
} }
if err == errNAK {
c.Ack = nil // start over at DHCPDISCOVER
}
c.err = fmt.Errorf("DHCP: %v", err) c.err = fmt.Errorf("DHCP: %v", err)
return true // temporary error return true // temporary error
} }
@ -237,6 +243,9 @@ func (c *Client) dhcpRequest() (*layers.DHCPv4, error) {
continue // broadcast reply for different DHCP transaction continue // broadcast reply for different DHCP transaction
} }
if !dhcp4.HasMessageType(ack.Options, layers.DHCPMsgTypeAck) { if !dhcp4.HasMessageType(ack.Options, layers.DHCPMsgTypeAck) {
if dhcp4.HasMessageType(ack.Options, layers.DHCPMsgTypeNak) {
return nil, errNAK
}
continue continue
} }
return ack, nil return ack, nil