/*
 *  Copyright (c) 2013 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.
 *
 *
 */
#include "fe.h"

#if defined (COMCERTO_2000)
/* Commands */ 
typedef struct _tl2tp_itf_add_cmd {
	U8 ifname[16];
	U16 sock_id;
	U16	local_tun_id;
	U16	peer_tun_id;
	U16	local_ses_id;
	U16	peer_ses_id;
	U16	options;	
}__attribute__((__packed__)) l2tp_itf_add_cmd, *pl2tp_itf_add_cmd;

typedef struct _tl2tp_itf_del_cmd {
	char ifname[16];
}__attribute__((__packed__)) l2tp_itf_del_cmd, *pl2tp_itf_del_cmd;

/* Entries */
typedef struct _tl2tp_entry {
	struct itf itf;
	struct slist_entry	list;
	U16 local_tun_id;
	U16 peer_tun_id;
	U16 local_ses_id;
	U16 peer_ses_id;
	U16 sock_id;
	U16 options;
}l2tp_entry, *pl2tp_entry;;

#define MAX_L2TP_ITF	60
#define L2TP_IF_FREE	0
static __inline U32 HASH_L2TP(U16 tun_id, U16 ses_id)
{
	U32 sum;

	tun_id = ntohs(tun_id);
	ses_id = ntohs(ses_id);

	sum = tun_id + ses_id;
	sum ^= (sum >> 8);
	return (sum & (NUM_L2TP_ENTRIES - 1));
}

extern struct slist_head l2tp_cache[];
extern l2tp_entry l2tp_table[];


#if defined(COMCERTO_2000_CLASS)
/* PBUF route entry memory chunk is used to allocated a socket entry */
#define L2TP_BUFFER()\
    ((PVOID)(CLASS_ROUTE0_BASE_ADDR))
#endif
int l2tp_init(void);
void l2tp_exit(void);

void M_L2TP_RX_process_packet(PMetadata mtd);
void M_L2TP_TX_process_packet(PMetadata mtd);

/* Bit definitions */
#define TYPE_BIT         0x80
#define LENGTH_BIT       0x40
#define SEQUENCE_BIT     0x08
#define OFFSET_BIT       0x02
#define PRIORITY_BIT     0x01
#define RESERVED_BITS    0x34
#define VERSION_MASK     0x0F
#define VERSION_RESERVED 0xF0

#define L2TP_VERSION_TWO	2
/* L2TP Options */
#define L2TP_OPT_LENGTH		0x0001
#define L2TP_OPT_SEQ		0x0002

#define L2TP_HDR_LEN		(6 + 4)	//No options hdr + PPP
#define L2TP_OPT_LENGTH_LEN	2
#define L2TP_OPT_SEQ_LEN	4

#define PPP_L2TP_CTRL_ADDR	0xff03

#endif
