GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / net / ethernet / mellanox / mlxsw / core_acl_flex_actions.h
1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved */
3
4 #ifndef _MLXSW_CORE_ACL_FLEX_ACTIONS_H
5 #define _MLXSW_CORE_ACL_FLEX_ACTIONS_H
6
7 #include <linux/types.h>
8 #include <linux/netdevice.h>
9 #include <net/flow_offload.h>
10
11 struct mlxsw_afa;
12 struct mlxsw_afa_block;
13
14 struct mlxsw_afa_ops {
15         int (*kvdl_set_add)(void *priv, u32 *p_kvdl_index,
16                             char *enc_actions, bool is_first);
17         void (*kvdl_set_del)(void *priv, u32 kvdl_index, bool is_first);
18         int (*kvdl_set_activity_get)(void *priv, u32 kvdl_index,
19                                      bool *activity);
20         int (*kvdl_fwd_entry_add)(void *priv, u32 *p_kvdl_index, u16 local_port);
21         void (*kvdl_fwd_entry_del)(void *priv, u32 kvdl_index);
22         int (*counter_index_get)(void *priv, unsigned int *p_counter_index);
23         void (*counter_index_put)(void *priv, unsigned int counter_index);
24         int (*mirror_add)(void *priv, u16 local_in_port,
25                           const struct net_device *out_dev,
26                           bool ingress, int *p_span_id);
27         void (*mirror_del)(void *priv, u16 local_in_port, int span_id,
28                            bool ingress);
29         int (*policer_add)(void *priv, u64 rate_bytes_ps, u32 burst,
30                            u16 *p_policer_index,
31                            struct netlink_ext_ack *extack);
32         void (*policer_del)(void *priv, u16 policer_index);
33         int (*sampler_add)(void *priv, u16 local_port,
34                            struct psample_group *psample_group, u32 rate,
35                            u32 trunc_size, bool truncate, bool ingress,
36                            int *p_span_id, struct netlink_ext_ack *extack);
37         void (*sampler_del)(void *priv, u16 local_port, int span_id,
38                             bool ingress);
39         bool dummy_first_set;
40 };
41
42 struct mlxsw_afa *mlxsw_afa_create(unsigned int max_acts_per_set,
43                                    const struct mlxsw_afa_ops *ops,
44                                    void *ops_priv);
45 void mlxsw_afa_destroy(struct mlxsw_afa *mlxsw_afa);
46 struct mlxsw_afa_block *mlxsw_afa_block_create(struct mlxsw_afa *mlxsw_afa);
47 void mlxsw_afa_block_destroy(struct mlxsw_afa_block *block);
48 int mlxsw_afa_block_commit(struct mlxsw_afa_block *block);
49 char *mlxsw_afa_block_first_set(struct mlxsw_afa_block *block);
50 char *mlxsw_afa_block_cur_set(struct mlxsw_afa_block *block);
51 u32 mlxsw_afa_block_first_kvdl_index(struct mlxsw_afa_block *block);
52 int mlxsw_afa_block_activity_get(struct mlxsw_afa_block *block, bool *activity);
53 int mlxsw_afa_block_continue(struct mlxsw_afa_block *block);
54 int mlxsw_afa_block_jump(struct mlxsw_afa_block *block, u16 group_id);
55 int mlxsw_afa_block_terminate(struct mlxsw_afa_block *block);
56 const struct flow_action_cookie *
57 mlxsw_afa_cookie_lookup(struct mlxsw_afa *mlxsw_afa, u32 cookie_index);
58 int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block, bool ingress,
59                                 const struct flow_action_cookie *fa_cookie,
60                                 struct netlink_ext_ack *extack);
61 int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id);
62 int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block,
63                                             u16 trap_id);
64 int mlxsw_afa_block_append_mirror(struct mlxsw_afa_block *block,
65                                   u16 local_in_port,
66                                   const struct net_device *out_dev,
67                                   bool ingress,
68                                   struct netlink_ext_ack *extack);
69 int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
70                                u16 local_port, bool in_port,
71                                struct netlink_ext_ack *extack);
72 int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
73                                        u16 vid, u8 pcp, u8 et,
74                                        struct netlink_ext_ack *extack);
75 int mlxsw_afa_block_append_qos_switch_prio(struct mlxsw_afa_block *block,
76                                            u8 prio,
77                                            struct netlink_ext_ack *extack);
78 int mlxsw_afa_block_append_qos_dsfield(struct mlxsw_afa_block *block,
79                                        u8 dsfield,
80                                        struct netlink_ext_ack *extack);
81 int mlxsw_afa_block_append_qos_dscp(struct mlxsw_afa_block *block,
82                                     u8 dscp, struct netlink_ext_ack *extack);
83 int mlxsw_afa_block_append_qos_ecn(struct mlxsw_afa_block *block,
84                                    u8 ecn, struct netlink_ext_ack *extack);
85 int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block,
86                                              u32 counter_index);
87 int mlxsw_afa_block_append_counter(struct mlxsw_afa_block *block,
88                                    u32 *p_counter_index,
89                                    struct netlink_ext_ack *extack);
90 int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid,
91                                    struct netlink_ext_ack *extack);
92 int mlxsw_afa_block_append_ignore(struct mlxsw_afa_block *block,
93                                   bool disable_learning, bool disable_security);
94 int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block,
95                                     u16 expected_irif, u16 min_mtu,
96                                     bool rmid_valid, u32 kvdl_index);
97 int mlxsw_afa_block_append_ip(struct mlxsw_afa_block *block, bool is_dip,
98                               bool is_lsb, u32 val_31_0, u32 val_63_32,
99                               struct netlink_ext_ack *extack);
100 int mlxsw_afa_block_append_l4port(struct mlxsw_afa_block *block, bool is_dport, u16 l4_port,
101                                   struct netlink_ext_ack *extack);
102 int mlxsw_afa_block_append_police(struct mlxsw_afa_block *block,
103                                   u32 fa_index, u64 rate_bytes_ps, u32 burst,
104                                   u16 *p_policer_index,
105                                   struct netlink_ext_ack *extack);
106 int mlxsw_afa_block_append_sampler(struct mlxsw_afa_block *block, u16 local_port,
107                                    struct psample_group *psample_group,
108                                    u32 rate, u32 trunc_size, bool truncate,
109                                    bool ingress,
110                                    struct netlink_ext_ack *extack);
111
112 #endif