@@ -624,18 +624,11 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct mptcp_sock *msk, sockptr_t
624
624
return ret ;
625
625
}
626
626
627
- static int mptcp_setsockopt_sol_tcp_cork (struct mptcp_sock * msk , sockptr_t optval ,
628
- unsigned int optlen )
627
+ static int __mptcp_setsockopt_sol_tcp_cork (struct mptcp_sock * msk , int val )
629
628
{
630
629
struct mptcp_subflow_context * subflow ;
631
630
struct sock * sk = (struct sock * )msk ;
632
- int val , ret ;
633
631
634
- ret = mptcp_get_int_option (msk , optval , optlen , & val );
635
- if (ret )
636
- return ret ;
637
-
638
- lock_sock (sk );
639
632
sockopt_seq_inc (msk );
640
633
msk -> cork = !!val ;
641
634
mptcp_for_each_subflow (msk , subflow ) {
@@ -647,23 +640,15 @@ static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t optva
647
640
}
648
641
if (!val )
649
642
mptcp_check_and_set_pending (sk );
650
- release_sock (sk );
651
643
652
644
return 0 ;
653
645
}
654
646
655
- static int mptcp_setsockopt_sol_tcp_nodelay (struct mptcp_sock * msk , sockptr_t optval ,
656
- unsigned int optlen )
647
+ static int __mptcp_setsockopt_sol_tcp_nodelay (struct mptcp_sock * msk , int val )
657
648
{
658
649
struct mptcp_subflow_context * subflow ;
659
650
struct sock * sk = (struct sock * )msk ;
660
- int val , ret ;
661
651
662
- ret = mptcp_get_int_option (msk , optval , optlen , & val );
663
- if (ret )
664
- return ret ;
665
-
666
- lock_sock (sk );
667
652
sockopt_seq_inc (msk );
668
653
msk -> nodelay = !!val ;
669
654
mptcp_for_each_subflow (msk , subflow ) {
@@ -675,8 +660,6 @@ static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t op
675
660
}
676
661
if (val )
677
662
mptcp_check_and_set_pending (sk );
678
- release_sock (sk );
679
-
680
663
return 0 ;
681
664
}
682
665
@@ -799,35 +782,10 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
799
782
int ret , val ;
800
783
801
784
switch (optname ) {
802
- case TCP_INQ :
803
- ret = mptcp_get_int_option (msk , optval , optlen , & val );
804
- if (ret )
805
- return ret ;
806
- if (val < 0 || val > 1 )
807
- return - EINVAL ;
808
-
809
- lock_sock (sk );
810
- msk -> recvmsg_inq = !!val ;
811
- release_sock (sk );
812
- return 0 ;
813
785
case TCP_ULP :
814
786
return - EOPNOTSUPP ;
815
- case TCP_NOTSENT_LOWAT :
816
- ret = mptcp_get_int_option (msk , optval , optlen , & val );
817
- if (ret )
818
- return ret ;
819
-
820
- lock_sock (sk );
821
- WRITE_ONCE (msk -> notsent_lowat , val );
822
- mptcp_write_space (sk );
823
- release_sock (sk );
824
- return 0 ;
825
787
case TCP_CONGESTION :
826
788
return mptcp_setsockopt_sol_tcp_congestion (msk , optval , optlen );
827
- case TCP_CORK :
828
- return mptcp_setsockopt_sol_tcp_cork (msk , optval , optlen );
829
- case TCP_NODELAY :
830
- return mptcp_setsockopt_sol_tcp_nodelay (msk , optval , optlen );
831
789
case TCP_DEFER_ACCEPT :
832
790
/* See tcp.c: TCP_DEFER_ACCEPT does not fail */
833
791
mptcp_setsockopt_first_sf_only (msk , SOL_TCP , optname , optval , optlen );
@@ -840,7 +798,34 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
840
798
optval , optlen );
841
799
}
842
800
843
- return - EOPNOTSUPP ;
801
+ ret = mptcp_get_int_option (msk , optval , optlen , & val );
802
+ if (ret )
803
+ return ret ;
804
+
805
+ lock_sock (sk );
806
+ switch (optname ) {
807
+ case TCP_INQ :
808
+ if (val < 0 || val > 1 )
809
+ ret = - EINVAL ;
810
+ else
811
+ msk -> recvmsg_inq = !!val ;
812
+ break ;
813
+ case TCP_NOTSENT_LOWAT :
814
+ WRITE_ONCE (msk -> notsent_lowat , val );
815
+ mptcp_write_space (sk );
816
+ break ;
817
+ case TCP_CORK :
818
+ ret = __mptcp_setsockopt_sol_tcp_cork (msk , val );
819
+ break ;
820
+ case TCP_NODELAY :
821
+ ret = __mptcp_setsockopt_sol_tcp_nodelay (msk , val );
822
+ break ;
823
+ default :
824
+ ret = - ENOPROTOOPT ;
825
+ }
826
+
827
+ release_sock (sk );
828
+ return ret ;
844
829
}
845
830
846
831
int mptcp_setsockopt (struct sock * sk , int level , int optname ,
0 commit comments