equal
deleted
inserted
replaced
84 * The DCCP retransmit timer. |
84 * The DCCP retransmit timer. |
85 */ |
85 */ |
86 static void dccp_retransmit_timer(struct sock *sk) |
86 static void dccp_retransmit_timer(struct sock *sk) |
87 { |
87 { |
88 struct inet_connection_sock *icsk = inet_csk(sk); |
88 struct inet_connection_sock *icsk = inet_csk(sk); |
89 |
|
90 /* retransmit timer is used for feature negotiation throughout |
|
91 * connection. In this case, no packet is re-transmitted, but rather an |
|
92 * ack is generated and pending changes are placed into its options. |
|
93 */ |
|
94 if (sk->sk_send_head == NULL) { |
|
95 dccp_pr_debug("feat negotiation retransmit timeout %p\n", sk); |
|
96 if (sk->sk_state == DCCP_OPEN) |
|
97 dccp_send_ack(sk); |
|
98 goto backoff; |
|
99 } |
|
100 |
89 |
101 /* |
90 /* |
102 * More than than 4MSL (8 minutes) has passed, a RESET(aborted) was |
91 * More than than 4MSL (8 minutes) has passed, a RESET(aborted) was |
103 * sent, no need to retransmit, this sock is dead. |
92 * sent, no need to retransmit, this sock is dead. |
104 */ |
93 */ |
124 TCP_RESOURCE_PROBE_INTERVAL), |
113 TCP_RESOURCE_PROBE_INTERVAL), |
125 DCCP_RTO_MAX); |
114 DCCP_RTO_MAX); |
126 return; |
115 return; |
127 } |
116 } |
128 |
117 |
129 backoff: |
|
130 icsk->icsk_backoff++; |
118 icsk->icsk_backoff++; |
131 |
119 |
132 icsk->icsk_rto = min(icsk->icsk_rto << 1, DCCP_RTO_MAX); |
120 icsk->icsk_rto = min(icsk->icsk_rto << 1, DCCP_RTO_MAX); |
133 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, |
121 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, |
134 DCCP_RTO_MAX); |
122 DCCP_RTO_MAX); |