| |
| /* |
| * 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_CAPTURE_H_ |
| #define _MODULE_CAPTURE_H_ |
| |
| #include "types.h" |
| #include "modules.h" |
| #include "channels.h" |
| #include "system.h" |
| #include "module_Rx.h" |
| |
| #ifdef CFG_PCAP |
| |
| #if !defined(COMCERTO_2000) |
| #define SMI_CAP_EXPTQ_ADDR 0x0A0004A0 |
| #define MAX_FILL_CAP_DESC RX_BUDGET// This is dependent on RX_BUDGET parameter. |
| #endif |
| |
| #define MAX_CAP_QUERY_IFACES 2 |
| |
| |
| #define CAP_STATUS_ENABLED 1 |
| #define CAP_STATUS_DISABLED 0 |
| |
| #define CAP_DEFAULT_SLICE 96 |
| #define CAP_MAX_FLF_INSTRUCTIONS 30 |
| |
| |
| #define CAP_IFSTATUS_ENABLED 1 |
| #define CAP_IFSTATUS_DISABLED 0 |
| |
| #define PCAP_MAX_BPF_INST_SUPPORTED 128 |
| |
| /* BPF Instruction class - Begin */ |
| |
| /* |
| * Instruction classes |
| */ |
| |
| #define BPF_CLASS(code) ((code) & 0x07) |
| #define BPF_LD 0x00 |
| #define BPF_LDX 0x01 |
| #define BPF_ST 0x02 |
| #define BPF_STX 0x03 |
| #define BPF_ALU 0x04 |
| #define BPF_JMP 0x05 |
| #define BPF_RET 0x06 |
| #define BPF_MISC 0x07 |
| |
| /* ld/ldx fields */ |
| #define BPF_SIZE(code) ((code) & 0x18) |
| #define BPF_W 0x00 |
| #define BPF_H 0x08 |
| #define BPF_B 0x10 |
| #define BPF_MODE(code) ((code) & 0xe0) |
| #define BPF_IMM 0x00 |
| #define BPF_ABS 0x20 |
| #define BPF_IND 0x40 |
| #define BPF_MEM 0x60 |
| #define BPF_LEN 0x80 |
| #define BPF_MSH 0xa0 |
| |
| /* alu/jmp fields */ |
| #define BPF_OP(code) ((code) & 0xf0) |
| #define BPF_ADD 0x00 |
| #define BPF_SUB 0x10 |
| #define BPF_MUL 0x20 |
| #define BPF_DIV 0x30 |
| #define BPF_OR 0x40 |
| #define BPF_AND 0x50 |
| #define BPF_LSH 0x60 |
| #define BPF_RSH 0x70 |
| #define BPF_NEG 0x80 |
| #define BPF_JA 0x00 |
| #define BPF_JEQ 0x10 |
| #define BPF_JGT 0x20 |
| #define BPF_JGE 0x30 |
| #define BPF_JSET 0x40 |
| #define BPF_SRC(code) ((code) & 0x08) |
| #define BPF_K 0x00 |
| #define BPF_X 0x08 |
| |
| /* ret - BPF_K and BPF_X also apply */ |
| #define BPF_RVAL(code) ((code) & 0x18) |
| #define BPF_A 0x10 |
| |
| /* misc */ |
| #define BPF_MISCOP(code) ((code) & 0xf8) |
| #define BPF_TAX 0x00 |
| #define BPF_TXA 0x80 |
| |
| #ifndef BPF_MAXINSNS |
| #define BPF_MAXINSNS 4096 |
| #endif |
| |
| /* |
| * Macros for filter block array initializers. |
| */ |
| #ifndef BPF_STMT |
| #define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k } |
| #endif |
| #ifndef BPF_JUMP |
| #define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k } |
| #endif |
| |
| /* |
| * Number of scratch memory words for: BPF_ST and BPF_STX |
| */ |
| #define BPF_MEMWORDS 16 |
| |
| |
| /* BPF Instruction class - End */ |
| |
| #if !defined (COMCERTO_2000) |
| |
| typedef struct tCAPEXPT_context { |
| U32 cap_Q_PTR; // capture descriptors base address |
| U16 cap_enable; |
| U16 rsvd; |
| U32 cap_irqm; // capture interrrupt |
| U32 cap_wrt_index; |
| |
| } CAPEXPT_context, *PCAPEXPT_context; |
| |
| |
| //STATUS BITS in cap_status |
| |
| #define CAP_OWN (1<<29) |
| #define CAP_WRAP (1<<30) |
| |
| #define CAP_LENGTH_MASK 0x1FFF |
| #define CAP_SLICE_BIT 16 |
| |
| #define CAP_IFINDEX 29 |
| #define CAP_IFINDEX_MASK 3 |
| |
| |
| |
| //typedef struct __attribute__((aligned(16))) tCapDesc { |
| |
| typedef struct tCapDesc { |
| U32 cap_data; |
| U32 cap_len; |
| U32 cap_status; |
| U32 cap_tmpstmp; |
| } CAPDesc , *pCAPDesc; |
| |
| typedef struct tCapDesc_short { |
| U32 cap_len; |
| U32 cap_tmpstmp; |
| } CAPDesc_short , *pCAPDesc_short; |
| |
| #endif |
| |
| #define ACTION_IF_STATUS 0x1 |
| #define ACTION_SLICE 0x2 |
| |
| typedef struct tcmdCapStat |
| { |
| U16 action; |
| U8 ifindex; |
| U8 status; |
| }CAPStatCmd, *PCAPStatCmd; |
| |
| typedef struct tcmdCapSlice |
| { |
| U16 action; |
| U8 ifindex; |
| U8 rsvd; |
| U16 slice; |
| }CAPSliceCmd, *PCAPSliceCmd; |
| |
| typedef struct tcmdCapQuery{ |
| U16 slice; |
| U16 status; |
| } __attribute__((packed)) CAPQueryCmd; |
| |
| typedef struct tCapbpf_insn/* bpf instruction */{ |
| U16 code; /* Actual filter code */ |
| U8 jt; /* Jump true */ |
| U8 jf; /* Jump false */ |
| U32 k; /* Generic multiuse field */ |
| }Capbpf_insn; |
| |
| #if defined(COMCERTO_2000_CLASS) |
| typedef struct tCapflf/* First level filter */{ |
| U32 flen; /* filter length */ |
| Capbpf_insn filter[PCAP_MAX_BPF_INST_SUPPORTED]; |
| }CAPflf; |
| #else |
| typedef struct tCapflf/* First level filter */{ |
| U16 flen; /* filter length */ |
| Capbpf_insn *filter; |
| }CAPflf; |
| #endif |
| |
| #if defined (COMCERTO_2000_CONTROL) |
| typedef struct tCapflf_hw/* First level filter */{ |
| U32 flen; /* filter length */ |
| Capbpf_insn filter[PCAP_MAX_BPF_INST_SUPPORTED]; |
| }CAPflf_hw; |
| #endif |
| |
| |
| typedef struct tCapCfgflf/* First level filter */{ |
| U16 flen; /* filter length */ |
| U8 ifindex; |
| U8 mfg; /* set to inform fpp of fragment no, last fragment has the field set to 0 */ |
| Capbpf_insn filter[CAP_MAX_FLF_INSTRUCTIONS]; |
| }CAPcfgflf; |
| |
| typedef struct tCAPCtrl |
| { |
| U16 cap_status; |
| U16 cap_slice; |
| #if !defined (COMCERTO_2000) |
| CAPflf cap_flf; |
| #endif |
| }CAPCtrl; |
| |
| #if defined (COMCERTO_2000) |
| extern u8 g_pcap_enable; |
| extern u32 cap_pkt_cnt; |
| extern CAPCtrl gCapCtrl[GEM_PORTS]; |
| extern CAPflf gCapFilter[GEM_PORTS]; |
| #if !defined(COMCERTO_2000_CONTROL) |
| void pcap_tstamp_upd_lmem (); |
| u32 pcap_get_tstamp_in_us(); |
| void M_PKTCAP_process_packet(PMetadata mtd); |
| void M_pktcap_process(PMetadata mtd, U8 ifindex); |
| void M_pktcap_process_ddrpkt(u32 port, void *ddr_addr, u32 len); |
| void M_pktcap_process_mcast(PMetadata mtd, void *tx_hdr_start); |
| #if defined(COMCERTO_2000_CLASS) |
| int M_pktcap_filter_frame(u8* pkt,u16 pkt_len,Capbpf_insn * filter, U32 flen) __attribute__((section ("slow_pmem"))); |
| void pcap_init(void); |
| extern int (*pktcap_flf_fnptr)(u8* pkt, u16 pkt_len, Capbpf_insn * filter, U32 flen); |
| #endif |
| static inline int M_pktcap_chk_enable(U8 ifindex) |
| { |
| if (g_pcap_enable && (gCapCtrl[ifindex].cap_status & CAP_STATUS_ENABLED)) |
| return 1; |
| |
| return 0; |
| } |
| #define CAP_LMEM_WRAPS_ADDR 0xC0308100 |
| #define CAP_LMEM_CYCLES_ADDR 0xC0308104 |
| |
| #if defined (COMCERTO_2000_CLASS) |
| #define CAP_DMEM_BUFFER CLASS_GP_DMEM_BUF |
| #define CAP_DMEM_BUFFER_SIZE CLASS_GP_DMEM_BUF_SIZE |
| #endif |
| #if defined (COMCERTO_2000_UTIL) |
| #include "util_dmem_storage.h" |
| #define CAP_DMEM_BUFFER MEMCPY_TMP_BUF |
| #define CAP_DMEM_BUFFER_SIZE MEMCPY_TMP_BUF_SIZE |
| #endif |
| |
| #endif |
| #else |
| extern CAPEXPT_context gCapExpt; |
| extern CAPCtrl gCapCtrl[GEM_PORTS]; |
| extern U32 gCapData[MAX_FILL_CAP_DESC]; |
| extern CAPDesc_short gCapCtlShort[MAX_FILL_CAP_DESC]; |
| |
| void M_PKTCAP_process_packet(PMetadata mtd); |
| void M_pktcap_entry(void) __attribute__((section ("fast_path"))); |
| BOOL M_pktcap_init(PModuleDesc pModule); |
| int M_pktcap_process(PMetadata mtd, U8 ifindex) __attribute__((section ("fast_path"))); |
| |
| static inline int M_pktcap_chk_enable(PMetadata mtd , U8 ifindex) |
| { |
| if (gCapExpt.cap_enable && (gCapCtrl[ifindex].cap_status & CAP_STATUS_ENABLED)) |
| return 1; |
| |
| return 0; |
| } |
| #endif |
| int pktcap_init(void); |
| void pktcap_exit(void); |
| |
| #endif /* CFG_PCAP */ |
| #endif /* _MODULE_CAPTURE_H_ */ |
| |