// SPDX-License-Identifier: GPL-2.0 #include "bpf_tracing_net.h" char _license[] SEC("license") = "GPL"; int sk_index; int redirect_idx; int trace_port; int helper_ret; struct { __uint(type, BPF_MAP_TYPE_SOCKMAP); __uint(key_size, sizeof(__u32)); __uint(value_size, sizeof(__u32)); __uint(max_entries, 100); } sock_map SEC(".maps"); SEC("sockops") int mptcp_sockmap_inject(struct bpf_sock_ops *skops) { struct bpf_sock *sk; /* only accept specified connection */ if (skops->local_port != trace_port || skops->op != BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB) return 1; sk = skops->sk; if (!sk) return 1; /* update sk handler */ helper_ret = bpf_sock_map_update(skops, &sock_map, &sk_index, BPF_NOEXIST); return 1; } SEC("sk_skb/stream_verdict") int mptcp_sockmap_redirect(struct __sk_buff *skb) { /* redirect skb to the sk under sock_map[redirect_idx] */ return bpf_sk_redirect_map(skb, &sock_map, redirect_idx, 0); }