【C語言】linux內核generic_xdp_tx

一、中文注釋

/* 在執行通用XDP時,我們必須繞過qdisc層和網絡挖掘點,* 以匹配驅動內XDP的行為。*/
void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog)
{struct net_device *dev = skb->dev; // 獲取skb對應的網絡設備struct netdev_queue *txq; // 聲明網絡設備發送隊列bool free_skb = true; // 初始化一個標志位,用于標記是否需要釋放skbint cpu, rc; // 聲明CPU核心號和返回碼變量txq = netdev_pick_tx(dev, skb, NULL); // 選擇用于發送的隊列cpu = smp_processor_id(); // 獲取當前CPU核心的IDHARD_TX_LOCK(dev, txq, cpu); // 對選定的發送隊列加鎖if (!netif_xmit_stopped(txq)) { // 檢查發送隊列是否被停止rc = netdev_start_xmit(skb, dev, txq, 0); // 開始發送數據包if (dev_xmit_complete(rc)) // 如果發送完成,則不釋放skbfree_skb = false;}HARD_TX_UNLOCK(dev, txq); // 解鎖發送隊列if (free_skb) { // 如果標志位為true,則釋放skbtrace_xdp_exception(dev, xdp_prog, XDP_TX); // 記錄XDP傳輸異常kfree_skb(skb); // 釋放skb}
}
EXPORT_SYMBOL_GPL(generic_xdp_tx); // 導出該符號,GPL協議的模塊可以使用這個函數

這個函數`generic_xdp_tx`用于通用XDP處理的數據包發送。代碼里包含了一系列網絡層的操作和邏輯判斷。它在鎖定CPU和篩選適當的網絡發送隊列之后,嘗試發送數據包,如果發送成功,則記錄結果,否則將數據包內存釋放。

二、XDP

在 Linux 內核 4.9 版本中,XDP 指的是 eXpress Data Path。XDP 是一種高性能、可編程的網絡數據路徑,它允許用戶態程序直接處理在網絡設備驅動程序層收到的包,提供了一種脫離內核網絡棧處理數據包的方法。通過XDP,可以在內核中運行的 eBPF (extended Berkeley Packet Filter) 程序,以決定包應該被丟棄、傳遞到常規的內核網絡棧,還是直接轉發到另一個接口。
XDP可以用于多種場景,比如DDoS攻擊防御、高速包路由、負載均衡等,它通過允許包在被內核完全處理之前就被處理,來顯著減少數據包處理的延遲和CPU占用。這使得XDP尤其適合那些需要非常低延遲和高吞吐量的場合。
在函數`generic_xdp_tx`中,XDP是用來處理網絡數據包,并且在某些情況下,該函數在發送數據包前會繞過正常的內核網絡隊列調度(qdisc layer)和監視點(network taps)。這通常是當在驅動內部使用XDP時要實現的行為。而在這個函數中,我們可以看到涉及到skb(Socket Buffer)的發送邏輯,以及可能的異常記錄和資源清理。這是在軟件層面實現了類似硬件加速XDP的行為,因此被稱為"通用XDP"(generic XDP)。

三、中文講解

這段代碼是 Linux 內核網絡子系統的一部分,它實現了通用 XDP (eXpress Data Path) 傳輸的功能。在不支持驅動程序級別 XDP 的網絡設備上,當你需要處理 XDP 程序的發送行為時,可以使用這個函數。下面是對這段代碼的詳細解釋:
1. 函數簽名 void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog):這個函數接收兩個參數:`skb`(Socket Buffer,網絡數據包的內核表示)和 xdp_prog(與 XDP 程序相關聯的 BPF 程序)。
2. struct net_device *dev = skb->dev;:從 skb 中提取關聯的網絡設備,這個設備表示數據包將要發送的目的地網絡接口。
3. struct netdev_queue *txq;:定義一個指向 netdev_queue 的指針,表示網絡設備的發送隊列。
4. bool free_skb = true;:定義一個布爾變量用來標記是否應該釋放 skb,初始設置為 true,表示默認情況下(如果發送失敗)需要釋放 skb。
5. txq = netdev_pick_tx(dev, skb, NULL);:選擇一個合適的發送隊列來處理 skb。如果無法選擇隊列,可能會返回 NULL。
6. cpu = smp_processor_id();:獲取當前 CPU 的 ID,用于確定發送數據包的 CPU。
7. HARD_TX_LOCK(dev, txq, cpu);:獲取發送路徑上的鎖定,確保數據包發送的臨界區保護。
8. if (!netif_xmit_stopped(txq)) {:檢查是否隊列已經停止發送。如果沒有停止,就嘗試發送數據包。
9. rc = netdev_start_xmit(skb, dev, txq, 0);:調用 netdev_start_xmit 函數發送數據包。
10. if (dev_xmit_complete(rc)):判斷發送函數返回的結果是否表示發送完畢。如果 dev_xmit_complete(rc) 返回 true,則代表數據包已經成功發送,并且不需要釋放 skb。
11. HARD_TX_UNLOCK(dev, txq);:釋放之前獲得的鎖。
12. if (free_skb) {:如果之前沒有發送成功,或者發送函數指示我們需要自行釋放 skb。
13. trace_xdp_exception(dev, xdp_prog, XDP_TX);:如果有需要,記錄 XDP 異常事件(這個調用可能與監控和調試相關)。
14. kfree_skb(skb);:釋放 skb 資源,避免內存泄漏。
15. EXPORT_SYMBOL_GPL(generic_xdp_tx);:導出 generic_xdp_tx 函數,使其可以被模塊使用,同時指明該函數受 GPL 許可證保護。
需要注意的是,這段代碼需要在 Linux 內核的上下文中執行,并且需要相應的內核編程知識和經驗。內核版本不同,細節上可能會有所差異。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715317.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試高頻率問答題目

索引: 主鍵索引:表的id (唯一 且 不能為空) 唯一索引:表User 假設有account 字段 ,用戶名不重復 (唯一 可以為空) 復合索引:where() 的條件 用戶名,密碼 …

MySQL:函數

提醒: 設定下面的語句是在數據庫名為 db_book里執行的。 創建user_info表 注意:pwd為密碼字段,這里使用了VARCHAR(128)類型,為了后面方便對比,開發項目里一般使用char(32),SQL語句里使用MD5加密函數 USE db…

【博圖TIA-Api】通過Excel自動新建文件夾和導入FB塊

【博圖TIA-Api】通過Excel自動新建文件夾和導入FB塊 說明思路準備獲取Excel表格內文件名和FB塊名等信息新建文件夾部分篩分獲取的文件夾數據,去掉重復內容創建文件夾 導入FB塊導出FB塊的xml文件查找需要放置的文件夾導入塊 說明 續上一篇文章,這次是根據…

多線程 --- [ 線程池、線程安全、其他常見的鎖 ]

目錄 1. 線程池 模塊一:線程的封裝 模塊二:線程池的封裝 模塊三:互斥量的封裝 (RAII風格) 模塊四:任務的封裝 模塊五:日志的封裝 模塊六:時間的封裝 模塊六:主函數 模塊七&#xff1a…

備戰藍橋杯---狀態壓縮DP進階題1

我們來看一看一道比較難的問題(十分十分的巧妙): 顯然我們應該一行一行放,又豎的會對下一行產生影響,我們令橫著放為0,豎著放的上方為1. 對于下一行,前一行放1的下面為0,但是會出現…

【Redis | 第九篇】一篇文章看懂Redis持久化機制

文章目錄 9.一篇文章看懂Redis持久化機制9.1Redis的兩種持久化機制9.1.1為什么有持久化? 9.2RDB機制9.2.1介紹9.2.2觸發機制(1)save命令觸發(2)bgsave命令觸發(3)自動觸發 9.2.3執行流程9.2.4優…

C++知識點總結(22):模擬算法真題 ★★★★☆《卡牌游戲》《移動距離》

一、卡牌游戲 1. 審題 題目描述 A , B , C A,B,C A,B,C 三人在玩一個卡牌游戲,規則如下: 游戲開始時, 3 3 3 人分別會得到若干張手牌, 每張牌上寫著 a,b,c 中某一個字母。手牌的順序嚴格按照輸入順序排列&#xff0c…

前端【技術類】資源學習網站整理(那些年的小網站)

學習網站整理 值得分享的視頻博主:學習網站鏈接 百度首頁的資源收藏里的截圖(排列順序沒有任何意義,隨性而已~),可根據我標注的關鍵詞百度搜索到這些網站呀,本篇末尾會一一列出來,供大家學習呀 …

徹底搞懂回溯算法(例題詳解)

目錄 什么是回溯算法: 子集問題: 子集問題II(元素可重復但不可復選): 組合問題: 組合問題II(元素可重復但不可復選): 排列問題: 排列問題II(元素可重復但不可復選): 什么是回溯算法: 「回溯是遞歸的副產品&…

最小生成樹---Kruskal算法

最小生成樹定義: 給定一張邊帶權的無向圖 G(V,E),其中 V 表示圖中點的集合,E 表示圖中邊的集合。 由 V 中的全部 n 個頂點和 E 中 n?1 條邊構成的無向連通子圖被稱為 G 的一棵生成樹,其中邊的權值之和最小的生成樹被稱為無向圖 G…

leetcode hot100 每日溫度

在本題中,我們是通過單調棧來解決的,因為我們采用了棧的數據結構,并且,棧內存儲的元素是單調的。 本題我們考慮,將氣溫數組元素的下標存入棧中,首先初始化要把0放入,0是下標的意思。然后我們拿…

華為HCIP Datacom H12-821 卷4

1.單選題 下面哪些策略或工具不能夠應用于 OSPF: A、access-list B、prefix-list C、route- Policy D、as-path filter 正確答案: D 解析: as-path-filter命令用來創建AS路徑過濾器,OSPF屬于IGP協議,不涉及到AS號。 2.單選題…

【python基礎學習05課_for循環以及雙重for循環】

FOR循環 一、認識循環-while 1、循環條件不能超出列表長度 當i 1&#xff0c;while i < len(lst1) 時&#xff0c;i 3后, 打印print&#xff08;lst[3]&#xff09;小宋老師&#xff0c; 繼續1, i 4, 4不小于 len(lst1)&#xff0c;打破循環。 2、循環條件超出列表長度報錯…

JMeter元件和采樣器一覽

Apache JMeter是一個強大的開源負載測試工具&#xff0c;用于性能和功能測試。JMeter提供了豐富的元件和采樣器&#xff0c;使得它能夠模擬復雜的測試場景和高并發的用戶請求。以下是JMeter中常用的一些元件和采樣器的介紹和講解&#xff1a; 測試計劃元件 測試計劃&#xff0…

latex報錯I was expecting a `,‘ or a `}‘的解決辦法

解決辦法——經過檢查在ref22后面缺少一個逗號 總結 當你在使用LaTeX時遇到“I was expecting a , or a }”這樣的錯誤&#xff0c;這通常意味著LaTeX在解析你的代碼時&#xff0c;預期在某個位置看到一個逗號&#xff08;,&#xff09;或一個大括號&#xff08;}&#xff09;…

每日一題 2369

2369. 檢查數組是否存在有效劃分 題目描述&#xff1a; 給你一個下標從 0 開始的整數數組 nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為數組的一種 有效 劃分&#xff1a; 子數…

PTA 1010 一元多項式求導

1010 一元多項式求導 (25分) C/C - 知乎 (zhihu.com) #include<stdio.h> int main(){ int x,n; scanf("%d %d",&x,&n); if(n0)printf("%d %d",0,0); //n0 說明是常數&#xff0c;不需要求導 else printf("%d %…

STM32 串口通信

串口發原理 在stm32每個串口內部有發送寄存器和發送移位寄存器。 當調用HAL_UART_Transmit 時&#xff0c;cpu會將發送的數據放入發送寄存器中。發送移位寄存器會將數據轉換成電平的高低&#xff0c;從TX發出。 1、輪詢模式配置、發送與接收 輪詢模式時cpu會不斷檢測發送數…

嵌入式中匯編語言的基本實現

大家好&#xff0c;今天給大家分享&#xff0c;GNU匯編的語法。 第一&#xff1a;匯編簡介 GNU 匯編語法適用于所有的架構&#xff0c;并不是 ARM 獨享的&#xff0c;GNU 匯編由一系列的語句組成&#xff0c; 每行一條語句&#xff0c;每條語句有三個可選部分&#xff0c;如下…

小白學視覺 | 詳解遺傳算法 GA(Python實現代碼)

本文來源公眾號“小白學視覺”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;詳解遺傳算法 GA&#xff08;Python實現代碼&#xff09; 轉自&#xff1a;機器之心 英文&#xff1a;www.analyticsvidhya.com/blog/2017/07/introduc…