+const uint16_t vlan_tags[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31
+};
+
+static int
+get_eth_dcb_conf(struct rte_eth_conf *eth_conf, struct dcb_config *dcb_conf)
+{
+ uint8_t i;
+
+ /*
+ * Builds up the correct configuration for dcb+vt based on the vlan tags array
+ * given above, and the number of traffic classes available for use.
+ */
+ if (dcb_conf->dcb_mode == DCB_VT_ENABLED) {
+ struct rte_eth_vmdq_dcb_conf vmdq_rx_conf;
+ struct rte_eth_vmdq_dcb_tx_conf vmdq_tx_conf;
+
+ /* VMDQ+DCB RX and TX configrations */
+ vmdq_rx_conf.enable_default_pool = 0;
+ vmdq_rx_conf.default_pool = 0;
+ vmdq_rx_conf.nb_queue_pools =
+ (dcb_conf->num_tcs == ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);
+ vmdq_tx_conf.nb_queue_pools =
+ (dcb_conf->num_tcs == ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);
+
+ vmdq_rx_conf.nb_pool_maps = sizeof( vlan_tags )/sizeof( vlan_tags[ 0 ]);
+ for (i = 0; i < vmdq_rx_conf.nb_pool_maps; i++) {
+ vmdq_rx_conf.pool_map[i].vlan_id = vlan_tags[ i ];
+ vmdq_rx_conf.pool_map[i].pools = 1 << (i % vmdq_rx_conf.nb_queue_pools);
+ }
+ for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
+ vmdq_rx_conf.dcb_queue[i] = i;
+ vmdq_tx_conf.dcb_queue[i] = i;
+ }
+
+ /*set DCB mode of RX and TX of multiple queues*/
+ eth_conf->rxmode.mq_mode = ETH_MQ_RX_VMDQ_DCB;
+ eth_conf->txmode.mq_mode = ETH_MQ_TX_VMDQ_DCB;
+ if (dcb_conf->pfc_en)
+ eth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT|ETH_DCB_PFC_SUPPORT;
+ else
+ eth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT;
+
+ (void)(rte_memcpy(ð_conf->rx_adv_conf.vmdq_dcb_conf, &vmdq_rx_conf,
+ sizeof(struct rte_eth_vmdq_dcb_conf)));
+ (void)(rte_memcpy(ð_conf->tx_adv_conf.vmdq_dcb_tx_conf, &vmdq_tx_conf,
+ sizeof(struct rte_eth_vmdq_dcb_tx_conf)));
+ }
+ else {
+ struct rte_eth_dcb_rx_conf rx_conf;
+ struct rte_eth_dcb_tx_conf tx_conf;
+
+ /* queue mapping configuration of DCB RX and TX */
+ if (dcb_conf->num_tcs == ETH_4_TCS)
+ dcb_q_mapping = DCB_4_TCS_Q_MAPPING;
+ else
+ dcb_q_mapping = DCB_8_TCS_Q_MAPPING;
+
+ rx_conf.nb_tcs = dcb_conf->num_tcs;
+ tx_conf.nb_tcs = dcb_conf->num_tcs;
+
+ for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++){
+ rx_conf.dcb_queue[i] = i;
+ tx_conf.dcb_queue[i] = i;
+ }
+ eth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB;
+ eth_conf->txmode.mq_mode = ETH_MQ_TX_DCB;
+ if (dcb_conf->pfc_en)
+ eth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT|ETH_DCB_PFC_SUPPORT;
+ else
+ eth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT;
+
+ (void)(rte_memcpy(ð_conf->rx_adv_conf.dcb_rx_conf, &rx_conf,
+ sizeof(struct rte_eth_dcb_rx_conf)));
+ (void)(rte_memcpy(ð_conf->tx_adv_conf.dcb_tx_conf, &tx_conf,
+ sizeof(struct rte_eth_dcb_tx_conf)));
+ }
+
+ return 0;
+}
+
+int
+init_port_dcb_config(portid_t pid,struct dcb_config *dcb_conf)
+{
+ struct rte_eth_conf port_conf;
+ struct rte_port *rte_port;
+ int retval;
+ uint16_t nb_vlan;
+ uint16_t i;
+
+ /* rxq and txq configuration in dcb mode */
+ nb_rxq = 128;
+ nb_txq = 128;
+ rx_free_thresh = 64;
+
+ memset(&port_conf,0,sizeof(struct rte_eth_conf));
+ /* Enter DCB configuration status */
+ dcb_config = 1;
+
+ nb_vlan = sizeof( vlan_tags )/sizeof( vlan_tags[ 0 ]);
+ /*set configuration of DCB in vt mode and DCB in non-vt mode*/
+ retval = get_eth_dcb_conf(&port_conf, dcb_conf);
+ if (retval < 0)
+ return retval;
+
+ rte_port = &ports[pid];
+ memcpy(&rte_port->dev_conf, &port_conf,sizeof(struct rte_eth_conf));
+
+ rxtx_port_config(rte_port);
+ /* VLAN filter */
+ rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
+ for (i = 0; i < nb_vlan; i++){
+ rx_vft_set(pid, vlan_tags[i], 1);
+ }
+
+ rte_eth_macaddr_get(pid, &rte_port->eth_addr);
+ map_port_queue_stats_mapping_registers(pid, rte_port);
+
+ rte_port->dcb_flag = 1;
+
+ return 0;
+}
+
+static void
+init_port(void)
+{
+ portid_t pid;
+
+ /* Configuration of Ethernet ports. */
+ ports = rte_zmalloc("testpmd: ports",
+ sizeof(struct rte_port) * RTE_MAX_ETHPORTS,
+ RTE_CACHE_LINE_SIZE);
+ if (ports == NULL) {
+ rte_exit(EXIT_FAILURE,
+ "rte_zmalloc(%d struct rte_port) failed\n",
+ RTE_MAX_ETHPORTS);
+ }
+
+ /* enabled allocated ports */
+ for (pid = 0; pid < nb_ports; pid++)
+ ports[pid].enabled = 1;
+}