/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
/*
 * Copyright (c) 2021 MediaTek Inc.
 */

#ifndef ATSC30_NET_PROT_NETWORK_PACKET_T
#define ATSC30_NET_PROT_NETWORK_PACKET_T

#include "ip_v4.h"
#include "udp.h"
#include "net_buf.h"
#include "atsc30_utils.h"

#define IP_HEADER_WORD_SIZE (4)
#define UDP_HEADER_LENGTH (8U)

// 5 * IP_HEADER_WORD_SIZE + UDP_HEADER_LENGTH
#define UDP_IP_V4_HEADER_LENGTH (28U)

#define IP_ADDR_SIZE_V4 (0x4)
#define IP_ADDR_SIZE_V6 (0x16)

#define inet_ntoh16(x)	SWAP_ENDIAN16((x))
#define inet_ntoh32(x)	SWAP_ENDIAN32((x))
#define inet_hton16(x)	SWAP_ENDIAN16((x))
#define inet_hton32(x)	SWAP_ENDIAN32((x))

#define ipv4_is_fragment(ipv4_hdr) ((ipv4_hdr)->frag_info != 0x00)

typedef struct {
	u8 ihl;		// Internet header length

	u16 src_port;	// network byteorder
	u16 dst_port;	// network byteorder
	u32 src_addr;	// network byteorder
	u32 dst_addr;	// network byteorder
} network_udp_ip_t;

bool network_get_udp_ip(
		network_udp_ip_t *const net_info,
		const net_buf_t udp_ipv4_pkt);
const char *network_inet_ntoa(const u32 ipv4_addr_nbo);

bool network_ip_addr_is_ignore(
		u8 *ip_addr,
		u8 size);
bool network_udp_port_is_ignore(u16 udp_port);

#endif /* ATSC30_NET_PROT_NETWORK_PACKET_T */
