dhcp: send DHCPRELEASE with the client IP addr as ciaddr (#1279)

The dhcp IPAM plugin sends DHCPRELEASE packets with 0.0.0.0 as the IP source
address instead of the client's assigned IP.

This violates RFC 2131 section 4.4.4 and causes DHCP servers (e.g. dnsmasq) to
silently ignore the release. Leases are never freed — they only expire via
timeout.

By using the `nclient4.WithUnicast()` option, the client will stop using
a raw packet socket which constructs IP headers with 0.0.0.0 as the source.

Using src IP 0.0.0.0 is appropriate for DHCPDISCOVER (no address assigned yet)
but wrong for DHCPRELEASE.

Signed-off-by: Miguel Duarte Barroso <mdbarroso@redhat.com>
diff --git a/plugins/ipam/dhcp/lease.go b/plugins/ipam/dhcp/lease.go
index 302f95d..413ed37 100644
--- a/plugins/ipam/dhcp/lease.go
+++ b/plugins/ipam/dhcp/lease.go
@@ -428,7 +428,14 @@
 func (l *DHCPLease) release() error {
 	log.Printf("%v: releasing lease", l.clientID)
 
-	c, err := newDHCPClient(l.link, l.timeout)
+	c, err := newDHCPClient(
+		l.link,
+		l.timeout,
+		nclient4.WithUnicast(&net.UDPAddr{
+			IP:   l.latestLease.ACK.YourIPAddr,
+			Port: nclient4.ClientPort,
+		}),
+	)
 	if err != nil {
 		return err
 	}