Skip to content

Commit

Permalink
bpf: tcp: seq_file: Remove bpf_seq_afinfo from tcp_iter_state
Browse files Browse the repository at this point in the history
A following patch will create a separate struct to store extra
bpf_iter state and it will embed the existing tcp_iter_state like this:
struct bpf_tcp_iter_state {
	struct tcp_iter_state state;
	/* More bpf_iter specific states here ... */
}

As a prep work, this patch removes the
"struct tcp_seq_afinfo *bpf_seq_afinfo" where its purpose is
to tell if it is iterating from bpf_iter instead of proc fs.
Currently, if "*bpf_seq_afinfo" is not NULL, it is iterating from
bpf_iter.  The kernel should not filter by the addr family and
leave this filtering decision to the bpf prog.

Instead of adding a "*bpf_seq_afinfo" pointer, this patch uses the
"seq->op == &bpf_iter_tcp_seq_ops" test to tell if it is iterating
from the bpf iter.

The bpf_iter_(init|fini)_tcp() is left here to prepare for
the change of a following patch.

Signed-off-by: Martin KaFai Lau <[email protected]>
Signed-off-by: Andrii Nakryiko <[email protected]>
Reviewed-by: Eric Dumazet <[email protected]>
Acked-by: Kuniyuki Iwashima <[email protected]>
Acked-by: Yonghong Song <[email protected]>
Link: https://lore.kernel.org/bpf/[email protected]
  • Loading branch information
iamkafai authored and anakryiko committed Jul 23, 2021
1 parent ad2d613 commit 6200137
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 21 deletions.
1 change: 0 additions & 1 deletion include/net/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -1959,7 +1959,6 @@ struct tcp_iter_state {
struct seq_net_private p;
enum tcp_seq_states state;
struct sock *syn_wait_sk;
struct tcp_seq_afinfo *bpf_seq_afinfo;
int bucket, offset, sbucket, num;
loff_t last_pos;
};
Expand Down
25 changes: 5 additions & 20 deletions net/ipv4/tcp_ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -2735,12 +2735,13 @@ static const struct seq_operations bpf_iter_tcp_seq_ops = {
#endif
static unsigned short seq_file_family(const struct seq_file *seq)
{
const struct tcp_iter_state *st = seq->private;
const struct tcp_seq_afinfo *afinfo = st->bpf_seq_afinfo;
const struct tcp_seq_afinfo *afinfo;

#ifdef CONFIG_BPF_SYSCALL
/* Iterated from bpf_iter. Let the bpf prog to filter instead. */
if (afinfo)
if (seq->op == &bpf_iter_tcp_seq_ops)
return AF_UNSPEC;
#endif

/* Iterated from proc fs */
afinfo = PDE_DATA(file_inode(seq->file));
Expand Down Expand Up @@ -2998,27 +2999,11 @@ DEFINE_BPF_ITER_FUNC(tcp, struct bpf_iter_meta *meta,

static int bpf_iter_init_tcp(void *priv_data, struct bpf_iter_aux_info *aux)
{
struct tcp_iter_state *st = priv_data;
struct tcp_seq_afinfo *afinfo;
int ret;

afinfo = kmalloc(sizeof(*afinfo), GFP_USER | __GFP_NOWARN);
if (!afinfo)
return -ENOMEM;

afinfo->family = AF_UNSPEC;
st->bpf_seq_afinfo = afinfo;
ret = bpf_iter_init_seq_net(priv_data, aux);
if (ret)
kfree(afinfo);
return ret;
return bpf_iter_init_seq_net(priv_data, aux);
}

static void bpf_iter_fini_tcp(void *priv_data)
{
struct tcp_iter_state *st = priv_data;

kfree(st->bpf_seq_afinfo);
bpf_iter_fini_seq_net(priv_data);
}

Expand Down

0 comments on commit 6200137

Please sign in to comment.