/*
 * 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 "test_conn_impl.h"
#include "test_ifaces.h"

/* Create test ifaces */

/* Generic iface initializer, shared by all three 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);
}

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

/* Create three ifaces, a1, a2, b such that:
 * iface a1 and a2 share L2 connectivity implementation a
 * iface b uses connectivity implementation b
 */
NET_DEVICE_INIT(test_iface_a1,
		"test_iface_a1",
		NULL,
		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_iface_a2,
		"test_iface_a2",
		NULL,
		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_iface_b,
		"test_iface_b",
		NULL,
		NULL,
		NULL,
		NULL,
		CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		&test_iface_api,
		DUMMY_L2,
		NET_L2_GET_CTX_TYPE(DUMMY_L2),
		127);

/* Create an ifaces with NULL implementation, NULL init, and no connectivity at all */
NET_DEVICE_INIT(test_iface_null,
		"test_iface_null",
		NULL,
		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_iface_ni,
		"test_iface_ni",
		NULL,
		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_iface_none,
		"test_iface_none",
		NULL,
		NULL,
		NULL,
		NULL,
		CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		&test_iface_api,
		DUMMY_L2,
		NET_L2_GET_CTX_TYPE(DUMMY_L2),
		127);

/* Bind L2 connectivity implementations to ifaces */
CONN_MGR_BIND_CONN(test_iface_a1,	TEST_L2_CONN_IMPL_A);
CONN_MGR_BIND_CONN(test_iface_a2,	TEST_L2_CONN_IMPL_A);
CONN_MGR_BIND_CONN(test_iface_b,	TEST_L2_CONN_IMPL_B);

/* Bind edge-case L2 connectivity implementations to ifaces */
CONN_MGR_BIND_CONN(test_iface_null,	TEST_L2_CONN_IMPL_N);
CONN_MGR_BIND_CONN(test_iface_ni,	TEST_L2_CONN_IMPL_NI);

/* Public accessors for static iface structs */
struct net_if *ifa1  = NET_IF_GET(test_iface_a1, 0);
struct net_if *ifa2  = NET_IF_GET(test_iface_a2, 0);
struct net_if *ifb   = NET_IF_GET(test_iface_b,  0);
struct net_if *ifni  = NET_IF_GET(test_iface_ni,  0);
struct net_if *ifnull = NET_IF_GET(test_iface_null, 0);
struct net_if *ifnone = NET_IF_GET(test_iface_none, 0);
