Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
  2/* Copyright (c) 2020-2021 Marvell International Ltd. All rights reserved. */
  3
  4#ifndef _PRESTERA_ACL_H_
  5#define _PRESTERA_ACL_H_
  6
  7#include <linux/types.h>
  8#include "prestera_counter.h"
  9
 10#define PRESTERA_ACL_KEYMASK_PCL_ID		0x3FF
 11#define PRESTERA_ACL_KEYMASK_PCL_ID_USER			\
 12	(PRESTERA_ACL_KEYMASK_PCL_ID & 0x00FF)
 13#define PRESTERA_ACL_KEYMASK_PCL_ID_CHAIN			\
 14	(PRESTERA_ACL_KEYMASK_PCL_ID & 0xFF00)
 15#define PRESTERA_ACL_CHAIN_MASK					\
 16	(PRESTERA_ACL_KEYMASK_PCL_ID >> 8)
 17
 18#define PRESTERA_ACL_PCL_ID_MAKE(uid, chain_id)			\
 19	(((uid) & PRESTERA_ACL_KEYMASK_PCL_ID_USER) |		\
 20	(((chain_id) << 8) & PRESTERA_ACL_KEYMASK_PCL_ID_CHAIN))
 21
 22#define rule_match_set_n(match_p, type, val_p, size)		\
 23	memcpy(&(match_p)[PRESTERA_ACL_RULE_MATCH_TYPE_##type],	\
 24	       val_p, size)
 25#define rule_match_set(match_p, type, val)			\
 26	memcpy(&(match_p)[PRESTERA_ACL_RULE_MATCH_TYPE_##type],	\
 27	       &(val), sizeof(val))
 28
 29enum prestera_acl_match_type {
 30	PRESTERA_ACL_RULE_MATCH_TYPE_PCL_ID,
 31	PRESTERA_ACL_RULE_MATCH_TYPE_ETH_TYPE,
 32	PRESTERA_ACL_RULE_MATCH_TYPE_ETH_DMAC_0,
 33	PRESTERA_ACL_RULE_MATCH_TYPE_ETH_DMAC_1,
 34	PRESTERA_ACL_RULE_MATCH_TYPE_ETH_SMAC_0,
 35	PRESTERA_ACL_RULE_MATCH_TYPE_ETH_SMAC_1,
 36	PRESTERA_ACL_RULE_MATCH_TYPE_IP_PROTO,
 37	PRESTERA_ACL_RULE_MATCH_TYPE_SYS_PORT,
 38	PRESTERA_ACL_RULE_MATCH_TYPE_SYS_DEV,
 39	PRESTERA_ACL_RULE_MATCH_TYPE_IP_SRC,
 40	PRESTERA_ACL_RULE_MATCH_TYPE_IP_DST,
 41	PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_SRC,
 42	PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_DST,
 43	PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_RANGE_SRC,
 44	PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_RANGE_DST,
 45	PRESTERA_ACL_RULE_MATCH_TYPE_VLAN_ID,
 46	PRESTERA_ACL_RULE_MATCH_TYPE_VLAN_TPID,
 47	PRESTERA_ACL_RULE_MATCH_TYPE_ICMP_TYPE,
 48	PRESTERA_ACL_RULE_MATCH_TYPE_ICMP_CODE,
 49
 50	__PRESTERA_ACL_RULE_MATCH_TYPE_MAX
 51};
 52
 53enum prestera_acl_rule_action {
 54	PRESTERA_ACL_RULE_ACTION_ACCEPT = 0,
 55	PRESTERA_ACL_RULE_ACTION_DROP = 1,
 56	PRESTERA_ACL_RULE_ACTION_TRAP = 2,
 57	PRESTERA_ACL_RULE_ACTION_JUMP = 5,
 58	PRESTERA_ACL_RULE_ACTION_COUNT = 7,
 59	PRESTERA_ACL_RULE_ACTION_POLICE = 8,
 60
 61	PRESTERA_ACL_RULE_ACTION_MAX
 62};
 63
 64enum {
 65	PRESTERA_ACL_IFACE_TYPE_PORT,
 66	PRESTERA_ACL_IFACE_TYPE_INDEX
 67};
 68
 69struct prestera_acl_match {
 70	__be32 key[__PRESTERA_ACL_RULE_MATCH_TYPE_MAX];
 71	__be32 mask[__PRESTERA_ACL_RULE_MATCH_TYPE_MAX];
 72};
 73
 74struct prestera_acl_action_jump {
 75	u32 index;
 76};
 77
 78struct prestera_acl_action_police {
 79	u32 id;
 80};
 81
 82struct prestera_acl_action_count {
 83	u32 id;
 84};
 85
 86struct prestera_acl_rule_entry_key {
 87	u32 prio;
 88	struct prestera_acl_match match;
 89};
 90
 91struct prestera_acl_hw_action_info {
 92	enum prestera_acl_rule_action id;
 93	union {
 94		struct prestera_acl_action_police police;
 95		struct prestera_acl_action_count count;
 96		struct prestera_acl_action_jump jump;
 97	};
 98};
 99
100/* This struct (arg) used only to be passed as parameter for
101 * acl_rule_entry_create. Must be flat. Can contain object keys, which will be
102 * resolved to object links, before saving to acl_rule_entry struct
103 */
104struct prestera_acl_rule_entry_arg {
105	u32 vtcam_id;
106	struct {
107		struct {
108			u8 valid:1;
109		} accept, drop, trap;
110		struct {
111			struct prestera_acl_action_jump i;
112			u8 valid:1;
113		} jump;
114		struct {
115			u8 valid:1;
116			u64 rate;
117			u64 burst;
118			bool ingress;
119		} police;
120		struct {
121			u8 valid:1;
122			u32 client;
123		} count;
124	};
125};
126
127struct prestera_acl_rule {
128	struct rhash_head ht_node; /* Member of acl HT */
129	struct list_head list;
130	struct prestera_acl_ruleset *ruleset;
131	struct prestera_acl_ruleset *jump_ruleset;
132	unsigned long cookie;
133	u32 chain_index;
134	u32 priority;
135	struct prestera_acl_rule_entry_key re_key;
136	struct prestera_acl_rule_entry_arg re_arg;
137	struct prestera_acl_rule_entry *re;
138};
139
140struct prestera_acl_iface {
141	union {
142		struct prestera_port *port;
143		u32 index;
144	};
145	u8 type;
146};
147
148struct prestera_acl;
149struct prestera_switch;
150struct prestera_flow_block;
151
152int prestera_acl_init(struct prestera_switch *sw);
153void prestera_acl_fini(struct prestera_switch *sw);
154
155struct prestera_acl_rule *
156prestera_acl_rule_create(struct prestera_acl_ruleset *ruleset,
157			 unsigned long cookie, u32 chain_index);
158void prestera_acl_rule_priority_set(struct prestera_acl_rule *rule,
159				    u32 priority);
160void prestera_acl_rule_destroy(struct prestera_acl_rule *rule);
161struct prestera_acl_rule *
162prestera_acl_rule_lookup(struct prestera_acl_ruleset *ruleset,
163			 unsigned long cookie);
164int prestera_acl_rule_add(struct prestera_switch *sw,
165			  struct prestera_acl_rule *rule);
166void prestera_acl_rule_del(struct prestera_switch *sw,
167			   struct prestera_acl_rule *rule);
168int prestera_acl_rule_get_stats(struct prestera_acl *acl,
169				struct prestera_acl_rule *rule,
170				u64 *packets, u64 *bytes, u64 *last_use);
171struct prestera_acl_rule_entry *
172prestera_acl_rule_entry_find(struct prestera_acl *acl,
173			     struct prestera_acl_rule_entry_key *key);
174void prestera_acl_rule_entry_destroy(struct prestera_acl *acl,
175				     struct prestera_acl_rule_entry *e);
176struct prestera_acl_rule_entry *
177prestera_acl_rule_entry_create(struct prestera_acl *acl,
178			       struct prestera_acl_rule_entry_key *key,
179			       struct prestera_acl_rule_entry_arg *arg);
180struct prestera_acl_ruleset *
181prestera_acl_ruleset_get(struct prestera_acl *acl,
182			 struct prestera_flow_block *block,
183			 u32 chain_index);
184struct prestera_acl_ruleset *
185prestera_acl_ruleset_lookup(struct prestera_acl *acl,
186			    struct prestera_flow_block *block,
187			    u32 chain_index);
188int prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset,
189				     void *keymask);
190bool prestera_acl_ruleset_is_offload(struct prestera_acl_ruleset *ruleset);
191int prestera_acl_ruleset_offload(struct prestera_acl_ruleset *ruleset);
192void prestera_acl_ruleset_put(struct prestera_acl_ruleset *ruleset);
193int prestera_acl_ruleset_bind(struct prestera_acl_ruleset *ruleset,
194			      struct prestera_port *port);
195int prestera_acl_ruleset_unbind(struct prestera_acl_ruleset *ruleset,
196				struct prestera_port *port);
197u32 prestera_acl_ruleset_index_get(const struct prestera_acl_ruleset *ruleset);
198void prestera_acl_ruleset_prio_get(struct prestera_acl_ruleset *ruleset,
199				   u32 *prio_min, u32 *prio_max);
200void
201prestera_acl_rule_keymask_pcl_id_set(struct prestera_acl_rule *rule,
202				     u16 pcl_id);
203
204int prestera_acl_vtcam_id_get(struct prestera_acl *acl, u8 lookup, u8 dir,
205			      void *keymask, u32 *vtcam_id);
206int prestera_acl_vtcam_id_put(struct prestera_acl *acl, u32 vtcam_id);
207int prestera_acl_chain_to_client(u32 chain_index, bool ingress, u32 *client);
208
209#endif /* _PRESTERA_ACL_H_ */