summaryrefslogtreecommitdiffhomepage
path: root/dhcpv4/nclient4/lease.go
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpv4/nclient4/lease.go')
-rw-r--r--dhcpv4/nclient4/lease.go22
1 files changed, 9 insertions, 13 deletions
diff --git a/dhcpv4/nclient4/lease.go b/dhcpv4/nclient4/lease.go
index 83c59e6..9f9d67d 100644
--- a/dhcpv4/nclient4/lease.go
+++ b/dhcpv4/nclient4/lease.go
@@ -29,7 +29,8 @@ func WithClientIDOptions(cidl dhcpv4.OptionCodeList) ClientOpt {
//Release send DHCPv4 release messsage to server, based on specified lease.
//release is sent as unicast per RFC2131, section 4.4.4.
-//This function requires assigned address has been added on the binding interface.
+//Note: some DHCP server requries of using assigned IP address as source IP,
+//use nclient4.WithUnicast to create client for such case.
func (c *Client) Release(lease *Lease) error {
if lease == nil {
return fmt.Errorf("lease is nil")
@@ -45,21 +46,16 @@ func (c *Client) Release(lease *Lease) error {
req.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeRelease))
req.ClientHWAddr = lease.ACK.ClientHWAddr
req.ClientIPAddr = lease.ACK.YourIPAddr
- req.UpdateOption(dhcpv4.OptServerIdentifier(lease.ACK.ServerIPAddr))
+ req.UpdateOption(dhcpv4.OptGeneric(dhcpv4.OptionServerIdentifier, lease.ACK.Options.Get(dhcpv4.OptionServerIdentifier)))
req.SetUnicast()
- luaddr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%v:%v", lease.ACK.YourIPAddr, 68))
if err != nil {
return err
}
-
- uniconn, err := net.DialUDP("udp4", luaddr, &net.UDPAddr{IP: lease.ACK.ServerIPAddr, Port: 67})
- if err != nil {
- return err
- }
- _, err = uniconn.Write(req.ToBytes())
- if err != nil {
- return err
+ timeout := time.Now().Add(3 * time.Second)
+ c.conn.SetWriteDeadline(timeout)
+ _, err = c.conn.WriteTo(req.ToBytes(), &net.UDPAddr{IP: lease.ACK.Options.Get(dhcpv4.OptionServerIdentifier), Port: 67})
+ if err == nil {
+ c.logger.PrintMessage("sent message:", req)
}
- c.logger.PrintMessage("sent message:", req)
- return nil
+ return err
}