#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

INSERT

config UDHCPD
	bool "udhcp server (udhcpd)"
	default y
	select PLATFORM_LINUX
	help
	  udhcpd is a DHCP server geared primarily toward embedded systems,
	  while striving to be fully functional and RFC compliant.

config DHCPRELAY
	bool "dhcprelay"
	default y
	help
	  dhcprelay listens for dhcp requests on one or more interfaces
	  and forwards these requests to a different interface or dhcp
	  server.

config DUMPLEASES
	bool "Lease display utility (dumpleases)"
	default y
	help
	  dumpleases displays the leases written out by the udhcpd server.
	  Lease times are stored in the file by time remaining in lease, or
	  by the absolute time that it expires in seconds from epoch.

config FEATURE_UDHCPD_WRITE_LEASES_EARLY
	bool "Rewrite the lease file at every new acknowledge"
	default y
	depends on UDHCPD
	help
	  If selected, udhcpd will write a new file with leases every
	  time a new lease has been accepted, thus eliminating the need
	  to send SIGUSR1 for the initial writing or updating. Any timed
	  rewriting remains undisturbed.

config FEATURE_UDHCPD_BASE_IP_ON_MAC
	bool "Select IP address based on client MAC"
	default n
	depends on UDHCPD
	help
	  If selected, udhcpd will base its selection of IP address to offer
	  on the client's hardware address. Otherwise udhcpd uses the next
	  consecutive free address.

	  This reduces the frequency of IP address changes for clients
	  which let their lease expire, and makes consecutive DHCPOFFERS
	  for the same client to (almost always) contain the same
	  IP address.

config DHCPD_LEASES_FILE
	string "Absolute path to lease file"
	default "/var/lib/misc/udhcpd.leases"
	depends on UDHCPD
	help
	  udhcpd stores addresses in a lease file. This is the absolute path
	  of the file. Normally it is safe to leave it untouched.

config UDHCPC
	bool "udhcp client (udhcpc)"
	default y
	select PLATFORM_LINUX
	help
	  udhcpc is a DHCP client geared primarily toward embedded systems,
	  while striving to be fully functional and RFC compliant.

	  The udhcp client negotiates a lease with the DHCP server and
	  runs a script when a lease is obtained or lost.

config FEATURE_UDHCPC_ARPING
	bool "Verify that the offered address is free, using ARP ping"
	default y
	depends on UDHCPC
	help
	  If selected, udhcpc will send ARP probes and make sure
	  the offered address is really not in use by anyone. The client
	  will DHCPDECLINE the offer if the address is in use,
	  and restart the discover process.

config FEATURE_UDHCPC_SANITIZEOPT
	bool "Do not pass malformed host and domain names"
	default y
	depends on UDHCPC
	help
	  If selected, udhcpc will check some options (such as option 12 -
	  hostname) and if they don't look like valid hostnames
	  (for example, if they start with dash or contain spaces),
	  they will be replaced with string "bad" when exporting
	  to the environment.

config FEATURE_UDHCP_PORT
	bool "Enable '-P port' option for udhcpd and udhcpc"
	default n
	depends on UDHCPD || UDHCPC
	help
	  At the cost of ~300 bytes, enables -P port option.
	  This feature is typically not needed.

config UDHCP_DEBUG
	int "Maximum verbosity level for udhcp applets (0..9)"
	default 9
	range 0 9
	depends on UDHCPD || UDHCPC || DHCPRELAY
	help
	  Verbosity can be increased with multiple -v options.
	  This option controls how high it can be cranked up.

	  Bigger values result in bigger code. Levels above 1
	  are very verbose and useful for debugging only.

config FEATURE_UDHCP_RFC3397
	bool "Support for RFC3397 domain search (experimental)"
	default y
	depends on UDHCPD || UDHCPC
	help
	  If selected, both client and server will support passing of domain
	  search lists via option 119, specified in RFC 3397,
	  and SIP servers option 120, specified in RFC 3361.

config FEATURE_UDHCP_8021Q
	bool "Support for 802.1Q VLAN parameters"
	default y
	depends on UDHCPD || UDHCPC
	help
	  If selected, both client and server will support passing of VLAN
	  ID and priority via options 132 and 133 as per 802.1Q.

config UDHCPC_DEFAULT_SCRIPT
	string "Absolute path to config script"
	default "/usr/share/udhcpc/default.script"
	depends on UDHCPC
	help
	  This script is called after udhcpc receives an answer. See
	  examples/udhcp for a working example. Normally it is safe
	  to leave this untouched.

config UDHCPC_SLACK_FOR_BUGGY_SERVERS
	int "DHCP options slack buffer size"
	default 80
	range 0 924
	depends on UDHCPD || UDHCPC
	help
	  Some buggy DHCP servers send DHCP offer packets with option
	  field larger than we expect (which might also be considered a
	  buffer overflow attempt). These packets are normally discarded.
	  If circumstances beyond your control force you to support such
	  servers, this may help. The upper limit (924) makes dhcpc accept
	  even 1500 byte packets (maximum-sized ethernet packets).

	  This option does not make dhcp[cd] emit non-standard
	  sized packets.

	  Known buggy DHCP servers:
	  3Com OfficeConnect Remote 812 ADSL Router:
	    seems to confuse maximum allowed UDP packet size with
	    maximum size of entire IP packet, and sends packets which are
	    28 bytes too large.
	  Seednet (ISP) VDSL: sends packets 2 bytes too large.
