Post

DPDK 尝试(1)-开发一个小型dns服务

最近的学习暂时告一段落,一直看下去,不动手实操也不会有什么实际体验,还得是手写代码来走进每一个步骤才行。准备利用dpdk前面的知识,来尝试开发一个小型的dns服务,暂时名为mdns-D

这一篇就用来记录中途碰见的问题和怎么解决它们的。

port_init

前面仿照着example写下来,先默认4个lcore和2个nic可用。碰到第一个问题,rte_eth_dev_configure中的最后一个参数const struct rte_eth_conf * eth_conf该怎么去理解和配置呢?

这里还得是直接去看源码,这个结构如下,一个个的来看就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct rte_eth_conf {
    uint32_t link_speeds; 
    struct rte_eth_rxmode rxmode; 
    struct rte_eth_txmode txmode; 
    uint32_t lpbk_mode;
    struct {
        struct rte_eth_rss_conf rss_conf; 
        struct rte_eth_vmdq_dcb_conf vmdq_dcb_conf;
        struct rte_eth_dcb_rx_conf dcb_rx_conf;
        struct rte_eth_vmdq_rx_conf vmdq_rx_conf;
    } rx_adv_conf;
    union {
        struct rte_eth_vmdq_dcb_tx_conf vmdq_dcb_tx_conf;
        struct rte_eth_dcb_tx_conf dcb_tx_conf;
        struct rte_eth_vmdq_tx_conf vmdq_tx_conf;
    } tx_adv_conf; 
    uint32_t dcb_capability_en;
    struct rte_eth_intr_conf intr_conf; 
};

rxmode

该结构体定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct rte_eth_rxmode {
    enum rte_eth_rx_mq_mode mq_mode;
    uint32_t mtu;
    uint32_t max_lro_pkt_size;
 /**
  * Per-port Rx offloads to be set using RTE_ETH_RX_OFFLOAD_* flags.
  * Only offloads set on rx_offload_capa field on rte_eth_dev_info
  * structure are allowed to be set.
  */
    uint64_t offloads;

    uint64_t reserved_64s[2];
    void *reserved_ptrs[2];
};

这里重点关注这个mq_mode即MultiQueue-mode。可用的选项包含如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum rte_eth_rx_mq_mode {
    RTE_ETH_MQ_RX_NONE = 0,
    
    RTE_ETH_MQ_RX_RSS = RTE_ETH_MQ_RX_RSS_FLAG,
    RTE_ETH_MQ_RX_DCB = RTE_ETH_MQ_RX_DCB_FLAG,
    RTE_ETH_MQ_RX_DCB_RSS = RTE_ETH_MQ_RX_RSS_FLAG | RTE_ETH_MQ_RX_DCB_FLAG,
    

    RTE_ETH_MQ_RX_VMDQ_ONLY = RTE_ETH_MQ_RX_VMDQ_FLAG,
    RTE_ETH_MQ_RX_VMDQ_RSS = RTE_ETH_MQ_RX_RSS_FLAG | RTE_ETH_MQ_RX_VMDQ_FLAG,
    RTE_ETH_MQ_RX_VMDQ_DCB = RTE_ETH_MQ_RX_VMDQ_FLAG | RTE_ETH_MQ_RX_DCB_FLAG,
    RTE_ETH_MQ_RX_VMDQ_DCB_RSS = RTE_ETH_MQ_RX_RSS_FLAG |     RTE_ETH_MQ_RX_DCB_FLAG |
        RTE_ETH_MQ_RX_VMDQ_FLAG,
};
  1. RSS:Receive Side Scaling。接收端缩放,一种软件技术来通过hash散列,将不同连接交付给不同的cpu进行处理。更多的设置可以通过rte_eth_conf.rx_adv_conf.rte_eth_rss_conf来进行操作。
  2. DCB:Data Center Bridge。还没看。
  3. VMDQ。Virtual Machine Device Queues。还没看。
This post is licensed under CC BY 4.0 by the author.