xref: /linux/tools/testing/selftests/bpf/progs/mptcp_sockmap.c (revision cbba5d1b53fb82209feacb459edecb1ef8427119)
1*cb730e4aSJiayuan Chen // SPDX-License-Identifier: GPL-2.0
2*cb730e4aSJiayuan Chen 
3*cb730e4aSJiayuan Chen #include "bpf_tracing_net.h"
4*cb730e4aSJiayuan Chen 
5*cb730e4aSJiayuan Chen char _license[] SEC("license") = "GPL";
6*cb730e4aSJiayuan Chen 
7*cb730e4aSJiayuan Chen int sk_index;
8*cb730e4aSJiayuan Chen int redirect_idx;
9*cb730e4aSJiayuan Chen int trace_port;
10*cb730e4aSJiayuan Chen int helper_ret;
11*cb730e4aSJiayuan Chen struct {
12*cb730e4aSJiayuan Chen 	__uint(type, BPF_MAP_TYPE_SOCKMAP);
13*cb730e4aSJiayuan Chen 	__uint(key_size, sizeof(__u32));
14*cb730e4aSJiayuan Chen 	__uint(value_size, sizeof(__u32));
15*cb730e4aSJiayuan Chen 	__uint(max_entries, 100);
16*cb730e4aSJiayuan Chen } sock_map SEC(".maps");
17*cb730e4aSJiayuan Chen 
18*cb730e4aSJiayuan Chen SEC("sockops")
mptcp_sockmap_inject(struct bpf_sock_ops * skops)19*cb730e4aSJiayuan Chen int mptcp_sockmap_inject(struct bpf_sock_ops *skops)
20*cb730e4aSJiayuan Chen {
21*cb730e4aSJiayuan Chen 	struct bpf_sock *sk;
22*cb730e4aSJiayuan Chen 
23*cb730e4aSJiayuan Chen 	/* only accept specified connection */
24*cb730e4aSJiayuan Chen 	if (skops->local_port != trace_port ||
25*cb730e4aSJiayuan Chen 	    skops->op != BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB)
26*cb730e4aSJiayuan Chen 		return 1;
27*cb730e4aSJiayuan Chen 
28*cb730e4aSJiayuan Chen 	sk = skops->sk;
29*cb730e4aSJiayuan Chen 	if (!sk)
30*cb730e4aSJiayuan Chen 		return 1;
31*cb730e4aSJiayuan Chen 
32*cb730e4aSJiayuan Chen 	/* update sk handler */
33*cb730e4aSJiayuan Chen 	helper_ret = bpf_sock_map_update(skops, &sock_map, &sk_index, BPF_NOEXIST);
34*cb730e4aSJiayuan Chen 
35*cb730e4aSJiayuan Chen 	return 1;
36*cb730e4aSJiayuan Chen }
37*cb730e4aSJiayuan Chen 
38*cb730e4aSJiayuan Chen SEC("sk_skb/stream_verdict")
mptcp_sockmap_redirect(struct __sk_buff * skb)39*cb730e4aSJiayuan Chen int mptcp_sockmap_redirect(struct __sk_buff *skb)
40*cb730e4aSJiayuan Chen {
41*cb730e4aSJiayuan Chen 	/* redirect skb to the sk under sock_map[redirect_idx] */
42*cb730e4aSJiayuan Chen 	return bpf_sk_redirect_map(skb, &sock_map, redirect_idx, 0);
43*cb730e4aSJiayuan Chen }
44