Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
0002 /* Copyright (c) 2020-2021 Marvell International Ltd. All rights reserved. */
0003 
0004 #ifndef _PRESTERA_ACL_H_
0005 #define _PRESTERA_ACL_H_
0006 
0007 #include <linux/types.h>
0008 #include "prestera_counter.h"
0009 
0010 #define PRESTERA_ACL_KEYMASK_PCL_ID     0x3FF
0011 #define PRESTERA_ACL_KEYMASK_PCL_ID_USER            \
0012     (PRESTERA_ACL_KEYMASK_PCL_ID & 0x00FF)
0013 #define PRESTERA_ACL_KEYMASK_PCL_ID_CHAIN           \
0014     (PRESTERA_ACL_KEYMASK_PCL_ID & 0xFF00)
0015 #define PRESTERA_ACL_CHAIN_MASK                 \
0016     (PRESTERA_ACL_KEYMASK_PCL_ID >> 8)
0017 
0018 #define PRESTERA_ACL_PCL_ID_MAKE(uid, chain_id)         \
0019     (((uid) & PRESTERA_ACL_KEYMASK_PCL_ID_USER) |       \
0020     (((chain_id) << 8) & PRESTERA_ACL_KEYMASK_PCL_ID_CHAIN))
0021 
0022 #define rule_match_set_n(match_p, type, val_p, size)        \
0023     memcpy(&(match_p)[PRESTERA_ACL_RULE_MATCH_TYPE_##type], \
0024            val_p, size)
0025 #define rule_match_set(match_p, type, val)          \
0026     memcpy(&(match_p)[PRESTERA_ACL_RULE_MATCH_TYPE_##type], \
0027            &(val), sizeof(val))
0028 
0029 enum prestera_acl_match_type {
0030     PRESTERA_ACL_RULE_MATCH_TYPE_PCL_ID,
0031     PRESTERA_ACL_RULE_MATCH_TYPE_ETH_TYPE,
0032     PRESTERA_ACL_RULE_MATCH_TYPE_ETH_DMAC_0,
0033     PRESTERA_ACL_RULE_MATCH_TYPE_ETH_DMAC_1,
0034     PRESTERA_ACL_RULE_MATCH_TYPE_ETH_SMAC_0,
0035     PRESTERA_ACL_RULE_MATCH_TYPE_ETH_SMAC_1,
0036     PRESTERA_ACL_RULE_MATCH_TYPE_IP_PROTO,
0037     PRESTERA_ACL_RULE_MATCH_TYPE_SYS_PORT,
0038     PRESTERA_ACL_RULE_MATCH_TYPE_SYS_DEV,
0039     PRESTERA_ACL_RULE_MATCH_TYPE_IP_SRC,
0040     PRESTERA_ACL_RULE_MATCH_TYPE_IP_DST,
0041     PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_SRC,
0042     PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_DST,
0043     PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_RANGE_SRC,
0044     PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_RANGE_DST,
0045     PRESTERA_ACL_RULE_MATCH_TYPE_VLAN_ID,
0046     PRESTERA_ACL_RULE_MATCH_TYPE_VLAN_TPID,
0047     PRESTERA_ACL_RULE_MATCH_TYPE_ICMP_TYPE,
0048     PRESTERA_ACL_RULE_MATCH_TYPE_ICMP_CODE,
0049 
0050     __PRESTERA_ACL_RULE_MATCH_TYPE_MAX
0051 };
0052 
0053 enum prestera_acl_rule_action {
0054     PRESTERA_ACL_RULE_ACTION_ACCEPT = 0,
0055     PRESTERA_ACL_RULE_ACTION_DROP = 1,
0056     PRESTERA_ACL_RULE_ACTION_TRAP = 2,
0057     PRESTERA_ACL_RULE_ACTION_JUMP = 5,
0058     PRESTERA_ACL_RULE_ACTION_COUNT = 7,
0059     PRESTERA_ACL_RULE_ACTION_POLICE = 8,
0060 
0061     PRESTERA_ACL_RULE_ACTION_MAX
0062 };
0063 
0064 enum {
0065     PRESTERA_ACL_IFACE_TYPE_PORT,
0066     PRESTERA_ACL_IFACE_TYPE_INDEX
0067 };
0068 
0069 struct prestera_acl_match {
0070     __be32 key[__PRESTERA_ACL_RULE_MATCH_TYPE_MAX];
0071     __be32 mask[__PRESTERA_ACL_RULE_MATCH_TYPE_MAX];
0072 };
0073 
0074 struct prestera_acl_action_jump {
0075     u32 index;
0076 };
0077 
0078 struct prestera_acl_action_police {
0079     u32 id;
0080 };
0081 
0082 struct prestera_acl_action_count {
0083     u32 id;
0084 };
0085 
0086 struct prestera_acl_rule_entry_key {
0087     u32 prio;
0088     struct prestera_acl_match match;
0089 };
0090 
0091 struct prestera_acl_hw_action_info {
0092     enum prestera_acl_rule_action id;
0093     union {
0094         struct prestera_acl_action_police police;
0095         struct prestera_acl_action_count count;
0096         struct prestera_acl_action_jump jump;
0097     };
0098 };
0099 
0100 /* This struct (arg) used only to be passed as parameter for
0101  * acl_rule_entry_create. Must be flat. Can contain object keys, which will be
0102  * resolved to object links, before saving to acl_rule_entry struct
0103  */
0104 struct prestera_acl_rule_entry_arg {
0105     u32 vtcam_id;
0106     struct {
0107         struct {
0108             u8 valid:1;
0109         } accept, drop, trap;
0110         struct {
0111             struct prestera_acl_action_jump i;
0112             u8 valid:1;
0113         } jump;
0114         struct {
0115             u8 valid:1;
0116             u64 rate;
0117             u64 burst;
0118             bool ingress;
0119         } police;
0120         struct {
0121             u8 valid:1;
0122             u32 client;
0123         } count;
0124     };
0125 };
0126 
0127 struct prestera_acl_rule {
0128     struct rhash_head ht_node; /* Member of acl HT */
0129     struct list_head list;
0130     struct prestera_acl_ruleset *ruleset;
0131     struct prestera_acl_ruleset *jump_ruleset;
0132     unsigned long cookie;
0133     u32 chain_index;
0134     u32 priority;
0135     struct prestera_acl_rule_entry_key re_key;
0136     struct prestera_acl_rule_entry_arg re_arg;
0137     struct prestera_acl_rule_entry *re;
0138 };
0139 
0140 struct prestera_acl_iface {
0141     union {
0142         struct prestera_port *port;
0143         u32 index;
0144     };
0145     u8 type;
0146 };
0147 
0148 struct prestera_acl;
0149 struct prestera_switch;
0150 struct prestera_flow_block;
0151 
0152 int prestera_acl_init(struct prestera_switch *sw);
0153 void prestera_acl_fini(struct prestera_switch *sw);
0154 
0155 struct prestera_acl_rule *
0156 prestera_acl_rule_create(struct prestera_acl_ruleset *ruleset,
0157              unsigned long cookie, u32 chain_index);
0158 void prestera_acl_rule_priority_set(struct prestera_acl_rule *rule,
0159                     u32 priority);
0160 void prestera_acl_rule_destroy(struct prestera_acl_rule *rule);
0161 struct prestera_acl_rule *
0162 prestera_acl_rule_lookup(struct prestera_acl_ruleset *ruleset,
0163              unsigned long cookie);
0164 int prestera_acl_rule_add(struct prestera_switch *sw,
0165               struct prestera_acl_rule *rule);
0166 void prestera_acl_rule_del(struct prestera_switch *sw,
0167                struct prestera_acl_rule *rule);
0168 int prestera_acl_rule_get_stats(struct prestera_acl *acl,
0169                 struct prestera_acl_rule *rule,
0170                 u64 *packets, u64 *bytes, u64 *last_use);
0171 struct prestera_acl_rule_entry *
0172 prestera_acl_rule_entry_find(struct prestera_acl *acl,
0173                  struct prestera_acl_rule_entry_key *key);
0174 void prestera_acl_rule_entry_destroy(struct prestera_acl *acl,
0175                      struct prestera_acl_rule_entry *e);
0176 struct prestera_acl_rule_entry *
0177 prestera_acl_rule_entry_create(struct prestera_acl *acl,
0178                    struct prestera_acl_rule_entry_key *key,
0179                    struct prestera_acl_rule_entry_arg *arg);
0180 struct prestera_acl_ruleset *
0181 prestera_acl_ruleset_get(struct prestera_acl *acl,
0182              struct prestera_flow_block *block,
0183              u32 chain_index);
0184 struct prestera_acl_ruleset *
0185 prestera_acl_ruleset_lookup(struct prestera_acl *acl,
0186                 struct prestera_flow_block *block,
0187                 u32 chain_index);
0188 void prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset,
0189                       void *keymask);
0190 bool prestera_acl_ruleset_is_offload(struct prestera_acl_ruleset *ruleset);
0191 int prestera_acl_ruleset_offload(struct prestera_acl_ruleset *ruleset);
0192 void prestera_acl_ruleset_put(struct prestera_acl_ruleset *ruleset);
0193 int prestera_acl_ruleset_bind(struct prestera_acl_ruleset *ruleset,
0194                   struct prestera_port *port);
0195 int prestera_acl_ruleset_unbind(struct prestera_acl_ruleset *ruleset,
0196                 struct prestera_port *port);
0197 u32 prestera_acl_ruleset_index_get(const struct prestera_acl_ruleset *ruleset);
0198 void
0199 prestera_acl_rule_keymask_pcl_id_set(struct prestera_acl_rule *rule,
0200                      u16 pcl_id);
0201 
0202 int prestera_acl_vtcam_id_get(struct prestera_acl *acl, u8 lookup, u8 dir,
0203                   void *keymask, u32 *vtcam_id);
0204 int prestera_acl_vtcam_id_put(struct prestera_acl *acl, u32 vtcam_id);
0205 int prestera_acl_chain_to_client(u32 chain_index, bool ingress, u32 *client);
0206 
0207 #endif /* _PRESTERA_ACL_H_ */