2024-01-31 14:50:27 +03:00
|
|
|
package dhcpsvc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2024-02-08 20:39:18 +03:00
|
|
|
"slices"
|
2024-01-31 14:50:27 +03:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// netInterface is a common part of any network interface within the DHCP
|
|
|
|
// server.
|
|
|
|
//
|
|
|
|
// TODO(e.burkov): Add other methods as [DHCPServer] evolves.
|
|
|
|
type netInterface struct {
|
|
|
|
// name is the name of the network interface.
|
|
|
|
name string
|
|
|
|
|
|
|
|
// leases is a set of leases sorted by hardware address.
|
|
|
|
leases []*Lease
|
|
|
|
|
|
|
|
// leaseTTL is the default Time-To-Live value for leases.
|
|
|
|
leaseTTL time.Duration
|
|
|
|
}
|
|
|
|
|
|
|
|
// reset clears all the slices in iface for reuse.
|
|
|
|
func (iface *netInterface) reset() {
|
|
|
|
iface.leases = iface.leases[:0]
|
|
|
|
}
|
|
|
|
|
|
|
|
// insertLease inserts the given lease into iface. It returns an error if the
|
|
|
|
// lease can't be inserted.
|
|
|
|
func (iface *netInterface) insertLease(l *Lease) (err error) {
|
|
|
|
i, found := slices.BinarySearchFunc(iface.leases, l, compareLeaseMAC)
|
|
|
|
if found {
|
|
|
|
return fmt.Errorf("lease for mac %s already exists", l.HWAddr)
|
|
|
|
}
|
|
|
|
|
|
|
|
iface.leases = slices.Insert(iface.leases, i, l)
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|