#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/rhashtable.h>
#include <linux/list.h>
#include <linux/idr.h>
#include <linux/refcount.h>
#include <net/flow_offload.h>
#include "item.h"
#include "trap.h"
#include "core_acl_flex_actions.h"
enum mlxsw_afa_set_type { … };
MLXSW_ITEM32(afa, set, type, 0xA0, 28, 4);
MLXSW_ITEM32(afa, set, next_action_set_ptr, 0xA4, 0, 24);
MLXSW_ITEM32(afa, set, goto_g, 0xA4, 29, 1);
enum mlxsw_afa_set_goto_binding_cmd { … };
MLXSW_ITEM32(afa, set, goto_binding_cmd, 0xA4, 24, 3);
MLXSW_ITEM32(afa, set, goto_next_binding, 0xA4, 0, 16);
MLXSW_ITEM32(afa, all, action_type, 0x00, 24, 6);
struct mlxsw_afa { … };
#define MLXSW_AFA_SET_LEN …
struct mlxsw_afa_set_ht_key { … };
struct mlxsw_afa_set { … };
static const struct rhashtable_params mlxsw_afa_set_ht_params = …;
struct mlxsw_afa_fwd_entry_ht_key { … };
struct mlxsw_afa_fwd_entry { … };
static const struct rhashtable_params mlxsw_afa_fwd_entry_ht_params = …;
struct mlxsw_afa_cookie { … };
static u32 mlxsw_afa_cookie_hash(const struct flow_action_cookie *fa_cookie,
u32 seed)
{ … }
static u32 mlxsw_afa_cookie_key_hashfn(const void *data, u32 len, u32 seed)
{ … }
static u32 mlxsw_afa_cookie_obj_hashfn(const void *data, u32 len, u32 seed)
{ … }
static int mlxsw_afa_cookie_obj_cmpfn(struct rhashtable_compare_arg *arg,
const void *obj)
{ … }
static const struct rhashtable_params mlxsw_afa_cookie_ht_params = …;
struct mlxsw_afa_policer { … };
static const struct rhashtable_params mlxsw_afa_policer_ht_params = …;
struct mlxsw_afa *mlxsw_afa_create(unsigned int max_acts_per_set,
const struct mlxsw_afa_ops *ops,
void *ops_priv)
{ … }
EXPORT_SYMBOL(…);
void mlxsw_afa_destroy(struct mlxsw_afa *mlxsw_afa)
{ … }
EXPORT_SYMBOL(…);
static void mlxsw_afa_set_goto_set(struct mlxsw_afa_set *set,
enum mlxsw_afa_set_goto_binding_cmd cmd,
u16 group_id)
{ … }
static void mlxsw_afa_set_next_set(struct mlxsw_afa_set *set,
u32 next_set_kvdl_index)
{ … }
static struct mlxsw_afa_set *mlxsw_afa_set_create(bool is_first)
{ … }
static void mlxsw_afa_set_destroy(struct mlxsw_afa_set *set)
{ … }
static int mlxsw_afa_set_share(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_set *set)
{ … }
static void mlxsw_afa_set_unshare(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_set *set)
{ … }
static void mlxsw_afa_set_put(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_set *set)
{ … }
static struct mlxsw_afa_set *mlxsw_afa_set_get(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_set *orig_set)
{ … }
struct mlxsw_afa_block { … };
struct mlxsw_afa_resource { … };
static void mlxsw_afa_resource_add(struct mlxsw_afa_block *block,
struct mlxsw_afa_resource *resource)
{ … }
static void mlxsw_afa_resource_del(struct mlxsw_afa_resource *resource)
{ … }
static void mlxsw_afa_resources_destroy(struct mlxsw_afa_block *block)
{ … }
struct mlxsw_afa_block *mlxsw_afa_block_create(struct mlxsw_afa *mlxsw_afa)
{ … }
EXPORT_SYMBOL(…);
void mlxsw_afa_block_destroy(struct mlxsw_afa_block *block)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_commit(struct mlxsw_afa_block *block)
{ … }
EXPORT_SYMBOL(…);
char *mlxsw_afa_block_first_set(struct mlxsw_afa_block *block)
{ … }
EXPORT_SYMBOL(…);
char *mlxsw_afa_block_cur_set(struct mlxsw_afa_block *block)
{ … }
EXPORT_SYMBOL(…);
u32 mlxsw_afa_block_first_kvdl_index(struct mlxsw_afa_block *block)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_activity_get(struct mlxsw_afa_block *block, bool *activity)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_continue(struct mlxsw_afa_block *block)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_jump(struct mlxsw_afa_block *block, u16 group_id)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_terminate(struct mlxsw_afa_block *block)
{ … }
EXPORT_SYMBOL(…);
static struct mlxsw_afa_fwd_entry *
mlxsw_afa_fwd_entry_create(struct mlxsw_afa *mlxsw_afa, u16 local_port)
{ … }
static void mlxsw_afa_fwd_entry_destroy(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_fwd_entry *fwd_entry)
{ … }
static struct mlxsw_afa_fwd_entry *
mlxsw_afa_fwd_entry_get(struct mlxsw_afa *mlxsw_afa, u16 local_port)
{ … }
static void mlxsw_afa_fwd_entry_put(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_fwd_entry *fwd_entry)
{ … }
struct mlxsw_afa_fwd_entry_ref { … };
static void
mlxsw_afa_fwd_entry_ref_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_fwd_entry_ref *fwd_entry_ref)
{ … }
static void
mlxsw_afa_fwd_entry_ref_destructor(struct mlxsw_afa_block *block,
struct mlxsw_afa_resource *resource)
{ … }
static struct mlxsw_afa_fwd_entry_ref *
mlxsw_afa_fwd_entry_ref_create(struct mlxsw_afa_block *block, u16 local_port)
{ … }
struct mlxsw_afa_counter { … };
static void
mlxsw_afa_counter_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_counter *counter)
{ … }
static void
mlxsw_afa_counter_destructor(struct mlxsw_afa_block *block,
struct mlxsw_afa_resource *resource)
{ … }
static struct mlxsw_afa_counter *
mlxsw_afa_counter_create(struct mlxsw_afa_block *block)
{ … }
#define MLXSW_AFA_COOKIE_INDEX_BITS …
#define MLXSW_AFA_COOKIE_INDEX_MAX …
static struct mlxsw_afa_cookie *
mlxsw_afa_cookie_create(struct mlxsw_afa *mlxsw_afa,
const struct flow_action_cookie *fa_cookie)
{ … }
static void mlxsw_afa_cookie_destroy(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_cookie *cookie)
{ … }
static struct mlxsw_afa_cookie *
mlxsw_afa_cookie_get(struct mlxsw_afa *mlxsw_afa,
const struct flow_action_cookie *fa_cookie)
{ … }
static void mlxsw_afa_cookie_put(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_cookie *cookie)
{ … }
const struct flow_action_cookie *
mlxsw_afa_cookie_lookup(struct mlxsw_afa *mlxsw_afa, u32 cookie_index)
{ … }
EXPORT_SYMBOL(…);
struct mlxsw_afa_cookie_ref { … };
static void
mlxsw_afa_cookie_ref_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_cookie_ref *cookie_ref)
{ … }
static void
mlxsw_afa_cookie_ref_destructor(struct mlxsw_afa_block *block,
struct mlxsw_afa_resource *resource)
{ … }
static struct mlxsw_afa_cookie_ref *
mlxsw_afa_cookie_ref_create(struct mlxsw_afa_block *block,
const struct flow_action_cookie *fa_cookie)
{ … }
static struct mlxsw_afa_policer *
mlxsw_afa_policer_create(struct mlxsw_afa *mlxsw_afa, u32 fa_index,
u64 rate_bytes_ps, u32 burst,
struct netlink_ext_ack *extack)
{ … }
static void mlxsw_afa_policer_destroy(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_policer *policer)
{ … }
static struct mlxsw_afa_policer *
mlxsw_afa_policer_get(struct mlxsw_afa *mlxsw_afa, u32 fa_index,
u64 rate_bytes_ps, u32 burst,
struct netlink_ext_ack *extack)
{ … }
static void mlxsw_afa_policer_put(struct mlxsw_afa *mlxsw_afa,
struct mlxsw_afa_policer *policer)
{ … }
struct mlxsw_afa_policer_ref { … };
static void
mlxsw_afa_policer_ref_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_policer_ref *policer_ref)
{ … }
static void
mlxsw_afa_policer_ref_destructor(struct mlxsw_afa_block *block,
struct mlxsw_afa_resource *resource)
{ … }
static struct mlxsw_afa_policer_ref *
mlxsw_afa_policer_ref_create(struct mlxsw_afa_block *block, u32 fa_index,
u64 rate_bytes_ps, u32 burst,
struct netlink_ext_ack *extack)
{ … }
#define MLXSW_AFA_ONE_ACTION_LEN …
#define MLXSW_AFA_PAYLOAD_OFFSET …
enum mlxsw_afa_action_type { … };
static bool
mlxsw_afa_block_need_split(const struct mlxsw_afa_block *block,
enum mlxsw_afa_action_type type)
{ … }
static char *mlxsw_afa_block_append_action_ext(struct mlxsw_afa_block *block,
u8 action_code, u8 action_size,
enum mlxsw_afa_action_type type)
{ … }
static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
u8 action_code, u8 action_size)
{ … }
#define MLXSW_AFA_VLAN_CODE …
#define MLXSW_AFA_VLAN_SIZE …
enum mlxsw_afa_vlan_vlan_tag_cmd { … };
enum mlxsw_afa_vlan_cmd { … };
MLXSW_ITEM32(afa, vlan, vlan_tag_cmd, 0x00, 29, 3);
MLXSW_ITEM32(afa, vlan, vid_cmd, 0x04, 29, 3);
MLXSW_ITEM32(afa, vlan, vid, 0x04, 0, 12);
MLXSW_ITEM32(afa, vlan, ethertype_cmd, 0x08, 29, 3);
MLXSW_ITEM32(afa, vlan, ethertype, 0x08, 24, 3);
MLXSW_ITEM32(afa, vlan, pcp_cmd, 0x08, 13, 3);
MLXSW_ITEM32(afa, vlan, pcp, 0x08, 8, 3);
static inline void
mlxsw_afa_vlan_pack(char *payload,
enum mlxsw_afa_vlan_vlan_tag_cmd vlan_tag_cmd,
enum mlxsw_afa_vlan_cmd vid_cmd, u16 vid,
enum mlxsw_afa_vlan_cmd pcp_cmd, u8 pcp,
enum mlxsw_afa_vlan_cmd ethertype_cmd, u8 ethertype)
{ … }
int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
u16 vid, u8 pcp, u8 et,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_TRAP_CODE …
#define MLXSW_AFA_TRAP_SIZE …
#define MLXSW_AFA_TRAPWU_CODE …
#define MLXSW_AFA_TRAPWU_SIZE …
enum mlxsw_afa_trap_trap_action { … };
MLXSW_ITEM32(afa, trap, trap_action, 0x00, 24, 4);
enum mlxsw_afa_trap_forward_action { … };
MLXSW_ITEM32(afa, trap, forward_action, 0x00, 0, 4);
MLXSW_ITEM32(afa, trap, trap_id, 0x04, 0, 9);
MLXSW_ITEM32(afa, trap, mirror_agent, 0x08, 29, 3);
MLXSW_ITEM32(afa, trap, mirror_enable, 0x08, 24, 1);
MLXSW_ITEM32(afa, trap, user_def_val, 0x0C, 0, 20);
static inline void
mlxsw_afa_trap_pack(char *payload,
enum mlxsw_afa_trap_trap_action trap_action,
enum mlxsw_afa_trap_forward_action forward_action,
u16 trap_id)
{ … }
static inline void
mlxsw_afa_trapwu_pack(char *payload,
enum mlxsw_afa_trap_trap_action trap_action,
enum mlxsw_afa_trap_forward_action forward_action,
u16 trap_id, u32 user_def_val)
{ … }
static inline void
mlxsw_afa_trap_mirror_pack(char *payload, bool mirror_enable,
u8 mirror_agent)
{ … }
static char *mlxsw_afa_block_append_action_trap(struct mlxsw_afa_block *block,
u8 action_code, u8 action_size)
{ … }
static int mlxsw_afa_block_append_drop_plain(struct mlxsw_afa_block *block,
bool ingress)
{ … }
static int
mlxsw_afa_block_append_drop_with_cookie(struct mlxsw_afa_block *block,
bool ingress,
const struct flow_action_cookie *fa_cookie,
struct netlink_ext_ack *extack)
{ … }
int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block, bool ingress,
const struct flow_action_cookie *fa_cookie,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block,
u16 trap_id)
{ … }
EXPORT_SYMBOL(…);
struct mlxsw_afa_mirror { … };
static void
mlxsw_afa_mirror_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_mirror *mirror)
{ … }
static void
mlxsw_afa_mirror_destructor(struct mlxsw_afa_block *block,
struct mlxsw_afa_resource *resource)
{ … }
static struct mlxsw_afa_mirror *
mlxsw_afa_mirror_create(struct mlxsw_afa_block *block, u16 local_in_port,
const struct net_device *out_dev, bool ingress)
{ … }
static int
mlxsw_afa_block_append_allocated_mirror(struct mlxsw_afa_block *block,
u8 mirror_agent)
{ … }
int
mlxsw_afa_block_append_mirror(struct mlxsw_afa_block *block, u16 local_in_port,
const struct net_device *out_dev, bool ingress,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_QOS_CODE …
#define MLXSW_AFA_QOS_SIZE …
enum mlxsw_afa_qos_ecn_cmd { … };
MLXSW_ITEM32(afa, qos, ecn_cmd, 0x04, 29, 3);
MLXSW_ITEM32(afa, qos, ecn, 0x04, 24, 2);
enum mlxsw_afa_qos_dscp_cmd { … };
MLXSW_ITEM32(afa, qos, dscp_cmd, 0x04, 14, 2);
MLXSW_ITEM32(afa, qos, dscp, 0x04, 0, 6);
enum mlxsw_afa_qos_switch_prio_cmd { … };
MLXSW_ITEM32(afa, qos, switch_prio_cmd, 0x08, 14, 2);
MLXSW_ITEM32(afa, qos, switch_prio, 0x08, 0, 4);
enum mlxsw_afa_qos_dscp_rw { … };
MLXSW_ITEM32(afa, qos, dscp_rw, 0x0C, 30, 2);
static inline void
mlxsw_afa_qos_ecn_pack(char *payload,
enum mlxsw_afa_qos_ecn_cmd ecn_cmd, u8 ecn)
{ … }
static inline void
mlxsw_afa_qos_dscp_pack(char *payload,
enum mlxsw_afa_qos_dscp_cmd dscp_cmd, u8 dscp)
{ … }
static inline void
mlxsw_afa_qos_switch_prio_pack(char *payload,
enum mlxsw_afa_qos_switch_prio_cmd prio_cmd,
u8 prio)
{ … }
static int __mlxsw_afa_block_append_qos_dsfield(struct mlxsw_afa_block *block,
bool set_dscp, u8 dscp,
bool set_ecn, u8 ecn,
struct netlink_ext_ack *extack)
{ … }
int mlxsw_afa_block_append_qos_dsfield(struct mlxsw_afa_block *block,
u8 dsfield,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_append_qos_dscp(struct mlxsw_afa_block *block,
u8 dscp, struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_append_qos_ecn(struct mlxsw_afa_block *block,
u8 ecn, struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_append_qos_switch_prio(struct mlxsw_afa_block *block,
u8 prio,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_FORWARD_CODE …
#define MLXSW_AFA_FORWARD_SIZE …
enum mlxsw_afa_forward_type { … };
MLXSW_ITEM32(afa, forward, type, 0x00, 24, 2);
MLXSW_ITEM32(afa, forward, pbs_ptr, 0x08, 0, 24);
MLXSW_ITEM32(afa, forward, in_port, 0x0C, 0, 1);
static inline void
mlxsw_afa_forward_pack(char *payload, enum mlxsw_afa_forward_type type,
u32 pbs_ptr, bool in_port)
{ … }
int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
u16 local_port, bool in_port,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_POLCNT_CODE …
#define MLXSW_AFA_POLCNT_SIZE …
enum { … };
MLXSW_ITEM32(afa, polcnt, c_p, 0x00, 31, 1);
enum mlxsw_afa_polcnt_counter_set_type { … };
MLXSW_ITEM32(afa, polcnt, counter_set_type, 0x04, 24, 8);
MLXSW_ITEM32(afa, polcnt, counter_index, 0x04, 0, 24);
MLXSW_ITEM32(afa, polcnt, pid, 0x08, 0, 14);
static inline void
mlxsw_afa_polcnt_pack(char *payload,
enum mlxsw_afa_polcnt_counter_set_type set_type,
u32 counter_index)
{ … }
static void mlxsw_afa_polcnt_policer_pack(char *payload, u16 policer_index)
{ … }
int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block,
u32 counter_index)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_append_counter(struct mlxsw_afa_block *block,
u32 *p_counter_index,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
int mlxsw_afa_block_append_police(struct mlxsw_afa_block *block,
u32 fa_index, u64 rate_bytes_ps, u32 burst,
u16 *p_policer_index,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_VIRFWD_CODE …
#define MLXSW_AFA_VIRFWD_SIZE …
enum mlxsw_afa_virfwd_fid_cmd { … };
MLXSW_ITEM32(afa, virfwd, fid_cmd, 0x08, 29, 3);
MLXSW_ITEM32(afa, virfwd, fid, 0x08, 0, 16);
static inline void mlxsw_afa_virfwd_pack(char *payload,
enum mlxsw_afa_virfwd_fid_cmd fid_cmd,
u16 fid)
{ … }
int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_IGNORE_CODE …
#define MLXSW_AFA_IGNORE_SIZE …
MLXSW_ITEM32(afa, ignore, disable_learning, 0x00, 29, 1);
MLXSW_ITEM32(afa, ignore, disable_security, 0x00, 28, 1);
static void mlxsw_afa_ignore_pack(char *payload, bool disable_learning,
bool disable_security)
{ … }
int mlxsw_afa_block_append_ignore(struct mlxsw_afa_block *block,
bool disable_learning, bool disable_security)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_MCROUTER_CODE …
#define MLXSW_AFA_MCROUTER_SIZE …
enum mlxsw_afa_mcrouter_rpf_action { … };
MLXSW_ITEM32(afa, mcrouter, rpf_action, 0x00, 28, 3);
MLXSW_ITEM32(afa, mcrouter, expected_irif, 0x00, 0, 16);
MLXSW_ITEM32(afa, mcrouter, min_mtu, 0x08, 0, 16);
enum mlxsw_afa_mrouter_vrmid { … };
MLXSW_ITEM32(afa, mcrouter, vrmid, 0x0C, 31, 1);
MLXSW_ITEM32(afa, mcrouter, rigr_rmid_index, 0x0C, 0, 24);
static inline void
mlxsw_afa_mcrouter_pack(char *payload,
enum mlxsw_afa_mcrouter_rpf_action rpf_action,
u16 expected_irif, u16 min_mtu,
enum mlxsw_afa_mrouter_vrmid vrmid, u32 rigr_rmid_index)
{ … }
int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block,
u16 expected_irif, u16 min_mtu,
bool rmid_valid, u32 kvdl_index)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_IP_CODE …
#define MLXSW_AFA_IP_SIZE …
enum mlxsw_afa_ip_s_d { … };
MLXSW_ITEM32(afa, ip, s_d, 0x00, 31, 1);
enum mlxsw_afa_ip_m_l { … };
MLXSW_ITEM32(afa, ip, m_l, 0x00, 30, 1);
MLXSW_ITEM32(afa, ip, ip_63_32, 0x08, 0, 32);
MLXSW_ITEM32(afa, ip, ip_31_0, 0x0C, 0, 32);
static void mlxsw_afa_ip_pack(char *payload, enum mlxsw_afa_ip_s_d s_d,
enum mlxsw_afa_ip_m_l m_l, u32 ip_31_0,
u32 ip_63_32)
{ … }
int mlxsw_afa_block_append_ip(struct mlxsw_afa_block *block, bool is_dip,
bool is_lsb, u32 val_31_0, u32 val_63_32,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_L4PORT_CODE …
#define MLXSW_AFA_L4PORT_SIZE …
enum mlxsw_afa_l4port_s_d { … };
MLXSW_ITEM32(afa, l4port, s_d, 0x00, 31, 1);
MLXSW_ITEM32(afa, l4port, l4_port, 0x08, 0, 16);
static void mlxsw_afa_l4port_pack(char *payload, enum mlxsw_afa_l4port_s_d s_d, u16 l4_port)
{ … }
int mlxsw_afa_block_append_l4port(struct mlxsw_afa_block *block, bool is_dport, u16 l4_port,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);
#define MLXSW_AFA_SAMPLER_CODE …
#define MLXSW_AFA_SAMPLER_SIZE …
MLXSW_ITEM32(afa, sampler, mirror_agent, 0x04, 0, 3);
#define MLXSW_AFA_SAMPLER_RATE_MAX …
MLXSW_ITEM32(afa, sampler, mirror_probability_rate, 0x08, 0, 24);
static void mlxsw_afa_sampler_pack(char *payload, u8 mirror_agent, u32 rate)
{ … }
struct mlxsw_afa_sampler { … };
static void mlxsw_afa_sampler_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_sampler *sampler)
{ … }
static void mlxsw_afa_sampler_destructor(struct mlxsw_afa_block *block,
struct mlxsw_afa_resource *resource)
{ … }
static struct mlxsw_afa_sampler *
mlxsw_afa_sampler_create(struct mlxsw_afa_block *block, u16 local_port,
struct psample_group *psample_group, u32 rate,
u32 trunc_size, bool truncate, bool ingress,
struct netlink_ext_ack *extack)
{ … }
static int
mlxsw_afa_block_append_allocated_sampler(struct mlxsw_afa_block *block,
u8 mirror_agent, u32 rate)
{ … }
int mlxsw_afa_block_append_sampler(struct mlxsw_afa_block *block, u16 local_port,
struct psample_group *psample_group,
u32 rate, u32 trunc_size, bool truncate,
bool ingress,
struct netlink_ext_ack *extack)
{ … }
EXPORT_SYMBOL(…);