 /*
  *  module_tunnel.h: Tunnel module header file
  *
  *  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 "client_daemon.h"

#ifndef __MODULE_TUNNEL_H__
#define __MODULE_TUNNEL_H__

#ifdef SAM_LEGACY
#define DEFAULT_SAM_FRAG_MTU 1460 /* This is the value that will be used for all fragmentation
decisions on packets intended for the tunnel MTU. This is a cumulative fix on an ACP fix where
the tunnel interface MTU is configured as 1500(instead of the real 1460 (1500 - IPv6hdr size))
Bytes in order to force IPv6 fragmentation */
#endif

#ifndef SAM_LEGACY
struct map_rule {
	struct list_head list;
	struct ip6_4rd_map_msg rule;
 };
#endif

/* Functions prototypes */
int tunnel_daemon_msg_recv(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
int cmm_tunnel_parse_cmd(int argc, char ** keywords, int tabStart, daemon_handle_t daemon_handle);
int __tunnel_add(FCI_CLIENT *fci_handle, struct interface *itf);
int __tunnel_del(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct interface *itf);
unsigned int tunnel_get_ipv4_dst(struct RtEntry *route, struct interface *itf);

struct interface *__cmmTunnelFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned char proto, char *orig);

void __cmmTunnelUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route);
int __cmmGetTunnel(int fd, struct interface *itf);
int cmmTnlQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
int cmm4rdIdConvSetProcess(char ** keywords, int tabStart, int argc, daemon_handle_t daemon_handle);
int getTunnel4rdAddress(struct interface* itf, u_int32_t * Daddrv6,  unsigned int Daddr, unsigned short Dport);

#endif /* __MODULE_TUNNEL_H__ */

