 Documentation
      ¶
      Documentation
      ¶
    
    
  
    
      Overview ¶
Package dhcpd provides a DHCP server.
Index ¶
- Constants
- func Create(conf *ServerConfig) (s *server, err error)
- func OptionFQDN(fqdn string) (opt dhcpv4.Option)
- type DHCPServer
- type GetLeasesFlags
- type Interface
- type Lease
- type MockInterface
- func (s *MockInterface) Enabled() (ok bool)
- func (s *MockInterface) FindMACbyIP(ip net.IP) (mac net.HardwareAddr)
- func (s *MockInterface) Leases(flags GetLeasesFlags) (ls []*Lease)
- func (s *MockInterface) SetOnLeaseChanged(f OnLeaseChangedT)
- func (s *MockInterface) Start() (err error)
- func (s *MockInterface) Stop() (err error)
- func (s *MockInterface) WriteDiskConfig(c *ServerConfig)
 
- type OnLeaseChangedT
- type ServerConfig
- type V4ServerConf
- type V6ServerConf
Constants ¶
const ( // DefaultDHCPLeaseTTL is the default time-to-live for leases. DefaultDHCPLeaseTTL = uint32(timeutil.Day / time.Second) // DefaultDHCPTimeoutICMP is the default timeout for waiting ICMP responses. DefaultDHCPTimeoutICMP = 1000 )
const ( LeaseChangedAdded = iota LeaseChangedAddedStatic LeaseChangedRemovedStatic LeaseChangedRemovedAll LeaseChangedDBStore )
flags for onLeaseChanged()
const ErrDupHostname = errors.Error("hostname is not unique")
    ErrDupHostname is returned by addLease when the added lease has a not empty non-unique hostname.
const ErrUnconfigured errors.Error = "server is unconfigured"
    ErrUnconfigured is returned from the server's method when it requires the server to be configured and it's not.
Variables ¶
This section is empty.
Functions ¶
func Create ¶
func Create(conf *ServerConfig) (s *server, err error)
Create initializes and returns the DHCP server handling both address families. It also registers the corresponding HTTP API endpoints.
TODO(e.burkov): Don't register handlers, see TODO on aghhttp.RegisterFunc.
func OptionFQDN ¶ added in v0.107.12
OptionFQDN returns a DHCPv4 option for sending the FQDN to the client requested another hostname.
Types ¶
type DHCPServer ¶
type DHCPServer interface {
	// ResetLeases resets leases.
	ResetLeases(leases []*Lease) (err error)
	// GetLeases returns deep clones of the current leases.
	GetLeases(flags GetLeasesFlags) (leases []*Lease)
	// AddStaticLease - add a static lease
	AddStaticLease(l *Lease) (err error)
	// RemoveStaticLease - remove a static lease
	RemoveStaticLease(l *Lease) (err error)
	// FindMACbyIP - find a MAC address by IP address in the currently active DHCP leases
	FindMACbyIP(ip net.IP) net.HardwareAddr
	// WriteDiskConfig4 - copy disk configuration
	WriteDiskConfig4(c *V4ServerConf)
	// WriteDiskConfig6 - copy disk configuration
	WriteDiskConfig6(c *V6ServerConf)
	// Start - start server
	Start() (err error)
	// Stop - stop server
	Stop() (err error)
	// contains filtered or unexported methods
}
    DHCPServer - DHCP server interface
type GetLeasesFlags ¶ added in v0.107.0
type GetLeasesFlags uint8
GetLeasesFlags are the flags for GetLeases.
const ( LeasesDynamic GetLeasesFlags = 0b01 LeasesStatic GetLeasesFlags = 0b10 LeasesAll = LeasesDynamic | LeasesStatic )
GetLeasesFlags values
type Interface ¶ added in v0.107.13
type Interface interface {
	Start() (err error)
	Stop() (err error)
	Enabled() (ok bool)
	Leases(flags GetLeasesFlags) (leases []*Lease)
	SetOnLeaseChanged(onLeaseChanged OnLeaseChangedT)
	FindMACbyIP(ip net.IP) (mac net.HardwareAddr)
	WriteDiskConfig(c *ServerConfig)
}
    Interface is the DHCP server that deals with both IP address families.
type Lease ¶
type Lease struct {
	// Expiry is the expiration time of the lease.  The unix timestamp value
	// of 1 means that this is a static lease.
	Expiry time.Time `json:"expires"`
	Hostname string           `json:"hostname"`
	HWAddr   net.HardwareAddr `json:"mac"`
	IP       net.IP           `json:"ip"`
}
    Lease contains the necessary information about a DHCP lease
func (*Lease) IsBlocklisted ¶ added in v0.107.0
IsBlocklisted returns true if the lease is blocklisted.
TODO(a.garipov): Just make it a boolean field.
func (*Lease) IsStatic ¶ added in v0.106.0
IsStatic returns true if the lease is static.
TODO(a.garipov): Just make it a boolean field.
func (Lease) MarshalJSON ¶ added in v0.105.0
MarshalJSON implements the json.Marshaler interface for Lease.
func (*Lease) UnmarshalJSON ¶ added in v0.105.0
UnmarshalJSON implements the json.Unmarshaler interface for *Lease.
type MockInterface ¶ added in v0.107.13
type MockInterface struct {
	OnStart             func() (err error)
	OnStop              func() (err error)
	OnEnabled           func() (ok bool)
	OnLeases            func(flags GetLeasesFlags) (leases []*Lease)
	OnSetOnLeaseChanged func(f OnLeaseChangedT)
	OnFindMACbyIP       func(ip net.IP) (mac net.HardwareAddr)
	OnWriteDiskConfig   func(c *ServerConfig)
}
    MockInterface is a mock Interface implementation.
TODO(e.burkov): Move to aghtest when the API stabilized.
func (*MockInterface) Enabled ¶ added in v0.107.13
func (s *MockInterface) Enabled() (ok bool)
Enabled implements the Interface for *MockInterface.
func (*MockInterface) FindMACbyIP ¶ added in v0.107.13
func (s *MockInterface) FindMACbyIP(ip net.IP) (mac net.HardwareAddr)
FindMACbyIP implements the Interface for *MockInterface.
func (*MockInterface) Leases ¶ added in v0.107.13
func (s *MockInterface) Leases(flags GetLeasesFlags) (ls []*Lease)
Leases implements the Interface for *MockInterface.
func (*MockInterface) SetOnLeaseChanged ¶ added in v0.107.13
func (s *MockInterface) SetOnLeaseChanged(f OnLeaseChangedT)
SetOnLeaseChanged implements the Interface for *MockInterface.
func (*MockInterface) Start ¶ added in v0.107.13
func (s *MockInterface) Start() (err error)
Start implements the Interface for *MockInterface.
func (*MockInterface) Stop ¶ added in v0.107.13
func (s *MockInterface) Stop() (err error)
Stop implements the Interface for *MockInterface.
func (*MockInterface) WriteDiskConfig ¶ added in v0.107.13
func (s *MockInterface) WriteDiskConfig(c *ServerConfig)
WriteDiskConfig implements the Interface for *MockInterface.
type OnLeaseChangedT ¶
type OnLeaseChangedT func(flags int)
OnLeaseChangedT is a callback for lease changes.
type ServerConfig ¶
type ServerConfig struct {
	// Called when the configuration is changed by HTTP request
	ConfigModified func() `yaml:"-"`
	// Register an HTTP handler
	HTTPRegister aghhttp.RegisterFunc `yaml:"-"`
	Enabled       bool   `yaml:"enabled"`
	InterfaceName string `yaml:"interface_name"`
	// LocalDomainName is the domain name used for DHCP hosts.  For example,
	// a DHCP client with the hostname "myhost" can be addressed as "myhost.lan"
	// when LocalDomainName is "lan".
	LocalDomainName string `yaml:"local_domain_name"`
	Conf4 V4ServerConf `yaml:"dhcpv4"`
	Conf6 V6ServerConf `yaml:"dhcpv6"`
	WorkDir    string `yaml:"-"`
	DBFilePath string `yaml:"-"`
}
    ServerConfig is the configuration for the DHCP server. The order of YAML fields is important, since the YAML configuration file follows it.
type V4ServerConf ¶
type V4ServerConf struct {
	Enabled       bool   `yaml:"-" json:"-"`
	InterfaceName string `yaml:"-" json:"-"`
	GatewayIP  net.IP `yaml:"gateway_ip" json:"gateway_ip"`
	SubnetMask net.IP `yaml:"subnet_mask" json:"subnet_mask"`
	// The first & the last IP address for dynamic leases
	// Bytes [0..2] of the last allowed IP address must match the first IP
	RangeStart net.IP `yaml:"range_start" json:"range_start"`
	RangeEnd   net.IP `yaml:"range_end" json:"range_end"`
	LeaseDuration uint32 `yaml:"lease_duration" json:"lease_duration"` // in seconds
	// IP conflict detector: time (ms) to wait for ICMP reply
	// 0: disable
	ICMPTimeout uint32 `yaml:"icmp_timeout_msec" json:"-"`
	// Custom Options.
	//
	// Option with arbitrary hexadecimal data:
	//     DEC_CODE hex HEX_DATA
	// where DEC_CODE is a decimal DHCPv4 option code in range [1..255]
	//
	// Option with IP data (only 1 IP is supported):
	//     DEC_CODE ip IP_ADDR
	Options []string `yaml:"options" json:"-"`
	// contains filtered or unexported fields
}
    V4ServerConf - server configuration
func (*V4ServerConf) Validate ¶ added in v0.107.13
func (c *V4ServerConf) Validate() (err error)
Validate returns an error if c is not a valid configuration.
TODO(e.burkov): Don't set the config fields when the server itself will stop containing the config.
type V6ServerConf ¶
type V6ServerConf struct {
	Enabled       bool   `yaml:"-" json:"-"`
	InterfaceName string `yaml:"-" json:"-"`
	// The first IP address for dynamic leases
	// The last allowed IP address ends with 0xff byte
	RangeStart net.IP `yaml:"range_start" json:"range_start"`
	LeaseDuration uint32 `yaml:"lease_duration" json:"lease_duration"` // in seconds
	RASLAACOnly  bool `yaml:"ra_slaac_only" json:"-"`  // send ICMPv6.RA packets without MO flags
	RAAllowSLAAC bool `yaml:"ra_allow_slaac" json:"-"` // send ICMPv6.RA packets with MO flags
	// contains filtered or unexported fields
}
    V6ServerConf - server configuration