Documentation
¶
Overview ¶
Package dhcpsvc contains the AdGuard Home DHCP service.
TODO(e.burkov): Add tests.
Index ¶
- type Config
- type DHCPServer
- func (srv *DHCPServer) AddLease(ctx context.Context, l *Lease) (err error)
- func (srv *DHCPServer) Enabled() (ok bool)
- func (srv *DHCPServer) HostByIP(ip netip.Addr) (host string)
- func (srv *DHCPServer) IPByHost(host string) (ip netip.Addr)
- func (srv *DHCPServer) Leases() (leases []*Lease)
- func (srv *DHCPServer) MACByIP(ip netip.Addr) (mac net.HardwareAddr)
- func (srv *DHCPServer) RemoveLease(ctx context.Context, l *Lease) (err error)
- func (srv *DHCPServer) Reset(ctx context.Context) (err error)
- func (srv *DHCPServer) UpdateStaticLease(ctx context.Context, l *Lease) (err error)
- type Empty
- func (Empty) AddLease(_ context.Context, _ *Lease) (err error)
- func (Empty) Config() (conf *Config)
- func (Empty) Enabled() (ok bool)
- func (Empty) HostByIP(_ netip.Addr) (host string)
- func (Empty) IPByHost(_ string) (ip netip.Addr)
- func (Empty) Leases() (leases []*Lease)
- func (Empty) MACByIP(_ netip.Addr) (mac net.HardwareAddr)
- func (Empty) RemoveLease(_ context.Context, _ *Lease) (err error)
- func (Empty) Reset(_ context.Context) (err error)
- func (Empty) Shutdown(_ context.Context) (err error)
- func (Empty) Start() (err error)
- func (Empty) UpdateStaticLease(_ context.Context, _ *Lease) (err error)
- type IPv4Config
- type IPv6Config
- type Interface
- type InterfaceConfig
- type Lease
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Config ¶
type Config struct {
// Interfaces stores configurations of DHCP server specific for the network
// interface identified by its name.
Interfaces map[string]*InterfaceConfig
// Logger will be used to log the DHCP events.
Logger *slog.Logger
// 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
}
Config is the configuration for the DHCP service.
type DHCPServer ¶ added in v0.107.42
type DHCPServer struct {
// contains filtered or unexported fields
}
DHCPServer is a DHCP server for both IPv4 and IPv6 address families.
func New ¶ added in v0.107.42
func New(ctx context.Context, conf *Config) (srv *DHCPServer, err error)
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 (*DHCPServer) AddLease ¶ added in v0.107.46
func (srv *DHCPServer) AddLease(ctx context.Context, l *Lease) (err error)
AddLease implements the Interface interface for *DHCPServer.
func (*DHCPServer) Enabled ¶ added in v0.107.42
func (srv *DHCPServer) Enabled() (ok bool)
Enabled implements the Interface interface for *DHCPServer.
func (*DHCPServer) HostByIP ¶ added in v0.107.46
func (srv *DHCPServer) HostByIP(ip netip.Addr) (host string)
HostByIP implements the Interface interface for *DHCPServer.
func (*DHCPServer) IPByHost ¶ added in v0.107.46
func (srv *DHCPServer) IPByHost(host string) (ip netip.Addr)
IPByHost implements the Interface interface for *DHCPServer.
func (*DHCPServer) Leases ¶ added in v0.107.42
func (srv *DHCPServer) Leases() (leases []*Lease)
Leases implements the Interface interface for *DHCPServer.
func (*DHCPServer) MACByIP ¶ added in v0.107.46
func (srv *DHCPServer) MACByIP(ip netip.Addr) (mac net.HardwareAddr)
MACByIP implements the Interface interface for *DHCPServer.
func (*DHCPServer) RemoveLease ¶ added in v0.107.46
func (srv *DHCPServer) RemoveLease(ctx context.Context, l *Lease) (err error)
RemoveLease implements the Interface interface for *DHCPServer.
func (*DHCPServer) Reset ¶ added in v0.107.46
func (srv *DHCPServer) Reset(ctx context.Context) (err error)
Reset implements the Interface interface for *DHCPServer.
func (*DHCPServer) UpdateStaticLease ¶ added in v0.107.46
func (srv *DHCPServer) UpdateStaticLease(ctx context.Context, l *Lease) (err error)
UpdateStaticLease implements the Interface interface for *DHCPServer.
TODO(e.burkov): Support moving leases between interfaces.
type Empty ¶
type Empty struct{}
Empty is an Interface implementation that does nothing.
func (Empty) MACByIP ¶
func (Empty) MACByIP(_ netip.Addr) (mac net.HardwareAddr)
MACByIP implements the Interface interface for Empty.
func (Empty) RemoveLease ¶
RemoveLease implements the Interface interface for Empty.
type IPv4Config ¶
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 CIDR (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. The options
// having a zero value within the Length field are treated as deletions of
// the corresponding options, either implicit or explicit.
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
}
IPv4Config is the interface-specific configuration for DHCPv4.
type IPv6Config ¶
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. The options
// with zero length are treated as deletions of the corresponding options,
// either implicit or explicit.
Options layers.DHCPv6Options
// 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
}
IPv6Config is the interface-specific configuration for DHCPv6.
type Interface ¶
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.
//
// TODO(e.burkov): Think of a contract for the returned value.
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 or generated.
IPByHost(host string) (ip netip.Addr)
// Leases returns all the active DHCP leases. The returned slice should be
// a clone.
//
// TODO(e.burkov): Consider implementing iterating methods with appropriate
// signatures instead of cloning the whole list.
Leases() (ls []*Lease)
// AddLease adds a new DHCP lease. l must be valid. It returns an error if
// l already exists.
AddLease(ctx context.Context, l *Lease) (err error)
// UpdateStaticLease replaces an existing static DHCP lease. l must be
// valid. It returns an error if the lease with the given hardware address
// doesn't exist or if other values match another existing lease.
UpdateStaticLease(ctx context.Context, l *Lease) (err error)
// RemoveLease removes an existing DHCP lease. l must be valid. It returns
// an error if there is no lease equal to l.
RemoveLease(ctx context.Context, l *Lease) (err error)
// Reset removes all the DHCP leases.
//
// TODO(e.burkov): If it's really needed?
Reset(ctx context.Context) (err error)
}
Interface is a DHCP service.
TODO(e.burkov): Separate HostByIP, MACByIP, IPByHost into a separate interface. This is also applicable to Enabled method.
TODO(e.burkov): Reconsider the requirements for the leases validity.
type InterfaceConfig ¶
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
}
InterfaceConfig is the configuration of a single DHCP interface.
type Lease ¶
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
}
Lease is a DHCP lease.
TODO(e.burkov): Consider moving it to agh, since it also may be needed in [websvc].
TODO(e.burkov): Add validation method.