2024-01-31 14:50:27 +03:00
|
|
|
package dhcpsvc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"net"
|
|
|
|
"net/netip"
|
2024-02-08 20:39:18 +03:00
|
|
|
"slices"
|
2024-01-31 14:50:27 +03:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Lease is a DHCP lease.
|
|
|
|
//
|
|
|
|
// TODO(e.burkov): Consider moving it to [agh], since it also may be needed in
|
|
|
|
// [websvc].
|
|
|
|
//
|
|
|
|
// TODO(e.burkov): Add validation method.
|
|
|
|
type Lease struct {
|
|
|
|
// IP is the IP address leased to the client.
|
|
|
|
IP netip.Addr
|
|
|
|
|
|
|
|
// Expiry is the expiration time of the lease.
|
|
|
|
Expiry time.Time
|
|
|
|
|
|
|
|
// Hostname of the client.
|
|
|
|
Hostname string
|
|
|
|
|
|
|
|
// HWAddr is the physical hardware address (MAC address).
|
|
|
|
HWAddr net.HardwareAddr
|
|
|
|
|
|
|
|
// IsStatic defines if the lease is static.
|
|
|
|
IsStatic bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// Clone returns a deep copy of l.
|
|
|
|
func (l *Lease) Clone() (clone *Lease) {
|
|
|
|
if l == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return &Lease{
|
|
|
|
Expiry: l.Expiry,
|
|
|
|
Hostname: l.Hostname,
|
|
|
|
HWAddr: slices.Clone(l.HWAddr),
|
|
|
|
IP: l.IP,
|
|
|
|
IsStatic: l.IsStatic,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// compareLeaseMAC compares two [Lease]s by hardware address.
|
|
|
|
func compareLeaseMAC(a, b *Lease) (res int) {
|
|
|
|
return bytes.Compare(a.HWAddr, b.HWAddr)
|
|
|
|
}
|