/*
 * Copyright (c) 2020 DENX Software Engineering GmbH
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef __DSA_SAMPLE__
#define __DSA_SAMPLE__

#include <zephyr.h>
#include <errno.h>

#include <net/net_core.h>
#include <net/net_l2.h>
#include <net/net_if.h>
#include <net/socket.h>
#include <net/ethernet.h>

#define MCAST_DEST_MAC0 0x01
#define MCAST_DEST_MAC1 0x80
#define MCAST_DEST_MAC2 0xc2
#define MCAST_DEST_MAC3 0x00
#define MCAST_DEST_MAC4 0x00
#define MCAST_DEST_MAC5 0x03

#define RECV_BUFFER_SIZE 1280
#define ETH_ALEN 6
#define PACKET_LEN 128

extern struct ud ifaces;

struct eth_addr {
	uint8_t addr[ETH_ALEN]; /* origin hardware address */
};

struct instance_data {
	char *if_name;
	int sock;
	char recv_buffer[RECV_BUFFER_SIZE];
};

/* User data for the interface callback */
struct ud {
	struct net_if *lan1;
	struct net_if *lan2;
	struct net_if *lan3;
	struct net_if *master;
};

static inline bool check_ll_ether_addr(const uint8_t *a, const uint8_t *b)
{
	return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
		(a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5])) == 0;
}

static inline void dsa_buf_write_be16(uint16_t tl, uint8_t **p)
{
	uint8_t *v = (uint8_t *) &tl;
	**p = v[1];
	(*p)++;
	**p = v[0];
	(*p)++;
}

int start_slave_port_packet_socket(struct net_if *iface,
				   struct instance_data *pd);

enum net_verdict dsa_ll_addr_switch_cb(struct net_if *iface,
				       struct net_pkt *pkt);

#define CMD_DISCOVER 0
#define CMD_ACK      1
#define DSA_STACK_SIZE 4096
#define DSA_PRIORITY      5
#define DSA_THREAD_START_DELAY 4000

#define DSA_THREAD(ID, FN_RECV, FN_SEND)                                       \
	static void dsa_thread_##ID(void *t1, void *t2, void *t3);             \
	K_THREAD_DEFINE(dsa_tid_##ID, DSA_STACK_SIZE,                          \
		dsa_thread_##ID, NULL, NULL, NULL,                             \
			DSA_PRIORITY, 0, DSA_THREAD_START_DELAY);              \
									       \
	void dsa_thread_##ID(void *t1, void *t2, void *t3)                     \
	{                                                                      \
		int origin_port, ret;                                          \
		uint16_t seq;                                                  \
		struct eth_addr origin_addr;                                   \
		struct instance_data data;                                     \
									       \
		data.if_name = "lan"#ID;                                       \
		ret = start_slave_port_packet_socket(ifaces.lan##ID, &data);   \
		if (ret < 0) {                                                 \
			LOG_ERR("start_slave_port_packet_socket failed %d",    \
				ret);                                          \
			return;                                                \
		}                                                              \
		dsa_register_recv_callback(ifaces.lan##ID,                     \
					   dsa_ll_addr_switch_cb);             \
									       \
		LOG_INF("DSA -> eth/lan"#ID" idx: %d sock: %d",                \
			net_if_get_by_iface(ifaces.lan##ID), data.sock);       \
		do {                                                           \
			ret = FN_RECV(ifaces.lan##ID, &data, &seq,             \
				      &origin_port, &origin_addr);             \
			if (ret) {                                             \
				break;                                         \
			}                                                      \
			ret = FN_SEND(ifaces.lan##ID, &data,                   \
				      seq, 0, origin_port, CMD_ACK,            \
				      &origin_addr);                           \
			if (ret) {                                             \
				break;                                         \
			}                                                      \
		} while (true);                                                \
	}

#endif /* __DSA_SAMPLE__ */
