1 // SPDX-License-Identifier: GPL-2.0
5 #include <linux/if_ether.h>
6 #include <linux/if_packet.h>
9 #include <linux/types.h>
10 #include <linux/socket.h>
11 #include <linux/tcp.h>
12 #include <netinet/in.h>
13 #include "bpf_helpers.h"
14 #include "bpf_endian.h"
15 #include "test_tcpbpf.h"
17 struct bpf_map_def
SEC("maps") global_map
= {
18 .type
= BPF_MAP_TYPE_ARRAY
,
19 .key_size
= sizeof(__u32
),
20 .value_size
= sizeof(struct tcpbpf_globals
),
24 static inline void update_event_map(int event
)
27 struct tcpbpf_globals g
, *gp
;
29 gp
= bpf_map_lookup_elem(&global_map
, &key
);
31 struct tcpbpf_globals g
= {0};
33 g
.event_map
|= (1 << event
);
34 bpf_map_update_elem(&global_map
, &key
, &g
,
38 g
.event_map
|= (1 << event
);
39 bpf_map_update_elem(&global_map
, &key
, &g
,
44 int _version
SEC("version") = 1;
47 int bpf_testcb(struct bpf_sock_ops
*skops
)
60 case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB
:
61 /* Test failure to set largest cb flag (assumes not defined) */
62 bad_call_rv
= bpf_sock_ops_cb_flags_set(skops
, 0x80);
64 good_call_rv
= bpf_sock_ops_cb_flags_set(skops
,
65 BPF_SOCK_OPS_STATE_CB_FLAG
);
69 struct tcpbpf_globals g
, *gp
;
71 gp
= bpf_map_lookup_elem(&global_map
, &key
);
75 g
.bad_cb_test_rv
= bad_call_rv
;
76 g
.good_cb_test_rv
= good_call_rv
;
77 bpf_map_update_elem(&global_map
, &key
, &g
,
81 case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB
:
82 skops
->sk_txhash
= 0x12345f;
84 rv
= bpf_setsockopt(skops
, SOL_IPV6
, IPV6_TCLASS
, &v
,
87 case BPF_SOCK_OPS_RTO_CB
:
89 case BPF_SOCK_OPS_RETRANS_CB
:
91 case BPF_SOCK_OPS_STATE_CB
:
92 if (skops
->args
[1] == BPF_TCP_CLOSE
) {
94 struct tcpbpf_globals g
, *gp
;
96 gp
= bpf_map_lookup_elem(&global_map
, &key
);
100 g
.total_retrans
= skops
->total_retrans
;
101 g
.data_segs_in
= skops
->data_segs_in
;
102 g
.data_segs_out
= skops
->data_segs_out
;
103 g
.bytes_received
= skops
->bytes_received
;
104 g
.bytes_acked
= skops
->bytes_acked
;
105 bpf_map_update_elem(&global_map
, &key
, &g
,
115 char _license
[] SEC("license") = "GPL";