# 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 1
	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
