Skip to content

Commit 4fa5ddf

Browse files
committed
kprobe: add cookie_v4_check kprobe
Signed-off-by: Vincent Li <[email protected]>
1 parent 8afca8f commit 4fa5ddf

File tree

1 file changed

+83
-11
lines changed

1 file changed

+83
-11
lines changed

examples/c/kprobe.bpf.c

Lines changed: 83 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,102 @@
11
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
22
/* Copyright (c) 2021 Sartura */
33
#include "vmlinux.h"
4+
#include <bpf/bpf_core_read.h>
5+
#include <bpf/bpf_endian.h>
46
#include <bpf/bpf_helpers.h>
57
#include <bpf/bpf_tracing.h>
6-
#include <bpf/bpf_core_read.h>
78

89
char LICENSE[] SEC("license") = "Dual BSD/GPL";
910

1011
SEC("kprobe/do_unlinkat")
1112
int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name)
1213
{
13-
pid_t pid;
14-
const char *filename;
14+
pid_t pid;
15+
const char *filename;
1516

16-
pid = bpf_get_current_pid_tgid() >> 32;
17-
filename = BPF_CORE_READ(name, name);
18-
bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename);
19-
return 0;
17+
pid = bpf_get_current_pid_tgid() >> 32;
18+
filename = BPF_CORE_READ(name, name);
19+
bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename);
20+
return 0;
2021
}
2122

2223
SEC("kretprobe/do_unlinkat")
2324
int BPF_KRETPROBE(do_unlinkat_exit, long ret)
2425
{
25-
pid_t pid;
26+
pid_t pid;
27+
28+
pid = bpf_get_current_pid_tgid() >> 32;
29+
bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret);
30+
return 0;
31+
}
32+
33+
SEC("kprobe/cookie_v4_check")
34+
int BPF_KPROBE(cookie_v4_check, struct sock *sk, struct sk_buff *skb) {
35+
struct tcphdr tcph = {};
36+
int sk_state = 0;
37+
// Get socket state if socket exists
38+
if (sk) {
39+
sk_state = BPF_CORE_READ(sk, __sk_common.skc_state);
40+
bpf_printk("cookie_v4_check: state=%d", sk_state);
41+
}
42+
43+
if (bpf_probe_read_kernel(&tcph, sizeof(tcph),
44+
BPF_CORE_READ(skb, head) +
45+
BPF_CORE_READ(skb, transport_header)) == 0) {
46+
u16 dest_port = bpf_htons(tcph.dest);
47+
u16 src_port = bpf_htons(tcph.source);
48+
bpf_printk("cookie_v4_check: src=%d dest=%d", src_port, dest_port);
49+
return 0;
50+
}
51+
return 0;
52+
}
53+
54+
SEC("kprobe/tcp_v4_rcv")
55+
int BPF_KPROBE(tcp_v4_rcv, struct sk_buff *skb) {
56+
struct tcphdr tcph = {};
57+
struct sock *sk = BPF_CORE_READ(skb, sk);
58+
int sk_state = 0;
59+
60+
// Read TCP header (transport layer)
61+
if (bpf_probe_read_kernel(&tcph, sizeof(tcph),
62+
BPF_CORE_READ(skb, head) +
63+
BPF_CORE_READ(skb, transport_header)))
64+
return 0;
65+
66+
// Extract key fields
67+
u16 src_port = bpf_htons(tcph.source);
68+
u16 dest_port = bpf_htons(tcph.dest);
69+
if (dest_port != 444)
70+
return 0;
71+
72+
// Get socket state if socket exists
73+
if (sk) {
74+
sk_state = BPF_CORE_READ(sk, __sk_common.skc_state);
75+
bpf_printk("tcp_v4_rcv: state=%d", sk_state);
76+
}
77+
78+
// Initialize flags string with '.' (unset flags)
79+
char flags_str[6] = "....."; // Default: all flags unset
80+
81+
// Set active flags
82+
if (tcph.fin)
83+
flags_str[0] = 'F';
84+
if (tcph.syn)
85+
flags_str[1] = 'S';
86+
if (tcph.rst)
87+
flags_str[2] = 'R';
88+
if (tcph.psh)
89+
flags_str[3] = 'P'; // PUSH flag (data packet)
90+
if (tcph.ack)
91+
flags_str[4] = 'A';
92+
if (tcph.urg)
93+
flags_str[5] = 'U';
94+
95+
// Get sequence number (network byte order -> host)
96+
u32 seq_num = bpf_ntohl(tcph.seq);
97+
98+
bpf_printk("tcp_v4_rcv: src=%d dest=%d seq=%u flags=%s",
99+
bpf_htons(tcph.source), dest_port, seq_num, flags_str);
26100

27-
pid = bpf_get_current_pid_tgid() >> 32;
28-
bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret);
29-
return 0;
101+
return 0;
30102
}

0 commit comments

Comments
 (0)