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