-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into fix-blocked-services-client-schedule
- Loading branch information
Showing
10 changed files
with
324 additions
and
104 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
package dhcpsvc | ||
|
||
import ( | ||
"net/netip" | ||
"time" | ||
|
||
"github.com/google/gopacket/layers" | ||
) | ||
|
||
// Config is the configuration for the DHCP service. | ||
type Config struct { | ||
// Interfaces stores configurations of DHCP server specific for the network | ||
// interface identified by its name. | ||
Interfaces map[string]*InterfaceConfig | ||
|
||
// LocalDomainName is the top-level domain name to use for resolving DHCP | ||
// clients' hostnames. | ||
LocalDomainName string | ||
|
||
// ICMPTimeout is the timeout for checking another DHCP server's presence. | ||
ICMPTimeout time.Duration | ||
|
||
// Enabled is the state of the service, whether it is enabled or not. | ||
Enabled bool | ||
} | ||
|
||
// InterfaceConfig is the configuration of a single DHCP interface. | ||
type InterfaceConfig struct { | ||
// IPv4 is the configuration of DHCP protocol for IPv4. | ||
IPv4 *IPv4Config | ||
|
||
// IPv6 is the configuration of DHCP protocol for IPv6. | ||
IPv6 *IPv6Config | ||
} | ||
|
||
// IPv4Config is the interface-specific configuration for DHCPv4. | ||
type IPv4Config struct { | ||
// GatewayIP is the IPv4 address of the network's gateway. It is used as | ||
// the default gateway for DHCP clients and also used in calculating the | ||
// network-specific broadcast address. | ||
GatewayIP netip.Addr | ||
|
||
// SubnetMask is the IPv4 subnet mask of the network. It should be a valid | ||
// IPv4 subnet mask (i.e. all 1s followed by all 0s). | ||
SubnetMask netip.Addr | ||
|
||
// RangeStart is the first address in the range to assign to DHCP clients. | ||
RangeStart netip.Addr | ||
|
||
// RangeEnd is the last address in the range to assign to DHCP clients. | ||
RangeEnd netip.Addr | ||
|
||
// Options is the list of DHCP options to send to DHCP clients. | ||
Options layers.DHCPOptions | ||
|
||
// LeaseDuration is the TTL of a DHCP lease. | ||
LeaseDuration time.Duration | ||
|
||
// Enabled is the state of the DHCPv4 service, whether it is enabled or not | ||
// on the specific interface. | ||
Enabled bool | ||
} | ||
|
||
// IPv6Config is the interface-specific configuration for DHCPv6. | ||
type IPv6Config struct { | ||
// RangeStart is the first address in the range to assign to DHCP clients. | ||
RangeStart netip.Addr | ||
|
||
// Options is the list of DHCP options to send to DHCP clients. | ||
Options layers.DHCPOptions | ||
|
||
// LeaseDuration is the TTL of a DHCP lease. | ||
LeaseDuration time.Duration | ||
|
||
// RASlaacOnly defines whether the DHCP clients should only use SLAAC for | ||
// address assignment. | ||
RASLAACOnly bool | ||
|
||
// RAAllowSlaac defines whether the DHCP clients may use SLAAC for address | ||
// assignment. | ||
RAAllowSLAAC bool | ||
|
||
// Enabled is the state of the DHCPv6 service, whether it is enabled or not | ||
// on the specific interface. | ||
Enabled bool | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
// Package dhcpsvc contains the AdGuard Home DHCP service. | ||
// | ||
// TODO(e.burkov): Add tests. | ||
package dhcpsvc | ||
|
||
import ( | ||
"context" | ||
"net" | ||
"net/netip" | ||
"time" | ||
|
||
"github.com/AdguardTeam/AdGuardHome/internal/next/agh" | ||
) | ||
|
||
// Lease is a DHCP lease. | ||
// | ||
// TODO(e.burkov): Consider it to [agh], since it also may be needed in | ||
// [websvc]. Also think of implementing iterating methods with appropriate | ||
// signatures. | ||
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 | ||
} | ||
|
||
type Interface interface { | ||
agh.ServiceWithConfig[*Config] | ||
|
||
// Enabled returns true if DHCP provides information about clients. | ||
Enabled() (ok bool) | ||
|
||
// HostByIP returns the hostname of the DHCP client with the given IP | ||
// address. The address will be netip.Addr{} if there is no such client, | ||
// due to an assumption that a DHCP client must always have an IP address. | ||
HostByIP(ip netip.Addr) (host string) | ||
|
||
// MACByIP returns the MAC address for the given IP address leased. It | ||
// returns nil if there is no such client, due to an assumption that a DHCP | ||
// client must always have a MAC address. | ||
MACByIP(ip netip.Addr) (mac net.HardwareAddr) | ||
|
||
// IPByHost returns the IP address of the DHCP client with the given | ||
// hostname. The hostname will be an empty string if there is no such | ||
// client, due to an assumption that a DHCP client must always have a | ||
// hostname, either set by the client or assigned automatically. | ||
IPByHost(host string) (ip netip.Addr) | ||
|
||
// Leases returns all the DHCP leases. | ||
Leases() (leases []*Lease) | ||
|
||
// AddLease adds a new DHCP lease. It returns an error if the lease is | ||
// invalid or already exists. | ||
AddLease(l *Lease) (err error) | ||
|
||
// EditLease changes an existing DHCP lease. It returns an error if there | ||
// is no lease equal to old or if new is invalid or already exists. | ||
EditLease(old, new *Lease) (err error) | ||
|
||
// RemoveLease removes an existing DHCP lease. It returns an error if there | ||
// is no lease equal to l. | ||
RemoveLease(l *Lease) (err error) | ||
|
||
// Reset removes all the DHCP leases. | ||
Reset() (err error) | ||
} | ||
|
||
// Empty is an [Interface] implementation that does nothing. | ||
type Empty struct{} | ||
|
||
// type check | ||
var _ Interface = Empty{} | ||
|
||
// Start implements the [Service] interface for Empty. | ||
func (Empty) Start() (err error) { return nil } | ||
|
||
// Shutdown implements the [Service] interface for Empty. | ||
func (Empty) Shutdown(_ context.Context) (err error) { return nil } | ||
|
||
var _ agh.ServiceWithConfig[*Config] = Empty{} | ||
|
||
// Config implements the [ServiceWithConfig] interface for Empty. | ||
func (Empty) Config() (conf *Config) { return nil } | ||
|
||
// Enabled implements the [Interface] interface for Empty. | ||
func (Empty) Enabled() (ok bool) { return false } | ||
|
||
// HostByIP implements the [Interface] interface for Empty. | ||
func (Empty) HostByIP(_ netip.Addr) (host string) { return "" } | ||
|
||
// MACByIP implements the [Interface] interface for Empty. | ||
func (Empty) MACByIP(_ netip.Addr) (mac net.HardwareAddr) { return nil } | ||
|
||
// IPByHost implements the [Interface] interface for Empty. | ||
func (Empty) IPByHost(_ string) (ip netip.Addr) { return netip.Addr{} } | ||
|
||
// Leases implements the [Interface] interface for Empty. | ||
func (Empty) Leases() (leases []*Lease) { return nil } | ||
|
||
// AddLease implements the [Interface] interface for Empty. | ||
func (Empty) AddLease(_ *Lease) (err error) { return nil } | ||
|
||
// EditLease implements the [Interface] interface for Empty. | ||
func (Empty) EditLease(_, _ *Lease) (err error) { return nil } | ||
|
||
// RemoveLease implements the [Interface] interface for Empty. | ||
func (Empty) RemoveLease(_ *Lease) (err error) { return nil } | ||
|
||
// Reset implements the [Interface] interface for Empty. | ||
func (Empty) Reset() (err error) { return nil } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.