mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-11-22 13:05:36 +03:00
39aeaf8910
Merge in DNS/adguard-home from 4923-gopacket-dhcp-vol.3 to master
Updates #4923.
Squashed commit of the following:
commit 1a09c436e5666a515084cd5e76cfccd67991ae5e
Merge: 95bcf0720 c3f141a0a
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 28 19:38:57 2023 +0300
Merge branch 'master' into 4923-gopacket-dhcp-vol.3
commit 95bcf07206434fd451632e819926871ba8c14f08
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 28 13:19:42 2023 +0300
dhcpsvc: fix interface to match legacy version
commit 5da513ce177319f19698c5a8e1d10affaaf5e85c
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 28 12:32:21 2023 +0300
dhcpsvc: make it build on 32bit
commit 37a935514b1cebdc817cdcd5ec3562baeafbc42d
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Sep 27 19:39:35 2023 +0300
dhcpd: fix v6 as well
commit 03b5454b04c4fdb3fe928d661562883dc3e09d81
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Sep 27 19:34:17 2023 +0300
dhcpsvc: imp code, docs
commit 91a0e451f78fba64578cc541f7ba66579c31d388
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Fri Sep 22 15:25:58 2023 +0300
dhcpsvc: imp filing
commit 57c91e1194caa00a69e62b6655b1b4e38b69b89f
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Fri Sep 22 15:23:02 2023 +0300
dhcpsvc: imp code
commit d86be56efbfc121c9fe2c5ecef992b4523e04d57
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 14 12:24:39 2023 +0300
dhcpsvc: imp code, docs
commit c9ef29057e9e378779d1a7938ad13b6eebda8f50
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Sep 13 17:53:55 2023 +0300
dhcpsvc: add constructor, validations, tests
commit f2533ed64e4ef439603b9cdf9596f8b0c4a87cf1
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Sep 12 23:05:42 2023 +0500
WIP
77 lines
1.8 KiB
Go
77 lines
1.8 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
|
|
|
|
// 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
|
|
}
|