網路子系統54 ip協議分片重組 定位ipq

2021-09-08 09:46:49 字數 1179 閱讀 3742

//為分片確定正確的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 兩個...