linux/drivers/net/ethernet/marvell/prestera/prestera_acl.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
   2/* Copyright (c) 2020 Marvell International Ltd. All rights reserved. */
   3
   4#ifndef _PRESTERA_ACL_H_
   5#define _PRESTERA_ACL_H_
   6
   7enum prestera_acl_rule_match_entry_type {
   8        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ETH_TYPE = 1,
   9        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ETH_DMAC,
  10        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ETH_SMAC,
  11        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_IP_PROTO,
  12        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_PORT,
  13        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_IP_SRC,
  14        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_IP_DST,
  15        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_SRC,
  16        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_DST,
  17        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_RANGE_SRC,
  18        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_L4_PORT_RANGE_DST,
  19        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_VLAN_ID,
  20        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_VLAN_TPID,
  21        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ICMP_TYPE,
  22        PRESTERA_ACL_RULE_MATCH_ENTRY_TYPE_ICMP_CODE
  23};
  24
  25enum prestera_acl_rule_action {
  26        PRESTERA_ACL_RULE_ACTION_ACCEPT,
  27        PRESTERA_ACL_RULE_ACTION_DROP,
  28        PRESTERA_ACL_RULE_ACTION_TRAP
  29};
  30
  31struct prestera_switch;
  32struct prestera_port;
  33struct prestera_acl_rule;
  34struct prestera_acl_ruleset;
  35
  36struct prestera_flow_block_binding {
  37        struct list_head list;
  38        struct prestera_port *port;
  39        int span_id;
  40};
  41
  42struct prestera_flow_block {
  43        struct list_head binding_list;
  44        struct prestera_switch *sw;
  45        struct net *net;
  46        struct prestera_acl_ruleset *ruleset;
  47        struct flow_block_cb *block_cb;
  48};
  49
  50struct prestera_acl_rule_action_entry {
  51        struct list_head list;
  52        enum prestera_acl_rule_action id;
  53};
  54
  55struct prestera_acl_rule_match_entry {
  56        struct list_head list;
  57        enum prestera_acl_rule_match_entry_type type;
  58        union {
  59                struct {
  60                        u8 key;
  61                        u8 mask;
  62                } u8;
  63                struct {
  64                        u16 key;
  65                        u16 mask;
  66                } u16;
  67                struct {
  68                        u32 key;
  69                        u32 mask;
  70                } u32;
  71                struct {
  72                        u64 key;
  73                        u64 mask;
  74                } u64;
  75                struct {
  76                        u8 key[ETH_ALEN];
  77                        u8 mask[ETH_ALEN];
  78                } mac;
  79        } keymask;
  80};
  81
  82int prestera_acl_init(struct prestera_switch *sw);
  83void prestera_acl_fini(struct prestera_switch *sw);
  84struct prestera_flow_block *
  85prestera_acl_block_create(struct prestera_switch *sw, struct net *net);
  86void prestera_acl_block_destroy(struct prestera_flow_block *block);
  87struct net *prestera_acl_block_net(struct prestera_flow_block *block);
  88struct prestera_switch *prestera_acl_block_sw(struct prestera_flow_block *block);
  89int prestera_acl_block_bind(struct prestera_flow_block *block,
  90                            struct prestera_port *port);
  91int prestera_acl_block_unbind(struct prestera_flow_block *block,
  92                              struct prestera_port *port);
  93struct prestera_acl_ruleset *
  94prestera_acl_block_ruleset_get(struct prestera_flow_block *block);
  95struct prestera_acl_rule *
  96prestera_acl_rule_create(struct prestera_flow_block *block,
  97                         unsigned long cookie);
  98u32 prestera_acl_rule_priority_get(struct prestera_acl_rule *rule);
  99void prestera_acl_rule_priority_set(struct prestera_acl_rule *rule,
 100                                    u32 priority);
 101u16 prestera_acl_rule_ruleset_id_get(const struct prestera_acl_rule *rule);
 102struct list_head *
 103prestera_acl_rule_action_list_get(struct prestera_acl_rule *rule);
 104u8 prestera_acl_rule_action_len(struct prestera_acl_rule *rule);
 105u8 prestera_acl_rule_match_len(struct prestera_acl_rule *rule);
 106int prestera_acl_rule_action_add(struct prestera_acl_rule *rule,
 107                                 struct prestera_acl_rule_action_entry *entry);
 108struct list_head *
 109prestera_acl_rule_match_list_get(struct prestera_acl_rule *rule);
 110int prestera_acl_rule_match_add(struct prestera_acl_rule *rule,
 111                                struct prestera_acl_rule_match_entry *entry);
 112void prestera_acl_rule_destroy(struct prestera_acl_rule *rule);
 113struct prestera_acl_rule *
 114prestera_acl_rule_lookup(struct prestera_acl_ruleset *ruleset,
 115                         unsigned long cookie);
 116int prestera_acl_rule_add(struct prestera_switch *sw,
 117                          struct prestera_acl_rule *rule);
 118void prestera_acl_rule_del(struct prestera_switch *sw,
 119                           struct prestera_acl_rule *rule);
 120int prestera_acl_rule_get_stats(struct prestera_switch *sw,
 121                                struct prestera_acl_rule *rule,
 122                                u64 *packets, u64 *bytes, u64 *last_use);
 123
 124#endif /* _PRESTERA_ACL_H_ */
 125