15
15
// author: blown.away@qq.com
16
16
17
17
#include "common.bpf.h"
18
-
19
- static __always_inline int __udp_rcv (struct sk_buff * skb ) {
18
+ // receive
19
+ static __always_inline int __udp_rcv (struct sk_buff * skb )
20
+ {
20
21
if (!udp_info || skb == NULL )
21
22
return 0 ;
22
23
struct iphdr * ip = skb_to_iphdr (skb );
@@ -27,14 +28,16 @@ static __always_inline int __udp_rcv(struct sk_buff *skb) {
27
28
struct ktime_info * tinfo , zero = {0 };
28
29
tinfo = (struct ktime_info * )bpf_map_lookup_or_try_init (& timestamps ,
29
30
& pkt_tuple , & zero );
30
- if (tinfo == NULL ) {
31
+ if (tinfo == NULL )
32
+ {
31
33
return 0 ;
32
34
}
33
35
tinfo -> tran_time = bpf_ktime_get_ns () / 1000 ;
34
36
return 0 ;
35
37
}
36
38
static __always_inline int udp_enqueue_schedule_skb (struct sock * sk ,
37
- struct sk_buff * skb ) {
39
+ struct sk_buff * skb )
40
+ {
38
41
if (!udp_info || skb == NULL )
39
42
return 0 ;
40
43
struct iphdr * ip = skb_to_iphdr (skb );
@@ -44,14 +47,16 @@ static __always_inline int udp_enqueue_schedule_skb(struct sock *sk,
44
47
FILTER
45
48
struct ktime_info * tinfo , zero = {0 };
46
49
tinfo = bpf_map_lookup_elem (& timestamps , & pkt_tuple );
47
- if (tinfo == NULL ) {
50
+ if (tinfo == NULL )
51
+ {
48
52
return 0 ;
49
53
}
50
54
struct udp_message * message ;
51
55
struct udp_message * udp_message =
52
56
bpf_map_lookup_elem (& timestamps , & pkt_tuple );
53
57
message = bpf_ringbuf_reserve (& udp_rb , sizeof (* message ), 0 );
54
- if (!message ) {
58
+ if (!message )
59
+ {
55
60
return 0 ;
56
61
}
57
62
message -> saddr = pkt_tuple .saddr ;
@@ -60,25 +65,27 @@ static __always_inline int udp_enqueue_schedule_skb(struct sock *sk,
60
65
message -> sport = pkt_tuple .sport ;
61
66
message -> tran_time = bpf_ktime_get_ns () / 1000 - tinfo -> tran_time ;
62
67
message -> rx = 1 ; // 收包
63
- message -> len = __bpf_ntohs (BPF_CORE_READ (udp , len ));
68
+ message -> len = __bpf_ntohs (BPF_CORE_READ (udp , len )) - UDP_HEAD ;
64
69
bpf_ringbuf_submit (message , 0 );
65
70
return 0 ;
66
71
}
67
-
68
- static __always_inline int __udp_send_skb (struct sk_buff * skb ) {
72
+ // send
73
+ static __always_inline int __udp_send_skb (struct sk_buff * skb )
74
+ {
69
75
if (!udp_info || skb == NULL )
70
76
return 0 ;
71
77
struct packet_tuple pkt_tuple = {0 };
72
78
struct sock * sk = BPF_CORE_READ (skb , sk );
73
79
u16 dport = BPF_CORE_READ (sk , __sk_common .skc_dport );
74
80
u16 sport = BPF_CORE_READ (sk , __sk_common .skc_num );
75
- pkt_tuple .saddr = BPF_CORE_READ (sk , __sk_common .skc_rcv_saddr ); // 源ip
76
- pkt_tuple .daddr = BPF_CORE_READ (sk , __sk_common .skc_daddr ); // 目的ip
77
- pkt_tuple .sport = sport ; // 源端口
78
- pkt_tuple .dport = __bpf_ntohs (dport ); // 目的端口并进行字节序转换
81
+ pkt_tuple .saddr = BPF_CORE_READ (sk , __sk_common .skc_rcv_saddr );
82
+ pkt_tuple .daddr = BPF_CORE_READ (sk , __sk_common .skc_daddr );
83
+ pkt_tuple .sport = sport ;
84
+ pkt_tuple .dport = __bpf_ntohs (dport );
79
85
pkt_tuple .tran_flag = UDP ;
80
86
FILTER
81
87
struct ktime_info * tinfo , zero = {0 };
88
+
82
89
/** 注意:
83
90
* bpf_printk在老的Linux内核(在kernel 5.15测试)上,只支持三个以内的参数
84
91
* 可查看: https://github.com/libbpf/libbpf-bootstrap/issues/206
@@ -87,15 +94,18 @@ static __always_inline int __udp_send_skb(struct sk_buff *skb) {
87
94
// pkt_tuple.sport, pkt_tuple.dport);
88
95
bpf_printk ("udp_send_skb s&d addr: %d %d" , pkt_tuple .saddr , pkt_tuple .daddr );
89
96
bpf_printk ("udp_send_skb s&d port: %d %d" , pkt_tuple .sport , pkt_tuple .dport );
97
+
90
98
tinfo = (struct ktime_info * )bpf_map_lookup_or_try_init (& timestamps ,
91
99
& pkt_tuple , & zero );
92
- if (tinfo == NULL ) {
100
+ if (tinfo == NULL )
101
+ {
93
102
return 0 ;
94
103
}
95
104
tinfo -> tran_time = bpf_ktime_get_ns () / 1000 ;
96
105
return 0 ;
97
106
}
98
- static __always_inline int __ip_send_skb (struct sk_buff * skb ) {
107
+ static __always_inline int __ip_send_skb (struct sk_buff * skb )
108
+ {
99
109
if (!udp_info || skb == NULL )
100
110
return 0 ;
101
111
struct iphdr * ip = skb_to_iphdr (skb );
@@ -105,28 +115,31 @@ static __always_inline int __ip_send_skb(struct sk_buff *skb) {
105
115
FILTER
106
116
struct ktime_info * tinfo , zero = {0 };
107
117
tinfo = bpf_map_lookup_elem (& timestamps , & pkt_tuple );
108
- if (tinfo == NULL ) {
118
+ if (tinfo == NULL )
119
+ {
109
120
return 0 ;
110
121
}
111
122
struct udp_message * message ;
112
123
struct udp_message * udp_message =
113
124
bpf_map_lookup_elem (& timestamps , & pkt_tuple );
114
125
message = bpf_ringbuf_reserve (& udp_rb , sizeof (* message ), 0 );
115
- if (!message ) {
126
+ if (!message )
127
+ {
116
128
return 0 ;
117
129
}
118
- udp = skb_to_udphdr ( skb );
130
+
119
131
message -> tran_time = bpf_ktime_get_ns () / 1000 - tinfo -> tran_time ;
120
132
message -> saddr = pkt_tuple .saddr ;
121
133
message -> daddr = pkt_tuple .daddr ;
122
134
message -> sport = pkt_tuple .sport ;
123
135
message -> dport = pkt_tuple .dport ;
124
136
message -> rx = 0 ; // 发包
125
- message -> len = __bpf_ntohs (BPF_CORE_READ (udp , len ));
137
+ message -> len = __bpf_ntohs (BPF_CORE_READ (udp , len )) - UDP_HEAD ;
126
138
bpf_ringbuf_submit (message , 0 );
127
139
return 0 ;
128
140
}
129
- static __always_inline int process_dns_packet (struct sk_buff * skb , int rx ) {
141
+ static __always_inline int process_dns_packet (struct sk_buff * skb , int rx )
142
+ {
130
143
if (skb == NULL )
131
144
return 0 ;
132
145
u16 QR_flags ;
@@ -160,31 +173,42 @@ static __always_inline int process_dns_packet(struct sk_buff *skb, int rx) {
160
173
1000 0000 0000 0000
161
174
&运算提取最高位QR, QR=1 Response QR=0 Request
162
175
*/
163
- if (QR_flags & 0x8000 ) { // 响应
176
+ if (QR_flags & 0x8000 )
177
+ { // 响应
164
178
count_ptr = bpf_map_lookup_elem (& dns_response_count , & key );
165
- if (count_ptr ) {
179
+ if (count_ptr )
180
+ {
166
181
response_count = * count_ptr + 1 ;
167
- } else {
182
+ }
183
+ else
184
+ {
168
185
response_count = 1 ;
169
186
}
170
187
bpf_map_update_elem (& dns_response_count , & key , & response_count ,
171
188
BPF_ANY );
172
189
// 保留映射中的请求计数值
173
190
count_ptr = bpf_map_lookup_elem (& dns_request_count , & key );
174
- if (count_ptr ) {
191
+ if (count_ptr )
192
+ {
175
193
request_count = * count_ptr ;
176
194
}
177
- } else { // 请求
195
+ }
196
+ else
197
+ { // 请求
178
198
count_ptr = bpf_map_lookup_elem (& dns_request_count , & key );
179
- if (count_ptr ) {
199
+ if (count_ptr )
200
+ {
180
201
request_count = * count_ptr + 1 ;
181
- } else {
202
+ }
203
+ else
204
+ {
182
205
request_count = 1 ;
183
206
}
184
207
bpf_map_update_elem (& dns_request_count , & key , & request_count , BPF_ANY );
185
208
// 保留映射中的响应计数值
186
209
count_ptr = bpf_map_lookup_elem (& dns_response_count , & key );
187
- if (count_ptr ) {
210
+ if (count_ptr )
211
+ {
188
212
response_count = * count_ptr ;
189
213
}
190
214
}
@@ -203,10 +227,12 @@ static __always_inline int process_dns_packet(struct sk_buff *skb, int rx) {
203
227
bpf_ringbuf_submit (message , 0 );
204
228
return 0 ;
205
229
}
206
- static __always_inline int __dns_rcv (struct sk_buff * skb ) {
230
+ static __always_inline int __dns_rcv (struct sk_buff * skb )
231
+ {
207
232
return process_dns_packet (skb , 0 ); // 0 收
208
233
}
209
234
210
- static __always_inline int __dns_send (struct sk_buff * skb ) {
235
+ static __always_inline int __dns_send (struct sk_buff * skb )
236
+ {
211
237
return process_dns_packet (skb , 1 ); // 1 发
212
238
}
0 commit comments