WEB开发网
开发学院软件开发Java tcp connection setup的实现(一) 阅读

tcp connection setup的实现(一)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 最后我们来看下reqsk_queue_alloc的实现: Java代码 ///半开连接的最大长度.intsysctl_max_syn_backlog=256;intreqsk_queue_alloc(structrequest_sock_queue*queue,unsignedintnr_tab

最后我们来看下reqsk_queue_alloc的实现:

Java代码 ///半开连接的最大长度. 
int sysctl_max_syn_backlog = 256; 
 
int reqsk_queue_alloc(struct request_sock_queue *queue, 
    unsigned int nr_table_entries) 
{ 
 size_t lopt_size = sizeof(struct listen_sock); 
 struct listen_sock *lopt; 
///在当前的nr_table_entries(也就是listen传进来的backlog)和sysctl_max_syn_backlog取一个较小的值. 
 nr_table_entries = min_t(u32, nr_table_entries, sysctl_max_syn_backlog); 
 
///也就是说nr_table_entries不能小于8. 
 nr_table_entries = max_t(u32, nr_table_entries, 8); 
 
///其实也就是使nr_table_entries更接近于2的次幂 
 nr_table_entries = roundup_pow_of_two(nr_table_entries + 1); 
///最终所要分配的listen_sock 的大小. 
 lopt_size += nr_table_entries * sizeof(struct request_sock *); 
 if (lopt_size > PAGE_SIZE) 
 lopt = __vmalloc(lopt_size, 
  GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, 
  PAGE_KERNEL); 
 else 
 lopt = kzalloc(lopt_size, GFP_KERNEL); 
 if (lopt == NULL) 
 return -ENOMEM; 
///计算max_qlen_log的值,他最小要为3,最大为对nr_table_entries求以2为低的log.. 
 for (lopt->max_qlen_log = 3; 
   (1 << lopt->max_qlen_log) < nr_table_entries; 
   lopt->max_qlen_log++); 
 
 get_random_bytes(&lopt->hash_rnd, sizeof(lopt->hash_rnd)); 
 rwlock_init(&queue->syn_wait_lock); 
 queue->rskq_accept_head = NULL; 
///给nr_table_entries赋值. 
 lopt->nr_table_entries = nr_table_entries; 
 
 write_lock_bh(&queue->syn_wait_lock); 
///将listen_socket赋值给queue->listen_opt 
 queue->listen_opt = lopt; 
 write_unlock_bh(&queue->syn_wait_lock); 
 
 return 0; 
}

上一页  4 5 6 7 8 9 

Tags:tcp connection setup

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接