1/* SPDX-License-Identifier: GPL-2.0 */
2/* Copyright(c) 2017 - 2019 Pensando Systems, Inc */
3
4#ifndef _IONIC_RX_FILTER_H_
5#define _IONIC_RX_FILTER_H_
6
7#define IONIC_RXQ_INDEX_ANY		(0xFFFF)
8
9enum ionic_filter_state {
10	IONIC_FILTER_STATE_SYNCED,
11	IONIC_FILTER_STATE_NEW,
12	IONIC_FILTER_STATE_OLD,
13};
14
15struct ionic_rx_filter {
16	u32 flow_id;
17	u32 filter_id;
18	u16 rxq_index;
19	enum ionic_filter_state state;
20	struct ionic_rx_filter_add_cmd cmd;
21	struct hlist_node by_hash;
22	struct hlist_node by_id;
23};
24
25#define IONIC_RX_FILTER_HASH_BITS	10
26#define IONIC_RX_FILTER_HLISTS		BIT(IONIC_RX_FILTER_HASH_BITS)
27#define IONIC_RX_FILTER_HLISTS_MASK	(IONIC_RX_FILTER_HLISTS - 1)
28struct ionic_rx_filters {
29	spinlock_t lock;				    /* filter list lock */
30	struct hlist_head by_hash[IONIC_RX_FILTER_HLISTS];  /* by skb hash */
31	struct hlist_head by_id[IONIC_RX_FILTER_HLISTS];    /* by filter_id */
32};
33
34void ionic_rx_filter_free(struct ionic_lif *lif, struct ionic_rx_filter *f);
35void ionic_rx_filter_replay(struct ionic_lif *lif);
36int ionic_rx_filters_init(struct ionic_lif *lif);
37void ionic_rx_filters_deinit(struct ionic_lif *lif);
38int ionic_rx_filter_save(struct ionic_lif *lif, u32 flow_id, u16 rxq_index,
39			 u32 hash, struct ionic_admin_ctx *ctx,
40			 enum ionic_filter_state state);
41struct ionic_rx_filter *ionic_rx_filter_by_vlan(struct ionic_lif *lif, u16 vid);
42struct ionic_rx_filter *ionic_rx_filter_by_addr(struct ionic_lif *lif, const u8 *addr);
43struct ionic_rx_filter *ionic_rx_filter_rxsteer(struct ionic_lif *lif);
44void ionic_rx_filter_sync(struct ionic_lif *lif);
45int ionic_lif_list_addr(struct ionic_lif *lif, const u8 *addr, bool mode);
46int ionic_lif_vlan_add(struct ionic_lif *lif, const u16 vid);
47int ionic_lif_vlan_del(struct ionic_lif *lif, const u16 vid);
48
49#endif /* _IONIC_RX_FILTER_H_ */
50