diff options
Diffstat (limited to 'net/dccp/proto.c')
-rw-r--r-- | net/dccp/proto.c | 13 |
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; |