2 * Copyright (C) 2009, Broadcom Corporation
5 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
6 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
7 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
8 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
10 * $Id: hndctf.h,v 1.1.2.5 2010/01/06 19:09:50 Exp $
17 #include <proto/ethernet.h>
19 #define CTF_ENAB(ci) (((ci) != NULL) && (ci)->_ctf)
21 #define CTF_ACTION_TAG (1 << 0)
22 #define CTF_ACTION_UNTAG (1 << 1)
23 #define CTF_ACTION_SNAT (1 << 2)
24 #define CTF_ACTION_DNAT (1 << 3)
26 #define ctf_attach(osh, n, m, c, a) \
27 (ctf_attach_fn ? ctf_attach_fn(osh, n, m, c, a) : NULL)
28 #define ctf_forward(ci, p) (ci)->fn.forward(ci, p)
29 #define ctf_isenabled(ci, d) (CTF_ENAB(ci) ? (ci)->fn.isenabled(ci, d) : FALSE)
30 #define ctf_isbridge(ci, d) (CTF_ENAB(ci) ? (ci)->fn.isbridge(ci, d) : FALSE)
31 #define ctf_enable(ci, d, e) (CTF_ENAB(ci) ? (ci)->fn.enable(ci, d, e) : BCME_OK)
32 #define ctf_brc_add(ci, b) (CTF_ENAB(ci) ? (ci)->fn.brc_add(ci, b) : BCME_OK)
33 #define ctf_brc_delete(ci, e) (CTF_ENAB(ci) ? (ci)->fn.brc_delete(ci, e) : BCME_OK)
34 #define ctf_brc_update(ci, b) (CTF_ENAB(ci) ? (ci)->fn.brc_update(ci, b) : BCME_OK)
35 #define ctf_brc_lkup(ci, e) (CTF_ENAB(ci) ? (ci)->fn.brc_lkup(ci, e) : NULL)
36 #define ctf_ipc_add(ci, i) (CTF_ENAB(ci) ? (ci)->fn.ipc_add(ci, i) : BCME_OK)
37 #define ctf_ipc_delete(ci, sip, dip, p, sp, dp) \
38 (CTF_ENAB(ci) ? (ci)->fn.ipc_delete(ci, sip, dip, p, sp, dp) : BCME_OK)
39 #define ctf_ipc_lkup(ci, sip, dip, p, sp, dp) \
40 (CTF_ENAB(ci) ? (ci)->fn.ipc_lkup(ci, sip, dip, p, sp, dp) : NULL)
41 #define ctf_dev_register(ci, d, b) \
42 (CTF_ENAB(ci) ? (ci)->fn.dev_register(ci, d, b) : BCME_OK)
43 #define ctf_detach(ci) if (CTF_ENAB(ci)) (ci)->fn.detach(ci)
44 #define ctf_dump(ci, b) if (CTF_ENAB(ci)) (ci)->fn.dump(ci, b)
45 #define ctf_dev_unregister(ci, d) if (CTF_ENAB(ci)) (ci)->fn.dev_unregister(ci, d)
47 typedef struct ctf_pub ctf_t
;
48 typedef struct ctf_brc ctf_brc_t
;
49 typedef struct ctf_ipc ctf_ipc_t
;
51 typedef void (*ctf_detach_cb_t
)(ctf_t
*ci
, void *arg
);
52 typedef ctf_t
* (*ctf_attach_t
)(osl_t
*osh
, uint8
*name
, uint32
*msg_level
,
53 ctf_detach_cb_t cb
, void *arg
);
54 typedef void (*ctf_detach_t
)(ctf_t
*ci
);
55 typedef int32 (*ctf_forward_t
)(ctf_t
*ci
, void *p
);
56 typedef bool (*ctf_isenabled_t
)(ctf_t
*ci
, void *dev
);
57 typedef bool (*ctf_isbridge_t
)(ctf_t
*ci
, void *dev
);
58 typedef int32 (*ctf_brc_add_t
)(ctf_t
*ci
, ctf_brc_t
*brc
);
59 typedef int32 (*ctf_brc_delete_t
)(ctf_t
*ci
, uint8
*ea
);
60 typedef int32 (*ctf_brc_update_t
)(ctf_t
*ci
, ctf_brc_t
*brc
);
61 typedef ctf_brc_t
* (*ctf_brc_lkup_t
)(ctf_t
*ci
, uint8
*da
);
62 typedef int32 (*ctf_ipc_add_t
)(ctf_t
*ci
, ctf_ipc_t
*ipc
);
63 typedef int32 (*ctf_ipc_delete_t
)(ctf_t
*ci
, uint32 sip
, uint32 dip
, uint8 proto
,
64 uint16 sp
, uint16 dp
);
65 typedef ctf_ipc_t
* (*ctf_ipc_lkup_t
)(ctf_t
*ci
, uint32 sip
, uint32 dip
, uint8 proto
,
66 uint16 sp
, uint16 dp
);
67 typedef int32 (*ctf_enable_t
)(ctf_t
*ci
, void *dev
, bool enable
);
68 typedef int32 (*ctf_dev_register_t
)(ctf_t
*ci
, void *dev
, bool br
);
69 typedef void (*ctf_dev_unregister_t
)(ctf_t
*ci
, void *dev
);
70 #if defined(BCMDBG_DUMP)
71 typedef void (*ctf_dump_t
)(ctf_t
*ci
, struct bcmstrbuf
*b
);
74 typedef struct ctf_fn
{
76 ctf_forward_t forward
;
77 ctf_isenabled_t isenabled
;
78 ctf_isbridge_t isbridge
;
79 ctf_brc_add_t brc_add
;
80 ctf_brc_delete_t brc_delete
;
81 ctf_brc_update_t brc_update
;
82 ctf_brc_lkup_t brc_lkup
;
83 ctf_ipc_add_t ipc_add
;
84 ctf_ipc_delete_t ipc_delete
;
85 ctf_ipc_lkup_t ipc_lkup
;
87 ctf_dev_register_t dev_register
;
88 ctf_dev_unregister_t dev_unregister
;
89 ctf_detach_cb_t detach_cb
;
91 #if defined(BCMDBG_DUMP)
97 bool _ctf
; /* Global CTF enable/disable */
98 ctf_fn_t fn
; /* Exported functions */
102 struct ctf_brc
*next
; /* Pointer to brc entry */
103 struct ether_addr dhost
; /* MAC addr of host */
104 uint16 vid
; /* VLAN id to use on txif */
105 void *txifp
; /* Interface connected to host */
106 uint32 action
; /* Tag or untag the frames */
107 uint32 hits
; /* Num frames matching brc entry */
108 uint32 live
; /* Counter used to expire the entry */
111 typedef struct ctf_conn_tuple
{
117 typedef struct ctf_nat
{
123 struct ctf_ipc
*next
; /* Pointer to ipc entry */
124 ctf_conn_tuple_t tuple
; /* Tuple to uniquely id the flow */
125 uint16 vid
; /* VLAN id to use on txif */
126 struct ether_addr dhost
; /* Destination MAC address */
127 struct ether_addr shost
; /* Source MAC address */
128 void *txif
; /* Target interface to send */
129 uint32 action
; /* NAT and/or VLAN actions */
130 uint32 hits
; /* Num frames matching ipc entry */
131 uint32 live
; /* Counter used to expire the entry */
132 struct ctf_nat nat
[2]; /* Manip data for SNAT, DNAT */
135 extern ctf_t
*ctf_kattach(osl_t
*osh
, uint8
*name
);
136 extern void ctf_kdetach(ctf_t
*kci
);
137 extern ctf_attach_t ctf_attach_fn
;
138 extern ctf_t
*_ctf_attach(osl_t
*osh
, uint8
*name
, uint32
*msg_level
,
139 ctf_detach_cb_t cb
, void *arg
);
141 #endif /* _HNDCTF_H_ */