/*
 * Copyright (c) 2017 CPqD Foundation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <misc/printk.h>
#include <stdlib.h>
#include "rpl.h"

#define CURRENT_VERSION 0

void main(void)
{
	u8_t init_version = CURRENT_VERSION;

	char prefix_str[NET_IPV6_ADDR_LEN + 1];
	struct in6_addr prefix;
	u8_t prefix_len;

	printk("RPL border router starting\n");

	struct net_if *iface = net_if_get_default();

	if (!iface) {
		printk("Interface is NULL\n");
		printk("Failed to setup RPL root node\n");
		return;
	}

	/* Read prefix from KConfig and parse it */
	memset(prefix_str, 0, sizeof(prefix_str));
	memcpy(prefix_str, CONFIG_NET_RPL_PREFIX,
			min(strlen(CONFIG_NET_RPL_PREFIX), NET_IPV6_ADDR_LEN));

	char *slash = strstr(prefix_str, "/");

	if (!slash) {
		prefix_len = 64;
	} else {
		*slash = '\0';
		prefix_len = atoi(slash + 1);
	}

	if (prefix_len == 0) {
		printk("Invalid prefix length %s", slash + 1);
		return;
	}

	if (net_addr_pton(AF_INET6, prefix_str, &prefix) < 0) {
		printk("Invalid IPv6 prefix %s", prefix_str);
		return;
	}

	/* Check the current version */
	if (CURRENT_VERSION == 0) {
		/* case 0 - call init */
		init_version = net_rpl_lollipop_init();
	} else if (CURRENT_VERSION > 0) {
		/* case > 0 - increment */
		net_rpl_lollipop_increment(&init_version);
	} else {
		printk("CURRENT_VERSION should be greater or eqaul to 0");
		return;
	}

	/* Setup the root node */
	struct net_rpl_dag *dag = net_rpl_set_root_with_version(
		iface, CONFIG_NET_RPL_DEFAULT_INSTANCE, &prefix, init_version);

	if (!dag) {
		printk("Cannot set root node");
		return;
	}

	bool ret = net_rpl_set_prefix(iface, dag, &prefix, prefix_len);

	if (!ret) {
		printk("Cannot set prefix %s/%d", prefix_str, prefix_len);
		return;
	}
}
