blob: 57ef6c2abf89ac3f906e8d938af727e4a14ff7f1 [file] [log] [blame]
/*
* 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 _FE_H_
#define _FE_H_
#include "hal.h"
#include "module_timer.h"
#include "module_ethernet.h"
#include "fpp_globals.h"
/* Actions */
#define ACTION_REGISTER 0
#define ACTION_DEREGISTER 1
#define ACTION_REMOVED 3
#define ACTION_UPDATE 4
#define ACTION_QUERY 6
#define ACTION_QUERY_CONT 7
/* 8 is locally used by CMM */
#define ACTION_TCP_FIN 9
/* Actions allowed for multicast entry managment*/
#define MC_ACTION_ADD 0
#define MC_ACTION_REMOVE 1
#define MC_ACTION_REFRESH 2
#define OUTPUT_ACP 1
#define OUTPUT_GEM 0
/* Error codes */
enum return_code {
NO_ERR = 0,
ERR_UNKNOWN_COMMAND = 1,
ERR_WRONG_COMMAND_SIZE = 2,
ERR_WRONG_COMMAND_PARAM = 3,
ERR_UNKNOWN_ACTION = 4,
ERR_UNKNOWN_INTERFACE = 5,
ERR_NOT_ENOUGH_MEMORY = 6,
ERR_CREATION_FAILED = 7,
ERR_BRIDGE_ENTRY_NOT_FOUND = 50,
ERR_BRIDGE_ENTRY_ALREADY_EXISTS = 51,
ERR_BRIDGE_WRONG_MODE = 52,
#if !defined(COMCERTO_100)
ERR_MACVLAN_ALREADY_REGISTERED = 60,
ERR_MACVLAN_ENTRY_NOT_FOUND = 61,
ERR_MACVLAN_ENTRY_INVALID = 62,
#endif
ERR_CT_ENTRY_ALREADY_REGISTERED = 100,
ERR_CT_ENTRY_NOT_FOUND = 101,
ERR_CT_ENTRY_INVALID_SA = 102,
ERR_CT_ENTRY_TOO_MANY_SA_OP = 103,
ERR_RT_ENTRY_ALREADY_REGISTERED = 200,
ERR_RT_ENTRY_NOT_FOUND = 201,
ERR_RT_ENTRY_LINKED = 202,
ERR_RT_LINK_NOT_POSSIBLE = 203,
ERR_QM_QUEUE_RATE_LIMITED = 500,
ERR_QM_RATE_LIMIT_NOT_APPLIED_TO_OFF = 501,
ERR_QM_QUEUE_OUT_OF_RANGE = 502,
ERR_QM_NUM_DSCP_OUT_OF_RANGE = 503,
ERR_QM_DSCP_OUT_OF_RANGE = 504,
ERR_QM_NO_FREE_SHAPER = 505,
ERR_QM_NO_QUEUE_SPECIFIED = 506,
ERR_VLAN_ENTRY_ALREADY_REGISTERED = 600,
ERR_VLAN_ENTRY_NOT_FOUND = 601,
ERR_MC_ENTRY_NOT_FOUND = 700,
ERR_MC_MAX_LISTENERS = 701,
ERR_MC_DUP_LISTENER = 702,
ERR_MC_ENTRY_OVERLAP = 703,
ERR_MC_INVALID_MAC = 704,
ERR_MC_INTERFACE_NOT_ALLOWED = 705,
ERR_PPPOE_ENTRY_ALREADY_REGISTERED = 800,
ERR_PPPOE_ENTRY_NOT_FOUND = 801,
ERR_SA_DUPLICATED = 904,
ERR_SA_DUPLICATED_HANDLE = 905,
ERR_SA_UNKNOWN = 906,
ERR_SA_INVALID_CIPHER_KEY = 907,
ERR_SA_INVALID_DIGEST_KEY = 908,
ERR_SA_ENTRY_NOT_FOUND = 909,
ERR_SA_SOCK_ENTRY_NOT_FOUND = 910,
ERR_TNL_MAX_ENTRIES = 1000,
ERR_TNL_ENTRY_NOT_FOUND = 1001,
ERR_TNL_NOT_SUPPORTED = 1002,
ERR_TNL_NO_FREE_ENTRY = 1003,
ERR_TNL_ALREADY_CREATED = 1004,
ERR_STAT_FEATURE_NOT_ENABLED = 1100,
ERR_EXPT_QUEUE_OUT_OF_RANGE = 1101,
ERR_EXPT_NUM_DSCP_OUT_OF_RANGE = 1102,
ERR_EXPT_DSCP_OUT_OF_RANGE = 1103,
ERR_SOCK_ALREADY_OPEN = 1200,
ERR_SOCKID_ALREADY_USED = 1201,
ERR_SOCK_ALREADY_OPENED_WITH_OTHER_ID = 1202,
ERR_TOO_MANY_SOCKET_OPEN = 1203,
ERR_SOCKID_UNKNOWN = 1204,
ERR_SOCK_ALREADY_IN_USE = 1206,
ERR_RTP_CALLID_IN_USE = 1207,
ERR_RTP_UNKNOWN_CALL = 1208,
ERR_WRONG_SOCKID = 1209,
ERR_RTP_SPECIAL_PKT_LEN = 1210,
ERR_RTP_CALL_TABLE_FULL = 1211,
ERR_WRONG_SOCK_FAMILY = 1212,
ERR_WRONG_SOCK_PROTO = 1213,
ERR_WRONG_SOCK_TYPE = 1214,
ERR_MSP_NOT_READY = 1215,
ERR_NATPT_UNKNOWN_CONNECTION = 1220,
ERR_RTP_STATS_MAX_ENTRIES = 1230,
ERR_RTP_STATS_STREAMID_ALREADY_USED = 1231,
ERR_RTP_STATS_STREAMID_UNKNOWN = 1232,
ERR_RTP_STATS_DUPLICATED = 1233,
ERR_RTP_STATS_WRONG_DTMF_PT = 1234,
ERR_RTP_STATS_WRONG_TYPE = 1235,
ERR_RTP_STATS_NOT_AVAILABLE = 1236,
ERR_VOICE_BUFFER_UNKNOWN = 1240,
ERR_VOICE_BUFFER_USED = 1241,
ERR_VOICE_BUFFER_PT = 1242,
ERR_VOICE_BUFFER_FRAME_SIZE = 1243,
ERR_VOICE_BUFFER_ENTRIES = 1244,
ERR_VOICE_BUFFER_SIZE = 1245,
ERR_VOICE_BUFFER_STARTED = 1246,
ERR_ALTCONF_OPTION_NOT_SUPPORTED = 1300,
ERR_ALTCONF_MODE_NOT_SUPPORTED = 1301,
ERR_ALTCONF_WRONG_NUM_PARAMS = 1302,
#ifdef CFG_WIFI_OFFLOAD
ERR_WLAN_DUPLICATE_OPERATION = 2001,
#endif
#ifdef CFG_PCAP
ERR_PKTCAP_ALREADY_ENABLED = 1400,
ERR_PKTCAP_NOT_ENABLED = 1401,
ERR_PKTCAP_FLF_RESET = 1402,
#endif
ERR_ICC_TOO_MANY_ENTRIES = 1500,
ERR_ICC_ENTRY_ALREADY_EXISTS = 1501,
ERR_ICC_ENTRY_NOT_FOUND = 1502,
ERR_ICC_THRESHOLD_OUT_OF_RANGE = 1503,
ERR_ICC_INVALID_MASKLEN = 1504,
};
/******************************
* Forward Engine Common Definitions
*
******************************/
/* Conntrack status */
#define CONNTRACK_4O6 0x4000
#define CONNTRACK_RTP_STATS 0x2000
#define CONNTRACK_SEC 0x1000
#define CONNTRACK_SEC_noSA 0x800
#define CONNTRACK_TCP_FIN 0x400
#define CONNTRACK_TIMED_OUT 0x200
#define CONNTRACK_FF_DISABLED 0x100
#define CONNTRACK_NAT 0x20
#define CONNTRACK_SNAT CONNTRACK_NAT
#define CONNTRACK_DNAT 0x10
#define CONNTRACK_IPv6 0x08
#define CONNTRACK_ORIG 0x04
#define CONNTRACK_IPIP 0x02
#define CONNTRACK_UDP 0x01
#define IPPROTOCOL_ICMP 1
#define IPPROTOCOL_IGMP 2
#define IPPROTOCOL_TCP 6
#define IPPROTOCOL_UDP 17
#define IPPROTOCOL_IPIP 4
#define IPPROTOCOL_IPV6 41
#define IPPROTOCOL_ESP 50 /* Encapsulation Security Payload protocol */
#define IPPROTOCOL_AH 51 /* Authentication Header protocol */
#define IPPROTOCOL_ICMPV6 58
/* Nb buckets in cache tables */
#define NUM_ROUTE_ENTRIES 256
#if defined(COMCERTO_2000_CONTROL)
#define NUM_CT_ENTRIES (1 << ROUTE_TABLE_HASH_BITS)
#define CT_TABLE_HASH_MASK (NUM_CT_ENTRIES - 1)
#elif defined(COMCERTO_2000)
#define CT_TABLE_HASH_MASK class_route_table_hash_mask
#else
#define NUM_CT_ENTRIES 8192
#define CT_TABLE_HASH_MASK (NUM_CT_ENTRIES - 1)
#endif
#define NUM_VLAN_ENTRIES 16
#define NUM_BT_ENTRIES 256
#define NUM_BT_L3_ENTRIES 1024
#define NUM_SA_ENTRIES 16
#if defined(COMCERTO_2000)
#define NUM_SOCK_ENTRIES 64
#else
#define NUM_SOCK_ENTRIES 128
#endif
#define NUM_IPSEC_SOCK_ENTRIES 16
#define NUM_L2TP_ENTRIES 16
#if !defined(COMCERTO_2000)
/* Use status bits to decide on connection protocol */
#define MAX_CONNTRACK_PROTO MAX_L4_PROTO
#define CONNTRACK_PROTO_MASK 0x03
extern U8 ct_proto[MAX_CONNTRACK_PROTO];
#endif
// connection timer settings
#if defined(COMCERTO_2000_CONTROL) || !defined(COMCERTO_2000)
#define TCP_TIMEOUT 432000 /*5 days*/
#define UDP_UNIDIR_TIMEOUT 30 /*30s*/
#define UDP_BIDIR_TIMEOUT 180 /*180s*/
#define OTHER_PROTO_TIMEOUT 600 /*10 minutes*/
#if defined(COMCERTO_2000_CONTROL)
#define CT_TIMER_INTERVAL_MS 100
#define CT_SCAN_TIME_MS 2000
#else
#define CT_TIMER_INTERVAL_MS 10
#define CT_SCAN_TIME_MS 5120
#endif
#define CT_TIMER_INTERVAL ((CT_TIMER_INTERVAL_MS * TIMER_TICKS_PER_SEC) / 1000)
#define CT_TICKS_PER_SECOND (1000 / CT_TIMER_INTERVAL_MS)
#define CT_TIMER_BINSIZE ((NUM_CT_ENTRIES * 1000) / (CT_SCAN_TIME_MS * CT_TICKS_PER_SECOND))
#define CT_INACTIVE_TIME (1 * CT_TICKS_PER_SECOND)
#if ((CT_TICKS_PER_SECOND * CT_TIMER_INTERVAL) != TIMER_TICKS_PER_SEC)
# error "TIMER_TICKS_PER_SEC has to be multiple of CT_TIMER_INTERVAL_MS"
#endif
#if !defined(COMCERTO_2000_CONTROL)
#if (((NUM_CT_ENTRIES/CT_TIMER_BINSIZE)*CT_TIMER_BINSIZE) != NUM_CT_ENTRIES)
# error "NUM_CT_ENTRIES has to be multiple of CT_TIMER_BINSIZE"
#endif
#endif
#endif /* defined(COMCERTO_2000_CONTROL) || !defined(COMCERTO_2000) */
/******************************
* IPv4 API Command and Entry strutures
*
******************************/
#define CTCMD_FLAGS_ORIG_DISABLED (1 << 0)
#define CTCMD_FLAGS_REP_DISABLED (1 << 1)
typedef struct _tCtCommand {
U16 action;
U16 rsvd1;
U32 Saddr;
U32 Daddr;
U16 Sport;
U16 Dport;
U32 SaddrReply;
U32 DaddrReply;
U16 SportReply;
U16 DportReply;
U16 protocol;
U16 flags;
U32 fwmark;
U32 route_id;
U32 route_id_reply;
}CtCommand, *PCtCommand;
/*Structure representing the command sent to add or remove a Conntrack when extentions (IPsec SA) is available*/
typedef struct _tCtExCommand {
U16 action; /*Action to perform*/
U16 format; /* bit 0 : indicates if SA info are present in command */
/* bit 1 : indicates if orig Route info is present in command */
/* bit 2 : indicates if repl Route info is present in command */
U32 Saddr; /*Source IP address*/
U32 Daddr; /*Destination IP address*/
U16 Sport; /*Source Port*/
U16 Dport; /*Destination Port*/
U32 SaddrReply;
U32 DaddrReply;
U16 SportReply;
U16 DportReply;
U16 protocol; /*TCP, UDP ...*/
U16 flags;
U32 fwmark;
U32 route_id;
U32 route_id_reply;
// optional security parameters
U16 SA_nr;
U16 SA_handle[4];
U16 SAReply_nr;
U16 SAReply_handle[4];
U32 tunnel_route_id;
U32 tunnel_route_id_reply;
}CtExCommand, *PCtExCommand;
#define RTCMD_FLAGS_6o4 (1<<0) /* A IPv4 tunnel destination address is present */
#define RTCMD_FLAGS_4o6 (1<<1) /* A IPv6 tunnel destination address is present */
typedef struct _tRtCommand {
U16 action;
U16 mtu;
U8 macAddr[ETHER_ADDR_LEN];
U8 outputDevice[12];
U32 id;
U32 flags;
/* Optional parameters */
U32 daddr[4];
}RtCommand, *PRtCommand;
typedef struct _tTimeoutCommand {
U16 protocol;
U16 sam_4o6_timeout;
U32 timeout_value1;
U32 timeout_value2;
}TimeoutCommand , *PTimeoutCommand;
typedef struct _tFFControlCommand {
U16 enable;
U16 reserved;
} FFControlCommand, *PFFControlCommand;
typedef struct _tSockOpenCommand {
U16 SockID;
U8 SockType;
U8 mode; // 0 : not connected -> use 3 tuples. 1 : connected -> use 5 tuples
U32 Saddr;
U32 Daddr;
U16 Sport;
U16 Dport;
U8 proto;
U8 queue;
U16 dscp;
U32 route_id;
#ifdef COMCERTO_2000
U16 secure;
U16 SA_nr_rx;
U16 SA_handle_rx[4];
U16 SA_nr_tx;
U16 SA_handle_tx[4];
U16 pad;
#endif
}SockOpenCommand, *PSockOpenCommand;
typedef struct _tSockCloseCommand {
U16 SockID;
U16 rsvd1;
}SockCloseCommand, *PSockCloseCommand;
typedef struct _tSockUpdateCommand {
U16 SockID;
U16 rsvd1;
U32 Saddr;
U16 Sport;
U8 rsvd2;
U8 queue;
U16 dscp;
U16 pad;
U32 route_id;
#ifdef COMCERTO_2000
U16 secure;
U16 SA_nr_rx;
U16 SA_handle_rx[4];
U16 SA_nr_tx;
U16 SA_handle_tx[4];
U16 pad2;
#endif
}SockUpdateCommand, *PSockUpdateCommand;
/******************************
* IPv6 API Command and Entry strutures
*
******************************/
typedef struct _tCtCommandIPv6 {
U16 action;
U16 rsvd1;
U32 Saddr[4];
U32 Daddr[4];
U16 Sport;
U16 Dport;
U32 SaddrReply[4];
U32 DaddrReply[4];
U16 SportReply;
U16 DportReply;
U16 protocol;
U16 flags;
U32 fwmark;
U32 route_id;
U32 route_id_reply;
}CtCommandIPv6, *PCtCommandIPv6;
typedef struct _tCtExCommandIPv6_old {
U16 action;
U16 format; /* indicates if SA or tunnel info is present in command */
U32 Saddr[4];
U32 Daddr[4];
U16 Sport;
U16 Dport;
U32 SaddrReply[4];
U32 DaddrReply[4];
U16 SportReply;
U16 DportReply;
U16 protocol;
U16 flags;
U32 fwmark;
U32 route_id;
U32 route_id_reply;
U16 SA_nr;
U16 SA_handle[4];
U16 SAReply_nr;
U16 SAReply_handle[4];
}CtExCommandIPv6_old, *PCtExCommandIPv6_old;
typedef struct _tCtExCommandIPv6 {
U16 action;
U16 format; /* indicates if SA or tunnel info is present in command */
U32 Saddr[4];
U32 Daddr[4];
U16 Sport;
U16 Dport;
U32 SaddrReply[4];
U32 DaddrReply[4];
U16 SportReply;
U16 DportReply;
U16 protocol;
U16 flags;
U32 fwmark;
U32 route_id;
U32 route_id_reply;
U16 SA_nr;
U16 SA_handle[4];
U16 SAReply_nr;
U16 SAReply_handle[4];
U32 tunnel_route_id;
U32 tunnel_route_id_reply;
}CtExCommandIPv6, *PCtExCommandIPv6;
/* CtExCommand FORMAT bitfield DEFINES*/
#define CT_SECURE (1 << 0)
#define CT_ORIG_TUNNEL_SIT (1 << 1)
#define CT_REPL_TUNNEL_SIT (1 << 2)
#define CT_ORIG_TUNNEL_4O6 CT_ORIG_TUNNEL_SIT
#define CT_REPL_TUNNEL_4O6 CT_REPL_TUNNEL_SIT
typedef struct _tSock6OpenCommand {
U16 SockID;
U8 SockType;
U8 mode; // 0 : not connected -> use 3 tuples. 1 : connected -> use 5 tuples
U32 Saddr[4];
U32 Daddr[4];
U16 Sport;
U16 Dport;
U8 proto;
U8 queue;
U16 dscp;
U32 route_id;
#ifdef COMCERTO_2000
U16 secure;
U16 SA_nr_rx;
U16 SA_handle_rx[4];
U16 SA_nr_tx;
U16 SA_handle_tx[4];
U16 pad;
#endif
}Sock6OpenCommand, *PSock6OpenCommand;
typedef struct _tSock6CloseCommand {
U16 SockID;
U16 rsvd1;
}Sock6CloseCommand, *PSock6CloseCommand;
typedef struct _tFragTimeoutCommand {
U16 timeout;
U16 mode;
}FragTimeoutCommand, *PFragTimeoutCommand;
typedef struct _tSock6UpdateCommand {
U16 SockID;
U16 rsvd1;
U32 Saddr[4];
U16 Sport;
U8 rsvd2;
U8 queue;
U16 dscp;
U16 pad;
U32 route_id;
#ifdef COMCERTO_2000
U16 secure;
U16 SA_nr_rx;
U16 SA_handle_rx[4];
U16 SA_nr_tx;
U16 SA_handle_tx[4];
U16 pad2;
#endif
}Sock6UpdateCommand, *PSock6UpdateCommand;
/******************************
* TCP definitions
*
******************************/
typedef struct TCP_HDR_STRUCT
{
unsigned short SourcePort;
unsigned short DestinationPort;
unsigned int SequenceNumber;
unsigned int AckNumber;
unsigned short TcpFlags;
#ifdef ENDIAN_LITTLE
#define TCPFLAGS_FIN htons(0x0001)
#define TCPFLAGS_SYN htons(0x0002)
#define TCPFLAGS_RST htons(0x0004)
#define TCPFLAGS_PSH htons(0x0008)
#else
#define TCPFLAGS_FIN 0x0001
#define TCPFLAGS_SYN 0x0002
#define TCPFLAGS_RST 0x0004
#define TCPFLAGS_PSH 0x0008
#define TCPFLAGS_ACK 0x0010
#define TCPFLAGS_URG 0x0020
#define TCPFLAGS_ECE 0x0040
#define TCPFLAGS_CWR 0x0080
#define TCPFLAGS_DOFF(flags) ((flags & 0xF000) >> 12)
#endif
unsigned short Window;
unsigned short Checksum;
unsigned short UrgentPtr;
} tcp_hdr_t;
/******************************
* UDP definitions
*
******************************/
typedef struct UDP_HDR_STRUCT
{
unsigned short SourcePort;
unsigned short DestinationPort;
unsigned short Length;
unsigned short Chksum;
} udp_hdr_t;
/******************************
* Macros
*
******************************/
#define IS_IPV4(pEntry) ((((PCtEntry)pEntry)->status & CONNTRACK_IPv6) == 0)
#define IS_IPV6(pEntry) ((((PCtEntry)pEntry)->status & CONNTRACK_IPv6) != 0)
static __inline U32 HASH_RT(U32 id)
{
U16 sum;
U32 tmp32;
tmp32 = ((id << 7) | (id >> 25));
sum = (tmp32 >> 16) + (tmp32 & 0xffff);
return (sum ^ (sum >> 8)) & (NUM_ROUTE_ENTRIES - 1);
}
#define IP6_LO_ADDR 3
#if defined(COMCERTO_2000)
static __inline void COPY_MACHEADER(void *pheader, void *pdstmacaddr, void *psrcmacaddr, U16 typeid)
{
U16 *pto_U16;
U16 *pdst_U16;
U16 *psrc_U16;
pto_U16 = (U16 *)pheader;
pdst_U16 = (U16 *)pdstmacaddr;
psrc_U16 = (U16 *)psrcmacaddr;
pto_U16[0] = pdst_U16[0];
pto_U16[1] = pdst_U16[1];
pto_U16[2] = pdst_U16[2];
pto_U16[3] = psrc_U16[0];
pto_U16[4] = psrc_U16[1];
pto_U16[5] = psrc_U16[2];
pto_U16[6] = typeid;
}
static __inline void COPY_MACADDR(void *ptomacaddr, void *pfrommacaddr)
{
((U16 *)ptomacaddr)[0] = ((U16 *)pfrommacaddr)[0];
((U16 *)ptomacaddr)[1] = ((U16 *)pfrommacaddr)[1];
((U16 *)ptomacaddr)[2] = ((U16 *)pfrommacaddr)[2];
}
static __inline int TESTEQ_MACADDR(void *pmacaddr1, void *pmacaddr2)
{
return ((U16 *)pmacaddr1)[0] == ((U16 *)pmacaddr2)[0] &&
((U16 *)pmacaddr1)[1] == ((U16 *)pmacaddr2)[1] &&
((U16 *)pmacaddr1)[2] == ((U16 *)pmacaddr2)[2];
}
static __inline int TESTEQ_NULL_MACADDR(void *pmacaddr1)
{
return ((U16 *)pmacaddr1)[0] == 0 && ((U16 *)pmacaddr1)[1] == 0 && ((U16 *)pmacaddr1)[2] == 0;
}
static __inline void COPY_MACADDR2(void *ptomacaddr, void *pfrommacaddr)
{
U16 *pto;
U16 *pfrom;
pto = (U16 *)ptomacaddr;
pfrom = (U16 *)pfrommacaddr;
pto[0] = pfrom[0];
pto[1] = pfrom[1];
pto[2] = pfrom[2];
pto[3] = pfrom[3];
pto[4] = pfrom[4];
pto[5] = pfrom[5];
}
static __inline int TESTEQ_MACADDR2(void *pmacaddr1, void *pmacaddr2)
{
U16 *p1;
U16 *p2;
p1 = (U16 *)pmacaddr1;
p2 = (U16 *)pmacaddr2;
return p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2] &&
p1[3] == p2[3] && p1[4] == p2[4] && p1[5] == p2[5];
}
#else // !defined(COMCERTO_2000)
static __inline void COPY_MACHEADER(void *pheader, void *pdstmacaddr, void *psrcmacaddr, U16 typeid)
{
#if ((BaseOffset & 0x3) == 0)
U32 *pto_U32;
U16 *pto_U16;
U32 *pdst_U32;
U16 *pdst_U16;
U16 *psrc_U16;
pto_U32 = (U32 *)pheader;
pto_U16 = (U16 *)pheader;
pdst_U32 = (U32 *)pdstmacaddr;
pdst_U16 = (U16 *)pdstmacaddr;
psrc_U16 = (U16 *)psrcmacaddr;
WRITE_UNALIGNED_INT(pto_U32[0], READ_UNALIGNED_INT(pdst_U32[0]));
WRITE_UNALIGNED_INT(pto_U32[1], (U32)pdst_U16[2] | ((U32)psrc_U16[0] << 16));
WRITE_UNALIGNED_INT(pto_U32[2], (U32)psrc_U16[1] | ((U32)psrc_U16[2] << 16));
pto_U16[6] = typeid;
#else
U32 *pto_U32;
U16 *pto_U16;
U32 *pdst_U32;
U32 *psrc_U32;
U32 dmac0, dmac1;
U32 smac0, smac1;
pto_U16 = (U16 *)pheader;
pto_U32 = (U32 *)(&pto_U16[1]);
pdst_U32 = (U32 *)pdstmacaddr;
psrc_U32 = (U32 *)psrcmacaddr;
dmac0 = READ_UNALIGNED_INT(pdst_U32[0]);
dmac1 = READ_UNALIGNED_INT(pdst_U32[1]);
smac0 = READ_UNALIGNED_INT(psrc_U32[0]);
smac1 = READ_UNALIGNED_INT(psrc_U32[1]);
pto_U16[0] = (U16)(dmac0 & 0xFFFF);
WRITE_UNALIGNED_INT(pto_U32[0], (dmac0 >> 16) | (dmac1 << 16));
WRITE_UNALIGNED_INT(pto_U32[1], smac0);
WRITE_UNALIGNED_INT(pto_U32[2], (smac1 & 0xFFFF) | ((U32)typeid << 16));
#endif
}
static __inline void COPY_MACADDR(void *ptomacaddr, void *pfrommacaddr)
{
WRITE_UNALIGNED_INT(((U32 *)ptomacaddr)[0], READ_UNALIGNED_INT(((U32 *)pfrommacaddr)[0]));
((U16 *)ptomacaddr)[2] = ((U16 *)pfrommacaddr)[2];
}
static __inline int TESTEQ_MACADDR(void *pmacaddr1, void *pmacaddr2)
{
return READ_UNALIGNED_INT(((U32 *)pmacaddr1)[0]) == READ_UNALIGNED_INT(((U32 *)pmacaddr2)[0]) &&
((U16 *)pmacaddr1)[2] == ((U16 *)pmacaddr2)[2];
}
static __inline int TESTEQ_NULL_MACADDR(void *pmacaddr1)
{
return READ_UNALIGNED_INT(((U32 *)pmacaddr1)[0]) == 0 && ((U16 *)pmacaddr1)[2] == 0;
}
static __inline void COPY_MACADDR2(void *ptomacaddr, void *pfrommacaddr)
{
PEthernetFrame pto;
PEthernetFrame pfrom;
pto = (PEthernetFrame)ptomacaddr;
pfrom = (PEthernetFrame)pfrommacaddr;
WRITE_UNALIGNED_INT(pto->dst_src_x[0], READ_UNALIGNED_INT(pfrom->dst_src_x[0]));
WRITE_UNALIGNED_INT(pto->dst_src_x[1], READ_UNALIGNED_INT(pfrom->dst_src_x[1]));
WRITE_UNALIGNED_INT(pto->dst_src_x[2], READ_UNALIGNED_INT(pfrom->dst_src_x[2]));
}
static __inline int TESTEQ_MACADDR2(void *pmacaddr1, void *pmacaddr2)
{
PEthernetFrame p1;
PEthernetFrame p2;
p1 = (PEthernetFrame)pmacaddr1;
p2 = (PEthernetFrame)pmacaddr2;
return READ_UNALIGNED_INT(p1->dst_src_x[0]) == READ_UNALIGNED_INT(p2->dst_src_x[0]) &&
READ_UNALIGNED_INT(p1->dst_src_x[1]) == READ_UNALIGNED_INT(p2->dst_src_x[1]) &&
READ_UNALIGNED_INT(p1->dst_src_x[2]) == READ_UNALIGNED_INT(p2->dst_src_x[2]);
}
#endif
#if defined(COMCERTO_2000_CONTROL)
#define GET_TIMEOUT_VALUE(CtEntry,bidir_flag) get_timeout_value(CtEntry->proto,CtEntry->status & CONNTRACK_4O6,bidir_flag)
static __inline U32 get_timeout_value(U32 Proto,int sam_flag, int bidir_flag)
{
switch (Proto)
{
case IPPROTO_UDP:
if(sam_flag)
return bidir_flag ? udp_4o6_bidir_timeout : udp_4o6_unidir_timeout;
return bidir_flag ? udp_bidir_timeout : udp_unidir_timeout;
break;
case IPPROTO_TCP:
return sam_flag ? tcp_4o6_timeout: tcp_timeout;
break;
case IPPROTO_IPIP:
default:
return sam_flag ? other_4o6_proto_timeout : other_proto_timeout;
break;
}
}
#elif (!defined(COMCERTO_2000))
#define GET_TIMEOUT_VALUE(CtEntry,bidir_flag) get_timeout_value(CtEntry->status & CONNTRACK_PROTO_MASK , CtEntry->status & CONNTRACK_4O6 ,bidir_flag)
static __inline U32 get_timeout_value(U32 proto_flag, int sam_flag,int bidir_flag)
{
if(!SAM_4o6flag)
{
if((proto_flag & CONNTRACK_UDP) && bidir_flag)
{
return udp_bidir_timeout;
}
else
return ct_proto_timeout[proto_flag];
}
else
{
if ((proto_flag & CONNTRACK_UDP) && bidir_flag)
{
return udp_4o6_bidir_timeout;
}
return sam_4o6_proto_timeout[proto_flag];
}
}
#endif
static __inline int HASH_IPSEC_SOCK(U32 Saddr, U32 Daddr, U16 Sport, U16 Dport)
{
U32 tmp32;
U16 sum;
U8 hash;
tmp32 = Saddr + ((Daddr << 7) | (Daddr >> 25));
tmp32 += Sport + ((Dport << 11) | (Dport >> 5)); /* FIXME Dport is only 16bit */
sum = (tmp32 >> 16) + (tmp32 & 0xffff) ;
hash = (sum >> 8) ^ (sum & 0xFF);
return (hash ^ (hash >> 4)) & (NUM_IPSEC_SOCK_ENTRIES - 1);
}
#endif /* _FE_H_ */