• DPDK以太网部分代码整理


    总体流程如图所示,初始化时配置设备和队列,运行时通过rte_eth_tx_burst和rte_eth_rx_burst来收发包。

    收包内存池创建

    rte_pktmbuf_pool_create(pool_name, num, cache_size, priv_size, data_room_size, socket_id);

    1. num是pool里block个数

    2. cache_size是一些lcore的指针,指向本mempool里的buffer,注意每个lcore都会reserve这么多指针,其它buffer就没法访问这些block了。

    3. priv_size是预留的内部空间,比如可以作为一些custom header的存储位置。

    4. data_room_size是实际payload size + RTE_PKTMBUF_HEADROOM

    5. socket_id可以是0,如果只有1个socket。也可以是任意的,比如SOCKET_ID_ANY,也就是-1。主要涉及到不同的NUMA,会用到不同的DMA。

    6. 有些驱动比如ice的一些驱动,不支持iova=va的模式,因为PMD需要大块的连续物理内存。

    7. 收包DMA会搬运到事先分配好的收包内存池。注意发包内存池不需要给驱动额外创建,rte_eth_tx_burst前的buffer已经分配好了。

    设备端口初始化

    1. rte_eth_dev_count_avail()
      看有几个eth port,就是几个eth设备,包括所有PF和VF的数量。

    2. rte_eth_dev_info_get(port, &dev_info);
      看当前port支持哪些功能,比如最大的rx queue和tx queue数量。

    3. rte_eth_dev_configure(port, n_rx_q, n_tx_q + n_free_tx_q, &port_conf)
      配置port有几个tx和rx的队列。

    4. rte_eth_dev_set_vlan_offload(port_id, vlan_offload)
      先获得当前的VLAN offload配置。rte_eth_dev_get_vlan_offload(port_id),再配置vlan offload配置。rte_eth_dev_get_vlan_offload

    5. rte_eth_dev_vlan_filter(port_id, vlan_id, 1)
      给port_id和vlan_id配置offload,1表示使能,也就是允许让这些p

  • 相关阅读:
    这三大特性,让 G1 取代了 CMS!
    JavaBean 和 Spring Bean的区别
    Go 接口-契约介绍
    地理信息系统的发展趋势——网格GIS
    c语言练习85:通讯录的实现(基于顺序表实现)
    Vue源码系列讲解——生命周期篇【一】(综述)
    【STM32基础 CubeMX】ADC的基础使用
    内涵语录
    C#Regex正则表达式(Regular Expression)
    医学大数据|R|竞争风险模型:可视化与图像优化
  • 原文地址:https://blog.csdn.net/weixin_60043341/article/details/126623758