/*
 *
 *  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"

extern struct socket *socket_find(u_int16_t id);

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;
}


int inline  NATPT_Socket_init(int sock, FCI_CLIENT* fci_handle)
{
	struct socket *s;
	int rc = 0;
	/* Check if the Socket already has a route attached to it
	 * If yes, delete it, update the socket with a new route while attempting to fetch the route with iif filled to LO.*/
	s = socket_find(sock);
	if(!s)
		return CMMD_ERR_NOT_CONFIGURED;
	s->non_local_sock = 1;

	if(s->rt.route)
	{
		/* Delete existing route  */
		__cmmRouteDeregister(fci_handle, &s->rt, "socket");
		s->rt.route = NULL;
		s->rt.fpp_route = NULL;
	}
	rc = __socket_open(fci_handle, s);

	return rc;
}

int cmmNATPTOpenProcessClientCmd(FCI_CLIENT* fci_handle, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
{
	/* LOCKS TBD */
	fpp_natpt_open_cmd_t *cmd = (fpp_natpt_open_cmd_t*)cmd_buf;
	int rc = 0;

	__pthread_mutex_lock(&itf_table.lock);
	__pthread_mutex_lock(&rtMutex);
	__pthread_mutex_lock(&neighMutex);
	__pthread_mutex_lock(&flowMutex);
	__pthread_mutex_lock(&socket_lock);

	if( (rc = NATPT_Socket_init(cmd->socket_a, fci_handle)) != 0)
		goto out;
	if( (rc = NATPT_Socket_init(cmd->socket_b, fci_handle)) != 0)
		goto out;

	rc = fci_cmd(fci_handle, FPP_CMD_NATPT_OPEN, (unsigned short *)cmd_buf, cmd_len, (unsigned short *)res_buf, res_len);
out:
	__pthread_mutex_unlock(&socket_lock);
	__pthread_mutex_unlock(&flowMutex);
	__pthread_mutex_unlock(&neighMutex);
	__pthread_mutex_unlock(&rtMutex);
	__pthread_mutex_unlock(&itf_table.lock);

	return rc;
}
