#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/errno.h>
#include <linux/refcount.h>
#include "item.h"
#include "core_acl_flex_keys.h"
static const struct mlxsw_afk_element_info mlxsw_afk_element_infos[] = …;
struct mlxsw_afk { … };
static bool mlxsw_afk_blocks_check(struct mlxsw_afk *mlxsw_afk)
{ … }
struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
const struct mlxsw_afk_ops *ops)
{ … }
EXPORT_SYMBOL(…);
void mlxsw_afk_destroy(struct mlxsw_afk *mlxsw_afk)
{ … }
EXPORT_SYMBOL(…);
struct mlxsw_afk_key_info { … };
static bool
mlxsw_afk_key_info_elements_eq(struct mlxsw_afk_key_info *key_info,
struct mlxsw_afk_element_usage *elusage)
{ … }
static struct mlxsw_afk_key_info *
mlxsw_afk_key_info_find(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_element_usage *elusage)
{ … }
struct mlxsw_afk_picker { … };
static void mlxsw_afk_picker_count_hits(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_picker *picker,
enum mlxsw_afk_element element)
{ … }
static void mlxsw_afk_picker_subtract_hits(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_picker *picker,
int block_index)
{ … }
static int mlxsw_afk_picker_most_hits_get(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_picker *picker)
{ … }
static int mlxsw_afk_picker_key_info_add(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_picker *picker,
int block_index,
struct mlxsw_afk_key_info *key_info)
{ … }
static int mlxsw_afk_keys_fill(struct mlxsw_afk *mlxsw_afk,
unsigned long *chosen_blocks_bm,
struct mlxsw_afk_picker *picker,
struct mlxsw_afk_key_info *key_info)
{ … }
static int mlxsw_afk_picker(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_key_info *key_info,
struct mlxsw_afk_element_usage *elusage)
{ … }
static struct mlxsw_afk_key_info *
mlxsw_afk_key_info_create(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_element_usage *elusage)
{ … }
static void mlxsw_afk_key_info_destroy(struct mlxsw_afk_key_info *key_info)
{ … }
struct mlxsw_afk_key_info *
mlxsw_afk_key_info_get(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_element_usage *elusage)
{ … }
EXPORT_SYMBOL(…);
void mlxsw_afk_key_info_put(struct mlxsw_afk_key_info *key_info)
{ … }
EXPORT_SYMBOL(…);
bool mlxsw_afk_key_info_subset(struct mlxsw_afk_key_info *key_info,
struct mlxsw_afk_element_usage *elusage)
{ … }
EXPORT_SYMBOL(…);
static const struct mlxsw_afk_element_inst *
mlxsw_afk_block_elinst_get(const struct mlxsw_afk_block *block,
enum mlxsw_afk_element element)
{ … }
static const struct mlxsw_afk_element_inst *
mlxsw_afk_key_info_elinst_get(struct mlxsw_afk_key_info *key_info,
enum mlxsw_afk_element element,
int *p_block_index)
{ … }
u16
mlxsw_afk_key_info_block_encoding_get(const struct mlxsw_afk_key_info *key_info,
int block_index)
{ … }
EXPORT_SYMBOL(…);
unsigned int
mlxsw_afk_key_info_blocks_count_get(const struct mlxsw_afk_key_info *key_info)
{ … }
EXPORT_SYMBOL(…);
void mlxsw_afk_values_add_u32(struct mlxsw_afk_element_values *values,
enum mlxsw_afk_element element,
u32 key_value, u32 mask_value)
{ … }
EXPORT_SYMBOL(…);
void mlxsw_afk_values_add_buf(struct mlxsw_afk_element_values *values,
enum mlxsw_afk_element element,
const char *key_value, const char *mask_value,
unsigned int len)
{ … }
EXPORT_SYMBOL(…);
static void mlxsw_sp_afk_encode_u32(const struct mlxsw_item *storage_item,
const struct mlxsw_item *output_item,
char *storage, char *output, int diff)
{ … }
static void mlxsw_sp_afk_encode_buf(const struct mlxsw_item *storage_item,
const struct mlxsw_item *output_item,
char *storage, char *output)
{ … }
static void
mlxsw_sp_afk_encode_one(const struct mlxsw_afk_element_inst *elinst,
char *output, char *storage, int u32_diff)
{ … }
#define MLXSW_SP_AFK_KEY_BLOCK_MAX_SIZE …
void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_key_info *key_info,
struct mlxsw_afk_element_values *values,
char *key, char *mask)
{ … }
EXPORT_SYMBOL(…);
void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
int block_start, int block_end)
{ … }
EXPORT_SYMBOL(…);