16
#include <bpf/bpf_helpers.h>
17
#include <bpf/bpf_endian.h>
24
#define sk_v6_daddr __sk_common.skc_v6_daddr
25
#define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr
27
#define inet_daddr sk.__sk_common.skc_daddr
28
#define inet_rcv_saddr sk.__sk_common.skc_rcv_saddr
29
#define inet_dport sk.__sk_common.skc_dport
31
#define ir_loc_addr req.__req_common.skc_rcv_saddr
32
#define ir_num req.__req_common.skc_num
33
#define ir_rmt_addr req.__req_common.skc_daddr
34
#define ir_rmt_port req.__req_common.skc_dport
35
#define ir_v6_loc_addr req.__req_common.skc_v6_rcv_saddr
36
#define ir_v6_rmt_addr req.__req_common.skc_v6_daddr
37
#define ireq_family req.__req_common.skc_family
39
#define sk_family __sk_common.skc_family
40
#define sk_state __sk_common.skc_state
41
#define sk_proto __sk_common.sk_protocol
43
#define tw_daddr __tw_common.skc_daddr
44
#define tw_rcv_saddr __tw_common.skc_rcv_saddr
45
#define tw_dport __tw_common.skc_dport
46
#define tw_v6_daddr __tw_common.skc_v6_daddr
47
#define tw_v6_rcv_saddr __tw_common.skc_v6_rcv_saddr
48
#define tw_family __tw_common.skc_family
62
const struct entry *unused __attribute__((unused));
73
static unsigned long sock_i_ino(const struct sock *sk)
75
const struct socket *sk_socket = sk->sk_socket;
76
const struct inode *inode;
82
inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode;
83
bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino);
91
static __always_inline void
92
socket_bpf_seq_write(struct seq_file *seq, __u16 family, __u16 proto,
93
__be32 src_v4, struct in6_addr *src_v6, __u16 srcp,
94
__be32 dest_v4, struct in6_addr *dest_v6, __u16 destp,
95
__u8 state, __u64 ino)
97
struct entry entry = {};
101
*((__u32 *)entry.saddr) = src_v4;
102
*((__u32 *)entry.daddr) = dest_v4;
106
bpf_probe_read_kernel(&entry.daddr, sizeof(entry.daddr),
108
bpf_probe_read_kernel(&entry.saddr, sizeof(entry.saddr),
116
entry.dport = bpf_ntohs(destp);
117
entry.sport = bpf_ntohs(srcp);
119
entry.family = family;
123
bpf_seq_write(seq, &entry, sizeof(entry));
126
char _license[] SEC("license") = "GPL";
128
static int dump_tcp_sock(struct seq_file *seq, struct tcp_sock *tp)
130
struct inet_connection_sock *icsk = &tp->inet_conn;
131
struct inet_sock *inet = &icsk->icsk_inet;
132
struct sock *sp = &inet->sk;
134
socket_bpf_seq_write(seq, sp->sk_family, IPPROTO_TCP,
135
inet->inet_rcv_saddr, &sp->sk_v6_rcv_saddr,
136
inet->inet_sport, inet->inet_daddr,
137
&sp->sk_v6_daddr, inet->inet_dport, sp->sk_state,
143
static int dump_tw_sock(struct seq_file *seq, struct tcp_timewait_sock *ttw)
145
struct inet_timewait_sock *tw = &ttw->tw_sk;
161
socket_bpf_seq_write(seq, tw->tw_family, IPPROTO_TCP, tw->tw_rcv_saddr,
162
&tw->tw_v6_rcv_saddr, tw->tw_sport, tw->tw_daddr,
163
&tw->tw_v6_daddr, tw->tw_dport, tw->tw_substate,
169
static int dump_req_sock(struct seq_file *seq, struct tcp_request_sock *treq)
171
struct inet_request_sock *irsk = &treq->req;
173
socket_bpf_seq_write(seq, irsk->ireq_family, IPPROTO_TCP,
174
irsk->ir_loc_addr, &irsk->ir_v6_loc_addr,
175
irsk->ir_num, irsk->ir_rmt_addr,
176
&irsk->ir_v6_rmt_addr, irsk->ir_rmt_port,
177
TCP_SYN_RECV, sock_i_ino(treq->req.req.sk));
183
int ig_snap_tcp(struct bpf_iter__tcp *ctx)
185
struct sock_common *sk_common = ctx->sk_common;
186
struct seq_file *seq = ctx->meta->seq;
187
struct tcp_timewait_sock *tw;
188
struct tcp_request_sock *req;
191
if (sk_common == (void *)0)
194
tp = bpf_skc_to_tcp_sock(sk_common);
196
return dump_tcp_sock(seq, tp);
198
tw = bpf_skc_to_tcp_timewait_sock(sk_common);
200
return dump_tw_sock(seq, tw);
202
req = bpf_skc_to_tcp_request_sock(sk_common);
204
return dump_req_sock(seq, req);
210
int ig_snap_udp(struct bpf_iter__udp *ctx)
212
struct seq_file *seq = ctx->meta->seq;
213
struct udp_sock *udp_sk = ctx->udp_sk;
214
struct inet_sock *inet;
217
if (udp_sk == (void *)0)
220
inet = &udp_sk->inet;
223
socket_bpf_seq_write(seq, sp->sk_family, IPPROTO_UDP,
224
inet->inet_rcv_saddr, &sp->sk_v6_rcv_saddr,
225
inet->inet_sport, inet->inet_daddr,
226
&sp->sk_v6_daddr, inet->inet_dport, sp->sk_state,