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

INSERT

config UDHCPD
	bool "udhcpd (DHCP server)"
	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 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 DUMPLEASES
	bool "dumpleases (6.4 kb)"
	default y
	help
	dumpleases displays the leases written out by the udhcpd.
	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 DHCPRELAY
	bool "dhcprelay (5.8 kb)"
	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 UDHCPC
	bool "udhcpc (DHCP client)"
	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 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 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 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 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_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.
