Skip to content

Commit ad32af4

Browse files
authored
Merge pull request #335 from bobrik/ivan/tcp-retransmit-adjust
Adjust tcp-retransmit example
2 parents e9917bd + 1c2c660 commit ad32af4

File tree

2 files changed

+93
-95
lines changed

2 files changed

+93
-95
lines changed

examples/tcp-retransmit.bpf.c

Lines changed: 46 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include <vmlinux.h>
22
#include <bpf/bpf_tracing.h>
3-
#include <bpf/bpf_core_read.h>
43
#include "maps.bpf.h"
54

65
#define MAX_ENTRIES 8192
@@ -17,15 +16,15 @@
1716
struct ipv4_key_t {
1817
u32 saddr;
1918
u32 daddr;
20-
u16 mainport;
21-
u32 type;
19+
u16 main_port;
20+
u8 type;
2221
};
2322

2423
struct ipv6_key_t {
2524
u8 saddr[16];
2625
u8 daddr[16];
27-
u16 mainport;
28-
u32 type;
26+
u16 main_port;
27+
u8 type;
2928
};
3029

3130
struct {
@@ -42,60 +41,59 @@ struct {
4241
__type(value, u64);
4342
} tcp_retransmit_ipv6_packets_total SEC(".maps");
4443

45-
static int trace_event(const struct sock *sk, u32 type)
44+
static int extract_main_port(const struct sock *sk)
4645
{
47-
u32 family = sk->__sk_common.skc_family;
46+
u16 sport = sk->__sk_common.skc_num;
47+
u16 dport = __builtin_bswap16(sk->__sk_common.skc_dport);
4848

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-
}
49+
if (sport > UPPER_PORT_BOUND && dport > UPPER_PORT_BOUND) {
50+
return 0;
51+
}
6552

66-
if (key.mainport >= UPPER_PORT_BOUND) {
67-
key.mainport = 0;
68-
}
53+
if (sport < dport) {
54+
return sport;
55+
}
6956

70-
key.type = type;
57+
return dport;
58+
}
7159

72-
increment_map(&tcp_retransmit_ipv4_packets_total, &key, 1);
60+
#define TRACE_PROTOCOL(key_type, map, ip_extractor) \
61+
key_type key = {}; \
62+
\
63+
key.type = type; \
64+
key.main_port = extract_main_port(sk); \
65+
\
66+
ip_extractor; \
67+
\
68+
increment_map(map, &key, 1); \
69+
\
70+
return 0;
7371

74-
} else if (family == AF_INET6) {
75-
struct ipv6_key_t key;
76-
__builtin_memset(&key, 0, sizeof(key));
72+
static int trace_ipv4(const struct sock *sk, u8 type)
73+
{
74+
TRACE_PROTOCOL(struct ipv4_key_t, &tcp_retransmit_ipv4_packets_total, {
75+
key.saddr = sk->__sk_common.skc_rcv_saddr;
76+
key.daddr = sk->__sk_common.skc_daddr;
77+
});
78+
}
7779

80+
static int trace_ipv6(const struct sock *sk, u8 type)
81+
{
82+
TRACE_PROTOCOL(struct ipv6_key_t, &tcp_retransmit_ipv6_packets_total, {
7883
bpf_probe_read_kernel(&key.saddr, sizeof(key.saddr), sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
7984
bpf_probe_read_kernel(&key.daddr, sizeof(key.daddr), sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
85+
});
86+
}
8087

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);
88+
static int trace_event(const struct sock *sk, u8 type)
89+
{
90+
switch (sk->__sk_common.skc_family) {
91+
case AF_INET:
92+
return trace_ipv4(sk, type);
93+
case AF_INET6:
94+
return trace_ipv6(sk, type);
9895
}
96+
9997
return 0;
10098
}
10199

examples/tcp-retransmit.yaml

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,48 @@
11
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
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: 2
16+
decoders:
17+
- name: uint
18+
- name: type
19+
size: 2
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: 2
39+
decoders:
40+
- name: uint
41+
- name: type
42+
size: 2
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)