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") 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") 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