#ifndef _MLXSW_CORE_ACL_FLEX_KEYS_H
#define _MLXSW_CORE_ACL_FLEX_KEYS_H
#include <linux/types.h>
#include <linux/bitmap.h>
#include "item.h"
enum mlxsw_afk_element { … };
enum mlxsw_afk_element_type { … };
struct mlxsw_afk_element_info { … };
#define MLXSW_AFK_ELEMENT_INFO(_type, _element, _offset, _shift, _size) …
#define MLXSW_AFK_ELEMENT_INFO_U32(_element, _offset, _shift, _size) …
#define MLXSW_AFK_ELEMENT_INFO_BUF(_element, _offset, _size) …
#define MLXSW_AFK_ELEMENT_STORAGE_SIZE …
struct mlxsw_afk_element_inst { … };
#define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset, \
_shift, _size, _u32_key_diff, _avoid_size_check) …
#define MLXSW_AFK_ELEMENT_INST_U32(_element, _offset, _shift, _size) …
#define MLXSW_AFK_ELEMENT_INST_EXT_U32(_element, _offset, \
_shift, _size, _key_diff, \
_avoid_size_check) …
#define MLXSW_AFK_ELEMENT_INST_BUF(_element, _offset, _size) …
struct mlxsw_afk_block { … };
#define MLXSW_AFK_BLOCK(_encoding, _instances) …
#define MLXSW_AFK_BLOCK_HIGH_ENTROPY(_encoding, _instances) …
struct mlxsw_afk_element_usage { … };
#define mlxsw_afk_element_usage_for_each(element, elusage) …
static inline void
mlxsw_afk_element_usage_add(struct mlxsw_afk_element_usage *elusage,
enum mlxsw_afk_element element)
{ … }
static inline void
mlxsw_afk_element_usage_zero(struct mlxsw_afk_element_usage *elusage)
{ … }
static inline void
mlxsw_afk_element_usage_fill(struct mlxsw_afk_element_usage *elusage,
const enum mlxsw_afk_element *elements,
unsigned int elements_count)
{ … }
static inline bool
mlxsw_afk_element_usage_subset(struct mlxsw_afk_element_usage *elusage_small,
struct mlxsw_afk_element_usage *elusage_big)
{ … }
struct mlxsw_afk;
struct mlxsw_afk_ops { … };
struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
const struct mlxsw_afk_ops *ops);
void mlxsw_afk_destroy(struct mlxsw_afk *mlxsw_afk);
struct mlxsw_afk_key_info;
struct mlxsw_afk_key_info *
mlxsw_afk_key_info_get(struct mlxsw_afk *mlxsw_afk,
struct mlxsw_afk_element_usage *elusage);
void mlxsw_afk_key_info_put(struct mlxsw_afk_key_info *key_info);
bool mlxsw_afk_key_info_subset(struct mlxsw_afk_key_info *key_info,
struct mlxsw_afk_element_usage *elusage);
u16
mlxsw_afk_key_info_block_encoding_get(const struct mlxsw_afk_key_info *key_info,
int block_index);
unsigned int
mlxsw_afk_key_info_blocks_count_get(const struct mlxsw_afk_key_info *key_info);
struct mlxsw_afk_element_values { … };
void mlxsw_afk_values_add_u32(struct mlxsw_afk_element_values *values,
enum mlxsw_afk_element element,
u32 key_value, u32 mask_value);
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);
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);
void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
int block_start, int block_end);
#endif