h); spinlock_t *lock = inet_ehash_lockp(hinfo, hash); struct sock *sk2; const struct hlist_nulls_node *node; struct inet_timewait_sock *tw;
spin_lock(lock);
/* Check TIME-WAIT sockets first. */ sk_nulls_for_each(sk2, node, &head->twchain) { tw = inet_twsk(sk2);
if (INET_TW_MATCH(sk2, net, hash, acookie, saddr, daddr, ports, dif)) { if (twsk_unique(sk, sk2, twp)) goto unique; else goto not_unique; } } tw = NULL;
/* And established part... */ sk_nulls_for_each(sk2, node, &head->chain) { if (INET_MATCH(sk2, net, hash, acookie, saddr, daddr, ports, dif)) goto not_unique; }
unique: ...... return 0;
not_unique: spin_unlock(lock); return -EADDRNOTAVAIL; } 可以看到返回EADDRNOTVAIL错误的有两种情况: 1、在TIME_WAIT传输控制块中找到匹配的端口,并且twsk_unique()返回true时 2、在除TIME_WAIT和LISTEN状态外的传输块中存在匹配的端口。论文网 第二种情况很好容易理解了,只要状态在FIN_WAIT_1、ESTABLISHED等的传输控制块使用的端口和要查找的匹配,就会返回EADDRNOTVAIL错误。第一种情况还要取决于twsk_uniqueue()的返回值,所以接下来我们看twsk_uniqueue()中什么情况下会返回true。 如果是TCP套接字,twsk_uniqueue()中会调用tcp_twsk_uniqueue()来判断,返回true的条件如下所示:
[cpp] view plaincopyprint? 01.int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp) 02.{ 03. const struct tcp_timewait_sock *tcptw = tcp_twsk(sktw); 04. struct tcp_sock *tp = tcp_sk(sk); 05. 06. 07. if (tcptw->tw_ts_recent_stamp && 08. (twp == NULL || (sysctl_tcp_tw_reuse && 09. get_seconds() - tcptw->tw_ts_recent_stamp > 1))) { 10. << 上一页 [11] [12] [13] [14] [15] 下一页
|