/** @file
 @brief RPL data handler

 This is not to be included by the application.
 */

/*
 * Copyright (c) 2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef __RPL_H
#define __RPL_H

#include <kernel.h>
#include <stdbool.h>

#include <net/net_ip.h>

#ifdef __cplusplus
extern "C" {
#endif

#if defined(CONFIG_NET_RPL)

#include "route.h"

#define NET_ICMPV6_RPL			155  /* RPL Control Message */

#define NET_RPL_DODAG_SOLICIT		0x00
#define NET_RPL_DODAG_INFO_OBJ		0x01
#define NET_RPL_DEST_ADV_OBJ		0x02
#define NET_RPL_DEST_ADV_OBJ_ACK	0x03
#define NET_RPL_SEC_DODAG_SOLICIT	0x80
#define NET_RPL_SEC_DODAG_INFO_OBJ	0x81
#define NET_RPL_SEC_DEST_ADV_OBJ	0x82
#define NET_RPL_SEC_DEST_ADV_OBJ_ACK	0x83
#define NET_RPL_CONSISTENCY_CHECK	0x8A

/* Routing Metric/Constraint Type, RFC 6551 ch 6.1 */
#define NET_RPL_MC_NONE			0  /* Local identifier for empty MC */
#define NET_RPL_MC_NSA                  1  /* Node State and Attributes     */
#define NET_RPL_MC_ENERGY               2  /* Node Energy                   */
#define NET_RPL_MC_HOPCOUNT             3  /* Hop Count                     */
#define NET_RPL_MC_THROUGHPUT           4  /* Throughput                    */
#define NET_RPL_MC_LATENCY              5  /* Latency                       */
#define NET_RPL_MC_LQL                  6  /* Link Quality Level            */
#define NET_RPL_MC_ETX                  7  /* Expected Transmission Count   */
#define NET_RPL_MC_LC                   8  /* Link Color                    */

/* Routing Metric/Constraint Common Header Flag Field, RFC 6551, ch 6.3 */
#define NET_RPL_MC_FLAG_P               BIT(5)
#define NET_RPL_MC_FLAG_C               BIT(6)
#define NET_RPL_MC_FLAG_O               BIT(7)
#define NET_RPL_MC_FLAG_R               BIT(8)

/* Routing Metric/Constraint Common Header A Field, RFC 6551, ch 6.4 */
#define NET_RPL_MC_A_ADDITIVE		0
#define NET_RPL_MC_A_MAXIMUM		1
#define NET_RPL_MC_A_MINIMUM		2
#define NET_RPL_MC_A_MULTIPLICATIVE	3

/* Node type field, RFC 6551, ch 6.7 */
#define NET_RPL_MC_NODE_TYPE_MAINS	0
#define NET_RPL_MC_NODE_TYPE_BATTERY	1
#define NET_RPL_MC_NODE_TYPE_SCAVENGING	2

/* The bit index within the flags field of the RPL metric object energy
 * structure.
 */
#define NET_RPL_MC_ENERGY_INCLUDED	3
#define NET_RPL_MC_ENERGY_TYPE		1
#define NET_RPL_MC_ENERGY_ESTIMATION	0

/* RPL control message options. */
#define NET_RPL_OPTION_PAD1                 0
#define NET_RPL_OPTION_PADN                 1
#define NET_RPL_OPTION_DAG_METRIC_CONTAINER 2
#define NET_RPL_OPTION_ROUTE_INFO           3
#define NET_RPL_OPTION_DAG_CONF             4
#define NET_RPL_OPTION_TARGET               5
#define NET_RPL_OPTION_TRANSIT              6
#define NET_RPL_OPTION_SOLICITED_INFO       7
#define NET_RPL_OPTION_PREFIX_INFO          8
#define NET_RPL_OPTION_TARGET_DESC          9

#define NET_RPL_MAX_RANK_INC		(7 * CONFIG_NET_RPL_MIN_HOP_RANK_INC)
#define NET_RPL_INFINITE_RANK		0xffff

/* Rank of a root node. */
#define NET_RPL_ROOT_RANK(instance)	((instance)->min_hop_rank_inc)

#define NET_RPL_DAG_RANK(rank, instance) ((rank) / \
					  (instance)->min_hop_rank_inc)

/*
 * The ETX in the metric container is expressed as a fixed-point value
 * whose integer part can be obtained by dividing the value by
 * NET_RPL_MC_ETX_DIVISOR.
 */
#define NET_RPL_MC_ETX_DIVISOR		256

/* DAG Mode of Operation */
#define NET_RPL_MOP_NO_DOWNWARD_ROUTES      0
#define NET_RPL_MOP_NON_STORING             1
#define NET_RPL_MOP_STORING_NO_MULTICAST    2
#define NET_RPL_MOP_STORING_MULTICAST       3

#if defined(CONFIG_NET_RPL_DEFAULT_INSTANCE)
#define NET_RPL_DEFAULT_INSTANCE CONFIG_NET_RPL_DEFAULT_INSTANCE
#else
#define NET_RPL_DEFAULT_INSTANCE 0x1e
#endif

#define NET_RPL_PARENT_FLAG_UPDATED           0x1
#define NET_RPL_PARENT_FLAG_LINK_METRIC_VALID 0x2

/* RPL IPv6 extension header option. */
#define NET_RPL_HDR_OPT_LEN		4
#define NET_RPL_HOP_BY_HOP_LEN		(NET_RPL_HDR_OPT_LEN + 2 + 2)
#define NET_RPL_HDR_OPT_DOWN		0x80
#define NET_RPL_HDR_OPT_DOWN_SHIFT	7
#define NET_RPL_HDR_OPT_RANK_ERR	0x40
#define NET_RPL_HDR_OPT_RANK_ERR_SHIFT	6
#define NET_RPL_HDR_OPT_FWD_ERR		0x20
#define NET_RPL_HDR_OPT_FWD_ERR_SHIFT	5

/**
 * RPL modes
 *
 * The RPL module can be in either of three modes: mesh mode
 * (NET_RPL_MODE_MESH), feater mode (NET_RPL_MODE_FEATHER), and leaf mode
 * (NET_RPL_MODE_LEAF). In mesh mode, nodes forward data for other nodes,
 * and are reachable by others. In feather mode, nodes can forward
 * data for other nodes, but are not reachable themselves. In leaf
 * mode, nodes do not forward data for others, but are reachable by
 * others.
 */
enum net_rpl_mode {
	NET_RPL_MODE_MESH,
	NET_RPL_MODE_FEATHER,
	NET_RPL_MODE_LEAF,
};

/**
 * Flag values in DAO message.
 */
#define NET_RPL_DAO_K_FLAG                0x80  /* DAO ACK requested */
#define NET_RPL_DAO_D_FLAG                0x40  /* DODAG ID present */

#define NET_RPL_LOLLIPOP_MAX_VALUE        255
#define NET_RPL_LOLLIPOP_CIRCULAR_REGION  127
#define NET_RPL_LOLLIPOP_SEQUENCE_WINDOWS 16

static inline uint8_t net_rpl_lollipop_init(void)
{
	return NET_RPL_LOLLIPOP_MAX_VALUE -
		NET_RPL_LOLLIPOP_SEQUENCE_WINDOWS + 1;
}

static inline void net_rpl_lollipop_increment(uint8_t *counter)
{
	if (*counter > NET_RPL_LOLLIPOP_CIRCULAR_REGION) {
		*counter = (*counter + 1) & NET_RPL_LOLLIPOP_MAX_VALUE;
	} else {
		*counter = (*counter + 1) & NET_RPL_LOLLIPOP_CIRCULAR_REGION;
	}
}

static inline bool net_rpl_lollipop_is_init(uint8_t counter)
{
	return counter > NET_RPL_LOLLIPOP_CIRCULAR_REGION;
}

struct net_rpl_instance;
struct net_rpl_dag;

/**
 * @brief DIO prefix suboption.
 */
struct net_rpl_prefix {
	/** IPv6 address prefix */
	struct in6_addr prefix;

	/** Lifetime of the prefix */
	uint32_t lifetime;

	/** Length of the prefix */
	uint8_t length;

	/** Prefix flags */
	uint8_t flags;
};

/**
 * @brief Node energy object, RFC 6551, ch 3.2
 */
struct net_rpl_node_energy_object {
	/** Energy node flags */
	uint8_t flags;

	/** Energy estimation */
	uint8_t estimation;
};

/**
 * @brief DAG Metric Container. RFC 6551, ch 2.1
 */
struct net_rpl_metric_container {
	/** Type of the container */
	uint8_t type;

	/** Container flags */
	uint8_t flags;

	/** Aggregated value (A field) */
	uint8_t aggregated;

	/**
	 * Precedence of this Routing Metric/Constraint object relative
	 * to other objects in the container.
	 */
	uint8_t precedence;

	/** Length of the object body */
	uint8_t length;

	/** Metric container information */
	union metric_object {
		struct net_rpl_node_energy_object energy;
		uint16_t etx;
	} obj;
};

/**
 * @brief Parent information.
 */
struct net_rpl_parent {
	/** Used DAG */
	struct net_rpl_dag *dag;

	/** Used metric container */
	struct net_rpl_metric_container mc;

	/** When last transmit happened */
	uint32_t last_tx_time;

	/** Rank of the parent */
	uint16_t rank;

	/** Destination Advertisement Trigger Sequence Number */
	uint8_t dtsn;

	/** Parent flags */
	uint8_t flags;
};

/**
 * @brief Directed Acyclic Graph (DAG)
 */
struct net_rpl_dag {
	/** DAG id */
	struct in6_addr dag_id;

	/** What is the preferred parent. */
	struct net_rpl_parent *preferred_parent;

	/** IPv6 prefix information */
	struct net_rpl_prefix prefix_info;

	/** Used RPL instance */
	struct net_rpl_instance *instance;

	/** Minimum rank */
	uint16_t min_rank;

	/** DAG rank */
	uint16_t rank;

	/** DAG version. */
	uint8_t version;

	/** DODAG preference. */
	uint8_t preference : 3;

	/** Is this DAG used or not. */
	uint8_t is_used : 1;

	/** Is DAG grounded or floating. */
	uint8_t is_grounded : 1;

	/** Is DAG joined or not. */
	uint8_t is_joined : 1;

	uint8_t _unused : 2;
};

/**
 * @brief Get related neighbor information from parent pointer.
 *
 * @param data Pointer to parent.
 *
 * @return Neighbor pointer if found, NULL if neighbor is not found.
 */
struct net_nbr *net_rpl_get_nbr(struct net_rpl_parent *data);

/**
 * @brief RPL object function (OF) reset.
 *
 * @details Reset the OF state for a specific DAG. This function is called when
 * doing a global repair on the DAG.
 *
 * @param dag Pointer to DAG object
 */
extern void net_rpl_of_reset(struct net_rpl_dag *dag);

/**
 * @brief RPL object function (OF) neighbor link callback.
 *
 * @details Receives link-layer neighbor information. The etx parameter
 * specifies the current ETX(estimated transmissions) for the neighbor.
 *
 * @param iface Network interface
 * @param parent Parent of the neighbor
 * @param status Transmission status
 * @param ext Estimated transmissions value
 *
 * @return 0 if ok, < 0 if error
 */
extern int net_rpl_of_neighbor_link_cb(struct net_if *iface,
				       struct net_rpl_parent *parent,
				       int status, int etx);

/**
 * @brief RPL object function (OF) get best parent.
 *
 * @details Compares two parents and returns the best one.
 *
 * @param iface Network interface.
 * @param parentA First parent.
 * @param parentB Second parent.
 *
 * @return Best parent is returned.
 */
extern struct net_rpl_parent *
net_rpl_of_best_parent(struct net_if *iface,
		       struct net_rpl_parent *parentA,
		       struct net_rpl_parent *parentB);

/**
 * @brief RPL object function (OF) get best DAG.
 *
 * @details Compares two DAGs and returns the best one.
 *
 * @param dagA First DAG.
 * @param dagB Second DAG.
 *
 * @return Best DAG.
 */
extern struct net_rpl_dag *net_rpl_of_best_dag(struct net_rpl_dag *dagA,
					       struct net_rpl_dag *dagB);

/**
 * @brief RPL object function (OF) calculate rank.
 *
 * @details Calculates a rank value using the parent rank and a base rank.
 * If parent is not set, the OF selects a default increment that is
 * added to the base rank. Otherwise, the OF uses information known
 * about parent to select an increment to the base rank.
 */
extern uint16_t net_rpl_of_calc_rank(struct net_rpl_parent *parent,
				     uint16_t rank);

/**
 * @brief RPL object function (OF) update metric container.
 *
 * @details Updates the metric container for outgoing DIOs in a certain DAG.
 * If the OF of the DAG does not use metric containers, the function
 * should set the object type to NET_RPL_MC_NONE.
 *
 * @param instance Pointer to RPL instance.
 */
extern int net_rpl_of_update_mc(struct net_rpl_instance *instance);

/**
 * @brief RPL object function (OF) objective code point used.
 *
 * @details Check if we support desired objective function.
 *
 * @param ocp Objective Code Point value
 *
 * @return true if OF is supported, false otherwise.
 */
extern bool net_rpl_of_find(uint16_t ocp);

/**
 * @brief Return RPL object function (OF) objective code point used.
 *
 * @return OCP (Objective Code Point) value used.
 */
extern uint16_t net_rpl_of_get(void);

/**
 * @brief RPL instance structure
 *
 * Describe RPL instance.
 */
struct net_rpl_instance {
	/** Routing metric information */
	struct net_rpl_metric_container mc;

	/** All the DAGs for this RPL instance */
	struct net_rpl_dag dags[CONFIG_NET_RPL_MAX_DAG_PER_INSTANCE];

#if defined(CONFIG_NET_RPL_PROBING)
	/** When next probe message will be sent. */
	struct k_delayed_work probing_timer;
#endif /* CONFIG_NET_RPL_PROBING */

	/** DODAG Information Object timer. */
	struct k_delayed_work dio_timer;

	/** Destination Advertisement Object timer. */
	struct k_delayed_work dao_timer;

	/** DAO lifetime timer. */
	struct k_delayed_work dao_lifetime_timer;

#if defined(CONFIG_NET_RPL_DAO_ACK)
	/** DAO retransmit timer */
	struct k_delayed_work dao_retransmit_timer;

	/** DAO number of retransmissions */
	uint8_t dao_transmissions;
#endif

	/** Network interface to send DAO */
	struct net_if *iface;

	/** Current DAG in use */
	struct net_rpl_dag *current_dag;

	/** Current default router information */
	struct net_if_router *default_route;

	/** Amount of time for completion of dio interval */
	uint32_t dio_next_delay;

	/** Objective Code Point (Used objective function) */
	uint16_t ocp;

	/** MaxRankIncrease, RFC 6550, ch 6.7.6 */
	uint16_t max_rank_inc;

	/** MinHopRankIncrease, RFC 6550, ch 6.7.6 */
	uint16_t min_hop_rank_inc;

	/**
	 * Provides the unit in seconds that is used to express route
	 * lifetimes in RPL.  For very stable networks, it can be hours
	 * to days. RFC 6550, ch 6.7.6
	 */
	uint16_t lifetime_unit;

#if defined(CONFIG_NET_RPL_STATS)
	/** Number of DIO intervals for this RPL instance. */
	uint16_t dio_intervals;

	/** Number of DIOs sent for this RPL instance. */
	uint16_t dio_send_pkt;

	/** Number of DIOs received for this RPL instance. */
	uint16_t dio_recv_pkt;
#endif /* CONFIG_NET_RPL_STATS */

	/**
	 * This is the lifetime that is used as default for all RPL routes.
	 * It is expressed in units of Lifetime Units, e.g., the default
	 * lifetime in seconds is (Default Lifetime) * (Lifetime Unit)
	 * RFC 6550, ch 6.7.6
	 */
	uint8_t default_lifetime;

	/** Instance ID of this RPL instance */
	uint8_t instance_id;

	/** Destination Advertisement Trigger Sequence Number */
	uint8_t dtsn;

	/** Mode of operation */
	uint8_t mop;

	/** DIOIntervalDoublings, RFC 6550, ch 6.7.6 */
	uint8_t dio_interval_doublings;

	/** DIOIntervalMin, RFC 6550, ch 6.7.6 */
	uint8_t dio_interval_min;

	/** Current DIO interval */
	uint8_t dio_interval_current;

	/** DIORedundancyConstant, ch 6.7.6 */
	uint8_t dio_redundancy;

	/** Current number of DIOs received (temp var) */
	uint8_t dio_counter;

	/** Keep track of whether we can send DIOs or not (true if we can send)
	 */
	bool dio_send;

	/** Is this RPL instance used or not */
	bool is_used;

	/** Is DAO timer active or not. */
	bool dao_timer_active;

	/** Is DAO lifetime timer active or not. */
	bool dao_lifetime_timer_active;
};

/**
 * @brief RPL DIO structure
 *
 * Describe RPL DAG Information Object.
 */
struct net_rpl_dio {
	/** Routing metric information */
	struct net_rpl_metric_container mc;

	/** DAG id */
	struct in6_addr dag_id;

	/** IPv6 prefix information */
	struct net_rpl_prefix prefix_info;

	/** IPv6 destination prefix */
	struct net_rpl_prefix destination_prefix;

	/** Objective Code Point (OF being used) */
	uint16_t ocp;

	/** Current rank */
	uint16_t rank;

	/** MaxRankIncrease, RFC 6550, ch 6.7.6 */
	uint16_t max_rank_inc;

	/** MinHopRankIncrease, RFC 6550, ch 6.7.6 */
	uint16_t min_hop_rank_inc;
	/**
	 * Provides the unit in seconds that is used to express route
	 * lifetimes in RPL.  For very stable networks, it can be hours
	 * to days. RFC 6550, ch 6.7.6
	 */
	uint16_t lifetime_unit;

	/**
	 * This is the lifetime that is used as default for all RPL routes.
	 * It is expressed in units of Lifetime Units, e.g., the default
	 * lifetime in seconds is (Default Lifetime) * (Lifetime Unit)
	 * RFC 6550, ch 6.7.6
	 */
	uint8_t default_lifetime;

	/** Instance ID of this RPL instance */
	uint8_t instance_id;

	/** Destination Advertisement Trigger Sequence Number */
	uint8_t dtsn;

	/** Mode of operation */
	uint8_t mop;

	/** DAG interval doublings */
	uint8_t dag_interval_doublings;

	/** DAG interval min */
	uint8_t dag_interval_min;

	/** DAG interval */
	uint8_t dag_interval_current;

	/** DAG redundancy constant */
	uint8_t dag_redundancy;

	/** Is this DAG grounded or floating */
	uint8_t grounded;

	/** DODAG preference */
	uint8_t preference;

	/** DODAG version number */
	uint8_t version;
};

/**
 * @brief RPL route information source
 */
enum net_rpl_route_source {
	NET_RPL_ROUTE_INTERNAL,
	NET_RPL_ROUTE_UNICAST_DAO,
	NET_RPL_ROUTE_MULTICAST_DAO,
	NET_RPL_ROUTE_DIO,
};

/**
 * @brief RPL route entry
 *
 * Stores extra information for RPL route.
 */
struct net_rpl_route_entry {
	/** Dag info for this route */
	struct net_rpl_dag *dag;

	/** Lifetime for this route entry (in seconds) */
	uint32_t lifetime;

	/** Where this route came from */
	enum net_rpl_route_source route_source;

	/** No-Path target option with lifetime 0 received (true) or (false) */
	bool no_path_received;
};

/**
 * The extra data size is used in route.h to determine how much extra
 * space to allocate for RPL specific data.
 */
#define NET_ROUTE_EXTRA_DATA_SIZE sizeof(struct net_rpl_route_entry)

/**
 * @brief Check if the IPv6 address is a RPL multicast address.
 *
 * @param addr IPv6 address
 *
 * @return True if address is RPL multicast address, False otherwise.
 */
static inline bool net_rpl_is_ipv6_addr_mcast(const struct in6_addr *addr)
{
	return addr->s6_addr32[0] == htonl(0xff020000) &&
		addr->s6_addr32[1] == 0x00000000 &&
		addr->s6_addr32[2] == 0x00000000 &&
		addr->s6_addr32[3] == htonl(0x0000001a);
}

/**
 *  @brief Create RPL IPv6 multicast address FF02::1a
 *
 *  @param addr IPv6 address.
 *
 *  @return Pointer to given IPv6 address.
 */
static inline
struct in6_addr *net_rpl_create_mcast_address(struct in6_addr *addr)
{
	addr->s6_addr[0]   = 0xFF;
	addr->s6_addr[1]   = 0x02;
	addr->s6_addr16[1] = 0;
	addr->s6_addr16[2] = 0;
	addr->s6_addr16[3] = 0;
	addr->s6_addr16[4] = 0;
	addr->s6_addr16[5] = 0;
	addr->s6_addr16[6] = 0;
	addr->s6_addr[14]  = 0;
	addr->s6_addr[15]  = 0x1a;

	return addr;
}

/**
 * @brief Return information whether the DAG is in use right now.
 *
 * @param dag Pointer to DAG.
 *
 * @return true if in use, false otherwise
 */
static inline bool net_rpl_dag_is_used(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	return !!dag->is_used;
}

/**
 * @brief Set the DAG as not in use.
 *
 * @param dag Pointer to DAG.
 */
static inline void net_rpl_dag_set_not_used(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	dag->is_used = 0;
}

/**
 * @brief Set the DAG as in use.
 *
 * @param dag Pointer to DAG.
 */
static inline void net_rpl_dag_set_used(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	dag->is_used = 1;
}

/**
 * @brief Return information whether the DAG is grounded or floating.
 *
 * @param dag Pointer to DAG.
 *
 * @return true if grounded, false if floating
 */
static inline bool net_rpl_dag_is_grounded(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	return !!dag->is_grounded;
}

/**
 * @brief Set DAG information whether it is grounded or floating.
 *
 * @param dag Pointer to DAG.
 */
static inline void net_rpl_dag_set_grounded_status(struct net_rpl_dag *dag,
						   bool grounded)
{
	NET_ASSERT(dag);

	dag->is_grounded = grounded;
}

/**
 * @brief Return information whether the DAG is joined or not.
 *
 * @param dag Pointer to DAG.
 *
 * @return true if joined, false otherwise
 */
static inline bool net_rpl_dag_is_joined(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	return !!dag->is_joined;
}

/**
 * @brief Mark DAG as joined.
 *
 * @param dag Pointer to DAG.
 */
static inline void net_rpl_dag_join(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	dag->is_joined = 1;
}

/**
 * @brief Mark DAG as joined.
 *
 * @param dag Pointer to DAG.
 */
static inline void net_rpl_dag_unjoin(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	dag->is_joined = 0;
}

/**
 * @brief Get preference for this DAG.
 *
 * @details This function returns the preference of the dag.
 *
 * @param dag Pointer to DAG.
 *
 * @return preference value
 */
static inline
uint8_t net_rpl_dag_get_preference(struct net_rpl_dag *dag)
{
	NET_ASSERT(dag);

	return dag->preference;
}

/**
 * @brief Set preference for this DAG.
 *
 * @details This function sets the preference of the dag.
 *
 * @param dag Pointer to DAG.
 * @param preference New preference value.
 */
static inline
void net_rpl_dag_set_preference(struct net_rpl_dag *dag,
				uint8_t preference)
{
	NET_ASSERT(dag && preference <= 8);

	dag->preference = preference;
}

/**
 * @typedef net_rpl_join_callback_t
 * @brief Callback for evaluating if this is a network to join or not.
 * @param dio Pointer to DIO.
 * @return True if the network is to be joined, false otherwise.
 */
typedef bool (*net_rpl_join_callback_t)(struct net_rpl_dio *dio);

/**
 * @brief Register a callback that determines if the network is to be
 * joined or not.
 *
 * @param cb Callback function
 */
void net_rpl_set_join_callback(net_rpl_join_callback_t cb);

/**
 * @brief Send a DODAG Information Solicitation message.
 *
 * @param dst Destination IPv6 address.
 * @param iface Interface to send the message to.
 *
 * @return 0 message was sent ok, <0 otherwise
 */
int net_rpl_dis_send(struct in6_addr *dst, struct net_if *iface);

/**
 * @brief Send a Destination Advertisement Object message.
 *
 * @param iface Network interface to use, this can be set to NULL in which
 * case the function can try to figure it out itself.
 * @param parent Pointer to parent information.
 * @param prefix IPv6 address
 * @param lifetime Lifetime of the advertisement.
 *
 * @return 0 message was sent ok, <0 otherwise
 */
int net_rpl_dao_send(struct net_if *iface,
		     struct net_rpl_parent *parent,
		     struct in6_addr *prefix,
		     uint8_t lifetime);

/**
 * @brief Send a DODAG Information Object message.
 *
 * @param iface Network interface to use, this can be set to NULL in which
 * case the function can try to figure it out itself.
 * @param instance Pointer to instance object.
 * @param src IPv6 source address.
 * @param dst IPv6 destination address.
 *
 * @return 0 message was sent ok, <0 otherwise
 */
int net_rpl_dio_send(struct net_if *iface,
		     struct net_rpl_instance *instance,
		     struct in6_addr *src,
		     struct in6_addr *dst);

/**
 * @brief Set the root DAG.
 *
 * @param iface Network interface to use.
 * @param instance Pointer to instance object.
 * @param dag_id IPv6 address of the DAG.
 *
 * @return DAG object or NULL if creation failed.
 */
struct net_rpl_dag *net_rpl_set_root(struct net_if *iface,
				     uint8_t instance_id,
				     struct in6_addr *dag_id);

/**
 * @brief Get first available DAG.
 *
 * @return First available DAG or NULL if none found.
 */
struct net_rpl_dag *net_rpl_get_any_dag(void);

/**
 * @brief Set IPv6 prefix we are using.
 *
 * @param iface Network interface in use.
 * @param dag DAG in use.
 * @param prefix IPv6 prefix we are using.
 * @param prefix_len IPv6 prefix length.
 *
 * @return True if prefix could be set, false otherwise.
 */
bool net_rpl_set_prefix(struct net_if *iface,
			struct net_rpl_dag *dag,
			struct in6_addr *prefix,
			uint8_t prefix_len);

/**
 * @brief Do global repair for this route.
 *
 * @param route IPv6 route entry.
 */
void net_rpl_global_repair(struct net_route_entry *route);

/**
 * @brief Update RPL headers in IPv6 packet.
 *
 * @param buf Network buffer.
 * @param addr IPv6 address of next hop host.
 *
 * @return 0 if ok, < 0 if error
 */
int net_rpl_update_header(struct net_buf *buf, struct in6_addr *addr);

/**
 * @brief Verify RPL header in IPv6 packet.
 *
 * @param buf Network buffer fragment list.
 * @param frag Current network buffer fragment.
 * @param offset Where the RPL header starts in the packet
 * @param pos How long the RPL header was, this is returned to the caller.
 * @param out result True if ok, false if error
 *
 * @return frag Returns the fragment where this call finished reading.
 */
struct net_buf *net_rpl_verify_header(struct net_buf *buf, struct net_buf *frag,
				      uint16_t offset, uint16_t *pos,
				      bool *result);

/**
 * @brief Insert RPL extension header to IPv6 packet.
 *
 * @param buf Network buffer.
 *
 * @return 0 if ok, <0 if error.
 */
int net_rpl_insert_header(struct net_buf *buf);

/**
 * @brief Revert RPL extension header to IPv6 packet.
 *        Revert flags, instance ID and sender rank in the packet.
 *
 * @param buf Network buffer.
 * @param offset Where the HBH header starts in the packet
 * @param pos How long the RPL header was, this is returned to the caller.
 *
 * @return 0 if ok, <0 if error.
 */
int net_rpl_revert_header(struct net_buf *buf, uint16_t offset, uint16_t *pos);

/**
 * @brief Get parent IPv6 address.
 *
 * @param iface Network interface
 * @param parent Parent pointer
 *
 * @return Parent IPv6 address, or NULL if no such parent.
 */
struct in6_addr *net_rpl_get_parent_addr(struct net_if *iface,
					 struct net_rpl_parent *parent);

/**
 * @brief Set the RPL mode (mesh or leaf) of this node.
 *
 * @param new_mode New RPL mode. Value is either NET_RPL_MODE_MESH,
 * NET_RPL_MODE_FEATHER or NET_RPL_MODE_LEAF. The NET_RPL_MODE_MESH is
 * the default mode.
 */
void net_rpl_set_mode(enum net_rpl_mode new_mode);

/**
 * @brief Get the RPL mode (mesh or leaf) of this node.
 *
 * @return Current RPL mode.
 */
enum net_rpl_mode net_rpl_get_mode(void);

/**
 * @brief Get the default RPL instance.
 *
 * @return Current default RPL instance.
 */
struct net_rpl_instance *net_rpl_get_default_instance(void);

void net_rpl_init(void);
#else
#define net_rpl_init(...)
#define net_rpl_global_repair(...)
#define net_rpl_update_header(...) 0
#endif /* CONFIG_NET_RPL */

#ifdef __cplusplus
}
#endif

#endif /* __RPL_H */
