#include "nx_api.h"

static void NetXduoTest(int nTestNo);
extern NX_IP nx_ip;
extern NX_PACKET_POOL nx_pool;

static void NetXduoTest(int nTestNo)
{
	NX_TCP_SOCKET	TcpSocket;
	NXD_ADDRESS		serverIp;
	UINT status;
	NX_PACKET		*sendData;
	NX_PACKET		*rcvData;
	UCHAR			sendDummyData[16];
	UCHAR			rcvDummyData[16];
	ULONG			rcvSize;
	int				i;

	/* Create TCP/IP Socket */
	status = nx_tcp_socket_create(&nx_ip, &TcpSocket, "ConnectLinuxSocket",
		NX_IP_NORMAL, NX_DONT_FRAGMENT, NX_IP_TIME_TO_LIVE,
		1024, NX_NULL, NX_NULL);
	if (status != NX_SUCCESS)
	{
		printf("NetXduo nx_tcp_socket_create() failed.(ret=%x)\r\n", status);
		return;
	}
	
	/* Bind TCP/IP Port*/
	status = nx_tcp_client_socket_bind(&TcpSocket, NX_ANY_PORT, 300);
	if (status != NX_SUCCESS)
	{
		nx_tcp_socket_delete(&TcpSocket);
		printf("NetXduo nx_tcp_client_socket_bind() failed.(ret=%x)\r\n", status);
		return;
	}

	/* Connect Linux Server */
	serverIp.nxd_ip_version = NX_IP_VERSION_V4;
	serverIp.nxd_ip_address.v4 = IP_ADDRESS(192,168,0,20);
	status = nxd_tcp_client_socket_connect(&TcpSocket, &serverIp, 1234, 300);
	if (status != NX_SUCCESS)
	{
		nx_tcp_client_socket_unbind(&TcpSocket);
		nx_tcp_socket_delete(&TcpSocket);
		printf("NetXduo nx_tcp_client_socket_connect() failed.(ret=%x)\r\n", status);
		return;
	}
	
	/* Get Send data packet area */
	status = nx_packet_allocate(&nx_pool, &sendData, NX_TCP_PACKET, NX_WAIT_FOREVER);
	if (status != NX_SUCCESS)
	{
		nx_tcp_socket_disconnect(&TcpSocket, 300);
		nx_tcp_client_socket_unbind(&TcpSocket);
		nx_tcp_socket_delete(&TcpSocket);
		printf("NetXduo nx_packet_allocate() failed.(ret=%x)\r\n", status);
		return;
	}
	
	/* Set send data */
	for (i = 0 ; i < sizeof(sendDummyData); i++)
	{
		sendDummyData[i] = (i + 1);
	}
	nx_packet_data_append(sendData, sendDummyData, sizeof(sendDummyData),
		&nx_pool, NX_WAIT_FOREVER);

	/* Send dummy data */
	status = nx_tcp_socket_send(&TcpSocket, sendData, NX_WAIT_FOREVER);
	if (status != NX_SUCCESS)
	{
		nx_tcp_socket_disconnect(&TcpSocket, 300);
		nx_tcp_client_socket_unbind(&TcpSocket);
		nx_tcp_socket_delete(&TcpSocket);
		printf("NetXduo nx_tcp_socket_send() failed.(ret=%x)\r\n", status);
		return;
	}
	
	/* Recv dummy data */
	status = nx_tcp_socket_receive(&TcpSocket, &rcvData, NX_WAIT_FOREVER);
	if (status != NX_SUCCESS)
	{
		nx_tcp_socket_disconnect(&TcpSocket, 300);
		nx_tcp_client_socket_unbind(&TcpSocket);
		nx_tcp_socket_delete(&TcpSocket);
		printf("NetXduo nx_tcp_socket_receive() failed.(ret=%x)\r\n", status);
		return;
	}
	
	/* Get recv data */
	status = nx_packet_data_retrieve(rcvData, rcvDummyData, &rcvSize);
	if (status != NX_SUCCESS)
	{
		nx_tcp_socket_disconnect(&TcpSocket, 300);
		nx_tcp_client_socket_unbind(&TcpSocket);
		nx_tcp_socket_delete(&TcpSocket);
		printf("NetXduo nx_packet_data_retrieve() failed.(ret=%x)\r\n", status);
		return;
	}
	
	/* Disconnect to Linux Server */
	nx_tcp_socket_disconnect(&TcpSocket, 300);
	
	/* Unbind Network port */
	nx_tcp_client_socket_unbind(&TcpSocket);

	/* Delete TCP/IP Socket */
	nx_tcp_socket_delete(&TcpSocket);
}
