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