.tw_timer = TIMER_INITIALIZER(inet_twdr_hangman, 0,
(unsigned long)&tcp_death_row),
.twkill_work = __WORK_INITIALIZER(tcp_death_row.twkill_work,
- inet_twdr_twkill_work,
- &tcp_death_row),
+ inet_twdr_twkill_work),
/* Short-time timewait calendar */
.twcal_hand = -1,
return (seq == e_win && seq == end_seq);
}
-/*
+/*
* * Main purpose of TIME-WAIT state is to close connection gracefully,
* when one of ends sits in LAST-ACK or CLOSING retransmitting FIN
* (and, probably, tail of data) and one or more our ACKs are lost.
* "When a connection is [...] on TIME-WAIT state [...]
* [a TCP] MAY accept a new SYN from the remote TCP to
* reopen the connection directly, if it:
- *
+ *
* (1) assigns its initial sequence number for the new
* connection to be larger than the largest sequence
* number it used on the previous connection incarnation,
* and
*
- * (2) returns to TIME-WAIT state if the SYN turns out
+ * (2) returns to TIME-WAIT state if the SYN turns out
* to be an old duplicate".
*/
return TCP_TW_SUCCESS;
}
-/*
+/*
* Move a socket to time-wait or dead fin-wait-2 state.
- */
+ */
void tcp_time_wait(struct sock *sk, int state, int timeo)
{
struct inet_timewait_sock *tw = NULL;
* socket up. We've got bigger problems than
* non-graceful socket closings.
*/
- if (net_ratelimit())
- printk(KERN_INFO "TCP: time wait bucket table overflow\n");
+ LIMIT_NETDEBUG(KERN_INFO "TCP: time wait bucket table overflow\n");
}
tcp_update_metrics(sk);
return newsk;
}
-/*
+/*
* Process an incoming packet for SYN_RECV sockets represented
* as a request_sock.
*/
* newsk structure. If we fail to get memory then we
* end up not copying the key across. Shucks.
*/
- char *newkey = kmalloc(key->keylen, GFP_ATOMIC);
+ char *newkey = kmemdup(key->key, key->keylen,
+ GFP_ATOMIC);
if (newkey) {
if (!tcp_alloc_md5sig_pool())
BUG();
- memcpy(newkey, key->key, key->keylen);
tp->af_specific->md5_add(child, child,
newkey,
key->keylen);