1 /* Copyright (c) 2014 Broadcom Corporation 2 * 3 * Permission to use, copy, modify, and/or distribute this software for any 4 * purpose with or without fee is hereby granted, provided that the above 5 * copyright notice and this permission notice appear in all copies. 6 * 7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 */ 15 #ifndef BRCMFMAC_FLOWRING_H 16 #define BRCMFMAC_FLOWRING_H 17 18 19 #define BRCMF_FLOWRING_HASHSIZE 512 /* has to be 2^x */ 20 #define BRCMF_FLOWRING_INVALID_ID 0xFFFFFFFF 21 22 23 struct brcmf_flowring_hash { 24 u8 mac[ETH_ALEN]; 25 u8 fifo; 26 u8 ifidx; 27 u16 flowid; 28 }; 29 30 enum ring_status { 31 RING_CLOSED, 32 RING_CLOSING, 33 RING_OPEN 34 }; 35 36 struct brcmf_flowring_ring { 37 u16 hash_id; 38 bool blocked; 39 enum ring_status status; 40 struct sk_buff_head skblist; 41 }; 42 43 struct brcmf_flowring_tdls_entry { 44 u8 mac[ETH_ALEN]; 45 struct brcmf_flowring_tdls_entry *next; 46 }; 47 48 struct brcmf_flowring { 49 struct device *dev; 50 struct brcmf_flowring_hash hash[BRCMF_FLOWRING_HASHSIZE]; 51 struct brcmf_flowring_ring **rings; 52 spinlock_t block_lock; 53 enum proto_addr_mode addr_mode[BRCMF_MAX_IFS]; 54 u16 nrofrings; 55 bool tdls_active; 56 struct brcmf_flowring_tdls_entry *tdls_entry; 57 }; 58 59 60 u32 brcmf_flowring_lookup(struct brcmf_flowring *flow, u8 da[ETH_ALEN], 61 u8 prio, u8 ifidx); 62 u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN], 63 u8 prio, u8 ifidx); 64 void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid); 65 void brcmf_flowring_open(struct brcmf_flowring *flow, u16 flowid); 66 u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u16 flowid); 67 u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u16 flowid, 68 struct sk_buff *skb); 69 struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u16 flowid); 70 void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u16 flowid, 71 struct sk_buff *skb); 72 u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u16 flowid); 73 u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u16 flowid); 74 struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings); 75 void brcmf_flowring_detach(struct brcmf_flowring *flow); 76 void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx, 77 enum proto_addr_mode addr_mode); 78 void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx, 79 u8 peer[ETH_ALEN]); 80 void brcmf_flowring_add_tdls_peer(struct brcmf_flowring *flow, int ifidx, 81 u8 peer[ETH_ALEN]); 82 83 84 #endif /* BRCMFMAC_FLOWRING_H */ 85