1
1
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2
- /* Copyright (c) 2020 Marvell International Ltd. All rights reserved. */
2
+ /* Copyright (c) 2020-2021 Marvell International Ltd. All rights reserved. */
3
3
4
4
#ifndef _PRESTERA_ACL_H_
5
5
#define _PRESTERA_ACL_H_
6
6
7
- enum 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
7
+ #include <linux/types.h>
8
+
9
+ #define PRESTERA_ACL_KEYMASK_PCL_ID 0x3FF
10
+ #define PRESTERA_ACL_KEYMASK_PCL_ID_USER \
11
+ (PRESTERA_ACL_KEYMASK_PCL_ID & 0x00FF)
12
+
13
+ #define rule_match_set_n (match_p , type , val_p , size ) \
14
+ memcpy(&(match_p)[PRESTERA_ACL_RULE_MATCH_TYPE_##type], \
15
+ val_p, size)
16
+ #define rule_match_set (match_p , type , val ) \
17
+ memcpy(&(match_p)[PRESTERA_ACL_RULE_MATCH_TYPE_##type], \
18
+ &(val), sizeof(val))
19
+
20
+ enum prestera_acl_match_type {
21
+ PRESTERA_ACL_RULE_MATCH_TYPE_PCL_ID ,
22
+ PRESTERA_ACL_RULE_MATCH_TYPE_ETH_TYPE ,
23
+ PRESTERA_ACL_RULE_MATCH_TYPE_ETH_DMAC_0 ,
24
+ PRESTERA_ACL_RULE_MATCH_TYPE_ETH_DMAC_1 ,
25
+ PRESTERA_ACL_RULE_MATCH_TYPE_ETH_SMAC_0 ,
26
+ PRESTERA_ACL_RULE_MATCH_TYPE_ETH_SMAC_1 ,
27
+ PRESTERA_ACL_RULE_MATCH_TYPE_IP_PROTO ,
28
+ PRESTERA_ACL_RULE_MATCH_TYPE_SYS_PORT ,
29
+ PRESTERA_ACL_RULE_MATCH_TYPE_SYS_DEV ,
30
+ PRESTERA_ACL_RULE_MATCH_TYPE_IP_SRC ,
31
+ PRESTERA_ACL_RULE_MATCH_TYPE_IP_DST ,
32
+ PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_SRC ,
33
+ PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_DST ,
34
+ PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_RANGE_SRC ,
35
+ PRESTERA_ACL_RULE_MATCH_TYPE_L4_PORT_RANGE_DST ,
36
+ PRESTERA_ACL_RULE_MATCH_TYPE_VLAN_ID ,
37
+ PRESTERA_ACL_RULE_MATCH_TYPE_VLAN_TPID ,
38
+ PRESTERA_ACL_RULE_MATCH_TYPE_ICMP_TYPE ,
39
+ PRESTERA_ACL_RULE_MATCH_TYPE_ICMP_CODE ,
40
+
41
+ __PRESTERA_ACL_RULE_MATCH_TYPE_MAX
23
42
};
24
43
25
44
enum prestera_acl_rule_action {
26
- PRESTERA_ACL_RULE_ACTION_ACCEPT ,
27
- PRESTERA_ACL_RULE_ACTION_DROP ,
28
- PRESTERA_ACL_RULE_ACTION_TRAP
45
+ PRESTERA_ACL_RULE_ACTION_ACCEPT = 0 ,
46
+ PRESTERA_ACL_RULE_ACTION_DROP = 1 ,
47
+ PRESTERA_ACL_RULE_ACTION_TRAP = 2 ,
48
+ PRESTERA_ACL_RULE_ACTION_COUNT = 7 ,
49
+
50
+ PRESTERA_ACL_RULE_ACTION_MAX
29
51
};
30
52
31
- struct prestera_switch ;
32
- struct prestera_port ;
33
- struct prestera_acl_rule ;
34
- struct prestera_acl_ruleset ;
53
+ enum {
54
+ PRESTERA_ACL_IFACE_TYPE_PORT ,
55
+ PRESTERA_ACL_IFACE_TYPE_INDEX
56
+ } ;
35
57
36
- struct prestera_flow_block_binding {
37
- struct list_head list ;
38
- struct prestera_port * port ;
39
- int span_id ;
58
+ struct prestera_acl_match {
59
+ __be32 key [__PRESTERA_ACL_RULE_MATCH_TYPE_MAX ];
60
+ __be32 mask [__PRESTERA_ACL_RULE_MATCH_TYPE_MAX ];
40
61
};
41
62
42
- struct 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 ;
63
+ struct prestera_acl_rule_entry_key {
64
+ u32 prio ;
65
+ struct prestera_acl_match match ;
48
66
};
49
67
50
- struct prestera_acl_rule_action_entry {
51
- struct list_head list ;
68
+ struct prestera_acl_hw_action_info {
52
69
enum prestera_acl_rule_action id ;
53
70
};
54
71
55
- struct prestera_acl_rule_match_entry {
72
+ /* This struct (arg) used only to be passed as parameter for
73
+ * acl_rule_entry_create. Must be flat. Can contain object keys, which will be
74
+ * resolved to object links, before saving to acl_rule_entry struct
75
+ */
76
+ struct prestera_acl_rule_entry_arg {
77
+ u32 vtcam_id ;
78
+ struct {
79
+ struct {
80
+ u8 valid :1 ;
81
+ } accept , drop , trap ;
82
+ };
83
+ };
84
+
85
+ struct prestera_acl_rule {
86
+ struct rhash_head ht_node ; /* Member of acl HT */
56
87
struct list_head list ;
57
- enum prestera_acl_rule_match_entry_type type ;
88
+ struct prestera_acl_ruleset * ruleset ;
89
+ unsigned long cookie ;
90
+ u32 priority ;
91
+ struct prestera_acl_rule_entry_key re_key ;
92
+ struct prestera_acl_rule_entry_arg re_arg ;
93
+ struct prestera_acl_rule_entry * re ;
94
+ };
95
+
96
+ struct prestera_acl_iface {
58
97
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 ;
98
+ struct prestera_port * port ;
99
+ u32 index ;
100
+ };
101
+ u8 type ;
80
102
};
81
103
104
+ struct prestera_acl ;
105
+ struct prestera_switch ;
106
+ struct prestera_flow_block ;
107
+
82
108
int prestera_acl_init (struct prestera_switch * sw );
83
109
void prestera_acl_fini (struct prestera_switch * sw );
84
- struct prestera_flow_block *
85
- prestera_acl_block_create (struct prestera_switch * sw , struct net * net );
86
- void prestera_acl_block_destroy (struct prestera_flow_block * block );
87
- struct net * prestera_acl_block_net (struct prestera_flow_block * block );
88
- struct prestera_switch * prestera_acl_block_sw (struct prestera_flow_block * block );
89
- int prestera_acl_block_bind (struct prestera_flow_block * block ,
90
- struct prestera_port * port );
91
- int prestera_acl_block_unbind (struct prestera_flow_block * block ,
92
- struct prestera_port * port );
93
- struct prestera_acl_ruleset *
94
- prestera_acl_block_ruleset_get (struct prestera_flow_block * block );
110
+
95
111
struct prestera_acl_rule *
96
- prestera_acl_rule_create (struct prestera_flow_block * block ,
112
+ prestera_acl_rule_create (struct prestera_acl_ruleset * ruleset ,
97
113
unsigned long cookie );
98
- u32 prestera_acl_rule_priority_get (struct prestera_acl_rule * rule );
99
114
void prestera_acl_rule_priority_set (struct prestera_acl_rule * rule ,
100
115
u32 priority );
101
- u16 prestera_acl_rule_ruleset_id_get (const struct prestera_acl_rule * rule );
102
- struct list_head *
103
- prestera_acl_rule_action_list_get (struct prestera_acl_rule * rule );
104
- u8 prestera_acl_rule_action_len (struct prestera_acl_rule * rule );
105
- u8 prestera_acl_rule_match_len (struct prestera_acl_rule * rule );
106
- int prestera_acl_rule_action_add (struct prestera_acl_rule * rule ,
107
- struct prestera_acl_rule_action_entry * entry );
108
- struct list_head *
109
- prestera_acl_rule_match_list_get (struct prestera_acl_rule * rule );
110
- int prestera_acl_rule_match_add (struct prestera_acl_rule * rule ,
111
- struct prestera_acl_rule_match_entry * entry );
112
116
void prestera_acl_rule_destroy (struct prestera_acl_rule * rule );
113
117
struct prestera_acl_rule *
114
118
prestera_acl_rule_lookup (struct prestera_acl_ruleset * ruleset ,
@@ -117,8 +121,37 @@ int prestera_acl_rule_add(struct prestera_switch *sw,
117
121
struct prestera_acl_rule * rule );
118
122
void prestera_acl_rule_del (struct prestera_switch * sw ,
119
123
struct prestera_acl_rule * rule );
120
- int prestera_acl_rule_get_stats (struct prestera_switch * sw ,
124
+ int prestera_acl_rule_get_stats (struct prestera_acl * acl ,
121
125
struct prestera_acl_rule * rule ,
122
126
u64 * packets , u64 * bytes , u64 * last_use );
127
+ struct prestera_acl_rule_entry *
128
+ prestera_acl_rule_entry_find (struct prestera_acl * acl ,
129
+ struct prestera_acl_rule_entry_key * key );
130
+ void prestera_acl_rule_entry_destroy (struct prestera_acl * acl ,
131
+ struct prestera_acl_rule_entry * e );
132
+ struct prestera_acl_rule_entry *
133
+ prestera_acl_rule_entry_create (struct prestera_acl * acl ,
134
+ struct prestera_acl_rule_entry_key * key ,
135
+ struct prestera_acl_rule_entry_arg * arg );
136
+ struct prestera_acl_ruleset *
137
+ prestera_acl_ruleset_get (struct prestera_acl * acl ,
138
+ struct prestera_flow_block * block );
139
+ struct prestera_acl_ruleset *
140
+ prestera_acl_ruleset_lookup (struct prestera_acl * acl ,
141
+ struct prestera_flow_block * block );
142
+ bool prestera_acl_ruleset_is_offload (struct prestera_acl_ruleset * ruleset );
143
+ int prestera_acl_ruleset_offload (struct prestera_acl_ruleset * ruleset );
144
+ void prestera_acl_ruleset_put (struct prestera_acl_ruleset * ruleset );
145
+ int prestera_acl_ruleset_bind (struct prestera_acl_ruleset * ruleset ,
146
+ struct prestera_port * port );
147
+ int prestera_acl_ruleset_unbind (struct prestera_acl_ruleset * ruleset ,
148
+ struct prestera_port * port );
149
+ void
150
+ prestera_acl_rule_keymask_pcl_id_set (struct prestera_acl_rule * rule ,
151
+ u16 pcl_id );
152
+
153
+ int prestera_acl_vtcam_id_get (struct prestera_acl * acl , u8 lookup ,
154
+ void * keymask , u32 * vtcam_id );
155
+ int prestera_acl_vtcam_id_put (struct prestera_acl * acl , u32 vtcam_id );
123
156
124
157
#endif /* _PRESTERA_ACL_H_ */
0 commit comments