aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/input.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@mandriva.com>2005-08-24 00:50:06 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2005-08-29 19:04:31 -0400
commit7ad07e7cf343181002c10c39d3f57a88e4903d4f (patch)
treec22067f3f443faebdcd3403fa8ce7c5c89662c60 /net/dccp/input.c
parent58e45131dc269eff0983c6d44494f9e687686900 (diff)
[DCCP]: Implement the CLOSING timer
So that we retransmit CLOSE/CLOSEREQ packets till they elicit an answer or we hit a timeout. Most of the machinery uses TCP approaches, this code has to be polished & audited, but this is better than we had before. Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dccp/input.c')
-rw-r--r--net/dccp/input.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/net/dccp/input.c b/net/dccp/input.c
index 85402532e4e9..02af05ec23a2 100644
--- a/net/dccp/input.c
+++ b/net/dccp/input.c
@@ -31,14 +31,9 @@ static void dccp_fin(struct sock *sk, struct sk_buff *skb)
31 31
32static void dccp_rcv_close(struct sock *sk, struct sk_buff *skb) 32static void dccp_rcv_close(struct sock *sk, struct sk_buff *skb)
33{ 33{
34 switch (sk->sk_state) { 34 dccp_v4_send_reset(sk, DCCP_RESET_CODE_CLOSED);
35 case DCCP_PARTOPEN: 35 dccp_fin(sk, skb);
36 case DCCP_OPEN: 36 dccp_set_state(sk, DCCP_CLOSED);
37 dccp_v4_send_reset(sk, DCCP_RESET_CODE_CLOSED);
38 dccp_fin(sk, skb);
39 dccp_set_state(sk, DCCP_CLOSED);
40 break;
41 }
42} 37}
43 38
44static void dccp_rcv_closereq(struct sock *sk, struct sk_buff *skb) 39static void dccp_rcv_closereq(struct sock *sk, struct sk_buff *skb)
@@ -54,13 +49,8 @@ static void dccp_rcv_closereq(struct sock *sk, struct sk_buff *skb)
54 return; 49 return;
55 } 50 }
56 51
57 switch (sk->sk_state) { 52 dccp_set_state(sk, DCCP_CLOSING);
58 case DCCP_PARTOPEN: 53 dccp_send_close(sk, 0);
59 case DCCP_OPEN:
60 dccp_set_state(sk, DCCP_CLOSING);
61 dccp_send_close(sk);
62 break;
63 }
64} 54}
65 55
66static inline void dccp_event_ack_recv(struct sock *sk, struct sk_buff *skb) 56static inline void dccp_event_ack_recv(struct sock *sk, struct sk_buff *skb)
@@ -562,6 +552,12 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
562 dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq, 552 dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq,
563 DCCP_PKT_SYNC); 553 DCCP_PKT_SYNC);
564 goto discard; 554 goto discard;
555 } else if (dh->dccph_type == DCCP_PKT_CLOSEREQ) {
556 dccp_rcv_closereq(sk, skb);
557 goto discard;
558 } else if (dh->dccph_type == DCCP_PKT_CLOSE) {
559 dccp_rcv_close(sk, skb);
560 return 0;
565 } 561 }
566 562
567 switch (sk->sk_state) { 563 switch (sk->sk_state) {