linux 核心 UDP層csum校驗

2021-08-15 19:27:37 字數 966 閱讀 1590

本人核心小菜,最近工作需要在核心模組做udp的recv checksum 校驗,整理了相關資料並把關鍵的函式列出來。

//recv udp packet check

static bool checksumerror(struct sk_buff* skb, struct udphdr* uh)

//2. udp header check is 0,mean needn't check

if(uh->check == 0)

//otherwise, we must calculate csum

//skb->data must move to udphr

if(skb_pull(skb, ip_hdrlen (skb)) == null) //注意:勾包是l3 skb->data 指向ip頭

//calculate pseudo header csum

psum = csum_tcpudp_nofold(ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, skb->len, ip_hdr(skb)->protocol, 0);

if(skb->ip_summed == checksum_complete)

//calculate payload csum and fold pseudo header csum

skb->csum = skb_checksum(skb, 0, skb->len, 0);

if(!csum_fold(csum_add(psum, skb->csum)))

return true;

//call

if(checksumerror(skb, udph)) //check csum

//discard packet if csum error

return nf_drop;  //直接返回 不需要 kfree_skb(skb);  nf_hook_slow函式中free掉,否則crash

傳輸層 UDP協議

資料單位 特點具體實現 要求udp首部格式 傳送udp請求的客戶端圖釋 udp 傳送的資料單位協議是 udp 報文或使用者資料報 udp 是無連線的,即傳送資料之前不需要建立連線 udp 使用盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制 udp 是面向報文的.udp 沒有擁塞控制,很適合多...

傳輸層 UDP協議

傳輸層 udp協議 資料單位 特點具體實現 要求udp首部格式 傳送udp請求的客戶端圖釋 udp 傳送的資料單位協議是 udp 報文或使用者資料報 udp 是無連線的,即傳送資料之前不需要建立連線 udp 使用盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制 udp 是面向報文的.udp 沒...

傳輸層 UDP協議

資料單位 特點具體實現 要求udp首部格式 傳送udp請求的客戶端圖釋 udp 傳送的資料單位協議是 udp 報文或使用者資料報 udp 是無連線的,即傳送資料之前不需要建立連線 udp 使用盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制 udp 是面向報文的.udp 沒有擁塞控制,很適合多...