mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-12-21 22:34:27 +03:00
8bb1aad739
Merge in DNS/adguard-home from 4923-gopacket-dhcp-vol.4 to master
Updates #4923.
Squashed commit of the following:
commit 4b87258c70ac98b2abb1ac95f7e916e244b3cd08
Merge: 61458864f 9b91a8740
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Nov 16 14:05:34 2023 +0300
Merge branch 'master' into 4923-gopacket-dhcp-vol.4
commit 61458864f3df7a027e65060a5f0fb516cc7911a7
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Nov 15 18:48:40 2023 +0300
all: imp code
commit 506a0ab81e76beebb900f86580577563b471e4e2
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Nov 14 15:59:56 2023 +0300
all: cleanup moving lease
commit 8d218b732662ac4308ed09d28c1bf9f65906d47c
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Mon Nov 13 18:13:39 2023 +0300
all: rm old leases type
100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
package dhcpsvc
|
|
|
|
import (
|
|
"fmt"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"golang.org/x/exp/maps"
|
|
"golang.org/x/exp/slices"
|
|
)
|
|
|
|
// DHCPServer is a DHCP server for both IPv4 and IPv6 address families.
|
|
type DHCPServer struct {
|
|
// enabled indicates whether the DHCP server is enabled and can provide
|
|
// information about its clients.
|
|
enabled *atomic.Bool
|
|
|
|
// localTLD is the top-level domain name to use for resolving DHCP
|
|
// clients' hostnames.
|
|
localTLD string
|
|
|
|
// interfaces4 is the set of IPv4 interfaces sorted by interface name.
|
|
interfaces4 []*iface4
|
|
|
|
// interfaces6 is the set of IPv6 interfaces sorted by interface name.
|
|
interfaces6 []*iface6
|
|
|
|
// leases is the set of active DHCP leases.
|
|
leases []*Lease
|
|
|
|
// icmpTimeout is the timeout for checking another DHCP server's presence.
|
|
icmpTimeout time.Duration
|
|
}
|
|
|
|
// New creates a new DHCP server with the given configuration. It returns an
|
|
// error if the given configuration can't be used.
|
|
//
|
|
// TODO(e.burkov): Use.
|
|
func New(conf *Config) (srv *DHCPServer, err error) {
|
|
if !conf.Enabled {
|
|
// TODO(e.burkov): Perhaps return [Empty]?
|
|
return nil, nil
|
|
}
|
|
|
|
ifaces4 := make([]*iface4, len(conf.Interfaces))
|
|
ifaces6 := make([]*iface6, len(conf.Interfaces))
|
|
|
|
ifaceNames := maps.Keys(conf.Interfaces)
|
|
slices.Sort(ifaceNames)
|
|
|
|
var i4 *iface4
|
|
var i6 *iface6
|
|
|
|
for _, ifaceName := range ifaceNames {
|
|
iface := conf.Interfaces[ifaceName]
|
|
|
|
i4, err = newIface4(ifaceName, iface.IPv4)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("interface %q: ipv4: %w", ifaceName, err)
|
|
} else if i4 != nil {
|
|
ifaces4 = append(ifaces4, i4)
|
|
}
|
|
|
|
i6 = newIface6(ifaceName, iface.IPv6)
|
|
if i6 != nil {
|
|
ifaces6 = append(ifaces6, i6)
|
|
}
|
|
}
|
|
|
|
enabled := &atomic.Bool{}
|
|
enabled.Store(conf.Enabled)
|
|
|
|
return &DHCPServer{
|
|
enabled: enabled,
|
|
interfaces4: ifaces4,
|
|
interfaces6: ifaces6,
|
|
localTLD: conf.LocalDomainName,
|
|
icmpTimeout: conf.ICMPTimeout,
|
|
}, nil
|
|
}
|
|
|
|
// type check
|
|
//
|
|
// TODO(e.burkov): Uncomment when the [Interface] interface is implemented.
|
|
// var _ Interface = (*DHCPServer)(nil)
|
|
|
|
// Enabled implements the [Interface] interface for *DHCPServer.
|
|
func (srv *DHCPServer) Enabled() (ok bool) {
|
|
return srv.enabled.Load()
|
|
}
|
|
|
|
// Leases implements the [Interface] interface for *DHCPServer.
|
|
func (srv *DHCPServer) Leases() (leases []*Lease) {
|
|
leases = make([]*Lease, 0, len(srv.leases))
|
|
for _, lease := range srv.leases {
|
|
leases = append(leases, lease.Clone())
|
|
}
|
|
|
|
return leases
|
|
}
|