Updates #4923.
Squashed commit of the following:
commit 0bfccf8bc1e63c4f5a01ce7f268e767969b368a0
Merge: 305f9fe2f 0e5e8e4dd
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Jul 3 15:12:43 2024 +0300
Merge branch 'master' into 4923-gopacket-dhcp-vol.8
commit 305f9fe2fec033f28385dfe2bbee6a27a83b9702
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Jul 2 17:03:01 2024 +0300
dhcpsvc: adjust interface
commit f05b9f42e2f50325ddaf09b5fed84b62e48c5120
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Jul 2 16:59:39 2024 +0300
dhcpsvc: use logger
commit 4779f945baf9c8722d07d589928a86290a37d3ab
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Jul 2 14:59:22 2024 +0300
dhcpsvc: add todo
commit ae1713e5f717a66863eb0289e3aa66c7069ac8bf
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Mon Jul 1 15:49:22 2024 +0300
dhcpsvc: use slog
71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
package dhcpsvc
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"slices"
|
|
"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 {
|
|
// logger logs the events related to the network interface.
|
|
logger *slog.Logger
|
|
|
|
// 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
|
|
}
|
|
|
|
// updateLease replaces an existing lease within iface with the given one. It
|
|
// returns an error if there is no lease with such hardware address.
|
|
func (iface *netInterface) updateLease(l *Lease) (prev *Lease, err error) {
|
|
i, found := slices.BinarySearchFunc(iface.leases, l, compareLeaseMAC)
|
|
if !found {
|
|
return nil, fmt.Errorf("no lease for mac %s", l.HWAddr)
|
|
}
|
|
|
|
prev, iface.leases[i] = iface.leases[i], l
|
|
|
|
return prev, nil
|
|
}
|
|
|
|
// removeLease removes an existing lease from iface. It returns an error if
|
|
// there is no lease equal to l.
|
|
func (iface *netInterface) removeLease(l *Lease) (err error) {
|
|
i, found := slices.BinarySearchFunc(iface.leases, l, compareLeaseMAC)
|
|
if !found {
|
|
return fmt.Errorf("no lease for mac %s", l.HWAddr)
|
|
}
|
|
|
|
iface.leases = slices.Delete(iface.leases, i, i+1)
|
|
|
|
return nil
|
|
}
|