dhcp4: drop last ack to restart with DISCOVER upon receiving NAK
fixes #13
This commit is contained in:
parent
725262d376
commit
ddcdd39737
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user