nfp: bpf: parse function call and map capabilities
Parse helper function and supported map FW TLV capabilities. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
ff3d43f756
commit
9d080d5da9
@ -38,7 +38,14 @@
|
|||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
enum bpf_cap_tlv_type {
|
enum bpf_cap_tlv_type {
|
||||||
|
NFP_BPF_CAP_TYPE_FUNC = 1,
|
||||||
NFP_BPF_CAP_TYPE_ADJUST_HEAD = 2,
|
NFP_BPF_CAP_TYPE_ADJUST_HEAD = 2,
|
||||||
|
NFP_BPF_CAP_TYPE_MAPS = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nfp_bpf_cap_tlv_func {
|
||||||
|
__le32 func_id;
|
||||||
|
__le32 func_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nfp_bpf_cap_tlv_adjust_head {
|
struct nfp_bpf_cap_tlv_adjust_head {
|
||||||
@ -51,6 +58,15 @@ struct nfp_bpf_cap_tlv_adjust_head {
|
|||||||
|
|
||||||
#define NFP_BPF_ADJUST_HEAD_NO_META BIT(0)
|
#define NFP_BPF_ADJUST_HEAD_NO_META BIT(0)
|
||||||
|
|
||||||
|
struct nfp_bpf_cap_tlv_maps {
|
||||||
|
__le32 types;
|
||||||
|
__le32 max_maps;
|
||||||
|
__le32 max_elems;
|
||||||
|
__le32 max_key_sz;
|
||||||
|
__le32 max_val_sz;
|
||||||
|
__le32 max_elem_sz;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Types defined for map related control messages
|
* Types defined for map related control messages
|
||||||
*/
|
*/
|
||||||
|
@ -251,6 +251,45 @@ nfp_bpf_parse_cap_adjust_head(struct nfp_app_bpf *bpf, void __iomem *value,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
nfp_bpf_parse_cap_func(struct nfp_app_bpf *bpf, void __iomem *value, u32 length)
|
||||||
|
{
|
||||||
|
struct nfp_bpf_cap_tlv_func __iomem *cap = value;
|
||||||
|
|
||||||
|
if (length < sizeof(*cap)) {
|
||||||
|
nfp_err(bpf->app->cpp, "truncated function TLV: %d\n", length);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (readl(&cap->func_id)) {
|
||||||
|
case BPF_FUNC_map_lookup_elem:
|
||||||
|
bpf->helpers.map_lookup = readl(&cap->func_addr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
nfp_bpf_parse_cap_maps(struct nfp_app_bpf *bpf, void __iomem *value, u32 length)
|
||||||
|
{
|
||||||
|
struct nfp_bpf_cap_tlv_maps __iomem *cap = value;
|
||||||
|
|
||||||
|
if (length < sizeof(*cap)) {
|
||||||
|
nfp_err(bpf->app->cpp, "truncated maps TLV: %d\n", length);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bpf->maps.types = readl(&cap->types);
|
||||||
|
bpf->maps.max_maps = readl(&cap->max_maps);
|
||||||
|
bpf->maps.max_elems = readl(&cap->max_elems);
|
||||||
|
bpf->maps.max_key_sz = readl(&cap->max_key_sz);
|
||||||
|
bpf->maps.max_val_sz = readl(&cap->max_val_sz);
|
||||||
|
bpf->maps.max_elem_sz = readl(&cap->max_elem_sz);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int nfp_bpf_parse_capabilities(struct nfp_app *app)
|
static int nfp_bpf_parse_capabilities(struct nfp_app *app)
|
||||||
{
|
{
|
||||||
struct nfp_cpp *cpp = app->pf->cpp;
|
struct nfp_cpp *cpp = app->pf->cpp;
|
||||||
@ -276,11 +315,19 @@ static int nfp_bpf_parse_capabilities(struct nfp_app *app)
|
|||||||
goto err_release_free;
|
goto err_release_free;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case NFP_BPF_CAP_TYPE_FUNC:
|
||||||
|
if (nfp_bpf_parse_cap_func(app->priv, value, length))
|
||||||
|
goto err_release_free;
|
||||||
|
break;
|
||||||
case NFP_BPF_CAP_TYPE_ADJUST_HEAD:
|
case NFP_BPF_CAP_TYPE_ADJUST_HEAD:
|
||||||
if (nfp_bpf_parse_cap_adjust_head(app->priv, value,
|
if (nfp_bpf_parse_cap_adjust_head(app->priv, value,
|
||||||
length))
|
length))
|
||||||
goto err_release_free;
|
goto err_release_free;
|
||||||
break;
|
break;
|
||||||
|
case NFP_BPF_CAP_TYPE_MAPS:
|
||||||
|
if (nfp_bpf_parse_cap_maps(app->priv, value, length))
|
||||||
|
goto err_release_free;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
nfp_dbg(cpp, "unknown BPF capability: %d\n", type);
|
nfp_dbg(cpp, "unknown BPF capability: %d\n", type);
|
||||||
break;
|
break;
|
||||||
|
@ -112,6 +112,17 @@ enum pkt_vec {
|
|||||||
* @off_max: maximum packet offset within buffer required
|
* @off_max: maximum packet offset within buffer required
|
||||||
* @guaranteed_sub: amount of negative adjustment guaranteed possible
|
* @guaranteed_sub: amount of negative adjustment guaranteed possible
|
||||||
* @guaranteed_add: amount of positive adjustment guaranteed possible
|
* @guaranteed_add: amount of positive adjustment guaranteed possible
|
||||||
|
*
|
||||||
|
* @maps: map capability
|
||||||
|
* @types: supported map types
|
||||||
|
* @max_maps: max number of maps supported
|
||||||
|
* @max_elems: max number of entries in each map
|
||||||
|
* @max_key_sz: max size of map key
|
||||||
|
* @max_val_sz: max size of map value
|
||||||
|
* @max_elem_sz: max size of map entry (key + value)
|
||||||
|
*
|
||||||
|
* @helpers: helper addressess for various calls
|
||||||
|
* @map_lookup: map lookup helper address
|
||||||
*/
|
*/
|
||||||
struct nfp_app_bpf {
|
struct nfp_app_bpf {
|
||||||
struct nfp_app *app;
|
struct nfp_app *app;
|
||||||
@ -132,6 +143,19 @@ struct nfp_app_bpf {
|
|||||||
int guaranteed_sub;
|
int guaranteed_sub;
|
||||||
int guaranteed_add;
|
int guaranteed_add;
|
||||||
} adjust_head;
|
} adjust_head;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u32 types;
|
||||||
|
u32 max_maps;
|
||||||
|
u32 max_elems;
|
||||||
|
u32 max_key_sz;
|
||||||
|
u32 max_val_sz;
|
||||||
|
u32 max_elem_sz;
|
||||||
|
} maps;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u32 map_lookup;
|
||||||
|
} helpers;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user