return (tcp_call_bpf(sk, BPF_SOCK_OPS_NEEDS_ECN, 0, NULL) == 1);
 }
 
+static inline void tcp_bpf_rtt(struct sock *sk)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+
+       if (BPF_SOCK_OPS_TEST_FLAG(tp, BPF_SOCK_OPS_RTT_CB_FLAG))
+               tcp_call_bpf(sk, BPF_SOCK_OPS_RTT_CB, 0, NULL);
+}
+
 #if IS_ENABLED(CONFIG_SMC)
 extern struct static_key_false tcp_have_smc;
 #endif
 
  *             * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out)
  *             * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission)
  *             * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change)
+ *             * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT)
  *
  *             Therefore, this function can be used to clear a callback flag by
  *             setting the appropriate bit to zero. e.g. to disable the RTO
 #define BPF_SOCK_OPS_RTO_CB_FLAG       (1<<0)
 #define BPF_SOCK_OPS_RETRANS_CB_FLAG   (1<<1)
 #define BPF_SOCK_OPS_STATE_CB_FLAG     (1<<2)
-#define BPF_SOCK_OPS_ALL_CB_FLAGS       0x7            /* Mask of all currently
+#define BPF_SOCK_OPS_RTT_CB_FLAG       (1<<3)
+#define BPF_SOCK_OPS_ALL_CB_FLAGS       0xF            /* Mask of all currently
                                                         * supported cb flags
                                                         */
 
        BPF_SOCK_OPS_TCP_LISTEN_CB,     /* Called on listen(2), right after
                                         * socket transition to LISTEN state.
                                         */
+       BPF_SOCK_OPS_RTT_CB,            /* Called on every RTT.
+                                        */
 };
 
 /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
 
                                tp->rttvar_us -= (tp->rttvar_us - tp->mdev_max_us) >> 2;
                        tp->rtt_seq = tp->snd_nxt;
                        tp->mdev_max_us = tcp_rto_min_us(sk);
+
+                       tcp_bpf_rtt(sk);
                }
        } else {
                /* no previous measure. */
                tp->rttvar_us = max(tp->mdev_us, tcp_rto_min_us(sk));
                tp->mdev_max_us = tp->rttvar_us;
                tp->rtt_seq = tp->snd_nxt;
+
+               tcp_bpf_rtt(sk);
        }
        tp->srtt_us = max(1U, srtt);
 }