点击(此处)折叠或打开
- struct inet_frag_queue *inet_frag_find(struct inet_frags *f, void *key,
- unsigned int hash)
- {
- struct inet_frag_queue *q;
- struct hlist_node *n;
- /* f->lock是读写锁,先搜索是否存在该IP分段所属的队列 */
- read_lock(&f->lock);
- hlist_for_each_entry(q, n, &f->hash[hash], list) { /* 扫描该HASH槽中所有节点 */
- /* f->match中match字段在ipfrag_init中初始化为ip4_frag_match函数。*/
- /* 对比分片队列中的散列字段和user是否和key相等,key指向的是struct ip4_create_arg
- * 结构,包含IP头部和user字段。 */
- if (f->match(q, key)) {
- atomic_inc(&q->refcnt); /* 若找到,则增加该队列引用计数。 */
- read_unlock(&f->lock);
- return q; /* 返回该队列 */
- }
- }
- read_unlock(&f->lock);
- /* 该分片是第一个IP分片,创建一个新的分片队列并添加到合适的HASH队列 */
- return inet_frag_create(f, key, hash);
- }