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

menu "Networking Utilities"

config FEATURE_IPV6
	bool "Enable IPv6 support"
	default n
	help
	  Enable IPv6 support in busybox.
	  This adds IPv6 support in the networking applets.

config FEATURE_PREFER_IPV4_ADDRESS
	bool "Preferentially use IPv4 addresses from DNS queries"
	default y
	depends on FEATURE_IPV6
	help
	  Use IPv4 address of network host if it has one.

	  If this option is off, the first returned address will be used.
	  This may cause problems when your DNS server is IPv6-capable and
	  is returning IPv6 host addresses too. If IPv6 address
	  precedes IPv4 one in DNS reply, busybox network applets
	  (e.g. wget) will use IPv6 address. On an IPv6-incapable host
	  or network applets will fail to connect to the host
	  using IPv6 address.

config VERBOSE_RESOLUTION_ERRORS
	bool "Verbose resolution errors"
	default n
	help
	  Enable if you are not satisfied with simplistic
	  "can't resolve 'hostname.com'" and want to know more.
	  This may increase size of your executable a bit.

config ARP
	bool "arp"
	default n
	help
	  Manipulate the system ARP cache.

config ARPING
	bool "arping"
	default n
	help
	  Ping hosts by ARP packets.

config BRCTL
	bool "brctl"
	default n
	help
	  Manage ethernet bridges.
	  Supports addbr/delbr and addif/delif.

#config FEATURE_BRCTL_SHOW
#	bool "Support show, showmac and showstp"
#	default n
#	depends on BRCTL
#	help
#	  Add support for option which print the current config:
#	    showmacs, showstp, show

config FEATURE_BRCTL_FANCY
	bool "Fancy options"
	default n
	depends on BRCTL
	help
	  Add support for extended option like:
	    setageing, setfd, sethello, setmaxage,
	    setpathcost, setportprio, setbridgeprio,
	    stp
	  This adds about 600 bytes.

config DNSD
	bool "dnsd"
	default n
	help
	  Small and static DNS server daemon.

config ETHER_WAKE
	bool "ether-wake"
	default n
	help
	  Send a magic packet to wake up sleeping machines.

config FAKEIDENTD
	bool "fakeidentd"
	default n
	select FEATURE_SYSLOG
	help
	  fakeidentd listens on the ident port and returns a predefined
	  fake value on any query.

config FTPGET
	bool "ftpget"
	default n
	help
	  Retrieve a remote file via FTP.

config FTPPUT
	bool "ftpput"
	default n
	help
	  Store a remote file via FTP.

config FEATURE_FTPGETPUT_LONG_OPTIONS
	bool "Enable long options in ftpget/ftpput"
	default n
	depends on GETOPT_LONG && (FTPGET || FTPPUT)
	help
	  Support long options for the ftpget/ftpput applet.

config HOSTNAME
	bool "hostname"
	default n
	help
	  Show or set the system's host name.

config HTTPD
	bool "httpd"
	default n
	help
	  Serve web pages via an HTTP server.

config FEATURE_HTTPD_RANGES
	bool "Support 'Ranges:' header"
	default n
	depends on HTTPD
	help
	  Makes httpd emit "Accept-Ranges: bytes" header and understand
	  "Range: bytes=NNN-[MMM]" header. Allows for resuming interrupted
	  downloads, seeking in multimedia players etc.

config FEATURE_HTTPD_USE_SENDFILE
	bool "Use sendfile system call"
	default n
	depends on HTTPD
	help
	  When enabled, httpd will use the kernel sendfile() function
	  instead of read/write loop.

config FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP
	bool "Support reloading of global config file on HUP signal"
	default n
	depends on HTTPD
	help
	  This option enables processing of SIGHUP to reload cached
	  configuration settings.

config FEATURE_HTTPD_SETUID
	bool "Enable -u <user> option"
	default n
	depends on HTTPD
	help
	  This option allows the server to run as a specific user
	  rather than defaulting to the user that starts the server.
	  Use of this option requires special privileges to change to a
	  different user.

config FEATURE_HTTPD_BASIC_AUTH
	bool "Enable Basic http Authentication"
	default y
	depends on HTTPD
	help
	  Utilizes password settings from /etc/httpd.conf for basic
	  authentication on a per url basis.

config FEATURE_HTTPD_AUTH_MD5
	bool "Support MD5 crypted passwords for http Authentication"
	default n
	depends on FEATURE_HTTPD_BASIC_AUTH
	help
	  Enables basic per URL authentication from /etc/httpd.conf
	  using md5 passwords.

config FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES
	bool "Support loading additional MIME types at run-time"
	default n
	depends on HTTPD
	help
	  This option enables support for additional MIME types at
	  run-time to be specified in the configuration file.

config FEATURE_HTTPD_CGI
	bool "Support Common Gateway Interface (CGI)"
	default y
	depends on HTTPD
	help
	  This option allows scripts and executables to be invoked
	  when specific URLs are requested.

config FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
	bool "Support for running scripts through an interpreter"
	default n
	depends on FEATURE_HTTPD_CGI
	help
	  This option enables support for running scripts through an
	  interpreter. Turn this on if you want PHP scripts to work
	  properly. You need to supply an additional line in your httpd
	  config file:
	  *.php:/path/to/your/php

config FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV
	bool "Set REMOTE_PORT environment variable for CGI"
	default n
	depends on FEATURE_HTTPD_CGI
	help
	  Use of this option can assist scripts in generating
	  references that contain a unique port number.

config FEATURE_HTTPD_ENCODE_URL_STR
	bool "Enable -e option (useful for CGIs written as shell scripts)"
	default y
	depends on HTTPD
	help
	  This option allows html encoding of arbitrary strings for display
	  by the browser.  Output goes to stdout.
	  For example, httpd -e "<Hello World>" produces
	  "&#60Hello&#32World&#62".

config FEATURE_HTTPD_ERROR_PAGES
	bool "Support for custom error pages"
	default n
	depends on HTTPD
	help
	  This option allows you to define custom error pages in
	  the configuration file instead of the default HTTP status
	  error pages. For instance, if you add the line:
	        E404:/path/e404.html
	  in the config file, the server will respond the specified
	  '/path/e404.html' file instead of the terse '404 NOT FOUND'
	  message.

config FEATURE_HTTPD_PROXY
	bool "Support for reverse proxy"
	default n
	depends on HTTPD
	help
	  This option allows you to define URLs that will be forwarded
	  to another HTTP server. To setup add the following line to the
	  configuration file
	        P:/url/:http://hostname[:port]/new/path/
	  Then a request to /url/myfile will be forwarded to
	  http://hostname[:port]/new/path/myfile.

config IFCONFIG
	bool "ifconfig"
	default n
	help
	  Ifconfig is used to configure the kernel-resident network interfaces.

config FEATURE_IFCONFIG_STATUS
	bool "Enable status reporting output (+7k)"
	default y
	depends on IFCONFIG
	help
	  If ifconfig is called with no arguments it will display the status
	  of the currently active interfaces.

config FEATURE_IFCONFIG_SLIP
	bool "Enable slip-specific options \"keepalive\" and \"outfill\""
	default n
	depends on IFCONFIG
	help
	  Allow "keepalive" and "outfill" support for SLIP.  If you're not
	  planning on using serial lines, leave this unchecked.

config FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
	bool "Enable options \"mem_start\", \"io_addr\", and \"irq\""
	default n
	depends on IFCONFIG
	help
	  Allow the start address for shared memory, start address for I/O,
	  and/or the interrupt line used by the specified device.

config FEATURE_IFCONFIG_HW
	bool "Enable option \"hw\" (ether only)"
	default y
	depends on IFCONFIG
	help
	  Set the hardware address of this interface, if the device driver
	  supports  this  operation.  Currently, we only support the 'ether'
	  class.

config FEATURE_IFCONFIG_BROADCAST_PLUS
	bool "Set the broadcast automatically"
	default n
	depends on IFCONFIG
	help
	  Setting this will make ifconfig attempt to find the broadcast
	  automatically if the value '+' is used.

config IFENSLAVE
	bool "ifenslave"
	default n
	help
	  Userspace application to bind several interfaces
	  to a logical interface (use with kernel bonding driver).

config IFUPDOWN
	bool "ifupdown"
	default n
	help
	  Activate or deactivate the specified interfaces.  This applet makes
	  use of either "ifconfig" and "route" or the "ip" command to actually
	  configure network interfaces.  Therefore, you will probably also want
	  to enable either IFCONFIG and ROUTE, or enable
	  FEATURE_IFUPDOWN_IP and the various IP options.  Of
	  course you could use non-busybox versions of these programs, so
	  against my better judgement (since this will surely result in plenty
	  of support questions on the mailing list), I do not force you to
	  enable these additional options.  It is up to you to supply either
	  "ifconfig", "route" and "run-parts" or the "ip" command, either
	  via busybox or via standalone utilities.

config IFUPDOWN_IFSTATE_PATH
	string "Absolute path to ifstate file"
	default "/var/run/ifstate"
	depends on IFUPDOWN
	help
	  ifupdown keeps state information in a file called ifstate.
	  Typically it is located in /var/run/ifstate, however
	  some distributions tend to put it in other places
	  (debian, for example, uses /etc/network/run/ifstate).
	  This config option defines location of ifstate.

config FEATURE_IFUPDOWN_IP
	bool "Use ip applet"
	default n
	depends on IFUPDOWN
	help
	  Use the iproute "ip" command to implement "ifup" and "ifdown", rather
	  than the default of using the older 'ifconfig' and 'route' utilities.

config FEATURE_IFUPDOWN_IP_BUILTIN
	bool "Use busybox ip applet"
	default y
	depends on FEATURE_IFUPDOWN_IP
	select IP
	select FEATURE_IP_ADDRESS
	select FEATURE_IP_LINK
	select FEATURE_IP_ROUTE
	help
	  Use the busybox iproute "ip" applet to implement "ifupdown".

	  If left disabled, you must install the full-blown iproute2
	  utility or the  "ifup" and "ifdown" applets will not work.

config FEATURE_IFUPDOWN_IFCONFIG_BUILTIN
	bool "Use busybox ifconfig and route applets"
	default y
	depends on IFUPDOWN && !FEATURE_IFUPDOWN_IP
	select IFCONFIG
	select ROUTE
	help
	  Use the busybox iproute "ifconfig" and "route" applets to
	  implement the "ifup" and "ifdown" utilities.

	  If left disabled, you must install the full-blown ifconfig
	  and route utilities, or the  "ifup" and "ifdown" applets will not
	  work.

config FEATURE_IFUPDOWN_IPV4
	bool "Support for IPv4"
	default y
	depends on IFUPDOWN
	help
	  If you want ifup/ifdown to talk IPv4, leave this on.

config FEATURE_IFUPDOWN_IPV6
	bool "Support for IPv6"
	default n
	depends on IFUPDOWN && FEATURE_IPV6
	help
	  If you need support for IPv6, turn this option on.

### UNUSED
###config FEATURE_IFUPDOWN_IPX
###	bool "Support for IPX"
###	default n
###	depends on IFUPDOWN
###	help
###	  If this option is selected you can use busybox to work with IPX
###	  networks.

config FEATURE_IFUPDOWN_MAPPING
	bool "Enable mapping support"
	default n
	depends on IFUPDOWN
	help
	  This enables support for the "mapping" stanza, unless you have
	  a weird network setup you don't need it.

config FEATURE_IFUPDOWN_EXTERNAL_DHCP
	bool "Support for external dhcp clients"
	default n
	depends on IFUPDOWN
	help
	  This enables support for the external dhcp clients. Clients are
	  tried in the following order: dhcpcd, dhclient, pump and udhcpc.
	  Otherwise, if udhcpc applet is enabled, it is used.
	  Otherwise, ifup/ifdown will have no support for DHCP.

config INETD
	bool "inetd"
	default n
	select FEATURE_SYSLOG
	help
	  Internet superserver daemon

config FEATURE_INETD_SUPPORT_BUILTIN_ECHO
	bool "Support echo service"
	default y
	depends on INETD
	help
	  Echo received data internal inetd service

config FEATURE_INETD_SUPPORT_BUILTIN_DISCARD
	bool "Support discard service"
	default y
	depends on INETD
	help
	  Internet /dev/null internal inetd service

config FEATURE_INETD_SUPPORT_BUILTIN_TIME
	bool "Support time service"
	default y
	depends on INETD
	help
	  Return 32 bit time since 1900 internal inetd service

config FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME
	bool "Support daytime service"
	default y
	depends on INETD
	help
	  Return human-readable time internal inetd service

config FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
	bool "Support chargen service"
	default y
	depends on INETD
	help
	  Familiar character generator internal inetd service

config FEATURE_INETD_RPC
	bool "Support RPC services"
	default n
	depends on INETD
	select FEATURE_HAVE_RPC
	help
	  Support Sun-RPC based services

config IP
	bool "ip"
	default n
	help
	  The "ip" applet is a TCP/IP interface configuration and routing
	  utility.  You generally don't need "ip" to use busybox with
	  TCP/IP.

config FEATURE_IP_ADDRESS
	bool "ip address"
	default y
	depends on IP
	help
	  Address manipulation support for the "ip" applet.

config FEATURE_IP_LINK
	bool "ip link"
	default y
	depends on IP
	help
	  Configure network devices with "ip".

config FEATURE_IP_ROUTE
	bool "ip route"
	default y
	depends on IP
	help
	  Add support for routing table management to "ip".

config FEATURE_IP_TUNNEL
	bool "ip tunnel"
	default n
	depends on IP
	help
	  Add support for tunneling commands to "ip".

config FEATURE_IP_RULE
	bool "ip rule"
	default n
	depends on IP
	help
	  Add support for rule commands to "ip".

config FEATURE_IP_SHORT_FORMS
	bool "Support short forms of ip commands"
	default n
	depends on IP
	help
	  Also support short-form of ip <OBJECT> commands:
	  ip addr   -> ipaddr
	  ip link   -> iplink
	  ip route  -> iproute
	  ip tunnel -> iptunnel
	  ip rule   -> iprule

	  Say N unless you desparately need the short form of the ip
	  object commands.

config FEATURE_IP_RARE_PROTOCOLS
	bool "Support displaying rarely used link types"
	default n
	depends on IP
	help
	  If you are not going to use links of type "frad", "econet",
	  "bif" etc, you probably don't need to enable this.
	  Ethernet, wireless, infrared, ppp/slip, ip tunnelling
	  link types are supported without this option selected.

config IPADDR
	bool
	default y
	depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_ADDRESS

config IPLINK
	bool
	default y
	depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_LINK

config IPROUTE
	bool
	default y
	depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_ROUTE

config IPTUNNEL
	bool
	default y
	depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_TUNNEL

config IPRULE
	bool
	default y
	depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_RULE

config IPCALC
	bool "ipcalc"
	default n
	help
	  ipcalc takes an IP address and netmask and calculates the
	  resulting broadcast, network, and host range.

config FEATURE_IPCALC_FANCY
	bool "Fancy IPCALC, more options, adds 1 kbyte"
	default y
	depends on IPCALC
	help
	  Adds the options hostname, prefix and silent to the output of "ipcalc".

config FEATURE_IPCALC_LONG_OPTIONS
	bool "Enable long options"
	default n
	depends on IPCALC && GETOPT_LONG
	help
	  Support long options for the ipcalc applet.

config NAMEIF
	bool "nameif"
	default n
	select FEATURE_SYSLOG
	help
	  nameif is used to rename network interface by its MAC address.
	  Renamed interfaces MUST be in the down state.
	  It is possible to use a file (default: /etc/mactab)
	  with list of new interface names and MACs.
	  Maximum interface name length: IF_NAMESIZE = 16
	  File fields are separated by space or tab.
	  File format:
	  # Comment
	  new_interface_name    XX:XX:XX:XX:XX:XX

config FEATURE_NAMEIF_EXTENDED
	bool "Extended nameif"
	default n
	depends on NAMEIF
	help
	  This extends the nameif syntax to support the bus_info and driver
	  checks. The syntax is compatible to the normal nameif.
	  File format:
	    new_interface_name  driver=asix bus=usb-0000:00:08.2-3
	    new_interface_name  bus=usb-0000:00:08.2-3 00:80:C8:38:91:B5
	    new_interface_name  mac=00:80:C8:38:91:B5
	    new_interface_name  00:80:C8:38:91:B5

config NC
	bool "nc"
	default n
	help
	  A simple Unix utility which reads and writes data across network
	  connections.

config NC_SERVER
	bool "Netcat server options (-l)"
	default n
	depends on NC
	help
	  Allow netcat to act as a server.

config NC_EXTRA
	bool "Netcat extensions (-eiw and filename)"
	default n
	depends on NC
	help
	  Add -e (support for executing the rest of the command line after
	  making or receiving a successful connection), -i (delay interval for
	  lines sent), -w (timeout for initial connection).

config NETSTAT
	bool "netstat"
	default n
	help
	  netstat prints information about the Linux networking subsystem.

config FEATURE_NETSTAT_WIDE
	bool "Enable wide netstat output"
	default n
	depends on NETSTAT
	help
	  Add support for wide columns. Useful when displaying IPv6 addresses
	  (-W option).

config NSLOOKUP
	bool "nslookup"
	default n
	help
	  nslookup is a tool to query Internet name servers.

config PING
	bool "ping"
	default n
	help
	  ping uses the ICMP protocol's mandatory ECHO_REQUEST datagram to
	  elicit an ICMP ECHO_RESPONSE from a host or gateway.

config PING6
	bool "ping6"
	default n
	depends on FEATURE_IPV6 && PING
	help
	  This will give you a ping that can talk IPv6.

config FEATURE_FANCY_PING
	bool "Enable fancy ping output"
	default y
	depends on PING
	help
	  Make the output from the ping applet include statistics, and at the
	  same time provide full support for ICMP packets.

config PSCAN
	bool "pscan"
	default n
	help
	  Simple network port scanner.

config ROUTE
	bool "route"
	default n
	help
	  Route displays or manipulates the kernel's IP routing tables.

config SENDMAIL
	bool "sendmail"
	default n
	help
	  Barebones sendmail.

config FETCHMAIL
	bool "fetchmail"
	default n
	help
	  Barebones fetchmail.

config SLATTACH
	bool "slattach"
	default n
	help
	  slattach is a small utility to attach network interfaces to serial lines.

config TELNET
	bool "telnet"
	default n
	help
	  Telnet is an interface to the TELNET protocol, but is also commonly
	  used to test other simple protocols.

config FEATURE_TELNET_TTYPE
	bool "Pass TERM type to remote host"
	default y
	depends on TELNET
	help
	  Setting this option will forward the TERM environment variable to the
	  remote host you are connecting to.  This is useful to make sure that
	  things like ANSI colors and other control sequences behave.

config FEATURE_TELNET_AUTOLOGIN
	bool "Pass USER type to remote host"
	default y
	depends on TELNET
	help
	  Setting this option will forward the USER environment variable to the
	  remote host you are connecting to. This is useful when you need to
	  log into a machine without telling the username (autologin). This
	  option enables `-a' and `-l USER' arguments.

config TELNETD
	bool "telnetd"
	default n
	select FEATURE_SYSLOG
	help
	  A daemon for the TELNET protocol, allowing you to log onto the host
	  running the daemon.  Please keep in mind that the TELNET protocol
	  sends passwords in plain text.  If you can't afford the space for an
	  SSH daemon and you trust your network, you may say 'y' here.  As a
	  more secure alternative, you should seriously consider installing the
	  very small Dropbear SSH daemon instead:
		http://matt.ucc.asn.au/dropbear/dropbear.html

	  Note that for busybox telnetd to work you need several things:
	  First of all, your kernel needs:
		  UNIX98_PTYS=y
		  DEVPTS_FS=y

	  Next, you need a /dev/pts directory on your root filesystem:

		  $ ls -ld /dev/pts
		  drwxr-xr-x  2 root root 0 Sep 23 13:21 /dev/pts/

	  Next you need the pseudo terminal master multiplexer /dev/ptmx:

		  $ ls -la /dev/ptmx
		  crw-rw-rw-  1 root tty 5, 2 Sep 23 13:55 /dev/ptmx

	  Any /dev/ttyp[0-9]* files you may have can be removed.
	  Next, you need to mount the devpts filesystem on /dev/pts using:

		  mount -t devpts devpts /dev/pts

	  You need to be sure that Busybox has LOGIN and
	  FEATURE_SUID enabled.  And finally, you should make
	  certain that Busybox has been installed setuid root:

		chown root.root /bin/busybox
		chmod 4755 /bin/busybox

	  with all that done, telnetd _should_ work....


config FEATURE_TELNETD_STANDALONE
	bool "Support standalone telnetd (not inetd only)"
	default n
	depends on TELNETD
	help
	  Selecting this will make telnetd able to run standalone.

config TFTP
	bool "tftp"
	default n
	help
	  This enables the Trivial File Transfer Protocol client program.  TFTP
	  is usually used for simple, small transfers such as a root image
	  for a network-enabled bootloader.

config TFTPD
	bool "tftpd"
	default n
	help
	  This enables the Trivial File Transfer Protocol server program.
	  It expects that stdin is a datagram socket and a packet
	  is already pending on it. It will exit after one transfer.
	  In other words: it should be run from inetd in nowait mode,
	  or from udpsvd. Example: "udpsvd -E 0 69 tftpd DIR"

config FEATURE_TFTP_GET
	bool "Enable \"get\" command"
	default y
	depends on TFTP || TFTPD
	help
	  Add support for the GET command within the TFTP client.  This allows
	  a client to retrieve a file from a TFTP server.
	  Also enable upload support in tftpd, if tftpd is selected.

config FEATURE_TFTP_PUT
	bool "Enable \"put\" command"
	default y
	depends on TFTP || TFTPD
	help
	  Add support for the PUT command within the TFTP client.  This allows
	  a client to transfer a file to a TFTP server.
	  Also enable download support in tftpd, if tftpd is selected.

config FEATURE_TFTP_BLOCKSIZE
	bool "Enable \"blksize\" protocol option"
	default n
	depends on TFTP || TFTPD
	help
	  Allow tftp to specify block size, and tftpd to understand
	  "blksize" option.

config DEBUG_TFTP
	bool "Enable debug"
	default n
	depends on TFTP
	help
	  Enable debug settings for tftp.  This is useful if you're running
	  into problems with tftp as the protocol doesn't help you much when
	  you run into problems.

config TRACEROUTE
	bool "traceroute"
	default n
	help
	  Utility to trace the route of IP packets

config FEATURE_TRACEROUTE_VERBOSE
	bool "Enable verbose output"
	default n
	depends on TRACEROUTE
	help
	  Add some verbosity to traceroute.  This includes amongst other things
	  hostnames and ICMP response types.

config FEATURE_TRACEROUTE_SOURCE_ROUTE
	bool "Enable loose source route"
	default n
	depends on TRACEROUTE
	help
	  Add option to specify a loose source route gateway
	  (8 maximum).

config FEATURE_TRACEROUTE_USE_ICMP
	bool "Use ICMP instead of UDP"
	default n
	depends on TRACEROUTE
	help
	  Add feature to allow for ICMP ECHO instead of UDP datagrams.

source networking/udhcp/Config.in

config VCONFIG
	bool "vconfig"
	default n
	help
	  Creates, removes, and configures VLAN interfaces

config WGET
	bool "wget"
	default n
	help
	  wget is a utility for non-interactive download of files from HTTP,
	  HTTPS, and FTP servers.

config FEATURE_WGET_STATUSBAR
	bool "Enable a nifty process meter (+2k)"
	default y
	depends on WGET
	help
	  Enable the transfer progress bar for wget transfers.

config FEATURE_WGET_AUTHENTICATION
	bool "Enable HTTP authentication"
	default y
	depends on WGET
	help
	  Support authenticated HTTP transfers.

config FEATURE_WGET_LONG_OPTIONS
	bool "Enable long options"
	default n
	depends on WGET && GETOPT_LONG
	help
	  Support long options for the wget applet.

config ZCIP
	bool "zcip"
	default n
	select FEATURE_SYSLOG
	help
	  ZCIP provides ZeroConf IPv4 address selection, according to RFC 3927.
	  It's a daemon that allocates and defends a dynamically assigned
	  address on the 169.254/16 network, requiring no system administrator.

	  See http://www.zeroconf.org for further details, and "zcip.script"
	  in the busybox examples.

config TCPSVD
	bool "tcpsvd"
	default n
	help
	  tcpsvd listens on a TCP port and runs a program for each new connection

config UDPSVD
	bool "udpsvd"
	default n
	help
	  udpsvd listens on an UDP port and runs a program for each new connection

endmenu
