#
# 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
	depends on UDHCPD
	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
	depends on UDHCPD
	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_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.
