brintos

brintos / linux-shallow public Read only

0
0
Text · 6.4 KiB · a35cc06 Raw
210 lines · c
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		0x3FF11#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_MAX51};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_MAX62};63 64enum {65	PRESTERA_ACL_IFACE_TYPE_PORT,66	PRESTERA_ACL_IFACE_TYPE_INDEX67};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 for101 * acl_rule_entry_create. Must be flat. Can contain object keys, which will be102 * resolved to object links, before saving to acl_rule_entry struct103 */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);200void201prestera_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_ */210