Skip to content

Commit e9917bd

Browse files
authored
Merge pull request #318 from alebsys/tcp-retransmit
Add tcp-retransmit example
2 parents fbfab4f + 0ae0f07 commit e9917bd

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

examples/tcp-retransmit.bpf.c

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include <vmlinux.h>
2+
#include <bpf/bpf_tracing.h>
3+
#include <bpf/bpf_core_read.h>
4+
#include "maps.bpf.h"
5+
6+
#define MAX_ENTRIES 8192
7+
8+
// Type of tcp retransmits
9+
#define RETRANSMIT 1
10+
#define TLP 2
11+
12+
#define AF_INET 2
13+
#define AF_INET6 10
14+
15+
#define UPPER_PORT_BOUND 32768
16+
17+
struct ipv4_key_t {
18+
u32 saddr;
19+
u32 daddr;
20+
u16 mainport;
21+
u32 type;
22+
};
23+
24+
struct ipv6_key_t {
25+
u8 saddr[16];
26+
u8 daddr[16];
27+
u16 mainport;
28+
u32 type;
29+
};
30+
31+
struct {
32+
__uint(type, BPF_MAP_TYPE_LRU_HASH);
33+
__uint(max_entries, MAX_ENTRIES);
34+
__type(key, struct ipv4_key_t);
35+
__type(value, u64);
36+
} tcp_retransmit_ipv4_packets_total SEC(".maps");
37+
38+
struct {
39+
__uint(type, BPF_MAP_TYPE_LRU_HASH);
40+
__uint(max_entries, MAX_ENTRIES);
41+
__type(key, struct ipv6_key_t);
42+
__type(value, u64);
43+
} tcp_retransmit_ipv6_packets_total SEC(".maps");
44+
45+
static int trace_event(const struct sock *sk, u32 type)
46+
{
47+
u32 family = sk->__sk_common.skc_family;
48+
49+
if (family == AF_INET) {
50+
struct ipv4_key_t key;
51+
__builtin_memset(&key, 0, sizeof(key));
52+
53+
key.saddr = sk->__sk_common.skc_rcv_saddr;
54+
key.daddr = sk->__sk_common.skc_daddr;
55+
56+
u16 sport = sk->__sk_common.skc_num;
57+
u16 dport = sk->__sk_common.skc_dport;
58+
dport = __builtin_bswap16(dport);
59+
60+
if (sport <= dport) {
61+
key.mainport = sport;
62+
} else {
63+
key.mainport = dport;
64+
}
65+
66+
if (key.mainport >= UPPER_PORT_BOUND) {
67+
key.mainport = 0;
68+
}
69+
70+
key.type = type;
71+
72+
increment_map(&tcp_retransmit_ipv4_packets_total, &key, 1);
73+
74+
} else if (family == AF_INET6) {
75+
struct ipv6_key_t key;
76+
__builtin_memset(&key, 0, sizeof(key));
77+
78+
bpf_probe_read_kernel(&key.saddr, sizeof(key.saddr), sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
79+
bpf_probe_read_kernel(&key.daddr, sizeof(key.daddr), sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
80+
81+
u16 sport = sk->__sk_common.skc_num;
82+
u16 dport = sk->__sk_common.skc_dport;
83+
dport = __builtin_bswap16(dport);
84+
85+
if (sport <= dport) {
86+
key.mainport = sport;
87+
} else {
88+
key.mainport = dport;
89+
}
90+
91+
if (key.mainport >= UPPER_PORT_BOUND) {
92+
key.mainport = 0;
93+
}
94+
95+
key.type = type;
96+
97+
increment_map(&tcp_retransmit_ipv6_packets_total, &key, 1);
98+
}
99+
return 0;
100+
}
101+
102+
SEC("fentry/tcp_send_loss_probe")
103+
int BPF_PROG(tcp_send_loss_probe, struct sock *sk)
104+
{
105+
return trace_event(sk, TLP);
106+
}
107+
108+
SEC("fentry/tcp_retransmit_skb")
109+
int BPF_PROG(tcp_retransmit_skb, struct sock *sk)
110+
{
111+
return trace_event(sk, RETRANSMIT);
112+
}
113+
114+
char LICENSE[] SEC("license") = "GPL";

examples/tcp-retransmit.yaml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
metrics:
2+
counters:
3+
- name: tcp_retransmit_ipv4_packets_total
4+
help: Total count of IPv4 TCP retransmissions
5+
labels:
6+
- name: local_ip
7+
size: 4
8+
decoders:
9+
- name: inet_ip
10+
- name: peer_ip
11+
size: 4
12+
decoders:
13+
- name: inet_ip
14+
- name: main_port
15+
size: 4
16+
decoders:
17+
- name: uint
18+
- name: type
19+
size: 4
20+
decoders:
21+
- name: uint
22+
- name: static_map
23+
static_map:
24+
1: retransmit
25+
2: tail_loss_probe
26+
- name: tcp_retransmit_ipv6_packets_total
27+
help: Total count of IPv6 TCP retransmissions
28+
labels:
29+
- name: local_ip
30+
size: 16
31+
decoders:
32+
- name: inet_ip
33+
- name: peer_ip
34+
size: 16
35+
decoders:
36+
- name: inet_ip
37+
- name: main_port
38+
size: 4
39+
decoders:
40+
- name: uint
41+
- name: type
42+
size: 4
43+
decoders:
44+
- name: uint
45+
- name: static_map
46+
static_map:
47+
1: retransmit
48+
2: tail_loss_probe

0 commit comments

Comments
 (0)