FreeBSD ixgbe网卡驱动相关数据结构讲解

前言

此文是5、6年前维护网卡驱动和优化时记录总结,当时10G设备绝对主流,1G网卡还分单队列和多队列两种,几年过去网络设备上40G网卡大行其道,100G网卡也是纷至沓来,但不管带宽如何升级,其实现原理类似。

正传

ixgbe.h 定义的 的相关结构:

/*

  • The transmit ring, one per queue
    */
    struct tx_ring {
    struct adapter *adapter;
    struct mbuf *m_prev;
    struct mtx tx_mtx;
    u32 me;
    u16 queue_status;
    u16 queue_full;
    int watchdog_time;
    union ixgbe_adv_tx_desc *tx_base; —>这是网卡真正是识别的discripter. 由ixgbe_dma_malloc函数分配4096个描述符(存储在连续的物理地址上), 该字段存储的是物理地址,在ixgbe_xmit的时候 操作 tx_base[i].read.buffer_addr = mbuf->m_data &~ DMAP_MIN_ADDRESS, 由此让网卡能够知道发送位置
    struct ixgbe_dma_alloc txdma;
    u32 next_avail_desc;
    u32 next_to_clean;
    struct ixgbe_tx_buf *tx_buffers; —>和描述符一样也是申请4096个,但是该成员是被用来操作驱动代码里面的mbuf的, 如在ixgbe_xmit里面tx_buffers[i]->m_head = mbuf(传进来的mbuf) 记录要发送的mbuf, 然后在ixgbe_txeof里面 把已经发送出去的mbuf内存回收,m_freem(tx_buffers[i]->m_head)
    volatile u16 tx_avail
    u32 txd_cmd;
    bus_dma_tag_t txtag;
    char mtx_name[16];

    u32 bytes; /* used for AIM /
    u32 packets;
    /
    Soft Stats */
    u64 no_desc_avail;
    u64 total_packets;
    };

/*

  • The Receive ring, one per rx queue
    */
    struct rx_ring {
    struct adapter *adapter;
    struct mtx rx_mtx;
    u32 me;
    union ixgbe_adv_rx_desc *rx_base;-------------->这是网卡真正是识别的discripter. 由ixgbe_dma_malloc函数分配4096个描述符(存储在连续的物理地址上), 该字段存储的是物理地址,在setup和 refresh的时候 操作 rx_base[i].read.pkt_addr = mbuf->m_data &~ DMAP_MIN_ADDRESS, 由此让网卡能够找到接收位置, 在ixgbe_rxeof里面 通过rx_base[i] 拿到要处理的描述符,判断 vtag 类的信息 和 接收是否完成等
    struct ixgbe_dma_alloc rxdma;
    struct lro_ctrl lro;
    bool lro_enabled;
    bool hdr_split;
    bool hw_rsc;
    bool discard;
    u32 next_to_refresh;
    u32 next_to_check;
    char mtx_name[16];
    struct ixgbe_rx_buf *rx_buffers; ----------------->和描述符一样也是申请4096个,但是该成员是被用来操作驱动代码里面的mbuf的, 如在ixgbe_rxeof里面 通过拿到 rx_buffers[i] 一下就拿到了一个mbuf, 这个mbuf就是送给协议栈处理的mbuf.
    bus_dma_tag_t htag;
    bus_dma_tag_t ptag;

    u32 bytes; /* Used for AIM calc */
    u32 packets;

};

struct ixgbe_tx_buf {
u32 eop_index;
struct mbuf *m_head;
bus_dmamap_t map;
};

struct ixgbe_rx_buf {
struct mbuf *m_head;
struct mbuf *m_pack;
struct mbuf *fmp;
bus_dmamap_t hmap;
bus_dmamap_t pmap;
};

struct adapter {
/*
** Queues:
** This is the irq holder, it has 网卡有多少个队列就有多少个该结构, 每个队列是与IRQ一对一的,且这里说的 RX/TX pair 是指针, 指向的是在rx_rings/tx_rings 分配的内容的
** and RX/TX pair or rings associated
** with it.
*/
struct ix_queue *queues; ===============>假设16个队列的IXGBE来说就是分配16个该结构

 /*
 * Transmit rings:
 *     Allocated at run time, an array of rings.
 */
 struct tx_ring          *tx_rings;  ===============>假设16个队列的IXGBE来说就是分配16个该结构
 int               num_tx_desc;

 /*
 * Receive rings:
 *     Allocated at run time, an array of rings.
 */
 struct rx_ring          *rx_rings; ===============>假设16个队列的IXGBE来说就是分配16个该结构

}

struct ix_queue {
struct adapter adapter;
u32 msix; /
This queue’s MSIX vector /
u32 eims; /
This queue’s EIMS bit */
u32 eitr_setting;
u32 stress_ticks;
struct resource *res;
void *tag;
struct tx_ring *txr; /一个队列结构上挂着两个方向的ring/ ==========>用adaptor里面的 tx_rings 来初始化这里的txr
struct rx_ring *rxr;/这个指针将在ixgbe_allocate_queues中赋值成在此函数中malloc出来的adapter->rx/tx_rings/
struct task que_task;
struct taskqueue *tq;
u64 irqs;
u64 stress_out;
};

/无论igb和ixgbe用多少个队列,一块物理的网卡只有一个adapter,起多队列的特性都是包含在adapter中的/

ixgbe_allocate_queues(){
malloc出来num_queues个ix_queue队列==>adapter->queues = malloc();
…tx_rings==>adapter->tx_rings = malloc(*num_queues);
…rx_rings==>adapter->rx_rings = malloc(*num_queues);

 /*对每个(共num_queues个,每个队列上都有rx/tx_ring,其实就相当于多个队列的em(em是FreeBSD下1G网卡的驱动命名主要的网卡类型是8254x, 82571/2/4等)网卡实现)tx/rx_ring 根据*/
 
 for (i = 0; i < adapter->num_queues; i++) {
      que = &adapter->queues[i];
      que->adapter = adapter;
      que->txr = &adapter->tx_rings[i];
      que->rxr = &adapter->rx_rings[i];
 }

}

以上相关结构关联图:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Intel英特尔PRO100/1000/10GbE系列官方网卡驱动20.0版For Win2008-32/Win2008-64/Win2012-32/Win2012-64/Win7-32/Win7-64/Win8-32/Win8-64/Win8.1-32/Win8.1-64(2015年3月3日发布) 操作系统:linux-32,linux-64,Win2008-32,Win2008-64,Win7-32,Win7-64,Win8-32,Win8-64,Win8.1-32,Win8.1-64,WinServer 2012-32,WinServer 2012-64 驱动说明 Intel英特尔PRO100/1000/10GbE系列官方网卡驱动20.0版For Win2008-32/Win2008-64/Win2012-32/Win2012-64/Win7-32/Win7-64/Win8-32/Win8-64/Win8.1-32/Win8.1-64(2015年3月3日发布)近日,Intel官方发布了一款最新的网卡驱动,版本为20.0,除了适用于Win2008/Win7以上操作系统之外,还包括Linux和FreeBSD系统,可以说是网卡驱动系列的全系统整合版。同样,该驱动也支持大部分Intel网卡型号(详细点此处),推荐喜欢朋友们下载使用。 支持网卡型号列表: — Sun Dual 10GbE PCIe 2.0 FEM — 英特尔 82567 千兆以太网控制器 — 英特尔 82571EB 千兆位以太网控制器 — 英特尔 82572EI 千兆位以太网控制器 — 英特尔 82574 千兆以太网控制器 — 英特尔 82575EB 千兆以太网控制器 — 英特尔 82576 千兆以太网控制器 — 英特尔 82577 千兆以太网 PHY — 英特尔 82578 千兆以太网 PHY — 英特尔 82579 千兆位以太网控制器 — 英特尔 82580EB 千兆以太网控制器 — 英特尔 82583V 千兆以太网控制器 — 英特尔 82598 万兆以太网控制器 — 英特尔 82599 万兆以太网控制器 — 英特尔 PRO/100 M 台式机适配器 — 英特尔 PRO/100 S 双端口服务器适配器 — 英特尔 PRO/100 S 台式机适配器 — 英特尔 PRO/100 S 服务器适配器 — 英特尔 PRO/100 S 管理适配器 — 英特尔 PRO/100 Smart 适配器 — 英特尔 PRO/100 VE 台式机适配器 — 英特尔 PRO/100 VE 网络连接 — 英特尔 PRO/100 VM 网络连接 — 英特尔 PRO/100 智能型服务器适配器 — 英特尔 PRO/100+ 双端口服务器适配器 — 英特尔 PRO/100+ 服务器适配器 — 英特尔 PRO/100+ 管理适配器 — 英特尔 PRO/100+ 适配器 — 英特尔 PRO/1000 CT 网络连接 — 英特尔 PRO/1000 F 服务器适配器 — 英特尔 PRO/1000 GT 台式机网卡 — 英特尔 PRO/1000 GT 四端口服务器适配器 — 英特尔 PRO/1000 MF 双端口服务器适配器 — 英特尔 PRO/1000 MF 服务器适配器 — 英特尔 PRO/1000 MF 服务器适配器(LX) — 英特尔 PRO/1000 MT 双端口服务器适配器 — 英特尔 PRO/1000 MT 台式机适配器 — 英特尔 PRO/1000 MT 四端口服务器适配器 — 英特尔 PRO/1000 MT 服务器适配器 — 英特尔 PRO/1000 PF 双端口服务器适配器 — 英特尔 PRO/1000 PF 四端口服务器适配器 — 英特尔 PRO/1000 PF 服务器适配器 — 英特尔 PRO/1000 PM 网络连接 — 英特尔 PRO/1000 PT 双端口服务器适配器 — 英特尔 PRO/1000 PT 台式机适配器 — 英特尔 PRO/1000 PT 四端口服务器适配器 — 英特尔 PRO/1000 PT 四端口窄板服务器适配器 — 英特尔 PRO/1000 PT 服务器适配器 — 英特尔 PRO/1000 T 台式机适配器 — 英特尔 PRO/1000 T 服务器适配器 — 英特尔 PRO/1000 XF 服务器适配器 — 英特尔 PRO/1000 XT 服务器适配器 — 英特尔 PRO/1000 XT 窄板服务器适配器 — 英特尔 PRO/1000 千兆位服务器适配器 — 英特尔 万兆 AF DA 双端口服务器适配器 — 英特尔 万兆 AT 服务器适配器 — 英特尔 万兆 AT2 服务器适配器 — 英特尔 万兆 CX4 双端口服务器适配器 — 英特尔 万兆 SR 双端口 ExpressModule — 英特尔 万兆 XF LR 服务器适配器 — 英特尔 万兆 XF SR 双端口服务器适配器 — 英特尔 万兆 XF SR 服务器适配器 — 英特尔 以太网控制器 I210 系列 — 英特尔 以太网控制器 I211 系列 — 英特尔 以太网控制器 I350 — 英特尔 以太网控制器 X540-AT2 — 英特尔 以太网控制器 X710 系列 — 英特尔 以太网控制器 XL710 系列 — 英特尔 以太网服务器适配器 I210-T1 — 英特尔 以太网服务器适配器 I340-F4 — 英特尔 以太网服务器适配器 I340-T4 — 英特尔 以太网服务器适配器 I350-F2 — 英特尔 以太网服务器适配器 I350-F4 — 英特尔 以太网服务器适配器 I350-T2 — 英特尔 以太网服务器适配器 I350-T4 — 英特尔 以太网服务器适配器 X520 系列 — 英特尔 以太网服务器适配器 X520-DA2 — 英特尔 以太网服务器适配器 X520-LR1 — 英特尔 以太网服务器适配器 X520-SR1 — 英特尔 以太网服务器适配器 X520-SR2 — 英特尔 以太网服务器适配器 X520-T2 — 英特尔 以太网聚合网络适配器 X520 系列 — 英特尔 以太网聚合网络适配器 X540 T1 — 英特尔 以太网聚合网络适配器 X540 T2 — 英特尔 以太网聚合网络适配器 X710 系列 — 英特尔 以太网聚合网络适配器 XL710 系列 — 英特尔 以太网连接 I217-LM — 英特尔 以太网连接 I217-V — 英特尔 以太网连接 I218-LM — 英特尔 以太网连接 I218-V — 英特尔 千兆 CT 台式机适配器 — 英特尔 千兆 EF 双端口服务器适配器 — 英特尔 千兆 ET 双端口服务器适配器 — 英特尔 千兆 ET 四端口服务器适配器 — 英特尔 千兆 PT 四端口服务器 ExpressModule — 英特尔 千兆位 ET2 四端口服务器适配器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值