aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/proto.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp/proto.c')
-rw-r--r--net/dccp/proto.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 8a73c8f98d76..cc87c500bfb8 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -551,6 +551,12 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
551 (struct dccp_so_feat __user *) 551 (struct dccp_so_feat __user *)
552 optval); 552 optval);
553 break; 553 break;
554 case DCCP_SOCKOPT_SERVER_TIMEWAIT:
555 if (dp->dccps_role != DCCP_ROLE_SERVER)
556 err = -EOPNOTSUPP;
557 else
558 dp->dccps_server_timewait = (val != 0);
559 break;
554 case DCCP_SOCKOPT_SEND_CSCOV: /* sender side, RFC 4340, sec. 9.2 */ 560 case DCCP_SOCKOPT_SEND_CSCOV: /* sender side, RFC 4340, sec. 9.2 */
555 if (val < 0 || val > 15) 561 if (val < 0 || val > 15)
556 err = -EINVAL; 562 err = -EINVAL;
@@ -653,6 +659,10 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname,
653 val = dp->dccps_mss_cache; 659 val = dp->dccps_mss_cache;
654 len = sizeof(val); 660 len = sizeof(val);
655 break; 661 break;
662 case DCCP_SOCKOPT_SERVER_TIMEWAIT:
663 val = dp->dccps_server_timewait;
664 len = sizeof(val);
665 break;
656 case DCCP_SOCKOPT_SEND_CSCOV: 666 case DCCP_SOCKOPT_SEND_CSCOV:
657 val = dp->dccps_pcslen; 667 val = dp->dccps_pcslen;
658 len = sizeof(val); 668 len = sizeof(val);
@@ -918,7 +928,8 @@ static void dccp_terminate_connection(struct sock *sk)
918 case DCCP_OPEN: 928 case DCCP_OPEN:
919 dccp_send_close(sk, 1); 929 dccp_send_close(sk, 1);
920 930
921 if (dccp_sk(sk)->dccps_role == DCCP_ROLE_SERVER) 931 if (dccp_sk(sk)->dccps_role == DCCP_ROLE_SERVER &&
932 !dccp_sk(sk)->dccps_server_timewait)
922 next_state = DCCP_ACTIVE_CLOSEREQ; 933 next_state = DCCP_ACTIVE_CLOSEREQ;
923 else 934 else
924 next_state = DCCP_CLOSING; 935 next_state = DCCP_CLOSING;