/*
 *
 *  Copyright (C) 2007 Mindspeed Technologies, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#include "cmm.h"
#include <stdlib.h>
#include <string.h>
#include "module_natpt.h"

static void cmmNATPTSetUsage(void)
{
	cmm_print(DEBUG_STDOUT, 
			"Usage: set natpt \n"
			"\n"
			"                                  [open]\n"
			"                                       [sock_id_a {socket ID}]\n"
			"                                       [sock_id_b {socket ID}]\n"
			"                                       [6to4] \n"
			"                                       [4to6] \n"
			"\n"
			"                                  [close]\n"
			"                                       [sock_id_a {socket ID}]\n"
			"                                       [sock_id_b {socket ID}]\n"
			"\n"
	          );
}
static void cmmNATPTQueryUsage(void)
{
	cmm_print(DEBUG_STDOUT, 
			"Usage: query natpt\n"
			"             [sock_id_a {socket ID}]\n"
			"             [sock_id_b {socket ID}]\n"
			"\n"
	          );
}
int cmmNATPTSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
{
	int cpt = tabStart;
	unsigned int tmp;
	char * endptr;
	char rcvBuffer[256];

	if(!keywords[cpt])
		goto print_help;

	if (strcasecmp(keywords[cpt], "open") == 0)
	{
		fpp_natpt_open_cmd_t cmd;

		if(!keywords[++cpt])
			goto print_help;
		
		memset(&cmd, 0, sizeof(cmd));

		if((strcasecmp(keywords[cpt], "sock_id_a") == 0))
		{
			if(!keywords[++cpt])
				goto print_help;
			
			/*Get an integer from the string*/
			endptr = NULL;
			tmp = strtoul(keywords[cpt], &endptr, 0);
			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
			{
				cmm_print(DEBUG_CRIT, "ERROR: sock_id_a parameter must be a number between 0 and %d\n", USHRT_MAX);
				goto  print_help;
			}
			cmd.socket_a= tmp;
		}
		else
			goto keyword_error;

		if(!keywords[++cpt])
			goto print_help;
	
		if((strcasecmp(keywords[cpt], "sock_id_b") == 0))
		{
			if(!keywords[++cpt])
				goto print_help;
		
			/*Get an integer from the string*/
			endptr = NULL;
			tmp = strtoul(keywords[cpt], &endptr, 0);
			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
			{
				cmm_print(DEBUG_CRIT, "ERROR: sock_id_b parameter must be a number between 0 and %d\n", USHRT_MAX);
				goto  print_help;
			}
			cmd.socket_b= tmp;
		}
		else
			goto keyword_error;

		while (keywords[++cpt])
		{
			if((strcasecmp(keywords[cpt], "6to4") == 0))
				cmd.control |= FPP_NATPT_CONTROL_6to4;
			else if((strcasecmp(keywords[cpt], "4to6") == 0))
				cmd.control |= FPP_NATPT_CONTROL_4to6;
			else
				goto keyword_error;
		}

		if (cmd.control == 0)
		{
			cmm_print(DEBUG_CRIT, "ERROR: 6to4 or 4to6 must be specified\n");
			goto print_help;
		}

		// Send  command
		if(cmmSendToDaemon(daemon_handle, FPP_CMD_NATPT_OPEN, &cmd, sizeof(cmd), &rcvBuffer) == 2)
		{
			if ((((unsigned short*)rcvBuffer)[0]) != 0)
				cmm_print(DEBUG_STDERR, "Error %d received from FPP \n", ((unsigned short*)rcvBuffer)[0]);
		}
	}
	
	else if (strcasecmp(keywords[cpt], "close") == 0)
	{
		fpp_natpt_close_cmd cmd;

		if(!keywords[++cpt])
			goto print_help;
		
		memset(&cmd, 0, sizeof(cmd));

		if((strcasecmp(keywords[cpt], "sock_id_a") == 0))
		{
			if(!keywords[++cpt])
				goto print_help;
			
			/*Get an integer from the string*/
			endptr = NULL;
			tmp = strtoul(keywords[cpt], &endptr, 0);
			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
			{
				cmm_print(DEBUG_CRIT, "ERROR: sock_id_a parameter must be a number between 0 and %d\n", USHRT_MAX);
				goto  print_help;
			}
			cmd.socket_a= tmp;
		}
		else
			goto keyword_error;

		if(!keywords[++cpt])
			goto print_help;
	
		if((strcasecmp(keywords[cpt], "sock_id_b") == 0))
		{
			if(!keywords[++cpt])
				goto print_help;
		
			/*Get an integer from the string*/
			endptr = NULL;
			tmp = strtoul(keywords[cpt], &endptr, 0);
			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
			{
				cmm_print(DEBUG_CRIT, "ERROR: sock_id_b parameter must be a number between 0 and %d\n", USHRT_MAX);
				goto  print_help;
			}
			cmd.socket_b= tmp;
		}
		else
			goto keyword_error;

		if (keywords[++cpt])
			goto keyword_error;

		// Send  command
		if(cmmSendToDaemon(daemon_handle, FPP_CMD_NATPT_CLOSE, &cmd, sizeof(cmd), &rcvBuffer) == 2)
		{
			if ((((unsigned short*)rcvBuffer)[0]) != 0)
				cmm_print(DEBUG_STDERR, "Error %d received from FPP \n", ((unsigned short*)rcvBuffer)[0]);
		}
	}
	else
	{
		goto keyword_error;
	}
	
	return 0;

keyword_error:
	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
print_help:
	cmmNATPTSetUsage();
	return -1;
}

int cmmNATPTQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
{
	int rcvBytes;
	int cpt = tabStart;
	unsigned int tmp;
	char * endptr;
	char rcvBuffer[256];
	fpp_natpt_query_cmd_t cmd;
	fpp_natpt_query_response_t *pEntryResponse;

	if(!keywords[cpt])
		goto print_help;

	memset(&cmd, 0, sizeof(cmd));

	if((strcasecmp(keywords[cpt], "sock_id_a") == 0))
	{
		if(!keywords[++cpt])
			goto print_help;
		
		/*Get an integer from the string*/
		endptr = NULL;
		tmp = strtoul(keywords[cpt], &endptr, 0);
		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
		{
			cmm_print(DEBUG_CRIT, "ERROR: sock_id_a parameter must be a number between 0 and %d\n", USHRT_MAX);
			goto  print_help;
		}
		cmd.socket_a= tmp;
	}
	else
		goto keyword_error;

	if(!keywords[++cpt])
		goto print_help;

	if((strcasecmp(keywords[cpt], "sock_id_b") == 0))
	{
		if(!keywords[++cpt])
			goto print_help;
	
		/*Get an integer from the string*/
		endptr = NULL;
		tmp = strtoul(keywords[cpt], &endptr, 0);
		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
		{
			cmm_print(DEBUG_CRIT, "ERROR: sock_id_b parameter must be a number between 0 and %d\n", USHRT_MAX);
			goto  print_help;
		}
		cmd.socket_b= tmp;
	}
	else
		goto keyword_error;

	if (keywords[++cpt])
		goto keyword_error;

	// Send  command
	rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_NATPT_QUERY, &cmd, sizeof(cmd), &rcvBuffer);
	if (rcvBytes != sizeof(fpp_natpt_query_response_t))
	{
		cmm_print(DEBUG_STDERR, "ERROR: CMD_NATPT_QUERY Unexpected result returned from FPP rc:%04x - received %d - expected %d\n",
			(rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer),
			rcvBytes, sizeof(fpp_natpt_query_response_t)
		);
		return -1;
	}
	pEntryResponse = (fpp_natpt_query_response_t *)rcvBuffer;
	if (pEntryResponse->retcode != 0)
	{
		cmm_print(DEBUG_STDERR, "Error %d received from FPP \n", pEntryResponse->retcode);
		return -1;
	}

	cmm_print(DEBUG_STDOUT, "NAT-PT Entry:\n\tSocket A: %d, Socket B: %d%s%s%s\n",
					pEntryResponse->socket_a, pEntryResponse->socket_b,
					(pEntryResponse->control & FPP_NATPT_CONTROL_6to4) ? ", 6to4" : "",
					(pEntryResponse->control & FPP_NATPT_CONTROL_4to6) ? ", 4to6" : "",
					(pEntryResponse->control & FPP_NATPT_CONTROL_TCPFIN) ? ", TCP_FIN" : "");
	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Received: %lld\n", pEntryResponse->stat_v6_received);
	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Transmitted: %lld\n", pEntryResponse->stat_v6_transmitted);
	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Dropped: %lld\n", pEntryResponse->stat_v6_dropped);
	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Sent to ACP: %lld\n", pEntryResponse->stat_v6_sent_to_ACP);
	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Received: %lld\n", pEntryResponse->stat_v4_received);
	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Transmitted: %lld\n", pEntryResponse->stat_v4_transmitted);
	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Dropped: %lld\n", pEntryResponse->stat_v4_dropped);
	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Sent to ACP: %lld\n", pEntryResponse->stat_v4_sent_to_ACP);

	return 0;


keyword_error:
	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
print_help:
	cmmNATPTQueryUsage();
	return -1;
}

