#
# SCTP configuration
#

menuconfig IP_SCTP
	tristate "The SCTP Protocol"
	depends on INET
	depends on IPV6 || IPV6=n
	select CRYPTO
	select CRYPTO_HMAC
	select CRYPTO_SHA1
	select LIBCRC32C
	---help---
	  Stream Control Transmission Protocol

	  From RFC 2960 <http://www.ietf.org/rfc/rfc2960.txt>.

	  "SCTP is a reliable transport protocol operating on top of a
	  connectionless packet network such as IP.  It offers the following
	  services to its users:

	  -- acknowledged error-free non-duplicated transfer of user data,
	  -- data fragmentation to conform to discovered path MTU size,
	  -- sequenced delivery of user messages within multiple streams,
	  with an option for order-of-arrival delivery of individual user
	  messages,
	  -- optional bundling of multiple user messages into a single SCTP
	  packet, and
	  -- network-level fault tolerance through supporting of multi-
	  homing at either or both ends of an association."

	  To compile this protocol support as a module, choose M here: the
	  module will be called sctp. Debug messages are handeled by the
	  kernel's dynamic debugging framework.

	  If in doubt, say N.

if IP_SCTP

config NET_SCTPPROBE
	tristate "SCTP: Association probing"
        depends on PROC_FS && KPROBES
        ---help---
        This module allows for capturing the changes to SCTP association
        state in response to incoming packets. It is used for debugging
        SCTP congestion control algorithms. If you don't understand
        what was just said, you don't need it: say N.

        To compile this code as a module, choose M here: the
        module will be called sctp_probe.

config SCTP_DBG_OBJCNT
	bool "SCTP: Debug object counts"
	depends on PROC_FS
	help
	  If you say Y, this will enable debugging support for counting the 
	  type of objects that are currently allocated.  This is useful for 
	  identifying memory leaks. This debug information can be viewed by
	  'cat /proc/net/sctp/sctp_dbg_objcnt'

	  If unsure, say N
choice
	prompt "Default SCTP cookie HMAC encoding"
	default SCTP_DEFAULT_COOKIE_HMAC_MD5
	help
	  This option sets the default sctp cookie hmac algorithm
	  when in doubt select 'md5'

config SCTP_DEFAULT_COOKIE_HMAC_MD5
	bool "Enable optional MD5 hmac cookie generation"
	help
	  Enable optional MD5 hmac based SCTP cookie generation
	select SCTP_COOKIE_HMAC_MD5

config SCTP_DEFAULT_COOKIE_HMAC_SHA1
	bool "Enable optional SHA1 hmac cookie generation"
	help
	  Enable optional SHA1 hmac based SCTP cookie generation
	select SCTP_COOKIE_HMAC_SHA1

config SCTP_DEFAULT_COOKIE_HMAC_NONE
	bool "Use no hmac alg in SCTP cookie generation"
	help
	  Use no hmac algorithm in SCTP cookie generation

endchoice

config SCTP_COOKIE_HMAC_MD5
	bool "Enable optional MD5 hmac cookie generation"
	help
	  Enable optional MD5 hmac based SCTP cookie generation
	select CRYPTO_HMAC if SCTP_COOKIE_HMAC_MD5
	select CRYPTO_MD5 if SCTP_COOKIE_HMAC_MD5

config SCTP_COOKIE_HMAC_SHA1
	bool "Enable optional SHA1 hmac cookie generation"
	help
	  Enable optional SHA1 hmac based SCTP cookie generation
	select CRYPTO_HMAC if SCTP_COOKIE_HMAC_SHA1
	select CRYPTO_SHA1 if SCTP_COOKIE_HMAC_SHA1

config INET_SCTP_DIAG
	depends on INET_DIAG
	def_tristate INET_DIAG


endif # IP_SCTP
