AdGuardHome/internal/dhcpsvc/dhcpsvc.go

114 lines
3.9 KiB
Go
Raw Permalink Normal View History

2023-07-03 12:10:40 +01:00
// Package dhcpsvc contains the AdGuard Home DHCP service.
//
// TODO(e.burkov): Add tests.
package dhcpsvc
import (
"context"
"net"
"net/netip"
"github.com/AdguardTeam/AdGuardHome/internal/next/agh"
)
2024-03-12 14:45:11 +00:00
// Interface is a DHCP service.
2023-07-03 12:10:40 +01:00
//
2024-03-12 14:45:11 +00:00
// 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.
2023-07-03 12:10:40 +01:00
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.
2024-03-12 14:45:11 +00:00
//
// TODO(e.burkov): Think of a contract for the returned value.
2023-07-03 12:10:40 +01:00
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
2023-09-07 15:13:48 +01:00
// hostname, either set or generated.
2023-07-03 12:10:40 +01:00
IPByHost(host string) (ip netip.Addr)
2024-03-12 14:45:11 +00:00
// 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)
2023-07-03 12:10:40 +01:00
2024-03-12 14:45:11 +00:00
// AddLease adds a new DHCP lease. l must be valid. It returns an error if
// l already exists.
2023-07-03 12:10:40 +01:00
AddLease(l *Lease) (err error)
2024-03-12 14:45:11 +00:00
// 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(l *Lease) (err error)
2023-07-03 12:10:40 +01:00
2024-03-12 14:45:11 +00:00
// RemoveLease removes an existing DHCP lease. l must be valid. It returns
// an error if there is no lease equal to l.
2023-07-03 12:10:40 +01:00
RemoveLease(l *Lease) (err error)
// Reset removes all the DHCP leases.
2024-03-12 14:45:11 +00:00
//
// TODO(e.burkov): If it's really needed?
2023-07-03 12:10:40 +01:00
Reset() (err error)
}
// Empty is an [Interface] implementation that does nothing.
type Empty struct{}
// type check
var _ agh.ServiceWithConfig[*Config] = Empty{}
2023-07-03 12:10:40 +01:00
// 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 }
// Config implements the [ServiceWithConfig] interface for Empty.
func (Empty) Config() (conf *Config) { return nil }
// type check
var _ Interface = Empty{}
2023-07-03 12:10:40 +01:00
// 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 }
// UpdateStaticLease implements the [Interface] interface for Empty.
func (Empty) UpdateStaticLease(_ *Lease) (err error) { return nil }
2023-07-03 12:10:40 +01:00
// 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 }