/*
 *  Copyright (c) 2009 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 *
 */


#ifndef _ALT_CONF_H_
#define _ALT_CONF_H_

#include "types.h"
#include "module_timer.h"

int ALTCONF_HandleCONF_SET (U16 *p, U16 Length);
int ALTCONF_HandleCONF_RESET_ALL (U16 *p, U16 Length);

#define ALTCONF_OPTION_MCTTL		1	/*Multicast TTL option */
#define ALTCONF_OPTION_IPSECRL        2  /*IPSEC Rate Limiting option */
#define ALTCONF_OPTION_MAX			ALTCONF_OPTION_IPSECRL
 #define ALTCONF_OPTIN_MAX_PARAMS    3 /* IPSEC Rate Limiting has 3 parameters. To be updated if a new option is add with more 32bits params */


/* Multicast TTL Configuration definitions */
#define ALTCONF_MCTTL_MODE_DEFAULT	0
#define ALTCONF_MCTTL_MODE_IGNORE	1
#define ALTCONF_MCTTL_MODE_MAX 		ALTCONF_MCTTL_MODE_IGNORE
#define ALTCONF_MCTTL_NUM_PARAMS 	1  //maximu number of u32 allowed for this option

#if !defined(COMCERTO_100)
/* IPSEC Rate Limiting Configuration definitions */
#define ALTCONF_IPSECRL_ON  1
#define ALTCONF_IPSECRL_OFF 0
#define ALTCONF_IPSECRL_NUM_PARAMS      3  //maximu number of u32 allowed for this option


#define ALTCONF_IPSEC_INBOUND    0
#define ALTCONF_IPSEC_OUTBOUND 1

#define ALTCONF_FCS_SIZE 			4
#define ALTCONF_RX_MTU 		1518

#define ALTCONF_bps_PER_Kbps		1000
#define ALTCONF_MILLISEC_PER_SEC	1000
#define ALTCONF_BITS_PER_BYTE		8

#if !defined(COMCERTO_2000)
// IPSEC Rate Limit Information Structure  
typedef struct tAltConfIpsec_RlEntry{
   U32 enable; // Specifies whether IPSEC rate limiting is enabled or not
   U32 aggregate_bandwidth; //Configured Aggregate bandwidth in Mbps
   int tokens_per_clock_period; // Number of bytes worth token available every clock period
   int inbound_tokens_available; // Number of bytes worth tokens available to receive inbound traffic
   int outbound_tokens_available; // Number of bytes worth tokens available to transmit outbound traffic 
   int bucket_size; // Configurable bucket Sizes in bytes 
} AltConfIpsec_RlEntry;
#elif defined(COMCERTO_2000_CONTROL)
typedef struct tAltConfIpsec_RlEntry{
   U32 enable; // Specifies whether IPSEC rate limiting is enabled or not
   U32 aggregate_bandwidth; //Configured Aggregate bandwidth in Mbps
   int tokens_per_clock_period; // Number of bytes worth token available every clock period
   int bucket_size; // Configurable bucket Sizes in bytes
} AltConfIpsec_RlEntry;
#else	// defined(COMCERTO_2000)
typedef struct tAltConfIpsec_RlEntry{
	U32 enable; // Specifies whether IPSEC rate limiting is enabled or not
   int tokens_per_clock_period; // Number of bytes worth token available every clock period
   int inbound_tokens_available; // Number of bytes worth tokens available to receive inbound traffic
   int outbound_tokens_available; // Number of bytes worth tokens available to transmit outbound traffic
   int bucket_size; // Configurable bucket Sizes in bytes
} AltConfIpsec_RlEntry;
#endif

extern AltConfIpsec_RlEntry AltConfIpsec_RateLimitEntry;
extern TIMER_ENTRY ipsec_ratelimiter_timer;

void AltConfIpsec_RateLimit_token_generator(void);
U8 AltConfIpsec_Rate_Limiter(int mode, U32 sizeofpacket);

#endif /* #if !defined(COMCERTO_100) */

typedef struct _tAltConfCommandSet {
	U16		option_id;
	U16		num_params;
	U32		params[ALTCONF_OPTIN_MAX_PARAMS];
}AltConfCommandSet , *PAltConfCommandSet;



#endif /* _ALT_CONF_H_ */
