# 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_ND
	select NET_ROUTE
	help
	  See RFC 6550 and RFC 6551 for details. Enable this if required by
	  the network needs.

if NET_RPL

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_EXT
	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_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_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_DEBUG_RPL
	bool "Debug RPL"
	default n
	depends on NET_RPL && NET_LOG
	help
	  Enables RPL output debug messages

endif # NET_RPL
