diff options
author | Hu Jun <hujun.work@gmail.com> | 2020-06-26 20:41:33 -0700 |
---|---|---|
committer | Hu Jun <hujun.work@gmail.com> | 2020-06-26 20:41:33 -0700 |
commit | b418fa564662be29be64d464e045e353500ceb3e (patch) | |
tree | 34e9101aa69ff6a7f21c98b26ecf92743f984a32 /dhcpv4/nclient4/lease.go | |
parent | ec310975369ab43122823425959e6426e229140a (diff) |
- Client.Release() now use existing conn to send packet
- update example_lease_test.go accordingly
- add lease_test.go, which contain some test cases for lease&release, using socketpair
Signed-off-by: Hu Jun <hujun.work@gmail.com>
Diffstat (limited to 'dhcpv4/nclient4/lease.go')
-rw-r--r-- | dhcpv4/nclient4/lease.go | 22 |
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 } |