| /* |
| * 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 _MODULE_NATPT_H_ |
| #define _MODULE_NATPT_H_ |
| |
| #include "types.h" |
| #include "modules.h" |
| #include "mtd.h" |
| |
| #if !defined(COMCERTO_2000) |
| #define NUM_NATPT_ENTRIES 2048 |
| #else |
| #define NUM_NATPT_ENTRIES 256 |
| #endif |
| |
| #define NATPT_CONTROL_6to4 0x0001 |
| #define NATPT_CONTROL_4to6 0x0002 |
| |
| |
| #if !defined(COMCERTO_2000) |
| |
| typedef struct _tNATPT_Entry { |
| struct _tNATPT_Entry *next; |
| U16 socketA; |
| U16 socketB; |
| U16 control; |
| U8 protocol; |
| U8 tcpfin_flag; |
| U64 stat_v6_received; |
| U64 stat_v6_transmitted; |
| U64 stat_v6_dropped; |
| U64 stat_v6_sent_to_ACP; |
| U64 stat_v4_received; |
| U64 stat_v4_transmitted; |
| U64 stat_v4_dropped; |
| U64 stat_v4_sent_to_ACP; |
| } NATPT_Entry, *PNATPT_Entry; |
| |
| #elif defined (COMCERTO_2000_CONTROL) |
| |
| /* control path HW natpt entry */ |
| |
| typedef struct _thw_natpt { |
| U32 dma_addr; |
| |
| U16 socketA; |
| U16 socketB; |
| U16 control; |
| U8 protocol; |
| U8 tcpfin_flag; |
| struct { |
| U64 stat_v6_received; |
| U64 stat_v6_transmitted; |
| U64 stat_v6_dropped; |
| U64 stat_v6_sent_to_ACP; |
| U64 stat_v4_received; |
| U64 stat_v4_transmitted; |
| U64 stat_v4_dropped; |
| U64 stat_v4_sent_to_ACP; |
| } stats[NUM_PE_CLASS] __attribute__((aligned(8))); |
| |
| /* HOST only , these fields are only used by host software, so keep them at the end of the structure */ |
| struct dlist_head list; /* only used for delayed removal list */ |
| struct _tNATPT_Entry *sw_natpt; /*pointer to the software natpt entry */ |
| unsigned long removal_time; |
| } hw_natpt; |
| |
| /* control path SW natpt entry */ |
| |
| typedef struct _tNATPT_Entry { |
| struct slist_entry list; |
| U32 hash; |
| U16 socketA; |
| U16 socketB; |
| U16 control; |
| U8 protocol; |
| U8 tcpfin_flag; |
| U64 stat_v6_received; |
| U64 stat_v6_transmitted; |
| U64 stat_v6_dropped; |
| U64 stat_v6_sent_to_ACP; |
| U64 stat_v4_received; |
| U64 stat_v4_transmitted; |
| U64 stat_v4_dropped; |
| U64 stat_v4_sent_to_ACP; |
| struct _thw_natpt *hw_natpt; /** pointer to the hardware natpt entry */ |
| } NATPT_Entry, *PNATPT_Entry; |
| |
| #else // defined (COMCERTO_2000_CLASS) |
| |
| /* class PE natpt entry */ |
| |
| typedef struct _tNATPT_Entry { |
| U32 dma_addr; |
| |
| U16 socketA; |
| U16 socketB; |
| U16 control; |
| U8 protocol; |
| U8 tcpfin_flag; |
| struct { |
| U64 stat_v6_received; |
| U64 stat_v6_transmitted; |
| U64 stat_v6_dropped; |
| U64 stat_v6_sent_to_ACP; |
| U64 stat_v4_received; |
| U64 stat_v4_transmitted; |
| U64 stat_v4_dropped; |
| U64 stat_v4_sent_to_ACP; |
| } stats[NUM_PE_CLASS] __attribute__((aligned(8))); |
| } NATPT_Entry, *PNATPT_Entry; |
| |
| #endif // defined(COMCERTO_2000) |
| |
| typedef struct _tNATPTOpenCommand { |
| U16 socketA; |
| U16 socketB; |
| U16 control; |
| U16 reserved; |
| }NATPTOpenCommand, *PNATPTOpenCommand; |
| |
| typedef struct _tNATPTCloseCommand { |
| U16 socketA; |
| U16 socketB; |
| }NATPTCloseCommand, *PNATPTCloseCommand; |
| |
| typedef struct _tNATPTQueryCommand { |
| U16 reserved1; |
| U16 socketA; |
| U16 socketB; |
| U16 reserved2; |
| }NATPTQueryCommand, *PNATPTQueryCommand; |
| |
| typedef struct _tNATPTQueryResponse { |
| U16 retcode; |
| U16 socketA; |
| U16 socketB; |
| U16 control; |
| U64 stat_v6_received; |
| U64 stat_v6_transmitted; |
| U64 stat_v6_dropped; |
| U64 stat_v6_sent_to_ACP; |
| U64 stat_v4_received; |
| U64 stat_v4_transmitted; |
| U64 stat_v4_dropped; |
| U64 stat_v4_sent_to_ACP; |
| }NATPTQueryResponse, *PNATPTQueryResponse; |
| |
| #if !defined(COMCERTO_2000) |
| BOOL M_natpt_init(PModuleDesc pModule); |
| #else |
| BOOL natpt_init(void); |
| void natpt_exit(void); |
| #endif |
| |
| void M_natpt_receive(void) __attribute__((section ("fast_path"))); |
| |
| void M_NATPT_process_packet(PMetadata mtd); |
| |
| |
| #if !defined(COMCERTO_2000) || defined(COMCERTO_2000_CONTROL) |
| extern struct slist_head natpt_cache[]; |
| #endif |
| |
| static __inline U32 HASH_NATPT(U16 socketA, U16 socketB) |
| { |
| U32 hash; |
| // This hash function is designed so that socketA and socketB can be reversed. |
| hash = socketA ^ socketB; |
| hash ^= hash >> 8; |
| return hash & (NUM_NATPT_ENTRIES - 1); |
| } |
| |
| #endif /* _MODULE_NATPT_H_ */ |