bpf: convert sockmap field attach_bpf_fd2 to type
In the initial sockmap API we provided strparser and verdict programs
using a single attach command by extending the attach API with a the
attach_bpf_fd2 field.
However, if we add other programs in the future we will be adding a
field for every new possible type, attach_bpf_fd(3,4,..). This
seems a bit clumsy for an API. So lets push the programs using two
new type fields.
BPF_SK_SKB_STREAM_PARSER
BPF_SK_SKB_STREAM_VERDICT
This has the advantage of having a readable name and can easily be
extended in the future.
Updates to samples and sockmap included here also generalize tests
slightly to support upcoming patch for multiple map support.
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Fixes: 174a79ff95
("bpf: sockmap with sk redirect support")
Suggested-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
901c5d2fbf
commit
464bc0fd62
@@ -723,20 +723,24 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sock_map_attach_prog(struct bpf_map *map,
|
||||
struct bpf_prog *parse,
|
||||
struct bpf_prog *verdict)
|
||||
int sock_map_attach_prog(struct bpf_map *map, struct bpf_prog *prog, u32 type)
|
||||
{
|
||||
struct bpf_stab *stab = container_of(map, struct bpf_stab, map);
|
||||
struct bpf_prog *_parse, *_verdict;
|
||||
struct bpf_prog *orig;
|
||||
|
||||
_parse = xchg(&stab->bpf_parse, parse);
|
||||
_verdict = xchg(&stab->bpf_verdict, verdict);
|
||||
switch (type) {
|
||||
case BPF_SK_SKB_STREAM_PARSER:
|
||||
orig = xchg(&stab->bpf_parse, prog);
|
||||
break;
|
||||
case BPF_SK_SKB_STREAM_VERDICT:
|
||||
orig = xchg(&stab->bpf_verdict, prog);
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (_parse)
|
||||
bpf_prog_put(_parse);
|
||||
if (_verdict)
|
||||
bpf_prog_put(_verdict);
|
||||
if (orig)
|
||||
bpf_prog_put(orig);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -777,7 +781,6 @@ const struct bpf_map_ops sock_map_ops = {
|
||||
.map_get_next_key = sock_map_get_next_key,
|
||||
.map_update_elem = sock_map_update_elem,
|
||||
.map_delete_elem = sock_map_delete_elem,
|
||||
.map_attach = sock_map_attach_prog,
|
||||
};
|
||||
|
||||
BPF_CALL_5(bpf_sock_map_update, struct bpf_sock_ops_kern *, bpf_sock,
|
||||
|
@@ -1093,12 +1093,12 @@ static int bpf_obj_get(const union bpf_attr *attr)
|
||||
|
||||
#ifdef CONFIG_CGROUP_BPF
|
||||
|
||||
#define BPF_PROG_ATTACH_LAST_FIELD attach_bpf_fd2
|
||||
#define BPF_PROG_ATTACH_LAST_FIELD attach_flags
|
||||
|
||||
static int sockmap_get_from_fd(const union bpf_attr *attr, int ptype)
|
||||
static int sockmap_get_from_fd(const union bpf_attr *attr)
|
||||
{
|
||||
struct bpf_prog *prog1, *prog2;
|
||||
int ufd = attr->target_fd;
|
||||
struct bpf_prog *prog;
|
||||
struct bpf_map *map;
|
||||
struct fd f;
|
||||
int err;
|
||||
@@ -1108,29 +1108,16 @@ static int sockmap_get_from_fd(const union bpf_attr *attr, int ptype)
|
||||
if (IS_ERR(map))
|
||||
return PTR_ERR(map);
|
||||
|
||||
if (!map->ops->map_attach) {
|
||||
prog = bpf_prog_get_type(attr->attach_bpf_fd, BPF_PROG_TYPE_SK_SKB);
|
||||
if (IS_ERR(prog)) {
|
||||
fdput(f);
|
||||
return -EOPNOTSUPP;
|
||||
return PTR_ERR(prog);
|
||||
}
|
||||
|
||||
prog1 = bpf_prog_get_type(attr->attach_bpf_fd, ptype);
|
||||
if (IS_ERR(prog1)) {
|
||||
fdput(f);
|
||||
return PTR_ERR(prog1);
|
||||
}
|
||||
|
||||
prog2 = bpf_prog_get_type(attr->attach_bpf_fd2, ptype);
|
||||
if (IS_ERR(prog2)) {
|
||||
fdput(f);
|
||||
bpf_prog_put(prog1);
|
||||
return PTR_ERR(prog2);
|
||||
}
|
||||
|
||||
err = map->ops->map_attach(map, prog1, prog2);
|
||||
err = sock_map_attach_prog(map, prog, attr->attach_type);
|
||||
if (err) {
|
||||
fdput(f);
|
||||
bpf_prog_put(prog1);
|
||||
bpf_prog_put(prog2);
|
||||
bpf_prog_put(prog);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1165,16 +1152,13 @@ static int bpf_prog_attach(const union bpf_attr *attr)
|
||||
case BPF_CGROUP_SOCK_OPS:
|
||||
ptype = BPF_PROG_TYPE_SOCK_OPS;
|
||||
break;
|
||||
case BPF_CGROUP_SMAP_INGRESS:
|
||||
ptype = BPF_PROG_TYPE_SK_SKB;
|
||||
break;
|
||||
case BPF_SK_SKB_STREAM_PARSER:
|
||||
case BPF_SK_SKB_STREAM_VERDICT:
|
||||
return sockmap_get_from_fd(attr);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (attr->attach_type == BPF_CGROUP_SMAP_INGRESS)
|
||||
return sockmap_get_from_fd(attr, ptype);
|
||||
|
||||
prog = bpf_prog_get_type(attr->attach_bpf_fd, ptype);
|
||||
if (IS_ERR(prog))
|
||||
return PTR_ERR(prog);
|
||||
|
Reference in New Issue
Block a user