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

#define NET_LOG_LEVEL CONFIG_NET_L2_ETHERNET_LOG_LEVEL

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(net_test, NET_LOG_LEVEL);

#include <zephyr/zephyr.h>

#include <zephyr/net/net_if.h>
#include <zephyr/net/ethernet.h>
#include <zephyr/net/ethernet_mgmt.h>

#include <ztest.h>

#if NET_LOG_LEVEL >= LOG_LEVEL_DBG
#define DBG(fmt, ...) printk(fmt, ##__VA_ARGS__)
#else
#define DBG(fmt, ...)
#endif

static struct net_if *default_iface;

static const uint8_t mac_addr_init[6] = { 0x01, 0x02, 0x03,
				       0x04,  0x05,  0x06 };

static const uint8_t mac_addr_change[6] = { 0x01, 0x02, 0x03,
					 0x04,  0x05,  0x07 };

struct eth_fake_context {
	struct net_if *iface;
	uint8_t mac_address[6];

	bool auto_negotiation;
	bool full_duplex;
	bool link_10bt;
	bool link_100bt;
	bool promisc_mode;
	struct {
		bool qav_enabled;
		int idle_slope;
		int delta_bandwidth;
	} priority_queues[2];

	struct {
		/* Qbv parameters */
		struct {
			bool gate_status[NET_TC_TX_COUNT];
			enum ethernet_gate_state_operation operation;
			uint32_t time_interval;
			uint16_t row;
		} gate_control;
		uint32_t gate_control_list_len;
		bool qbv_enabled;
		struct net_ptp_extended_time base_time;
		struct net_ptp_time cycle_time;
		uint32_t extension_time;

		/* Qbu parameters */
		uint32_t hold_advance;
		uint32_t release_advance;
		enum ethernet_qbu_preempt_status
				frame_preempt_statuses[NET_TC_TX_COUNT];
		bool qbu_enabled;
		bool link_partner_status;
		uint8_t additional_fragment_size : 2;
	} ports[2];

	/* TXTIME parameters */
	bool txtime_statuses[NET_TC_TX_COUNT];
};

static struct eth_fake_context eth_fake_data;

static void eth_fake_iface_init(struct net_if *iface)
{
	const struct device *dev = net_if_get_device(iface);
	struct eth_fake_context *ctx = dev->data;

	ctx->iface = iface;

	net_if_set_link_addr(iface, ctx->mac_address,
			     sizeof(ctx->mac_address),
			     NET_LINK_ETHERNET);

	ethernet_init(iface);
}

static int eth_fake_send(const struct device *dev,
			 struct net_pkt *pkt)
{
	ARG_UNUSED(dev);
	ARG_UNUSED(pkt);

	return 0;
}

static enum ethernet_hw_caps eth_fake_get_capabilities(const struct device *dev)
{
	return ETHERNET_AUTO_NEGOTIATION_SET | ETHERNET_LINK_10BASE_T |
		ETHERNET_LINK_100BASE_T | ETHERNET_DUPLEX_SET | ETHERNET_QAV |
		ETHERNET_PROMISC_MODE | ETHERNET_PRIORITY_QUEUES |
		ETHERNET_QBV | ETHERNET_QBU | ETHERNET_TXTIME;
}

static int eth_fake_get_total_bandwidth(struct eth_fake_context *ctx)
{
	if (ctx->link_100bt) {
		return 100 * 1000 * 1000 / 8;
	}

	if (ctx->link_10bt) {
		return 10 * 1000 * 1000 / 8;
	}

	/* No link */
	return 0;
}

static void eth_fake_recalc_qav_delta_bandwidth(struct eth_fake_context *ctx)
{
	int bw;
	int i;

	bw = eth_fake_get_total_bandwidth(ctx);

	for (i = 0; i < ARRAY_SIZE(ctx->priority_queues); ++i) {
		if (bw == 0) {
			ctx->priority_queues[i].delta_bandwidth = 0;
		} else {
			ctx->priority_queues[i].delta_bandwidth =
				(ctx->priority_queues[i].idle_slope * 100);

			ctx->priority_queues[i].delta_bandwidth /= bw;
		}
	}
}

static void eth_fake_recalc_qav_idle_slopes(struct eth_fake_context *ctx)
{
	int bw;
	int i;

	bw = eth_fake_get_total_bandwidth(ctx);

	for (i = 0; i < ARRAY_SIZE(ctx->priority_queues); ++i) {
		ctx->priority_queues[i].idle_slope =
			(ctx->priority_queues[i].delta_bandwidth * bw) / 100;
	}
}

static int eth_fake_set_config(const struct device *dev,
			       enum ethernet_config_type type,
			       const struct ethernet_config *config)
{
	struct eth_fake_context *ctx = dev->data;
	int priority_queues_num = ARRAY_SIZE(ctx->priority_queues);
	int ports_num = ARRAY_SIZE(ctx->ports);
	enum ethernet_qav_param_type qav_param_type;
	enum ethernet_qbv_param_type qbv_param_type;
	enum ethernet_qbu_param_type qbu_param_type;
	enum ethernet_txtime_param_type txtime_param_type;
	int queue_id, port_id;

	switch (type) {
	case ETHERNET_CONFIG_TYPE_AUTO_NEG:
		if (config->auto_negotiation == ctx->auto_negotiation) {
			return -EALREADY;
		}

		ctx->auto_negotiation = config->auto_negotiation;

		break;
	case ETHERNET_CONFIG_TYPE_LINK:
		if ((config->l.link_10bt && ctx->link_10bt) ||
		    (config->l.link_100bt && ctx->link_100bt)) {
			return -EALREADY;
		}

		if (config->l.link_10bt) {
			ctx->link_10bt = true;
			ctx->link_100bt = false;
		} else {
			ctx->link_10bt = false;
			ctx->link_100bt = true;
		}

		eth_fake_recalc_qav_idle_slopes(ctx);

		break;
	case ETHERNET_CONFIG_TYPE_DUPLEX:
		if (config->full_duplex == ctx->full_duplex) {
			return -EALREADY;
		}

		ctx->full_duplex = config->full_duplex;

		break;
	case ETHERNET_CONFIG_TYPE_MAC_ADDRESS:
		memcpy(ctx->mac_address, config->mac_address.addr, 6);

		net_if_set_link_addr(ctx->iface, ctx->mac_address,
				     sizeof(ctx->mac_address),
				     NET_LINK_ETHERNET);
		break;
	case ETHERNET_CONFIG_TYPE_QAV_PARAM:
		queue_id = config->qav_param.queue_id;
		qav_param_type = config->qav_param.type;

		if (queue_id < 0 || queue_id >= priority_queues_num) {
			return -EINVAL;
		}

		switch (qav_param_type) {
		case ETHERNET_QAV_PARAM_TYPE_STATUS:
			ctx->priority_queues[queue_id].qav_enabled =
				config->qav_param.enabled;
			break;
		case ETHERNET_QAV_PARAM_TYPE_IDLE_SLOPE:
			ctx->priority_queues[queue_id].idle_slope =
				config->qav_param.idle_slope;

			eth_fake_recalc_qav_delta_bandwidth(ctx);
			break;
		case ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH:
			ctx->priority_queues[queue_id].delta_bandwidth =
				config->qav_param.delta_bandwidth;

			eth_fake_recalc_qav_idle_slopes(ctx);
			break;
		default:
			return -ENOTSUP;
		}

		break;
	case ETHERNET_CONFIG_TYPE_QBV_PARAM:
		port_id = config->qbv_param.port_id;
		qbv_param_type = config->qbv_param.type;

		if (port_id < 0 || port_id >= ports_num) {
			return -EINVAL;
		}

		switch (qbv_param_type) {
		case ETHERNET_QBV_PARAM_TYPE_STATUS:
			ctx->ports[port_id].qbv_enabled =
				config->qbv_param.enabled;
			break;
		case ETHERNET_QBV_PARAM_TYPE_TIME:
			memcpy(&ctx->ports[port_id].cycle_time,
			       &config->qbv_param.cycle_time,
			       sizeof(ctx->ports[port_id].cycle_time));
			ctx->ports[port_id].extension_time =
				config->qbv_param.extension_time;
			memcpy(&ctx->ports[port_id].base_time,
			       &config->qbv_param.base_time,
			       sizeof(ctx->ports[port_id].base_time));
			break;
		case ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST:
			ctx->ports[port_id].gate_control.gate_status[0] =
			    config->qbv_param.gate_control.gate_status[0];
			ctx->ports[port_id].gate_control.gate_status[1] =
			    config->qbv_param.gate_control.gate_status[1];
			break;
		case ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST_LEN:
			ctx->ports[port_id].gate_control_list_len =
			    config->qbv_param.gate_control_list_len;
			break;
		default:
			return -ENOTSUP;
		}

		break;
	case ETHERNET_CONFIG_TYPE_QBU_PARAM:
		port_id = config->qbu_param.port_id;
		qbu_param_type = config->qbu_param.type;

		if (port_id < 0 || port_id >= ports_num) {
			return -EINVAL;
		}

		switch (qbu_param_type) {
		case ETHERNET_QBU_PARAM_TYPE_STATUS:
			ctx->ports[port_id].qbu_enabled =
				config->qbu_param.enabled;
			break;
		case ETHERNET_QBU_PARAM_TYPE_RELEASE_ADVANCE:
			ctx->ports[port_id].release_advance =
				config->qbu_param.release_advance;
			break;
		case ETHERNET_QBU_PARAM_TYPE_HOLD_ADVANCE:
			ctx->ports[port_id].hold_advance =
				config->qbu_param.hold_advance;
			break;
		case ETHERNET_QBR_PARAM_TYPE_LINK_PARTNER_STATUS:
			ctx->ports[port_id].link_partner_status =
				config->qbu_param.link_partner_status;
			break;
		case ETHERNET_QBR_PARAM_TYPE_ADDITIONAL_FRAGMENT_SIZE:
			ctx->ports[port_id].additional_fragment_size =
				config->qbu_param.additional_fragment_size;
			break;
		case ETHERNET_QBU_PARAM_TYPE_PREEMPTION_STATUS_TABLE:
			memcpy(&ctx->ports[port_id].frame_preempt_statuses,
			   &config->qbu_param.frame_preempt_statuses,
			   sizeof(ctx->ports[port_id].frame_preempt_statuses));
			break;
		default:
			return -ENOTSUP;
		}

		break;
	case ETHERNET_CONFIG_TYPE_TXTIME_PARAM:
		queue_id = config->txtime_param.queue_id;
		txtime_param_type = config->txtime_param.type;

		if (queue_id < 0 || queue_id >= priority_queues_num) {
			return -EINVAL;
		}

		switch (txtime_param_type) {
		case ETHERNET_TXTIME_PARAM_TYPE_ENABLE_QUEUES:
			ctx->txtime_statuses[queue_id] =
				config->txtime_param.enable_txtime;
			break;
		default:
			return -ENOTSUP;
		}

		break;
	case ETHERNET_CONFIG_TYPE_PROMISC_MODE:
		if (config->promisc_mode == ctx->promisc_mode) {
			return -EALREADY;
		}

		ctx->promisc_mode = config->promisc_mode;

		break;
	default:
		return -ENOTSUP;
	}

	return 0;
}

static int eth_fake_get_config(const struct device *dev,
			       enum ethernet_config_type type,
			       struct ethernet_config *config)
{
	struct eth_fake_context *ctx = dev->data;
	int priority_queues_num = ARRAY_SIZE(ctx->priority_queues);
	int ports_num = ARRAY_SIZE(ctx->ports);
	enum ethernet_qav_param_type qav_param_type;
	enum ethernet_qbv_param_type qbv_param_type;
	enum ethernet_qbu_param_type qbu_param_type;
	enum ethernet_txtime_param_type txtime_param_type;
	int queue_id, port_id;

	switch (type) {
	case ETHERNET_CONFIG_TYPE_PRIORITY_QUEUES_NUM:
		config->priority_queues_num = ARRAY_SIZE(ctx->priority_queues);
		break;
	case ETHERNET_CONFIG_TYPE_PORTS_NUM:
		config->ports_num = ARRAY_SIZE(ctx->ports);
		break;
	case ETHERNET_CONFIG_TYPE_QAV_PARAM:
		queue_id = config->qav_param.queue_id;
		qav_param_type = config->qav_param.type;

		if (queue_id < 0 || queue_id >= priority_queues_num) {
			return -EINVAL;
		}

		switch (qav_param_type) {
		case ETHERNET_QAV_PARAM_TYPE_STATUS:
			config->qav_param.enabled =
				ctx->priority_queues[queue_id].qav_enabled;
			break;
		case ETHERNET_QAV_PARAM_TYPE_IDLE_SLOPE:
		case ETHERNET_QAV_PARAM_TYPE_OPER_IDLE_SLOPE:
			/* No distinction between idle slopes for fake eth */
			config->qav_param.idle_slope =
				ctx->priority_queues[queue_id].idle_slope;
			break;
		case ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH:
			config->qav_param.delta_bandwidth =
				ctx->priority_queues[queue_id].delta_bandwidth;
			break;
		case ETHERNET_QAV_PARAM_TYPE_TRAFFIC_CLASS:
			/* Default TC for BE - it doesn't really matter here */
			config->qav_param.traffic_class =
				net_tx_priority2tc(NET_PRIORITY_BE);
			break;
		default:
			return -ENOTSUP;
		}

		break;
	case ETHERNET_CONFIG_TYPE_QBV_PARAM:
		port_id = config->qbv_param.port_id;
		qbv_param_type = config->qbv_param.type;

		if (port_id < 0 || port_id >= ports_num) {
			return -EINVAL;
		}

		switch (qbv_param_type) {
		case ETHERNET_QBV_PARAM_TYPE_STATUS:
			config->qbv_param.enabled =
				ctx->ports[port_id].qbv_enabled;
			break;
		case ETHERNET_QBV_PARAM_TYPE_TIME:
			memcpy(&config->qbv_param.base_time,
			       &ctx->ports[port_id].base_time,
			       sizeof(config->qbv_param.base_time));
			memcpy(&config->qbv_param.cycle_time,
			       &ctx->ports[port_id].cycle_time,
			       sizeof(config->qbv_param.cycle_time));
			config->qbv_param.extension_time =
				ctx->ports[port_id].extension_time;
			break;
		case ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST_LEN:
			config->qbv_param.gate_control_list_len =
				ctx->ports[port_id].gate_control_list_len;
			break;
		case ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST:
			memcpy(&config->qbv_param.gate_control,
			       &ctx->ports[port_id].gate_control,
			       sizeof(config->qbv_param.gate_control));
			break;
		default:
			return -ENOTSUP;
		}

		break;
	case ETHERNET_CONFIG_TYPE_QBU_PARAM:
		port_id = config->qbu_param.port_id;
		qbu_param_type = config->qbu_param.type;

		if (port_id < 0 || port_id >= ports_num) {
			return -EINVAL;
		}

		switch (qbu_param_type) {
		case ETHERNET_QBU_PARAM_TYPE_STATUS:
			config->qbu_param.enabled =
				ctx->ports[port_id].qbu_enabled;
			break;
		case ETHERNET_QBU_PARAM_TYPE_RELEASE_ADVANCE:
			config->qbu_param.release_advance =
				ctx->ports[port_id].release_advance;
			break;
		case ETHERNET_QBU_PARAM_TYPE_HOLD_ADVANCE:
			config->qbu_param.hold_advance =
				ctx->ports[port_id].hold_advance;
			break;
		case ETHERNET_QBR_PARAM_TYPE_LINK_PARTNER_STATUS:
			config->qbu_param.link_partner_status =
				ctx->ports[port_id].link_partner_status;
			break;
		case ETHERNET_QBR_PARAM_TYPE_ADDITIONAL_FRAGMENT_SIZE:
			config->qbu_param.additional_fragment_size =
				ctx->ports[port_id].additional_fragment_size;
			break;
		case ETHERNET_QBU_PARAM_TYPE_PREEMPTION_STATUS_TABLE:
			memcpy(&config->qbu_param.frame_preempt_statuses,
			     &ctx->ports[port_id].frame_preempt_statuses,
			     sizeof(config->qbu_param.frame_preempt_statuses));
			break;
		default:
			return -ENOTSUP;
		}

		break;
	case ETHERNET_CONFIG_TYPE_TXTIME_PARAM:
		queue_id = config->txtime_param.queue_id;
		txtime_param_type = config->txtime_param.type;

		if (queue_id < 0 || queue_id >= priority_queues_num) {
			return -EINVAL;
		}

		switch (txtime_param_type) {
		case ETHERNET_TXTIME_PARAM_TYPE_ENABLE_QUEUES:
			config->txtime_param.enable_txtime =
				ctx->txtime_statuses[queue_id];
			break;
		default:
			return -ENOTSUP;
		}

		break;
	default:
		return -ENOTSUP;
	}

	return 0;
}

static struct ethernet_api eth_fake_api_funcs = {
	.iface_api.init = eth_fake_iface_init,

	.get_capabilities = eth_fake_get_capabilities,
	.set_config = eth_fake_set_config,
	.get_config = eth_fake_get_config,
	.send = eth_fake_send,
};

static int eth_fake_init(const struct device *dev)
{
	struct eth_fake_context *ctx = dev->data;
	int i;

	ctx->auto_negotiation = true;
	ctx->full_duplex = true;
	ctx->link_10bt = true;
	ctx->link_100bt = false;

	memcpy(ctx->mac_address, mac_addr_init, 6);

	/* Initialize priority queues */
	for (i = 0; i < ARRAY_SIZE(ctx->priority_queues); ++i) {
		ctx->priority_queues[i].qav_enabled = true;
		if (i + 1 == ARRAY_SIZE(ctx->priority_queues)) {
			/* 75% for the last priority queue */
			ctx->priority_queues[i].delta_bandwidth = 75;
		} else {
			/* 0% for the rest */
			ctx->priority_queues[i].delta_bandwidth = 0;
		}
	}

	eth_fake_recalc_qav_idle_slopes(ctx);

	return 0;
}

ETH_NET_DEVICE_INIT(eth_fake, "eth_fake", eth_fake_init, NULL,
		    &eth_fake_data, NULL, CONFIG_ETH_INIT_PRIORITY,
		    &eth_fake_api_funcs, NET_ETH_MTU);

#if NET_LOG_LEVEL >= LOG_LEVEL_DBG
static const char *iface2str(struct net_if *iface)
{
#ifdef CONFIG_NET_L2_ETHERNET
	if (net_if_l2(iface) == &NET_L2_GET_NAME(ETHERNET)) {
		return "Ethernet";
	}
#endif

#ifdef CONFIG_NET_L2_DUMMY
	if (net_if_l2(iface) == &NET_L2_GET_NAME(DUMMY)) {
		return "Dummy";
	}
#endif

	return "<unknown type>";
}
#endif

static void iface_cb(struct net_if *iface, void *user_data)
{
	struct net_if **my_iface = user_data;

	DBG("Interface %p (%s) [%d]\n", iface, iface2str(iface),
	    net_if_get_by_iface(iface));

	if (net_if_l2(iface) == &NET_L2_GET_NAME(ETHERNET)) {
		if (PART_OF_ARRAY(NET_IF_GET_NAME(eth_fake, 0), iface)) {
			*my_iface = iface;
		}
	}
}

static void test_setup(void)
{
	net_if_foreach(iface_cb, &default_iface);

	zassert_not_null(default_iface, "Cannot find test interface");
}

static void test_change_mac_when_up(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	memcpy(params.mac_address.addr, mac_addr_change, 6);

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_MAC_ADDRESS, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0,
			  "mac address change should not be possible");
}

static void test_change_mac_when_down(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	memcpy(params.mac_address.addr, mac_addr_change, 6);

	net_if_down(iface);

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_MAC_ADDRESS, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "unable to change mac address");

	ret = memcmp(net_if_get_link_addr(iface)->addr, mac_addr_change,
		     sizeof(mac_addr_change));

	zassert_equal(ret, 0, "invalid mac address change");

	net_if_up(iface);
}

static void test_change_auto_neg(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	params.auto_negotiation = false;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_AUTO_NEGOTIATION, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "invalid auto negotiation change");
}

static void test_change_to_same_auto_neg(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	params.auto_negotiation = false;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_AUTO_NEGOTIATION, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0,
			  "invalid change to already auto negotiation");
}

static void test_change_link(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params = { 0 };
	int ret;

	params.l.link_100bt = true;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_LINK, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "invalid link change");
}

static void test_change_same_link(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params = { 0 };
	int ret;

	params.l.link_100bt = true;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_LINK, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "invalid same link change");
}

static void test_change_unsupported_link(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params = { 0 };
	int ret;

	params.l.link_1000bt = true;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_LINK, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "invalid change to unsupported link");
}

static void test_change_duplex(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	params.full_duplex = false;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_DUPLEX, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "invalid duplex change");
}

static void test_change_same_duplex(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	params.full_duplex = false;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_DUPLEX, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "invalid change to already set duplex");
}

static void test_change_qav_params(void)
{
	struct net_if *iface = default_iface;
	const struct device *dev = net_if_get_device(iface);
	struct eth_fake_context *ctx = dev->data;
	struct ethernet_req_params params;
	int available_priority_queues;
	int i;
	int ret;

	/* Try to get the number of the priority queues */
	ret = net_mgmt(NET_REQUEST_ETHERNET_GET_PRIORITY_QUEUES_NUM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "could not get the number of priority queues");

	available_priority_queues = params.priority_queues_num;

	zassert_not_equal(available_priority_queues, 0,
			  "returned no priority queues");
	zassert_equal(available_priority_queues,
		      ARRAY_SIZE(ctx->priority_queues),
		      "an invalid number of priority queues returned");

	for (i = 0; i < available_priority_queues; ++i) {
		/* Try to set correct params to a correct queue id */
		params.qav_param.queue_id = i;

		/* Disable Qav for queue */
		params.qav_param.type = ETHERNET_QAV_PARAM_TYPE_STATUS;
		params.qav_param.enabled = false;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not disable qav");

		/* Invert it to make sure the read-back value is proper */
		params.qav_param.enabled = true;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read qav status");

		zassert_equal(false, params.qav_param.enabled,
			      "qav should be disabled");

		/* Re-enable Qav for queue */
		params.qav_param.enabled = true;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not enable qav");

		/* Invert it to make sure the read-back value is proper */
		params.qav_param.enabled = false;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read qav status");

		zassert_equal(true, params.qav_param.enabled,
			      "qav should be enabled");

		/* Starting with delta bandwidth */
		params.qav_param.type =
			ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH;
		params.qav_param.delta_bandwidth = 10U;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not set delta bandwidth");

		/* Reset local value - read-back and verify it */
		params.qav_param.delta_bandwidth = 0U;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read delta bandwidth");
		zassert_equal(params.qav_param.delta_bandwidth, 10,
			      "delta bandwidth did not change");

		/* And them the idle slope */
		params.qav_param.type = ETHERNET_QAV_PARAM_TYPE_IDLE_SLOPE;
		params.qav_param.idle_slope = 10U;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not set idle slope");

		/* Reset local value - read-back and verify it */
		params.qav_param.idle_slope = 0U;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read idle slope");
		zassert_equal(params.qav_param.idle_slope, 10,
			      "idle slope did not change");

		/* Oper idle slope should also be the same */
		params.qav_param.type =
			ETHERNET_QAV_PARAM_TYPE_OPER_IDLE_SLOPE;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read oper idle slope");
		zassert_equal(params.qav_param.oper_idle_slope, 10,
			      "oper idle slope should equal admin idle slope");

		/* Now try to set incorrect params to a correct queue */
		params.qav_param.type =
			ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH;
		params.qav_param.delta_bandwidth = -10;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_not_equal(ret, 0,
				  "allowed to set invalid delta bandwidth");

		params.qav_param.delta_bandwidth = 101U;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_not_equal(ret, 0,
				  "allowed to set invalid delta bandwidth");
	}

	/* Try to set read-only parameters */
	params.qav_param.queue_id = 0;
	params.qav_param.type = ETHERNET_QAV_PARAM_TYPE_OPER_IDLE_SLOPE;
	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "should not be able to set oper idle slope");

	params.qav_param.queue_id = 0;
	params.qav_param.type = ETHERNET_QAV_PARAM_TYPE_TRAFFIC_CLASS;
	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "should not be able to set traffic class");

	/* Now try to set valid parameters to an invalid queue id */
	params.qav_param.type = ETHERNET_QAV_PARAM_TYPE_DELTA_BANDWIDTH;
	params.qav_param.queue_id = available_priority_queues;
	params.qav_param.delta_bandwidth = 10U;
	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "should not be able to set delta bandwidth");

	params.qav_param.type = ETHERNET_QAV_PARAM_TYPE_IDLE_SLOPE;
	params.qav_param.idle_slope = 10U;
	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QAV_PARAM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "should not be able to set idle slope");
}

static void test_change_qbv_params(void)
{
	struct net_if *iface = default_iface;
	const struct device *dev = net_if_get_device(iface);
	struct eth_fake_context *ctx = dev->data;
	struct ethernet_req_params params;
	struct net_ptp_time cycle_time;
	int available_ports;
	int i;
	int ret;

	/* Try to get the number of the ports */
	ret = net_mgmt(NET_REQUEST_ETHERNET_GET_PORTS_NUM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "could not get the number of ports (%d)", ret);

	available_ports = params.ports_num;

	zassert_not_equal(available_ports, 0, "returned no priority queues");
	zassert_equal(available_ports,
		      ARRAY_SIZE(ctx->ports),
		      "an invalid number of ports returned");

	for (i = 0; i < available_ports; ++i) {
		/* Try to set correct params to a correct queue id */
		params.qbv_param.port_id = i;

		/* Disable Qbv for port */
		params.qbv_param.type = ETHERNET_QBV_PARAM_TYPE_STATUS;
		params.qbv_param.state = ETHERNET_QBV_STATE_TYPE_ADMIN;
		params.qbv_param.enabled = false;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not disable qbv for port %d", i);

		/* Invert it to make sure the read-back value is proper */
		params.qbv_param.enabled = true;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read qbv status (%d)", ret);

		zassert_equal(false, params.qbv_param.enabled,
			      "qbv should be disabled");

		/* Re-enable Qbv for queue */
		params.qbv_param.enabled = true;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not enable qbv (%d)", ret);

		/* Invert it to make sure the read-back value is proper */
		params.qbv_param.enabled = false;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read qbv status (%d)", ret);

		zassert_equal(true, params.qbv_param.enabled,
			      "qbv should be enabled");

		/* Then the Qbv parameter checks */

		params.qbv_param.type = ETHERNET_QBV_PARAM_TYPE_TIME;

		params.qbv_param.base_time.second = 10ULL;
		params.qbv_param.base_time.fract_nsecond = 20ULL;
		params.qbv_param.cycle_time.second = 30ULL;
		params.qbv_param.cycle_time.nanosecond = 20;
		params.qbv_param.extension_time = 40;

		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not set base time (%d)", ret);

		/* Reset local value - read-back and verify it */
		params.qbv_param.base_time.second = 0ULL;
		params.qbv_param.base_time.fract_nsecond = 0ULL;
		params.qbv_param.cycle_time.second = 0ULL;
		params.qbv_param.cycle_time.nanosecond = 0;
		params.qbv_param.extension_time = 0;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read times (%d)", ret);
		zassert_equal(params.qbv_param.base_time.second, 10ULL,
			      "base_time.second did not change");
		zassert_equal(params.qbv_param.base_time.fract_nsecond, 20ULL,
			      "base_time.fract_nsecond did not change");

		cycle_time.second = 30ULL;
		cycle_time.nanosecond = 20;
		zassert_true(params.qbv_param.cycle_time.second == cycle_time.second &&
			     params.qbv_param.cycle_time.nanosecond == cycle_time.nanosecond,
			     "cycle time did not change");

		zassert_equal(params.qbv_param.extension_time, 40,
			      "extension time did not change");

		params.qbv_param.type =
			ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST;
		params.qbv_param.gate_control.gate_status[0] = true;
		params.qbv_param.gate_control.gate_status[1] = false;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not set gate control list (%d)",
			      ret);

		/* Reset local value - read-back and verify it */
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read gate control (%d)", ret);

		params.qbv_param.type =
			ETHERNET_QBV_PARAM_TYPE_GATE_CONTROL_LIST_LEN;
		params.qbv_param.gate_control_list_len = 1;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0,
			      "could not set gate control list len (%d)", ret);

		/* Reset local value - read-back and verify it */
		params.qbv_param.gate_control_list_len = 0;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBV_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0,
			      "could not read gate control list len (%d)",
			      ret);
		zassert_equal(params.qbv_param.gate_control_list_len, 1,
			      "gate control list len did not change");
	}

	/* Try to set read-only parameters */
	params.qbv_param.state = ETHERNET_QBV_STATE_TYPE_OPER;
	params.qbv_param.type = ETHERNET_QBV_PARAM_TYPE_TIME;
	params.qbv_param.extension_time = 50;
	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBV_PARAM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "allowed to set oper status parameter (%d)",
			  ret);

	params.qbv_param.state = ETHERNET_QBV_STATE_TYPE_ADMIN;
	params.qbv_param.type = ETHERNET_QBV_PARAM_TYPE_TIME;
	params.qbv_param.base_time.fract_nsecond = 1000000000;
	params.qbv_param.cycle_time.nanosecond = 1000000000;
	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBV_PARAM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_not_equal(ret, 0, "allowed to set base_time parameter (%d)",
			  ret);
}

static void test_change_qbu_params(void)
{
	struct net_if *iface = default_iface;
	const struct device *dev = net_if_get_device(iface);
	struct eth_fake_context *ctx = dev->data;
	struct ethernet_req_params params;
	int available_ports;
	int i, j;
	int ret;

	/* Try to get the number of the ports */
	ret = net_mgmt(NET_REQUEST_ETHERNET_GET_PORTS_NUM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "could not get the number of ports (%d)", ret);

	available_ports = params.ports_num;

	zassert_not_equal(available_ports, 0, "returned no priority queues");
	zassert_equal(available_ports,
		      ARRAY_SIZE(ctx->ports),
		      "an invalid number of ports returned");

	for (i = 0; i < available_ports; ++i) {
		/* Try to set correct params to a correct queue id */
		params.qbu_param.port_id = i;

		/* Disable Qbu for port */
		params.qbu_param.type = ETHERNET_QBU_PARAM_TYPE_STATUS;
		params.qbu_param.enabled = false;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not disable qbu for port %d (%d)",
			      i, ret);

		/* Invert it to make sure the read-back value is proper */
		params.qbu_param.enabled = true;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read qbu status (%d)", ret);

		zassert_equal(false, params.qbu_param.enabled,
			      "qbu should be disabled");

		/* Re-enable Qbu for queue */
		params.qbu_param.enabled = true;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not enable qbu (%d)", ret);

		/* Invert it to make sure the read-back value is proper */
		params.qbu_param.enabled = false;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read qbu status (%d)", ret);

		zassert_equal(true, params.qbu_param.enabled,
			      "qbu should be enabled");

		/* Then the Qbu parameter checks */

		params.qbu_param.type = ETHERNET_QBU_PARAM_TYPE_RELEASE_ADVANCE;
		params.qbu_param.release_advance = 10;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not set release advance (%d)",
			      ret);

		/* Reset local value - read-back and verify it */
		params.qbu_param.release_advance = 0;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read release advance (%d)",
			      ret);
		zassert_equal(params.qbu_param.release_advance, 10,
			      "release_advance did not change");

		/* And them the hold advance */
		params.qbu_param.type = ETHERNET_QBU_PARAM_TYPE_HOLD_ADVANCE;
		params.qbu_param.hold_advance = 20;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not set hold advance (%d)", ret);

		/* Reset local value - read-back and verify it */
		params.qbu_param.hold_advance = 0;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read hold advance (%d)", ret);
		zassert_equal(params.qbu_param.hold_advance, 20,
			      "hold advance did not change");

		params.qbu_param.type =
			ETHERNET_QBR_PARAM_TYPE_LINK_PARTNER_STATUS;
		params.qbu_param.link_partner_status = true;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, -EINVAL,
			      "could set link partner status (%d)", ret);

		/* Reset local value - read-back and verify it */
		params.qbu_param.link_partner_status = false;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0,
			      "could not read link partner status (%d)", ret);
		zassert_equal(params.qbu_param.link_partner_status, false,
			      "link partner status changed");

		params.qbu_param.type =
			ETHERNET_QBR_PARAM_TYPE_ADDITIONAL_FRAGMENT_SIZE;
		params.qbu_param.additional_fragment_size = 2;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0,
			      "could not set additional frag size (%d)", ret);

		/* Reset local value - read-back and verify it */
		params.qbu_param.additional_fragment_size = 1;
		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0,
			      "could not read additional frag size (%d)", ret);
		zassert_equal(params.qbu_param.additional_fragment_size, 2,
			      "additional fragment size did not change");

		params.qbu_param.type =
			ETHERNET_QBU_PARAM_TYPE_PREEMPTION_STATUS_TABLE;

		for (j = 0;
		     j < ARRAY_SIZE(params.qbu_param.frame_preempt_statuses);
		     j++) {
			/* Set the preempt status for different priorities.
			 */
			params.qbu_param.frame_preempt_statuses[j] =
				j % 2 ? ETHERNET_QBU_STATUS_EXPRESS :
					ETHERNET_QBU_STATUS_PREEMPTABLE;
		}

		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0,
			      "could not set frame preempt status (%d)", ret);

		/* Reset local value - read-back and verify it */
		for (j = 0;
		     j < ARRAY_SIZE(params.qbu_param.frame_preempt_statuses);
		     j++) {
			params.qbu_param.frame_preempt_statuses[j] =
				j % 2 ? ETHERNET_QBU_STATUS_PREEMPTABLE :
					ETHERNET_QBU_STATUS_EXPRESS;
		}

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_QBU_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0,
			      "could not read frame preempt status (%d)", ret);

		for (j = 0;
		     j < ARRAY_SIZE(params.qbu_param.frame_preempt_statuses);
		     j++) {
			zassert_equal(
				params.qbu_param.frame_preempt_statuses[j],
				j % 2 ? ETHERNET_QBU_STATUS_EXPRESS :
					ETHERNET_QBU_STATUS_PREEMPTABLE,
			      "frame preempt status did not change");
		}
	}
}

static void test_change_txtime_params(void)
{
	struct net_if *iface = default_iface;
	const struct device *dev = net_if_get_device(iface);
	struct eth_fake_context *ctx = dev->data;
	struct ethernet_req_params params;
	int available_priority_queues;
	int ret;
	int i;

	/* Try to get the number of the priority queues */
	ret = net_mgmt(NET_REQUEST_ETHERNET_GET_PRIORITY_QUEUES_NUM,
		       iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "could not get the number of priority queues");

	available_priority_queues = params.priority_queues_num;

	zassert_not_equal(available_priority_queues, 0,
			  "returned no priority queues");
	zassert_equal(available_priority_queues,
		      ARRAY_SIZE(ctx->priority_queues),
		      "an invalid number of priority queues returned");

	net_if_up(iface);

	/* Make sure we cannot enable txtime if the interface is up */
	params.txtime_param.queue_id = 0;
	params.txtime_param.type = ETHERNET_TXTIME_PARAM_TYPE_ENABLE_QUEUES;
	params.txtime_param.enable_txtime = false;
	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_TXTIME_PARAM, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, -EACCES, "could disable TXTIME for queue 0 (%d)",
		      ret);

	net_if_down(iface);

	for (i = 0; i < available_priority_queues; ++i) {
		/* Try to set correct params to a correct queue id */
		params.txtime_param.queue_id = i;

		/* Disable TXTIME for queue */
		params.txtime_param.type = ETHERNET_TXTIME_PARAM_TYPE_ENABLE_QUEUES;
		params.txtime_param.enable_txtime = false;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_TXTIME_PARAM,
			       iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not disable TXTIME for queue %d (%d)",
			      i, ret);

		/* Invert it to make sure the read-back value is proper */
		params.txtime_param.enable_txtime = true;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_TXTIME_PARAM, iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read txtime status (%d)", ret);

		zassert_equal(false, params.txtime_param.enable_txtime,
			      "txtime should be disabled");

		/* Re-enable TXTIME for queue */
		params.txtime_param.enable_txtime = true;
		ret = net_mgmt(NET_REQUEST_ETHERNET_SET_TXTIME_PARAM, iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not enable txtime (%d)", ret);

		/* Invert it to make sure the read-back value is proper */
		params.txtime_param.enable_txtime = false;

		ret = net_mgmt(NET_REQUEST_ETHERNET_GET_TXTIME_PARAM, iface,
			       &params, sizeof(struct ethernet_req_params));

		zassert_equal(ret, 0, "could not read txtime status (%d)", ret);

		zassert_equal(true, params.txtime_param.enable_txtime,
			      "txtime should be enabled");
	}
}

static void test_change_promisc_mode(bool mode)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	params.promisc_mode = mode;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_PROMISC_MODE, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, 0, "invalid promisc mode change");
}

static void test_change_promisc_mode_on(void)
{
	test_change_promisc_mode(true);
}

static void test_change_promisc_mode_off(void)
{
	test_change_promisc_mode(false);
}

static void test_change_to_same_promisc_mode(void)
{
	struct net_if *iface = default_iface;
	struct ethernet_req_params params;
	int ret;

	params.promisc_mode = true;

	ret = net_mgmt(NET_REQUEST_ETHERNET_SET_PROMISC_MODE, iface,
		       &params, sizeof(struct ethernet_req_params));

	zassert_equal(ret, -EALREADY,
		      "invalid change to already set promisc mode");
}

void test_main(void)
{
	ztest_test_suite(ethernet_mgmt_test,
			 ztest_unit_test(test_setup),
			 ztest_unit_test(test_change_mac_when_up),
			 ztest_unit_test(test_change_mac_when_down),
			 ztest_unit_test(test_change_auto_neg),
			 ztest_unit_test(test_change_to_same_auto_neg),
			 ztest_unit_test(test_change_link),
			 ztest_unit_test(test_change_same_link),
			 ztest_unit_test(test_change_unsupported_link),
			 ztest_unit_test(test_change_duplex),
			 ztest_unit_test(test_change_same_duplex),
			 ztest_unit_test(test_change_qav_params),
			 ztest_unit_test(test_change_qbv_params),
			 ztest_unit_test(test_change_qbu_params),
			 ztest_unit_test(test_change_txtime_params),
			 ztest_unit_test(test_change_promisc_mode_on),
			 ztest_unit_test(test_change_to_same_promisc_mode),
			 ztest_unit_test(test_change_promisc_mode_off));

	ztest_run_test_suite(ethernet_mgmt_test);
}
