0001
0002
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
0101
0102
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;
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