1b4c3e9b5SBjoern A. Zeeb // SPDX-License-Identifier: ISC 2b4c3e9b5SBjoern A. Zeeb /* 3b4c3e9b5SBjoern A. Zeeb * Copyright (c) 2014 Broadcom Corporation 4b4c3e9b5SBjoern A. Zeeb */ 5b4c3e9b5SBjoern A. Zeeb #ifndef BRCMFMAC_FLOWRING_H 6b4c3e9b5SBjoern A. Zeeb #define BRCMFMAC_FLOWRING_H 7b4c3e9b5SBjoern A. Zeeb 8b4c3e9b5SBjoern A. Zeeb 9b4c3e9b5SBjoern A. Zeeb #define BRCMF_FLOWRING_HASHSIZE 512 /* has to be 2^x */ 10b4c3e9b5SBjoern A. Zeeb #define BRCMF_FLOWRING_INVALID_ID 0xFFFFFFFF 11b4c3e9b5SBjoern A. Zeeb 12b4c3e9b5SBjoern A. Zeeb 13b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring_hash { 14b4c3e9b5SBjoern A. Zeeb u8 mac[ETH_ALEN]; 15b4c3e9b5SBjoern A. Zeeb u8 fifo; 16b4c3e9b5SBjoern A. Zeeb u8 ifidx; 17b4c3e9b5SBjoern A. Zeeb u16 flowid; 18b4c3e9b5SBjoern A. Zeeb }; 19b4c3e9b5SBjoern A. Zeeb 20b4c3e9b5SBjoern A. Zeeb enum ring_status { 21b4c3e9b5SBjoern A. Zeeb RING_CLOSED, 22b4c3e9b5SBjoern A. Zeeb RING_CLOSING, 23b4c3e9b5SBjoern A. Zeeb RING_OPEN 24b4c3e9b5SBjoern A. Zeeb }; 25b4c3e9b5SBjoern A. Zeeb 26b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring_ring { 27b4c3e9b5SBjoern A. Zeeb u16 hash_id; 28b4c3e9b5SBjoern A. Zeeb bool blocked; 29b4c3e9b5SBjoern A. Zeeb enum ring_status status; 30b4c3e9b5SBjoern A. Zeeb struct sk_buff_head skblist; 31b4c3e9b5SBjoern A. Zeeb }; 32b4c3e9b5SBjoern A. Zeeb 33b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring_tdls_entry { 34b4c3e9b5SBjoern A. Zeeb u8 mac[ETH_ALEN]; 35b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring_tdls_entry *next; 36b4c3e9b5SBjoern A. Zeeb }; 37b4c3e9b5SBjoern A. Zeeb 38b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring { 39b4c3e9b5SBjoern A. Zeeb struct device *dev; 40b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring_hash hash[BRCMF_FLOWRING_HASHSIZE]; 41b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring_ring **rings; 42b4c3e9b5SBjoern A. Zeeb spinlock_t block_lock; 43b4c3e9b5SBjoern A. Zeeb enum proto_addr_mode addr_mode[BRCMF_MAX_IFS]; 44b4c3e9b5SBjoern A. Zeeb u16 nrofrings; 45b4c3e9b5SBjoern A. Zeeb bool tdls_active; 46b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring_tdls_entry *tdls_entry; 47b4c3e9b5SBjoern A. Zeeb }; 48b4c3e9b5SBjoern A. Zeeb 49b4c3e9b5SBjoern A. Zeeb 50b4c3e9b5SBjoern A. Zeeb u32 brcmf_flowring_lookup(struct brcmf_flowring *flow, u8 da[ETH_ALEN], 51b4c3e9b5SBjoern A. Zeeb u8 prio, u8 ifidx); 52b4c3e9b5SBjoern A. Zeeb u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN], 53b4c3e9b5SBjoern A. Zeeb u8 prio, u8 ifidx); 54b4c3e9b5SBjoern A. Zeeb void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid); 55b4c3e9b5SBjoern A. Zeeb void brcmf_flowring_open(struct brcmf_flowring *flow, u16 flowid); 56b4c3e9b5SBjoern A. Zeeb u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u16 flowid); 57b4c3e9b5SBjoern A. Zeeb u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u16 flowid, 58b4c3e9b5SBjoern A. Zeeb struct sk_buff *skb); 59b4c3e9b5SBjoern A. Zeeb struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u16 flowid); 60b4c3e9b5SBjoern A. Zeeb void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u16 flowid, 61b4c3e9b5SBjoern A. Zeeb struct sk_buff *skb); 62b4c3e9b5SBjoern A. Zeeb u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u16 flowid); 63b4c3e9b5SBjoern A. Zeeb u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u16 flowid); 64b4c3e9b5SBjoern A. Zeeb struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings); 65b4c3e9b5SBjoern A. Zeeb void brcmf_flowring_detach(struct brcmf_flowring *flow); 66b4c3e9b5SBjoern A. Zeeb void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx, 67b4c3e9b5SBjoern A. Zeeb enum proto_addr_mode addr_mode); 68b4c3e9b5SBjoern A. Zeeb void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx, 69*902136e0SBjoern A. Zeeb #if defined(__linux__) 70b4c3e9b5SBjoern A. Zeeb u8 peer[ETH_ALEN]); 71*902136e0SBjoern A. Zeeb #elif defined(__FreeBSD__) 72*902136e0SBjoern A. Zeeb const u8 peer[ETH_ALEN]); 73*902136e0SBjoern A. Zeeb #endif 74b4c3e9b5SBjoern A. Zeeb void brcmf_flowring_add_tdls_peer(struct brcmf_flowring *flow, int ifidx, 75*902136e0SBjoern A. Zeeb #if defined(__linux__) 76b4c3e9b5SBjoern A. Zeeb u8 peer[ETH_ALEN]); 77*902136e0SBjoern A. Zeeb #elif defined(__FreeBSD__) 78*902136e0SBjoern A. Zeeb const u8 peer[ETH_ALEN]); 79*902136e0SBjoern A. Zeeb #endif 80b4c3e9b5SBjoern A. Zeeb 81b4c3e9b5SBjoern A. Zeeb 82b4c3e9b5SBjoern A. Zeeb #endif /* BRCMFMAC_FLOWRING_H */ 83