#ifndef _USER_UDP_H_
#define _USER_UDP_H_

#include "lwip/err.h"
#include "lwip/udp.h"
#include "lwip/init.h"
#include "lwipopts.h"
#include "lwip/err.h"
#include "lwipopts.h"
#include "netif/xadapter.h"
#include "xil_printf.h"
#include "lwip/raw.h"

typedef struct usdp
{
	uint32_t ipAddr;
	uint16_t port;
	uint16_t len;
	uint8_t dataBuf[1472];
} UserDefinePacket, USDP;

extern struct netif *netif, server_netif;
extern ip_addr_t ipaddr, netmask, gw;
extern struct udp_pcb *pcb;
extern unsigned char mac_ethernet_address[]; // MAC
extern unsigned local_port;
extern unsigned remote_port;

#define PRINT_IP(ipaddr, msg)                   \
	do                                          \
	{                                           \
		xil_printf(INFO_MSG(msg "\t%3d.%3d.%3d.%3d"), \
				   ip4_addr1_16_val(ipaddr),    \
				   ip4_addr2_16_val(ipaddr),    \
				   ip4_addr3_16_val(ipaddr),    \
				   ip4_addr4_16_val(ipaddr));   \
	} while (0)

int UdpInit(void);

void UdpSendData(uint8_t *send_buff, int data_num);

void UdpRecvCallback(void *arg, struct udp_pcb *tpcb, struct pbuf *p, ip_addr_t *addr, u16_t port);

void RawInit();

uint8_t RawUdpSend(uint8_t *send_buff, int data_num);

uint8_t RawTcpSend(uint8_t *send_buff, int data_num);

u8_t RawUdpRecvCallback(void *arg, struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *addr);

u8_t RawTcpRecvCallback(void *arg, struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *addr);

#endif
