diff options
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 72046b9729a8..42b709c95cf3 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -2196,6 +2196,7 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, | |||
| 2196 | unsigned int optlen) | 2196 | unsigned int optlen) |
| 2197 | { | 2197 | { |
| 2198 | struct sctp_sock *sp = sctp_sk(sk); | 2198 | struct sctp_sock *sp = sctp_sk(sk); |
| 2199 | struct net *net = sock_net(sk); | ||
| 2199 | 2200 | ||
| 2200 | /* Applicable to UDP-style socket only */ | 2201 | /* Applicable to UDP-style socket only */ |
| 2201 | if (sctp_style(sk, TCP)) | 2202 | if (sctp_style(sk, TCP)) |
| @@ -2205,6 +2206,9 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, | |||
| 2205 | if (copy_from_user(&sp->autoclose, optval, optlen)) | 2206 | if (copy_from_user(&sp->autoclose, optval, optlen)) |
| 2206 | return -EFAULT; | 2207 | return -EFAULT; |
| 2207 | 2208 | ||
| 2209 | if (sp->autoclose > net->sctp.max_autoclose) | ||
| 2210 | sp->autoclose = net->sctp.max_autoclose; | ||
| 2211 | |||
| 2208 | return 0; | 2212 | return 0; |
| 2209 | } | 2213 | } |
| 2210 | 2214 | ||
| @@ -2811,6 +2815,8 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne | |||
| 2811 | { | 2815 | { |
| 2812 | struct sctp_rtoinfo rtoinfo; | 2816 | struct sctp_rtoinfo rtoinfo; |
| 2813 | struct sctp_association *asoc; | 2817 | struct sctp_association *asoc; |
| 2818 | unsigned long rto_min, rto_max; | ||
| 2819 | struct sctp_sock *sp = sctp_sk(sk); | ||
| 2814 | 2820 | ||
| 2815 | if (optlen != sizeof (struct sctp_rtoinfo)) | 2821 | if (optlen != sizeof (struct sctp_rtoinfo)) |
| 2816 | return -EINVAL; | 2822 | return -EINVAL; |
| @@ -2824,26 +2830,36 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne | |||
| 2824 | if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) | 2830 | if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) |
| 2825 | return -EINVAL; | 2831 | return -EINVAL; |
| 2826 | 2832 | ||
| 2833 | rto_max = rtoinfo.srto_max; | ||
| 2834 | rto_min = rtoinfo.srto_min; | ||
| 2835 | |||
| 2836 | if (rto_max) | ||
| 2837 | rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; | ||
| 2838 | else | ||
| 2839 | rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max; | ||
| 2840 | |||
| 2841 | if (rto_min) | ||
| 2842 | rto_min = asoc ? msecs_to_jiffies(rto_min) : rto_min; | ||
| 2843 | else | ||
| 2844 | rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min; | ||
| 2845 | |||
| 2846 | if (rto_min > rto_max) | ||
| 2847 | return -EINVAL; | ||
| 2848 | |||
| 2827 | if (asoc) { | 2849 | if (asoc) { |
| 2828 | if (rtoinfo.srto_initial != 0) | 2850 | if (rtoinfo.srto_initial != 0) |
| 2829 | asoc->rto_initial = | 2851 | asoc->rto_initial = |
| 2830 | msecs_to_jiffies(rtoinfo.srto_initial); | 2852 | msecs_to_jiffies(rtoinfo.srto_initial); |
| 2831 | if (rtoinfo.srto_max != 0) | 2853 | asoc->rto_max = rto_max; |
| 2832 | asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max); | 2854 | asoc->rto_min = rto_min; |
| 2833 | if (rtoinfo.srto_min != 0) | ||
| 2834 | asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min); | ||
| 2835 | } else { | 2855 | } else { |
| 2836 | /* If there is no association or the association-id = 0 | 2856 | /* If there is no association or the association-id = 0 |
| 2837 | * set the values to the endpoint. | 2857 | * set the values to the endpoint. |
| 2838 | */ | 2858 | */ |
| 2839 | struct sctp_sock *sp = sctp_sk(sk); | ||
| 2840 | |||
| 2841 | if (rtoinfo.srto_initial != 0) | 2859 | if (rtoinfo.srto_initial != 0) |
| 2842 | sp->rtoinfo.srto_initial = rtoinfo.srto_initial; | 2860 | sp->rtoinfo.srto_initial = rtoinfo.srto_initial; |
| 2843 | if (rtoinfo.srto_max != 0) | 2861 | sp->rtoinfo.srto_max = rto_max; |
| 2844 | sp->rtoinfo.srto_max = rtoinfo.srto_max; | 2862 | sp->rtoinfo.srto_min = rto_min; |
| 2845 | if (rtoinfo.srto_min != 0) | ||
| 2846 | sp->rtoinfo.srto_min = rtoinfo.srto_min; | ||
| 2847 | } | 2863 | } |
| 2848 | 2864 | ||
| 2849 | return 0; | 2865 | return 0; |
