/*
 * Copyright (c) 2023 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#include <zephyr/net/net_if.h>
#include <zephyr/net/dummy.h>
#include <zephyr/net/conn_mgr_connectivity.h>
#include <zephyr/net/ethernet.h>
#include "test_ifaces.h"

/* Create test ifaces */

/* Generic iface initializer, shared by all test ifaces */
static void test_iface_init(struct net_if *iface)
{
	/* Fake link layer address is needed to silence assertions inside the net core */
	static uint8_t fake_lladdr[] = { 0x01 };

	net_if_set_link_addr(iface, fake_lladdr, sizeof(fake_lladdr), NET_LINK_DUMMY);

	/* Do not automatically start the iface */
	net_if_flag_set(iface, NET_IF_NO_AUTO_START);
}

/* Mandatory stub for NET_DEVICE_INIT */
static int test_iface_netdev_init(const struct device *dev)
{
	return 0;
}

/* This is needed specifically for IPv6 DAD.
 * DAD tries to send a packet, and the test will hang if send is not implemented.
 */
static int test_iface_send(const struct device *dev, struct net_pkt *pkt)
{
	return 0;
}

static struct dummy_api test_iface_api = {
	.iface_api.init = test_iface_init,
	.send = test_iface_send,
};

static struct ethernet_api dummy_eth_api = {
	.iface_api.init = test_iface_init,
};

NET_DEVICE_INIT(test_if_simple_a,
		"test_if_simple_a",
		test_iface_netdev_init,
		NULL,
		NULL,
		NULL,
		CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		&test_iface_api,
		DUMMY_L2,
		NET_L2_GET_CTX_TYPE(DUMMY_L2),
		127);

NET_DEVICE_INIT(test_if_simple_b,
		"test_if_simple_b",
		test_iface_netdev_init,
		NULL,
		NULL,
		NULL,
		CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		&test_iface_api,
		DUMMY_L2,
		NET_L2_GET_CTX_TYPE(DUMMY_L2),
		127);

NET_DEVICE_INIT(test_if_connected_a,
		"test_if_connected_a",
		test_iface_netdev_init,
		NULL,
		NULL,
		NULL,
		CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		&test_iface_api,
		DUMMY_L2,
		NET_L2_GET_CTX_TYPE(DUMMY_L2),
		127);

NET_DEVICE_INIT(test_if_connected_b,
		"test_if_connected_b",
		test_iface_netdev_init,
		NULL,
		NULL,
		NULL,
		CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		&test_iface_api,
		DUMMY_L2,
		NET_L2_GET_CTX_TYPE(DUMMY_L2),
		127);

/* A dummy ETHERNET_L2 iface so that we can test L2 ignore.
 * This iface is not properly defined, do not attempt to use it.
 */
NET_DEVICE_INIT(test_if_dummy_eth,
		"test_if_dummy_eth",
		test_iface_netdev_init,
		NULL,
		NULL,
		NULL,
		CONFIG_ETH_INIT_PRIORITY,
		&dummy_eth_api,
		ETHERNET_L2,
		NET_L2_GET_CTX_TYPE(ETHERNET_L2),
		127);


static void test_conn_api_init(struct conn_mgr_conn_binding *const binding)
{
	/* Mark the iface dormant (disconnected) on initialization */
	net_if_dormant_on(binding->iface);
}

static int test_conn_api_connect(struct conn_mgr_conn_binding *const binding)
{
	/* Mark iface as connected */
	net_if_dormant_off(binding->iface);
	return 0;
}

static int test_conn_api_disconnect(struct conn_mgr_conn_binding *const binding)
{
	/* Mark iface as dormant (disconnected) */
	net_if_dormant_on(binding->iface);
	return 0;
}

static struct conn_mgr_conn_api test_conn_api = {
	.init = test_conn_api_init,
	.connect = test_conn_api_connect,
	.disconnect = test_conn_api_disconnect,
};

/* Dummy struct */
struct test_conn_data {
};

#define TEST_CONN_IMPL_CTX_TYPE struct test_conn_data
CONN_MGR_CONN_DEFINE(TEST_CONN_IMPL, &test_conn_api);

/* Bind connectivity implementation to ifaces */
CONN_MGR_BIND_CONN(test_if_connected_a,	TEST_CONN_IMPL);
CONN_MGR_BIND_CONN(test_if_connected_b,	TEST_CONN_IMPL);


struct net_if *if_simp_a = NET_IF_GET(test_if_simple_a,    0);
struct net_if *if_simp_b = NET_IF_GET(test_if_simple_b,    0);
struct net_if *if_conn_a = NET_IF_GET(test_if_connected_a, 0);
struct net_if *if_conn_b = NET_IF_GET(test_if_connected_b, 0);
struct net_if *if_dummy_eth = NET_IF_GET(test_if_dummy_eth, 0);
