dhcpsvc

package
v0.108.0-b.48 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 17, 2023 License: GPL-3.0 Imports: 15 Imported by: 0

Documentation

Overview

Package dhcpsvc contains the AdGuard Home DHCP service.

TODO(e.burkov): Add tests.

Index

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

	// 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.

func (*Config) Validate added in v0.107.42

func (conf *Config) Validate() (err error)

Validate returns an error in conf if any.

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(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.

type Empty

type Empty struct{}

Empty is an Interface implementation that does nothing.

func (Empty) AddLease

func (Empty) AddLease(_ *Lease) (err error)

AddLease implements the Interface interface for Empty.

func (Empty) Config

func (Empty) Config() (conf *Config)

Config implements the [ServiceWithConfig] interface for Empty.

func (Empty) Enabled

func (Empty) Enabled() (ok bool)

Enabled implements the Interface interface for Empty.

func (Empty) HostByIP

func (Empty) HostByIP(_ netip.Addr) (host string)

HostByIP implements the Interface interface for Empty.

func (Empty) IPByHost

func (Empty) IPByHost(_ string) (ip netip.Addr)

IPByHost implements the Interface interface for Empty.

func (Empty) Leases

func (Empty) Leases() (leases []*Lease)

Leases implements the Interface interface for Empty.

func (Empty) MACByIP

func (Empty) MACByIP(_ netip.Addr) (mac net.HardwareAddr)

MACByIP implements the Interface interface for Empty.

func (Empty) RemoveLease

func (Empty) RemoveLease(_ *Lease) (err error)

RemoveLease implements the Interface interface for Empty.

func (Empty) Reset

func (Empty) Reset() (err error)

Reset implements the Interface interface for Empty.

func (Empty) Shutdown

func (Empty) Shutdown(_ context.Context) (err error)

Shutdown implements the [Service] interface for Empty.

func (Empty) Start

func (Empty) Start() (err error)

Start implements the [Service] interface for Empty.

func (Empty) UpdateStaticLease added in v0.107.42

func (Empty) UpdateStaticLease(_ *Lease) (err error)

UpdateStaticLease 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.
	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.
	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
}

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.
	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.
	Leases() (ls []*Lease)

	// AddLease adds a new DHCP lease.  It returns an error if the lease is
	// invalid or already exists.
	AddLease(l *Lease) (err error)

	// UpdateStaticLease changes an existing DHCP lease.  It returns an error if
	// there is no lease with such hardware addressor if new values are invalid
	// or already exist.
	UpdateStaticLease(l *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)
}

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 it to agh, since it also may be needed in [websvc]. Also think of implementing iterating methods with appropriate signatures.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL