1. 程式人生 > >82599網絡卡驅動rx descriptor結構體分析

82599網絡卡驅動rx descriptor結構體分析

82599 datasheet: 7.1.6  節    大概位於314頁 對驅動的理解關鍵是對資料結構的理解。 The 82599 posts receive packets into data buffers in system memory.
The following controls are provided for the data buffers:
• The SRRCTL[n].BSIZEPACKET field defines the data buffer size. See section
Section 7.1.2for packet filtering by size.
• The SRRCTL.BSIZEHEADER field defines the size of the buffers allocated to headers
(advanced descriptors only). Each queue is provided with a separate SRRCTL register. Receive memory buffer addresses are word (2x byte) aligned (both data and headers). 每個queue都有單獨的SRRCTL暫存器 n表示的是queue id rx packet或者header buffer的記憶體地址必須兩位元組對齊,這樣的話可以保證地址的最低位(LSB)為0. 結構體的宣告如下: /* Receive Descriptor - Advanced */
union ixgbe_adv_rx_desc {  struct {                                 __le64 pkt_addr; /* Packet buffer address */                                 __le64 hdr_addr; /* Header buffer address */                 } read;  struct {  struct {  union {                                                                 __le32 data;
 struct {                                                                                 __le16 pkt_info; /* RSS, Pkt type */                                                                                 __le16 hdr_info; /* Splithdr, hdrlen */                                                                 } hs_rss;
                                                } lo_dword;  union {                                                                 __le32 rss; /* RSS Hash */  struct {                                                                                 __le16 ip_id; /* IP id */                                                                                 __le16 csum; /* Packet Checksum */                                                                 } csum_ip;                                                 } hi_dword;                                 } lower;  struct {                                                 __le32 status_error; /* ext status/error */                                                 __le16 length; /* Packet length */                                                 __le16 vlan; /* VLAN tag */                                 } upper;                 } wb;  /* writeback */ }; 根據datasheet來看這個union結構體,這個union包括兩個struct,一個是 struct {                                 __le64 pkt_addr; /* Packet buffer address */                                 __le64 hdr_addr; /* Header buffer address */                 } read; 這個struct對應的datasheet中的table 7-15:
     63                                                                                                                                1      0
 0                             Packet Buffer Address [63:1]     A0
 8                           Header Buffer Address [63:1]     DD
這個資料結構是在驅動中修改的。就兩個64bit地址。這兩個地址都是實體地址,當一個數據包接收完成時,驅動就將對應的存放當前資料包的dma ring buffer的實體地址寫到這個資料結構中。 header buffer的實體地址的最低位被用來表示當前的buffer是否可用。 DD的意思是Descriptor Done。 驅動每次要接收資料包的時候就檢查這個DD是不是1,如果是1, 那麼這個描述符對應的packet buffer中就有一個新來的資料包,然後就取出來資料包,取完之後就設定為0,這樣硬體下次就可以繼續使用。如果檢查發現DD為0,驅動會認為當前packet fifo為空,沒有新的資料包了。直接就會返回。 網絡卡每次來了新的資料包,就檢查當前這個buffer的DD位是否為0,如果為0那麼表示當前buffer可以使用,就讓DMA將資料包copy到這個buffer中,設定DD為1,這樣驅動就可以根據DD 1讀取這個新來的資料包了。如果硬體檢查為1,那麼硬體就認為fifo滿了,可能直接就將這個包給丟棄掉了。 典型的生產者---消費者模型。 在驅動程式碼中並沒有發現單獨的程式碼來設定DD為0。這是因為結構體中的這兩個實體地址必須2位元組對齊,也就是說最低位一定是0.所以直接通過下面的地址寫回就可以置0了,不需要再單獨的設定一下。 rxdp->read.hdr_addr = dma_addr; rxdp->read.pkt_addr = dma_addr;

下面接著分析union中的另一個結構體:抓狂

相關推薦

82599驅動rx descriptor結構分析

82599 datasheet: 7.1.6  節    大概位於314頁 對驅動的理解關鍵是對資料結構的理解。 The 82599 posts receive packets into data buffers in system memory. The follo

Linux 驅動學習(三)(net_device 等資料結構

【摘要】前文對網路驅動例子進行一個簡單的梳理總結,本文貼出 net_device 的資料結構以及一些驅動中常用的資料結構。 1、網路裝置驅動結構 1)、網路協議介面層向網路層協議提供提供統一的資料包收發介面,不論上層協議為ARP還是IP,都通過dev_queue_xmi

2015版uboot的啟動過程及驅動結構分析

啟動流程和上篇博文介紹的rtems類似 首先是start.s: 在這裡選擇arm的arm7作為例子分析,程式碼:/arch/arm/cpu/armv7/start.s /* * armboot - Startup Code for OMAP3530/ARM Cortex

Ubuntu14.04 無線驅動安裝

由於新安裝的14.04是 沒有無線網絡卡驅動的,這裡需要自己安裝網絡卡驅動。 (第一步) 我們需要在win10下看到網絡卡型號 (第二步) 升級ubuntu核心(uname -sr可以看現在的核心版本) 在 http://kernel.ubuntu.com/~kernel

DPDK驅動載入、繫結和解綁

Igb_uio程式碼相關的可以分為三個部分:igb_uio核心驅動,核心uio框架,uio使用者態部分。 載入igb_uio模組與繫結dpdk網絡卡 a)載入dpdk驅動需要先載入uio:modprobe uio b)載入dpdk驅動的方法:/sbin/insmod  ig

ThinkPad E480安裝ubuntu後沒有無線驅動,找不到wifi的解決方案

先安裝的ubuntu版本是ubuntu-16.04.3-desktop-amd64.iso 安裝後通過cat /proc/version或者uname -rs檢視linunx核心版本,其linux核心版本為4.10。 網上查到linux4.15及以上的linux核心才能支援此筆記本的無線網絡

安裝完Ubuntu系統之後無法連線無線,有無線卻找不到驅動

今天給我的Mac裝完Ubuntu16.04之後,發現登入系統之後無法連線WIFI無線網路,筆記本是自帶無線網絡卡的,所以這個出現問題的原因只有一個,那就是沒有安裝好網絡卡驅動,而且Ubuntu自帶的相容網絡卡驅動並沒有起到作用。這個時候我查閱了一些網路上的相關資料,自己總結了一個解決辦法,相

Jetson tk1 安裝 Intel 7260ac 無線驅動

首先,利用Jetpack將Jetson TK1升級到最新的L4T (version 21.3 +) 如果工作環境能提供有線網路,請將網線插到開發板,在開發板L4T的terminal輸入以下指令來下載並安裝驅動: sudo apt-get install git git clon

centos7.5安裝無線驅動

本文主要參考: https://blog.csdn.net/yanshaoshuai/article/details/81148664 http://elrepo.org/tiki/wl-kmod 1. 概要 本篇部落格主要記錄在 centos7.5 環境下安裝 BCM

【Ubuntu16.04】安裝無線驅動

1、參考連結:https://blog.csdn.net/weijia_kmy/article/details/51304518 昨天下載了ubuntu16.0.4,安裝後發現沒有wifi可連線,於是上網查了一個晚上,都沒有可行的辦法。無奈今早就又下載ubuntu15.10安裝,發現可以連wifi

l(轉)Linux DM9000驅動程式完全分析

[置頂] Linux DM9000網絡卡驅動程式完全分析 分類: Linux裝置驅動程式第三版學習筆記 2011-02-26 16:11 3513人閱讀 評論(34) 收藏 舉報 說明1:本文分析基於核心原始碼版本為linux-2

LINUX核心升級 - 更新驅動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Centos7.4.1708 安裝usb無限驅動

今天總結一下前幾天折騰的usb無線網絡卡驅動。 一、確定網絡卡驅動 實驗機器核心版本資訊如下: [[email protected] ~]# uname -a Linux localhost.localdomain 3.10.0-693.21.1.el7.x86_64 #1

驅動的移植

需要用到的檔案在 "u-boot-samsung-dev\board\samsung\smdkc110" 目錄下 第一步:  找到   smdkc110.c  下的 static void dm9000_pre_init 函式 在"S5PV210_UM

初識Linux 驅動移植 之 dm9621驅動移植

概述 將kernel移植到開發板並能正常載入和啟動核心後,發現網絡卡並沒有工作,因此將網絡卡作為第一個移植的實踐。這篇文章用於記錄移植dm9621網絡卡過程中遇到的問題以及如何定位問題並嘗試解決。 配置核心 在找到dm9621網絡卡驅動的原始碼後,需要將其新增

驅動收發包過程

網絡卡 網絡卡工作在物理層和資料鏈路層,主要由PHY/MAC晶片、Tx/Rx FIFO、DMA等組成,其中網線通過變壓器接PHY晶片、PHY晶片通過MII接MAC晶片、MAC晶片接PCI匯流排 PHY晶片主要負責:CSMA/CD、模數轉換、編解碼、串並轉換 MAC晶片主要

新裝linux系統沒有驅動的解決方法

最近公司伺服器剛裝完centos6.0系統,發現只有一個lo網絡卡,沒有eth0也沒有ifcfg-eth0檔案,可以初步說明沒有網絡卡驅動 1.首先下載一個centos6.0的網絡卡驅動(舊版本的網絡卡驅動網上很難找,本人網上沒找到,最後通過客服人員才獲得,已經

Linux 驅動sk_buff核心原始碼隨筆

          這幾天在除錯有關網絡卡驅動的東西,有很多地方不清楚。而且網絡卡驅動主要有兩個很重要的結構體:struct net_device 和struct sk_buff。 驅動都是圍繞這兩個東西進行操作的,為了搞清楚該如何按協議棧處理資料包,週末閒來無事就看看核

從ip addr add和ifconfig的區別看linuxip地址的結構

                今天一個老外在郵件列表上問了一個問題,就是ip addr add和ifconfig的區別,我給他進行了解答,可能因為英語不好吧,解答的很簡單,因此我還是要在這裡詳細說明一下。其實它們之間沒有什麼區別,只 是表述方式不同罷了。如果你非常理解網路協議的原理以及網路的分層架構那麼我想

重灌完centos6.5後沒有驅動的解決方法

進入到系統,輸入ifconfig命令,發現只有lo,沒有eth0資訊,在/etc/sysconfig/network-scripts/目錄下面也沒有ifcfg-eth0檔案 然後百度了很多文章,找到一個不錯的方法,在此做個筆記 解決方法: 1、檢視網絡卡型號:lsp