//為分片確定正確的ipq結構
// 定位5元組
// 1.id;
__u32 saddr = iph->saddr;
__u32 daddr = iph->daddr;
__u8 protocol = iph->protocol;
//對4元組進行hash
unsigned int hash = ipqhashfn(id, saddr, daddr, protocol);
struct ipq *qp;
read_lock(&ipfrag_lock);
//選擇正確的bucket
for(qp = ipq_hash[hash]; qp; qp = qp->next)
} read_unlock(&ipfrag_lock);
//該4元組的第乙個分片,建立新的ipq
return ip_frag_create(hash, iph, user);
}//呼叫路徑:ip_find->ip_frag_create
// 新ip分片到達時,根據4元組建立乙個ipq
1.2 static struct ipq *ip_frag_create(unsigned hash, struct iphdr *iph, u32 user)
//呼叫路徑:ip_frag_create->ip_frag_intern
// 將ipq插入到hash表中
1.3 static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)
//ipq中所有分片的到期時間
//接收到的ip分片不能永久的存在記憶體中,如果在一定時間範圍內,沒有為其完成重組,則需要釋放所有分片占用的記憶體
// 1.刪除定時器
// 2.從hash表中unlink
// 3.使用分片的入口裝置向傳送方傳送icmp訊息,告訴對方過期
// 4.釋放ipq中的所有分片,釋放ipq結構
1.4 static void ip_expire(unsigned long arg)
}out:
spin_unlock(&qp->lock);
ipq_put(qp, null);//釋放與ipq關聯的所有分片,釋放ipq結構
}
Linux網路子系統中協議棧的入口處理
網路驅動接收到報文後,會初始化skb protocol 字段。鏈路層的接收函式netif receive skb會根據該字段來確定把報文送給那個協議模組進一步處理。乙太網的裝置呼叫eth type trans 來給skb protocol賦值。be16eth type trans struct sk...
Linux 網路子系統底層機制分析 1
linux 網路子系統底層機制分析 1 網路子系統在linux中的地位非常重要。在如今這個嚴重依賴網際網路,強調協同工作的時代,乙個高效,穩定的網路處理系統是留住使用者群的基本手段。前段時間花了一部分時間學習了一下linux的網路子系統的源 以及一些處理機制。這部分是由於工作的原因,另一部分原因是想...
Linux網路子系統中鏈路層中GRO的處理
根據上篇博文的介紹,gro需要支援gro的每種協議都要實現自己的報文匹配合併函式和合併完成函式。這裡我們先來看看鏈路層上 實現的自己的gro函式。鏈路層的接收匹配函式 napi gro receive napi,skb 該函式對報文進行匹配,並不合併報文。匹配規則 必須同時滿足以下兩個條件 1 兩個...