@@ -5688,6 +5688,30 @@ const struct bpf_func_proto bpf_sk_getsockopt_proto = {
56885688 .arg5_type = ARG_CONST_SIZE ,
56895689};
56905690
5691+ BPF_CALL_5 (bpf_sk_setsockopt_nodelay , struct sock * , sk , int , level ,
5692+ int , optname , char * , optval , int , optlen )
5693+ {
5694+ /*
5695+ * TCP_NODELAY triggers tcp_push_pending_frames() and re-enters
5696+ * CA_EVENT_TX_START in bpf_tcp_cc.
5697+ */
5698+ if (level == SOL_TCP && optname == TCP_NODELAY )
5699+ return - EOPNOTSUPP ;
5700+
5701+ return _bpf_setsockopt (sk , level , optname , optval , optlen );
5702+ }
5703+
5704+ const struct bpf_func_proto bpf_sk_setsockopt_nodelay_proto = {
5705+ .func = bpf_sk_setsockopt_nodelay ,
5706+ .gpl_only = false,
5707+ .ret_type = RET_INTEGER ,
5708+ .arg1_type = ARG_PTR_TO_BTF_ID_SOCK_COMMON ,
5709+ .arg2_type = ARG_ANYTHING ,
5710+ .arg3_type = ARG_ANYTHING ,
5711+ .arg4_type = ARG_PTR_TO_MEM | MEM_RDONLY ,
5712+ .arg5_type = ARG_CONST_SIZE ,
5713+ };
5714+
56915715BPF_CALL_5 (bpf_unlocked_sk_setsockopt , struct sock * , sk , int , level ,
56925716 int , optname , char * , optval , int , optlen )
56935717{
@@ -5833,6 +5857,12 @@ BPF_CALL_5(bpf_sock_ops_setsockopt, struct bpf_sock_ops_kern *, bpf_sock,
58335857 if (!is_locked_tcp_sock_ops (bpf_sock ))
58345858 return - EOPNOTSUPP ;
58355859
5860+ /* TCP_NODELAY triggers tcp_push_pending_frames() and re-enters these callbacks. */
5861+ if ((bpf_sock -> op == BPF_SOCK_OPS_HDR_OPT_LEN_CB ||
5862+ bpf_sock -> op == BPF_SOCK_OPS_WRITE_HDR_OPT_CB ) &&
5863+ level == SOL_TCP && optname == TCP_NODELAY )
5864+ return - EOPNOTSUPP ;
5865+
58365866 return _bpf_setsockopt (bpf_sock -> sk , level , optname , optval , optlen );
58375867}
58385868
0 commit comments