-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'BPF iterator for UNIX domain socket.'
Kuniyuki Iwashima says: ==================== This patch set adds BPF iterator support for UNIX domain socket. The first patch implements it, and the second adds "%c" support for BPF_SEQ_PRINTF(). Thanks to Yonghong Song for the fix [0] for the LLVM code gen. The fix prevents the LLVM compiler from transforming the loop exit condition '<' to '!=', where the upper bound is not a constant. The transformation leads the verifier to interpret it as an infinite loop. And thanks to Andrii Nakryiko for its workaround [1]. [0] https://reviews.llvm.org/D107483 [1] https://lore.kernel.org/netdev/CAEf4BzZ3sVx1m1mOCcPcuVPiY6cWEAO=6VGHDiXEs9ZVD-RoLg@mail.gmail.com/ Changelog: v6: - Align the header "Inde" column - Change int vars to __u64 not to break test_progs-no_alu32 - Move the if statement into the for loop not to depend on the fix [0] - Drop the README change - Modify "%c" positive test patterns v5: https://lore.kernel.org/netdev/20210812164557.79046-1-kuniyu@amazon.co.jp/ - Align header line of bpf_iter_unix.c - Add test for "%c" v4: https://lore.kernel.org/netdev/20210810092807.13190-1-kuniyu@amazon.co.jp/ - Check IS_BUILTIN(CONFIG_UNIX) - Support "%c" in BPF_SEQ_PRINTF() - Uncomment the code to print the name of the abstract socket - Mention the LLVM fix in README.rst - Remove the 'aligned' attribute in bpf_iter.h - Keep the format string on a single line v3: https://lore.kernel.org/netdev/20210804070851.97834-1-kuniyu@amazon.co.jp/ - Export some functions for CONFIG_UNIX=m v2: https://lore.kernel.org/netdev/20210803011110.21205-1-kuniyu@amazon.co.jp/ - Implement bpf_iter specific seq_ops->stop() - Add bpf_iter__unix in bpf_iter.h - Move common definitions in selftest to bpf_tracing_net.h - Include the code for abstract UNIX domain socket as comment in selftest - Use ASSERT_OK_PTR() instead of CHECK() - Make ternary operators on single line v1: https://lore.kernel.org/netdev/20210729233645.4869-1-kuniyu@amazon.co.jp/ ==================== Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
- Loading branch information
Showing
9 changed files
with
223 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright Amazon.com Inc. or its affiliates. */ | ||
#include "bpf_iter.h" | ||
#include "bpf_tracing_net.h" | ||
#include <bpf/bpf_helpers.h> | ||
#include <bpf/bpf_endian.h> | ||
|
||
char _license[] SEC("license") = "GPL"; | ||
|
||
static long sock_i_ino(const struct sock *sk) | ||
{ | ||
const struct socket *sk_socket = sk->sk_socket; | ||
const struct inode *inode; | ||
unsigned long ino; | ||
|
||
if (!sk_socket) | ||
return 0; | ||
|
||
inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode; | ||
bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino); | ||
return ino; | ||
} | ||
|
||
SEC("iter/unix") | ||
int dump_unix(struct bpf_iter__unix *ctx) | ||
{ | ||
struct unix_sock *unix_sk = ctx->unix_sk; | ||
struct sock *sk = (struct sock *)unix_sk; | ||
struct seq_file *seq; | ||
__u32 seq_num; | ||
|
||
if (!unix_sk) | ||
return 0; | ||
|
||
seq = ctx->meta->seq; | ||
seq_num = ctx->meta->seq_num; | ||
if (seq_num == 0) | ||
BPF_SEQ_PRINTF(seq, "Num RefCount Protocol Flags Type St Inode Path\n"); | ||
|
||
BPF_SEQ_PRINTF(seq, "%pK: %08X %08X %08X %04X %02X %8lu", | ||
unix_sk, | ||
sk->sk_refcnt.refs.counter, | ||
0, | ||
sk->sk_state == TCP_LISTEN ? __SO_ACCEPTCON : 0, | ||
sk->sk_type, | ||
sk->sk_socket ? | ||
(sk->sk_state == TCP_ESTABLISHED ? SS_CONNECTED : SS_UNCONNECTED) : | ||
(sk->sk_state == TCP_ESTABLISHED ? SS_CONNECTING : SS_DISCONNECTING), | ||
sock_i_ino(sk)); | ||
|
||
if (unix_sk->addr) { | ||
if (!UNIX_ABSTRACT(unix_sk)) { | ||
BPF_SEQ_PRINTF(seq, " %s", unix_sk->addr->name->sun_path); | ||
} else { | ||
/* The name of the abstract UNIX domain socket starts | ||
* with '\0' and can contain '\0'. The null bytes | ||
* should be escaped as done in unix_seq_show(). | ||
*/ | ||
__u64 i, len; | ||
|
||
len = unix_sk->addr->len - sizeof(short); | ||
|
||
BPF_SEQ_PRINTF(seq, " @"); | ||
|
||
for (i = 1; i < len; i++) { | ||
/* unix_mkname() tests this upper bound. */ | ||
if (i >= sizeof(struct sockaddr_un)) | ||
break; | ||
|
||
BPF_SEQ_PRINTF(seq, "%c", | ||
unix_sk->addr->name->sun_path[i] ?: | ||
'@'); | ||
} | ||
} | ||
} | ||
|
||
BPF_SEQ_PRINTF(seq, "\n"); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters