# IPv6 Options

# Copyright (c) 2016 Intel Corporation.
# SPDX-License-Identifier: Apache-2.0

menuconfig NET_IPV6
	bool "IPv6"
	default y
	help
	  Enable IPv6 support. This should be selected by default as there
	  is limited set of network bearers provided that support IPv4.

if NET_IPV6

config NET_IF_MAX_IPV6_COUNT
	int "Max number of IPv6 network interfaces in the system"
	default NET_VLAN_COUNT if NET_VLAN
	default 2 if NET_LOOPBACK
	default 1
	help
	  This tells how many network interfaces there will be in the system
	  that will have IPv6 enabled.

config NET_IF_UNICAST_IPV6_ADDR_COUNT
	int "Max number of unicast IPv6 addresses per network interface"
	default 6 if NET_L2_OPENTHREAD
	default 3 if NET_LOOPBACK
	default 2

config NET_IF_MCAST_IPV6_ADDR_COUNT
	int "Max number of multicast IPv6 addresses per network interface"
	default 8 if NET_L2_OPENTHREAD
	default 3

config NET_IF_IPV6_PREFIX_COUNT
	int "Max number of IPv6 prefixes per network interface"
	default 2

if NET_NATIVE_IPV6

config NET_IPV6_MTU
	int "Initial IPv6 MTU value"
	default 1280
	range 1280 1500
	help
	  The value should normally be 1280 which is the minimum IPv6 packet
	  size that implementations need to support without fragmentation.

config NET_INITIAL_HOP_LIMIT
	int "Initial IPv6 hop limit value for unicast packets"
	default 64
	range 0 255
	help
	  The value should normally be > 0. The device receiving the IPv6
	  packet will decrement the value and will drop the packet if the hop
	  limit value is 0. When sending, the packet is dropped before
	  transmitting to network if hop limit is 0.

config NET_INITIAL_MCAST_HOP_LIMIT
	int "Initial IPv6 hop limit value for multicast packets"
	default 1
	range 0 255
	help
	  The value should normally be > 0. The device receiving the IPv6
	  packet will decrement the value and will drop the packet if the hop
	  limit value is 0. When sending, the packet is dropped before
	  transmitting to network if hop limit is 0.
	  The default is 1 (same as in IPv4) which means that multicast packets
	  don't leave the local network unless the application explicitly
	  requests it.

config NET_IPV6_MAX_NEIGHBORS
	int "How many IPv6 neighbors are supported"
	default 8
	range 1 254
	help
	  The value depends on your network needs.

config NET_IPV6_FRAGMENT
	bool "Support IPv6 fragmentation"
	help
	  IPv6 fragmentation is disabled by default. This saves memory and
	  should not cause issues normally as we support anyway the minimum
	  length IPv6 packets (1280 bytes). If you enable fragmentation
	  support, please increase amount of RX data buffers so that larger
	  than 1280 byte packets can be received.

config NET_IPV6_FRAGMENT_MAX_COUNT
	int "How many packets to reassemble at a time"
	range 1 16
	default 1
	depends on NET_IPV6_FRAGMENT
	help
	  How many fragmented IPv6 packets can be waiting reassembly
	  simultaneously. Each fragment count might use up to 1280 bytes
	  of memory so you need to plan this and increase the network buffer
	  count.

config NET_IPV6_FRAGMENT_MAX_PKT
	int "How many fragments can be handled to reassemble a packet"
	default 2
	depends on NET_IPV6_FRAGMENT
	help
	  Incoming fragments are stored in per-packet queue before being
	  reassembled. This value defines the number of fragments that
	  can be handled at the same time to reassemble a single packet.

	  We do not have to accept IPv6 packets larger than 1500 bytes
	  (RFC 2460 ch 5). This means that we should receive everything
	  within the first two fragments. The first one being 1280 bytes and
	  the second one 220 bytes.

	  You can increase this value if you expect packets with more
	  than two fragments.

config NET_IPV6_FRAGMENT_TIMEOUT
	int "How long to wait the fragments to receive"
	range 1 60
	default 5
	depends on NET_IPV6_FRAGMENT
	help
	  How long to wait for IPv6 fragment to arrive before the reassembly
	  will timeout. RFC 2460 chapter 4.5 tells to wait for 60 seconds but
	  this might be too long in memory constrained devices. This value
	  is in seconds.

config NET_IPV6_MLD
	bool "Multicast Listener Discovery support"
	default y
	help
	  The value depends on your network needs. MLD should normally
	  be active. Currently we support only MLDv2. See RFC 3810 for
	  details.

config NET_IPV6_NBR_CACHE
	bool "Neighbor cache"
	default y
	help
	  The value depends on your network needs. Neighbor cache should
	  normally be active.

config NET_IPV6_ND
	bool "Activate neighbor discovery"
	depends on NET_IPV6_NBR_CACHE
	select NET_IPV6_MLD if !NET_TEST
	default y
	help
	  The value depends on your network needs. ND should normally
	  be active.

config NET_IPV6_DAD
	bool "Activate duplicate address detection"
	depends on NET_IPV6_NBR_CACHE
	default y
	help
	  The value depends on your network needs. DAD should normally
	  be active.

config NET_IPV6_RA_RDNSS
	bool "Support RA RDNSS option"
	depends on NET_IPV6_ND
	select DNS_RESOLVER
	default y
	help
	  Support Router Advertisement Recursive DNS Server option.
	  See RFC 6106 for details. The value depends on your network needs.

config NET_6LO
	bool "6lowpan IPv6 Compression library"
	default y if NET_L2_IEEE802154
	help
	  6lowpan compression and fragmentation. It is enabled by default
	  if 802.15.4 is present, since using IPv6 on it requires it.

	  You may disable this option if you wish to implement a non-IP
	  custom protocol on top of the 802.15.4 MAC (L2) layer.

config NET_6LO_CONTEXT
	bool "6lowpan context based compression"
	depends on NET_6LO
	help
	  Enables 6lowpan context based compression based on information
	  received in Router Advertisement (RA) message.

config NET_MAX_6LO_CONTEXTS
	int "Number of supported 6CO (6lowpan contexts options)"
	depends on NET_6LO_CONTEXT
	default 1
	range 1 16
	help
	  6lowpan context options table size. The value depends on your
	  network and memory consumption. More 6CO options uses more memory.

if NET_6LO
module = NET_6LO
module-dep = NET_LOG
module-str = Log level for 6LoWPAN library
module-help = Enables 6LoWPAN code to output debug messages.
source "subsys/net/Kconfig.template.log_config.net"
endif # NET_6LO

module = NET_IPV6
module-dep = NET_LOG
module-str = Log level for core IPv6
module-help = Enables core IPv6 code to output debug messages.
source "subsys/net/Kconfig.template.log_config.net"

module = NET_IPV6_ND
module-dep = NET_LOG
module-str = Log level for IPv6 Neighbor Discovery
module-help = Enables IPv6 Neighbor Discovery code to output debug messages.
source "subsys/net/Kconfig.template.log_config.net"

module = NET_ICMPV6
module-dep = NET_LOG
module-str = Log level for ICMPv6
module-help = Enables ICMPv6 code to output debug messages.
source "subsys/net/Kconfig.template.log_config.net"

module = NET_IPV6_NBR_CACHE
module-dep = NET_LOG
module-str = Log level for IPv6 neighbor cache
module-help = Enables IPv6 Neighbor Cache code to output debug messages.
source "subsys/net/Kconfig.template.log_config.net"

endif # NET_NATIVE_IPV6
endif # NET_IPV6
