@@ -3758,6 +3758,39 @@ static int sctp_setsockopt_default_prinfo(struct sock *sk,
37583758 return retval ;
37593759}
37603760
3761+ static int sctp_setsockopt_reconfig_supported (struct sock * sk ,
3762+ char __user * optval ,
3763+ unsigned int optlen )
3764+ {
3765+ struct sctp_assoc_value params ;
3766+ struct sctp_association * asoc ;
3767+ int retval = - EINVAL ;
3768+
3769+ if (optlen != sizeof (params ))
3770+ goto out ;
3771+
3772+ if (copy_from_user (& params , optval , optlen )) {
3773+ retval = - EFAULT ;
3774+ goto out ;
3775+ }
3776+
3777+ asoc = sctp_id2assoc (sk , params .assoc_id );
3778+ if (asoc ) {
3779+ asoc -> reconf_enable = !!params .assoc_value ;
3780+ } else if (!params .assoc_id ) {
3781+ struct sctp_sock * sp = sctp_sk (sk );
3782+
3783+ sp -> ep -> reconf_enable = !!params .assoc_value ;
3784+ } else {
3785+ goto out ;
3786+ }
3787+
3788+ retval = 0 ;
3789+
3790+ out :
3791+ return retval ;
3792+ }
3793+
37613794static int sctp_setsockopt_enable_strreset (struct sock * sk ,
37623795 char __user * optval ,
37633796 unsigned int optlen )
@@ -4038,6 +4071,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname,
40384071 case SCTP_DEFAULT_PRINFO :
40394072 retval = sctp_setsockopt_default_prinfo (sk , optval , optlen );
40404073 break ;
4074+ case SCTP_RECONFIG_SUPPORTED :
4075+ retval = sctp_setsockopt_reconfig_supported (sk , optval , optlen );
4076+ break ;
40414077 case SCTP_ENABLE_STREAM_RESET :
40424078 retval = sctp_setsockopt_enable_strreset (sk , optval , optlen );
40434079 break ;
@@ -6540,6 +6576,47 @@ static int sctp_getsockopt_pr_assocstatus(struct sock *sk, int len,
65406576 return retval ;
65416577}
65426578
6579+ static int sctp_getsockopt_reconfig_supported (struct sock * sk , int len ,
6580+ char __user * optval ,
6581+ int __user * optlen )
6582+ {
6583+ struct sctp_assoc_value params ;
6584+ struct sctp_association * asoc ;
6585+ int retval = - EFAULT ;
6586+
6587+ if (len < sizeof (params )) {
6588+ retval = - EINVAL ;
6589+ goto out ;
6590+ }
6591+
6592+ len = sizeof (params );
6593+ if (copy_from_user (& params , optval , len ))
6594+ goto out ;
6595+
6596+ asoc = sctp_id2assoc (sk , params .assoc_id );
6597+ if (asoc ) {
6598+ params .assoc_value = asoc -> reconf_enable ;
6599+ } else if (!params .assoc_id ) {
6600+ struct sctp_sock * sp = sctp_sk (sk );
6601+
6602+ params .assoc_value = sp -> ep -> reconf_enable ;
6603+ } else {
6604+ retval = - EINVAL ;
6605+ goto out ;
6606+ }
6607+
6608+ if (put_user (len , optlen ))
6609+ goto out ;
6610+
6611+ if (copy_to_user (optval , & params , len ))
6612+ goto out ;
6613+
6614+ retval = 0 ;
6615+
6616+ out :
6617+ return retval ;
6618+ }
6619+
65436620static int sctp_getsockopt_enable_strreset (struct sock * sk , int len ,
65446621 char __user * optval ,
65456622 int __user * optlen )
@@ -6748,6 +6825,10 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname,
67486825 retval = sctp_getsockopt_pr_assocstatus (sk , len , optval ,
67496826 optlen );
67506827 break ;
6828+ case SCTP_RECONFIG_SUPPORTED :
6829+ retval = sctp_getsockopt_reconfig_supported (sk , len , optval ,
6830+ optlen );
6831+ break ;
67516832 case SCTP_ENABLE_STREAM_RESET :
67526833 retval = sctp_getsockopt_enable_strreset (sk , len , optval ,
67536834 optlen );
0 commit comments