1/*
2 * Copyright (C) 2010, Broadcom Corporation. All Rights Reserved.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 *
16 * $Id: hndctf.h,v 1.6.12.3 2010/10/26 00:19:09 Exp $
17 */
18
19#ifndef _HNDCTF_H_
20#define _HNDCTF_H_
21
22#include <bcmutils.h>
23#include <proto/ethernet.h>
24
25/*
26 * Define to enable couting VLAN tx and rx packets and bytes. This could be
27 * disabled if the functionality has impact on performance.
28 */
29#define CTFVLSTATS
30
31#define CTF_ENAB(ci)		(((ci) != NULL) && (ci)->_ctf)
32
33#define CTF_ACTION_TAG		(1 << 0)
34#define CTF_ACTION_UNTAG	(1 << 1)
35#define CTF_ACTION_SNAT		(1 << 2)
36#define CTF_ACTION_DNAT		(1 << 3)
37
38#define	ctf_attach(osh, n, m, c, a) \
39	(ctf_attach_fn ? ctf_attach_fn(osh, n, m, c, a) : NULL)
40#define ctf_forward(ci, p, d)	(ci)->fn.forward(ci, p, d)
41#define ctf_isenabled(ci, d)	(CTF_ENAB(ci) ? (ci)->fn.isenabled(ci, d) : FALSE)
42#define ctf_isbridge(ci, d)	(CTF_ENAB(ci) ? (ci)->fn.isbridge(ci, d) : FALSE)
43#define ctf_enable(ci, d, e)	(CTF_ENAB(ci) ? (ci)->fn.enable(ci, d, e) : BCME_OK)
44#define ctf_brc_add(ci, b)	(CTF_ENAB(ci) ? (ci)->fn.brc_add(ci, b) : BCME_OK)
45#define ctf_brc_delete(ci, e)	(CTF_ENAB(ci) ? (ci)->fn.brc_delete(ci, e) : BCME_OK)
46#define ctf_brc_update(ci, b)	(CTF_ENAB(ci) ? (ci)->fn.brc_update(ci, b) : BCME_OK)
47#define ctf_brc_lkup(ci, e)	(CTF_ENAB(ci) ? (ci)->fn.brc_lkup(ci, e) : NULL)
48#define ctf_ipc_add(ci, i)	(CTF_ENAB(ci) ? (ci)->fn.ipc_add(ci, i) : BCME_OK)
49#define ctf_ipc_delete(ci, sip, dip, p, sp, dp)	\
50	(CTF_ENAB(ci) ? (ci)->fn.ipc_delete(ci, sip, dip, p, sp, dp) : BCME_OK)
51#define ctf_ipc_count_get(ci, i) \
52	(CTF_ENAB(ci) ? (ci)->fn.ipc_count_get(ci, i) : BCME_OK)
53#define ctf_ipc_delete_multi(ci, i, im)	\
54	(CTF_ENAB(ci) ? (ci)->fn.ipc_delete_multi(ci, i, im) : BCME_OK)
55#define ctf_ipc_delete_range(ci, i, im)	\
56	(CTF_ENAB(ci) ? (ci)->fn.ipc_delete_range(ci, i, im) : BCME_OK)
57#define ctf_ipc_lkup(ci, sip, dip, p, sp, dp)	\
58	(CTF_ENAB(ci) ? (ci)->fn.ipc_lkup(ci, sip, dip, p, sp, dp) : NULL)
59#define ctf_dev_register(ci, d, b)	\
60	(CTF_ENAB(ci) ? (ci)->fn.dev_register(ci, d, b) : BCME_OK)
61#define ctf_dev_vlan_add(ci, d, vid, vd)	\
62	(CTF_ENAB(ci) ? (ci)->fn.dev_vlan_add(ci, d, vid, vd) : BCME_OK)
63#define ctf_dev_vlan_delete(ci, d, vid)	\
64	(CTF_ENAB(ci) ? (ci)->fn.dev_vlan_delete(ci, d, vid) : BCME_OK)
65#define ctf_detach(ci)			if (CTF_ENAB(ci)) (ci)->fn.detach(ci)
66#define ctf_dump(ci, b)			if (CTF_ENAB(ci)) (ci)->fn.dump(ci, b)
67#define ctf_dev_unregister(ci, d)	if (CTF_ENAB(ci)) (ci)->fn.dev_unregister(ci, d)
68
69#define CTFCNTINCR(s)
70
71/* copy an ethernet address in reverse order */
72#define	ether_rcopy(s, d) \
73do { \
74	((uint16 *)(d))[2] = ((uint16 *)(s))[2]; \
75	((uint16 *)(d))[1] = ((uint16 *)(s))[1]; \
76	((uint16 *)(d))[0] = ((uint16 *)(s))[0]; \
77} while (0)
78
79typedef struct ctf_pub	ctf_t;
80typedef struct ctf_brc	ctf_brc_t;
81typedef struct ctf_ipc	ctf_ipc_t;
82typedef struct ctf_conn_tuple	ctf_conn_tuple_t;
83
84typedef void (*ctf_detach_cb_t)(ctf_t *ci, void *arg);
85typedef ctf_t * (*ctf_attach_t)(osl_t *osh, uint8 *name, uint32 *msg_level,
86                                ctf_detach_cb_t cb, void *arg);
87typedef void (*ctf_detach_t)(ctf_t *ci);
88typedef int32 (*ctf_forward_t)(ctf_t *ci, void *p, void *rxifp);
89typedef bool (*ctf_isenabled_t)(ctf_t *ci, void *dev);
90typedef bool (*ctf_isbridge_t)(ctf_t *ci, void *dev);
91typedef int32 (*ctf_brc_add_t)(ctf_t *ci, ctf_brc_t *brc);
92typedef int32 (*ctf_brc_delete_t)(ctf_t *ci, uint8 *ea);
93typedef int32 (*ctf_brc_update_t)(ctf_t *ci, ctf_brc_t *brc);
94typedef ctf_brc_t * (*ctf_brc_lkup_t)(ctf_t *ci, uint8 *da);
95typedef int32 (*ctf_ipc_add_t)(ctf_t *ci, ctf_ipc_t *ipc);
96typedef int32 (*ctf_ipc_delete_t)(ctf_t *ci, uint32 sip, uint32 dip, uint8 proto,
97                                  uint16 sp, uint16 dp);
98typedef int32 (*ctf_ipc_count_get_t)(ctf_t *ci);
99typedef int32 (*ctf_ipc_delete_multi_t)(ctf_t *ci, ctf_ipc_t *ipc, ctf_ipc_t *ipcm);
100typedef int32 (*ctf_ipc_delete_range_t)(ctf_t *ci, ctf_ipc_t *start, ctf_ipc_t *end);
101typedef ctf_ipc_t * (*ctf_ipc_lkup_t)(ctf_t *ci, uint32 sip, uint32 dip, uint8 proto,
102                                    uint16 sp, uint16 dp);
103typedef int32 (*ctf_enable_t)(ctf_t *ci, void *dev, bool enable);
104typedef int32 (*ctf_dev_register_t)(ctf_t *ci, void *dev, bool br);
105typedef void (*ctf_dev_unregister_t)(ctf_t *ci, void *dev);
106typedef int32 (*ctf_dev_vlan_add_t)(ctf_t *ci, void *dev, uint16 vid, void *vldev);
107typedef int32 (*ctf_dev_vlan_delete_t)(ctf_t *ci, void *dev, uint16 vid);
108#if defined(BCMDBG_DUMP)
109typedef void (*ctf_dump_t)(ctf_t *ci, struct bcmstrbuf *b);
110#endif
111
112typedef struct ctf_fn {
113	ctf_detach_t		detach;
114	ctf_forward_t		forward;
115	ctf_isenabled_t		isenabled;
116	ctf_isbridge_t		isbridge;
117	ctf_brc_add_t		brc_add;
118	ctf_brc_delete_t	brc_delete;
119	ctf_brc_update_t	brc_update;
120	ctf_brc_lkup_t		brc_lkup;
121	ctf_ipc_add_t		ipc_add;
122	ctf_ipc_delete_t	ipc_delete;
123	ctf_ipc_count_get_t	ipc_count_get;
124	ctf_ipc_delete_multi_t	ipc_delete_multi;
125	ctf_ipc_delete_range_t	ipc_delete_range;
126	ctf_ipc_lkup_t		ipc_lkup;
127	ctf_enable_t		enable;
128	ctf_dev_register_t	dev_register;
129	ctf_dev_unregister_t	dev_unregister;
130	ctf_detach_cb_t		detach_cb;
131	void			*detach_cb_arg;
132	ctf_dev_vlan_add_t	dev_vlan_add;
133	ctf_dev_vlan_delete_t	dev_vlan_delete;
134#if defined(BCMDBG_DUMP)
135	ctf_dump_t		dump;
136#endif
137} ctf_fn_t;
138
139struct ctf_pub {
140	bool			_ctf;		/* Global CTF enable/disable */
141	ctf_fn_t		fn;		/* Exported functions */
142};
143
144struct ctf_brc {
145	struct	ctf_brc		*next;		/* Pointer to brc entry */
146	struct	ether_addr	dhost;		/* MAC addr of host */
147	uint16			vid;		/* VLAN id to use on txif */
148	void			*txifp;		/* Interface connected to host */
149	uint32			action;		/* Tag or untag the frames */
150	uint32			live;		/* Counter used to expire the entry */
151};
152
153struct ctf_conn_tuple {
154	uint32	sip, dip;
155	uint16	sp, dp;
156	uint8	proto;
157};
158
159typedef struct ctf_nat {
160	uint32	ip;
161	uint16	port;
162} ctf_nat_t;
163
164struct ctf_ipc {
165	struct	ctf_ipc		*next;		/* Pointer to ipc entry */
166	ctf_conn_tuple_t	tuple;		/* Tuple to uniquely id the flow */
167	uint16			vid;		/* VLAN id to use on txif */
168	struct	ether_addr	dhost;		/* Destination MAC address */
169	struct	ether_addr	shost;		/* Source MAC address */
170	void			*txif;		/* Target interface to send */
171	uint32			action;		/* NAT and/or VLAN actions */
172	ctf_brc_t		*brcp;		/* BRC entry corresp to source mac */
173	uint32			live;		/* Counter used to expire the entry */
174	struct	ctf_nat		nat;		/* Manip data for SNAT, DNAT */
175	struct	ether_addr	sa;		/* MAC address of sender */
176};
177
178extern ctf_t *ctf_kattach(osl_t *osh, uint8 *name);
179extern void ctf_kdetach(ctf_t *kci);
180extern ctf_attach_t ctf_attach_fn;
181extern ctf_t *_ctf_attach(osl_t *osh, uint8 *name, uint32 *msg_level,
182                          ctf_detach_cb_t cb, void *arg);
183extern ctf_t *kcih;
184
185#endif /* _HNDCTF_H_ */
186