# Kconfig.rpl - RPL Options

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

menuconfig NET_RPL
	bool "Enable RPL (Ripple) support"
	default n
	select NET_IPV6
	select NET_IPV6_NBR_CACHE
	select NET_ROUTE
	help
	See RFC 6550 and RFC 6551 for details. Enable this if required by
	the network needs.

if NET_RPL

config NET_RPL_PREFIX
	string "Network IPv6 prefix"
	help
	What is the DAG id (prefix) of the RPL network. This is only used
	if you are creating a root node. You should specify here the full
	IPv6 address as that is used as a root node address.
	Example: 2001:db8::1/64

choice
	prompt "Network type"
	default NET_RPL_L2_ANY
	default NET_RPL_L2_IEEE802154 if NET_L2_IEEE802154
	help
	The type of the network that this RPL device is supporting.
	Currently all the nodes in the network need to be the same type
	like IEEE 802.15.4.

config NET_RPL_L2_ANY
	bool "Any network type"

config NET_RPL_L2_IEEE802154
	bool "IEEE 802.15.4"
endchoice

choice
	prompt "Objective function"
	default NET_RPL_MRHOF
	help
	The objective function to use. All RPL nodes in a DODAG
	must use the same OF.
	The default is MRHOF, see RFC 6719 for details.
	Other alternative is OF0, see RFC 6552 for details.

config NET_RPL_MRHOF
	bool "Minimum Rank with Hysteresis, RFC 6719"
	help
	Choose this (MRHOF) if unsure.

config NET_RPL_OF0
	bool "OF Zero, RFC 6552"
	help
	Objective function zero (OF0).
endchoice

choice
	prompt "Routing Metric"
	default NET_RPL_MC_NONE
	help
	The routing metric to use. This must be a valid DAG Metric Container
	Object Type. When MRH OF (RFC6719) is used with ETX, no metric
	container must be used as the rank carries ETX directly.

config NET_RPL_MC_NONE
	bool "No routing metric"

config NET_RPL_MC_ETX
	bool "Estimated number of transmissions (ETX)"

config NET_RPL_MC_ENERGY
	bool "Energy based routing metric"
endchoice

choice
	prompt "Mode of operation (MOP)"
	default NET_RPL_MOP2
	help
	Mode of operation (MOP) level.
	MOP0 : No Downward routes maintained by RPL
	MOP1 : Non-Storing Mode of Operation
	MOP2 : Storing Mode of Operation with no multicast support
	MOP3 : Storing Mode of Operation with multicast support
	See RFC 6550 ch. 6.3.1 figure 15 for details.

config NET_RPL_MOP2
	bool "Storing Mode of Operation with no multicast support"
	help
	Choose this if unsure.

config NET_RPL_MOP3
	bool "Storing Mode of Operation with multicast support"
	select NET_ROUTE_MCAST
endchoice

config	NET_RPL_PROBING
	bool "Enable RPL probing"
	depends on NET_RPL
	default n
	help
	When enabled, probes will be sent periodically to keep
	parent link estimates up to date.

config	NET_RPL_MAX_INSTANCES
	int "Maximum number of RPL instances"
	depends on NET_RPL
	default 1
	help
	This determines how many RPL instances to allocate.

config	NET_RPL_MAX_DAG_PER_INSTANCE
	int "Maximum number of DAGs within an instance"
	depends on NET_RPL
	default 2
	help
	This determines how many DAG to allocate within one RPL instance.

config	NET_RPL_MAX_PARENTS
	int "Maximum number of parents for one node"
	default NET_IPV6_MAX_NEIGHBORS
	help
	This determines how many RPL parents each node can have.

config	NET_RPL_DAO_SPECIFY_DAG
	bool "Specify DAG when sending a DAO message."
	depends on NET_RPL
	default y
	help
	This determines whether the DAG is embedded into DAO ICMPv6 message.

config	NET_RPL_DIO_INTERVAL_MIN
	int "DIO interval."
	depends on NET_RPL
	default 12
	help
	The DIO interval value n represents 2^n ms.
	According to the specification, the default value is 3 which
	means 8 milliseconds. That is far too low when using duty cycling
	with wake-up intervals that are typically hundreds of milliseconds.
	We thus set the default to 2^12 ms = 4.096 s.

config	NET_RPL_DIO_INTERVAL_DOUBLINGS
	int "Maximum amount of timer doublings."
	depends on NET_RPL
	default 8
	help
	The maximum interval by default will be 2^(12+8) ms = 1048.576 s.
	RFC 6550 suggests a default value of 20, which would not be ok
	when we start with a minimum interval of 2^12.

config	NET_RPL_DIO_REDUNDANCY
	int "DIO redundancy."
	depends on NET_RPL
	default 10
	help
	RFC 6550 suggests a default value of 10. It is unclear what the basis
	of this suggestion is. Network operators might attain more efficient
	operation by tuning this parameter for specific deployments.
	See also RFC 6206.

config	NET_RPL_DEFAULT_LIFETIME_UNIT
	int "Default route lifetime unit."
	depends on NET_RPL
	default 65535
	help
	This is the granularity of time used in RPL lifetime values, in seconds.

config	NET_RPL_DEFAULT_LIFETIME
	int "Default route lifetime."
	depends on NET_RPL
	default 255
	help
	Default route lifetime as a multiple of the lifetime unit.

config	NET_RPL_MCAST_LIFETIME
	int "Multicast route lifetime."
	depends on NET_RPL_MOP3
	default 3
	help
	Multicast route lifetime as a multiple of the lifetime unit.

config	NET_RPL_MIN_HOP_RANK_INC
	int "Minimum hop rank increment"
	depends on NET_RPL
	default 256

config	NET_RPL_INIT_LINK_METRIC
	int "Initial link metric"
	depends on NET_RPL
	default 2
	help
	Initial metric attributed to a link when the ETX is unknown.

config	NET_RPL_DAO_TIMER
	int "DAO sending timer value"
	depends on NET_RPL
	default 4
	help
	How many seconds to wait before sending DAO.

config	NET_RPL_DAO_ACK
	bool "Node expecting DAO ACK"
	depends on NET_RPL
	default y
	help
	Node expecting DAO ACK for DAO message. Enable if interested
	in status of DAO message.

config  NET_RPL_DAO_MAX_RETRANSMISSIONS
	int "Max DAO retransmissions"
	depends on NET_RPL && NET_RPL_DAO_ACK
	default 4
	range 1 5
	help
	If NET_RPL_DAO_ACK enabled then node expects DAO ACK message from
	the parent. If DAO message is routed through different nodes, ACK
	may be lost. So retry sending DAO message for max number of trials.

config	NET_RPL_PREFERENCE
	int "DAG preference field default value"
	depends on NET_RPL
	default 0

config	NET_RPL_GROUNDED
	bool "DAG grounded default value"
	depends on NET_RPL
	default false
	help
	A grounded DODAG offers connectivity to hosts that are
	required for satisfying the application-defined goal.  A floating
	DODAG is not expected to satisfy the goal; in most cases, it only
	provides routes to nodes within the DODAG.

config	NET_RPL_DEFAULT_INSTANCE
	hex "Default DAG instance id"
	depends on NET_RPL
	default 0x1e
	help
	This value decides which DAG instance we should participate in
	by default.

config	NET_RPL_INSERT_HBH_OPTION
	bool "Add RPL Hop-by-hop ext header to sent UDP packets"
	depends on NET_RPL
	default y
	help
	This option control the insertion of the RPL Hop-by-Hop extension
	header into UDP packets originating from this node.

config	NET_RPL_DIS_SEND
	bool "Send DIS periodically"
	depends on NET_RPL
	default y
	help
	Enable periodic DODAG Information Solicitation message sending.

config	NET_RPL_DIS_INTERVAL
	int "Default DIS interval"
	depends on NET_RPL_DIS_SEND
	default 60
	help
	This value decides how often DIS messages are sent. The
	value is in seconds.

config NET_STATISTICS_RPL
	bool "Collect RPL statistics"
	depends on NET_STATISTICS
	default n
	help
	Keep track of RPL related statistics

config  NET_DEBUG_RPL
	bool "Debug RPL"
	default n
	depends on NET_RPL && NET_LOG
	help
	Enables RPL output debug messages

endif # NET_RPL
