get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/8501/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 8501,
    "url": "https://patches.dpdk.org/api/patches/8501/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1446307051-29283-9-git-send-email-jingjing.wu@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1446307051-29283-9-git-send-email-jingjing.wu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1446307051-29283-9-git-send-email-jingjing.wu@intel.com",
    "date": "2015-10-31T15:57:30",
    "name": "[dpdk-dev,v3,8/9] app/testpmd: set up DCB forwarding based on traffic class",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "fe5f5da1b80cdb2ec81115bbb00835aae6aff624",
    "submitter": {
        "id": 47,
        "url": "https://patches.dpdk.org/api/people/47/?format=api",
        "name": "Jingjing Wu",
        "email": "jingjing.wu@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1446307051-29283-9-git-send-email-jingjing.wu@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/8501/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/8501/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id AEA1C8E91;\n\tSat, 31 Oct 2015 16:58:06 +0100 (CET)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby dpdk.org (Postfix) with ESMTP id 0F6A18E7F\n\tfor <dev@dpdk.org>; Sat, 31 Oct 2015 16:57:56 +0100 (CET)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n\tby orsmga103.jf.intel.com with ESMTP; 31 Oct 2015 08:57:56 -0700",
            "from shvmail01.sh.intel.com ([10.239.29.42])\n\tby orsmga003.jf.intel.com with ESMTP; 31 Oct 2015 08:57:57 -0700",
            "from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com\n\t[10.239.29.89])\n\tby shvmail01.sh.intel.com with ESMTP id t9VFvs3E032739;\n\tSat, 31 Oct 2015 23:57:54 +0800",
            "from shecgisg004.sh.intel.com (localhost [127.0.0.1])\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP\n\tid t9VFvoWm029716; Sat, 31 Oct 2015 23:57:52 +0800",
            "(from wujingji@localhost)\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id t9VFvowf029712; \n\tSat, 31 Oct 2015 23:57:50 +0800"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.20,224,1444719600\"; d=\"scan'208\";a=\"675702893\"",
        "From": "Jingjing Wu <jingjing.wu@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Sat, 31 Oct 2015 23:57:30 +0800",
        "Message-Id": "<1446307051-29283-9-git-send-email-jingjing.wu@intel.com>",
        "X-Mailer": "git-send-email 1.7.4.1",
        "In-Reply-To": "<1446307051-29283-1-git-send-email-jingjing.wu@intel.com>",
        "References": "<1446108827-7907-1-git-send-email-jingjing.wu@intel.com>\n\t<1446307051-29283-1-git-send-email-jingjing.wu@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v3 8/9] app/testpmd: set up DCB forwarding based\n\ton traffic class",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This patch changes the testpmd DCB forwarding stream to make it\nbased on traffic class.\nIt also fixes some coding style issues.\n\nSigned-off-by: Jingjing Wu <jingjing.wu@intel.com>\n---\n app/test-pmd/cmdline.c |  39 +++++++-----\n app/test-pmd/config.c  | 159 +++++++++++++++++++++----------------------------\n app/test-pmd/testpmd.c | 151 +++++++++++++++++++++++++---------------------\n app/test-pmd/testpmd.h |  23 +------\n 4 files changed, 176 insertions(+), 196 deletions(-)",
    "diff": "diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c\nindex b3c36f3..0254628 100644\n--- a/app/test-pmd/cmdline.c\n+++ b/app/test-pmd/cmdline.c\n@@ -1999,37 +1999,46 @@ cmd_config_dcb_parsed(void *parsed_result,\n                         __attribute__((unused)) void *data)\n {\n \tstruct cmd_config_dcb *res = parsed_result;\n-\tstruct dcb_config dcb_conf;\n \tportid_t port_id = res->port_id;\n \tstruct rte_port *port;\n+\tuint8_t pfc_en;\n+\tint ret;\n \n \tport = &ports[port_id];\n \t/** Check if the port is not started **/\n \tif (port->port_status != RTE_PORT_STOPPED) {\n-\t\tprintf(\"Please stop port %d first\\n\",port_id);\n+\t\tprintf(\"Please stop port %d first\\n\", port_id);\n \t\treturn;\n \t}\n \n-\tdcb_conf.num_tcs = (enum rte_eth_nb_tcs) res->num_tcs;\n-\tif ((dcb_conf.num_tcs != ETH_4_TCS) && (dcb_conf.num_tcs != ETH_8_TCS)){\n-\t\tprintf(\"The invalid number of traffic class,only 4 or 8 allowed\\n\");\n+\tif ((res->num_tcs != ETH_4_TCS) && (res->num_tcs != ETH_8_TCS)) {\n+\t\tprintf(\"The invalid number of traffic class,\"\n+\t\t\t\" only 4 or 8 allowed.\\n\");\n \t\treturn;\n \t}\n \n-\t/* DCB in VT mode */\n-\tif (!strncmp(res->vt_en, \"on\",2))\n-\t\tdcb_conf.dcb_mode = DCB_VT_ENABLED;\n+\tif (nb_fwd_lcores < res->num_tcs) {\n+\t\tprintf(\"nb_cores shouldn't be less than number of TCs.\\n\");\n+\t\treturn;\n+\t}\n+\tif (!strncmp(res->pfc_en, \"on\", 2))\n+\t\tpfc_en = 1;\n \telse\n-\t\tdcb_conf.dcb_mode = DCB_ENABLED;\n+\t\tpfc_en = 0;\n \n-\tif (!strncmp(res->pfc_en, \"on\",2)) {\n-\t\tdcb_conf.pfc_en = 1;\n-\t}\n+\t/* DCB in VT mode */\n+\tif (!strncmp(res->vt_en, \"on\", 2))\n+\t\tret = init_port_dcb_config(port_id, DCB_VT_ENABLED,\n+\t\t\t\t(enum rte_eth_nb_tcs)res->num_tcs,\n+\t\t\t\tpfc_en);\n \telse\n-\t\tdcb_conf.pfc_en = 0;\n+\t\tret = init_port_dcb_config(port_id, DCB_ENABLED,\n+\t\t\t\t(enum rte_eth_nb_tcs)res->num_tcs,\n+\t\t\t\tpfc_en);\n+\n \n-\tif (init_port_dcb_config(port_id,&dcb_conf) != 0) {\n-\t\tprintf(\"Cannot initialize network ports\\n\");\n+\tif (ret != 0) {\n+\t\tprintf(\"Cannot initialize network ports.\\n\");\n \t\treturn;\n \t}\n \ndiff --git a/app/test-pmd/config.c b/app/test-pmd/config.c\nindex 1ec6a77..ef87581 100644\n--- a/app/test-pmd/config.c\n+++ b/app/test-pmd/config.c\n@@ -1128,113 +1128,92 @@ rss_fwd_config_setup(void)\n \t}\n }\n \n-/*\n- * In DCB and VT on,the mapping of 128 receive queues to 128 transmit queues.\n- */\n-static void\n-dcb_rxq_2_txq_mapping(queueid_t rxq, queueid_t *txq)\n-{\n-\tif(dcb_q_mapping == DCB_4_TCS_Q_MAPPING) {\n-\n-\t\tif (rxq < 32)\n-\t\t\t/* tc0: 0-31 */\n-\t\t\t*txq = rxq;\n-\t\telse if (rxq < 64) {\n-\t\t\t/* tc1: 64-95 */\n-\t\t\t*txq =  (uint16_t)(rxq + 32);\n-\t\t}\n-\t\telse {\n-\t\t\t/* tc2: 96-111;tc3:112-127 */\n-\t\t\t*txq =  (uint16_t)(rxq/2 + 64);\n-\t\t}\n-\t}\n-\telse {\n-\t\tif (rxq < 16)\n-\t\t\t/* tc0 mapping*/\n-\t\t\t*txq = rxq;\n-\t\telse if (rxq < 32) {\n-\t\t\t/* tc1 mapping*/\n-\t\t\t *txq = (uint16_t)(rxq + 16);\n-\t\t}\n-\t\telse if (rxq < 64) {\n-\t\t\t/*tc2,tc3 mapping */\n-\t\t\t*txq =  (uint16_t)(rxq + 32);\n-\t\t}\n-\t\telse {\n-\t\t\t/* tc4,tc5,tc6 and tc7 mapping */\n-\t\t\t*txq =  (uint16_t)(rxq/2 + 64);\n-\t\t}\n-\t}\n-}\n-\n /**\n- * For the DCB forwarding test, each core is assigned on every port multi-transmit\n- * queue.\n+ * For the DCB forwarding test, each core is assigned on each traffic class.\n  *\n  * Each core is assigned a multi-stream, each stream being composed of\n  * a RX queue to poll on a RX port for input messages, associated with\n- * a TX queue of a TX port where to send forwarded packets.\n- * All packets received on the RX queue of index \"RxQj\" of the RX port \"RxPi\"\n- * are sent on the TX queue \"TxQl\" of the TX port \"TxPk\" according to the two\n- * following rules:\n- * In VT mode,\n- *    - TxPk = (RxPi + 1) if RxPi is even, (RxPi - 1) if RxPi is odd\n- *    - TxQl = RxQj\n- * In non-VT mode,\n- *    - TxPk = (RxPi + 1) if RxPi is even, (RxPi - 1) if RxPi is odd\n- *    There is a mapping of RxQj to TxQl to be required,and the mapping was implemented\n- *    in dcb_rxq_2_txq_mapping function.\n+ * a TX queue of a TX port where to send forwarded packets. All RX and\n+ * TX queues are mapping to the same traffic class.\n+ * If VMDQ and DCB co-exist, each traffic class on different POOLs share\n+ * the same core\n  */\n static void\n dcb_fwd_config_setup(void)\n {\n-\tportid_t   rxp;\n-\tportid_t   txp;\n-\tqueueid_t  rxq;\n-\tqueueid_t  nb_q;\n+\tstruct rte_eth_dcb_info rxp_dcb_info, txp_dcb_info;\n+\tportid_t txp, rxp = 0;\n+\tqueueid_t txq, rxq = 0;\n \tlcoreid_t  lc_id;\n-\tuint16_t sm_id;\n-\n-\tnb_q = nb_rxq;\n+\tuint16_t nb_rx_queue, nb_tx_queue;\n+\tuint16_t i, j, k, sm_id = 0;\n+\tuint8_t tc = 0;\n \n \tcur_fwd_config.nb_fwd_lcores = (lcoreid_t) nb_fwd_lcores;\n \tcur_fwd_config.nb_fwd_ports = nb_fwd_ports;\n \tcur_fwd_config.nb_fwd_streams =\n-\t\t(streamid_t) (nb_q * cur_fwd_config.nb_fwd_ports);\n+\t\t(streamid_t) (nb_rxq * cur_fwd_config.nb_fwd_ports);\n \n \t/* reinitialize forwarding streams */\n \tinit_fwd_streams();\n+\tsm_id = 0;\n+\tif ((rxp & 0x1) == 0)\n+\t\ttxp = (portid_t) (rxp + 1);\n+\telse\n+\t\ttxp = (portid_t) (rxp - 1);\n+\t/* get the dcb info on the first RX and TX ports */\n+\t(void)rte_eth_dev_get_dcb_info(fwd_ports_ids[rxp], &rxp_dcb_info);\n+\t(void)rte_eth_dev_get_dcb_info(fwd_ports_ids[txp], &txp_dcb_info);\n \n-\tsetup_fwd_config_of_each_lcore(&cur_fwd_config);\n-\trxp = 0; rxq = 0;\n \tfor (lc_id = 0; lc_id < cur_fwd_config.nb_fwd_lcores; lc_id++) {\n-\t\t/* a fwd core can run multi-streams */\n-\t\tfor (sm_id = 0; sm_id < fwd_lcores[lc_id]->stream_nb; sm_id++)\n-\t\t{\n-\t\t\tstruct fwd_stream *fs;\n-\t\t\tfs = fwd_streams[fwd_lcores[lc_id]->stream_idx + sm_id];\n-\t\t\tif ((rxp & 0x1) == 0)\n-\t\t\t\ttxp = (portid_t) (rxp + 1);\n-\t\t\telse\n-\t\t\t\ttxp = (portid_t) (rxp - 1);\n-\t\t\tfs->rx_port = fwd_ports_ids[rxp];\n-\t\t\tfs->rx_queue = rxq;\n-\t\t\tfs->tx_port = fwd_ports_ids[txp];\n-\t\t\tif (dcb_q_mapping == DCB_VT_Q_MAPPING)\n-\t\t\t\tfs->tx_queue = rxq;\n-\t\t\telse\n-\t\t\t\tdcb_rxq_2_txq_mapping(rxq, &fs->tx_queue);\n-\t\t\tfs->peer_addr = fs->tx_port;\n-\t\t\trxq = (queueid_t) (rxq + 1);\n-\t\t\tif (rxq < nb_q)\n-\t\t\t\tcontinue;\n-\t\t\trxq = 0;\n-\t\t\tif (numa_support && (nb_fwd_ports <= (nb_ports >> 1)))\n-\t\t\t\trxp = (portid_t)\n-\t\t\t\t\t(rxp + ((nb_ports >> 1) / nb_fwd_ports));\n-\t\t\telse\n-\t\t\t\trxp = (portid_t) (rxp + 1);\n+\t\tfwd_lcores[lc_id]->stream_nb = 0;\n+\t\tfwd_lcores[lc_id]->stream_idx = sm_id;\n+\t\tfor (i = 0; i < ETH_MAX_VMDQ_POOL; i++) {\n+\t\t\t/* if the nb_queue is zero, means this tc is\n+\t\t\t * not enabled on the POOL\n+\t\t\t */\n+\t\t\tif (rxp_dcb_info.tc_queue.tc_rxq[i][tc].nb_queue == 0)\n+\t\t\t\tbreak;\n+\t\t\tk = fwd_lcores[lc_id]->stream_nb +\n+\t\t\t\tfwd_lcores[lc_id]->stream_idx;\n+\t\t\trxq = rxp_dcb_info.tc_queue.tc_rxq[i][tc].base;\n+\t\t\ttxq = txp_dcb_info.tc_queue.tc_txq[i][tc].base;\n+\t\t\tnb_rx_queue = txp_dcb_info.tc_queue.tc_rxq[i][tc].nb_queue;\n+\t\t\tnb_tx_queue = txp_dcb_info.tc_queue.tc_txq[i][tc].nb_queue;\n+\t\t\tfor (j = 0; j < nb_rx_queue; j++) {\n+\t\t\t\tstruct fwd_stream *fs;\n+\n+\t\t\t\tfs = fwd_streams[k + j];\n+\t\t\t\tfs->rx_port = fwd_ports_ids[rxp];\n+\t\t\t\tfs->rx_queue = rxq + j;\n+\t\t\t\tfs->tx_port = fwd_ports_ids[txp];\n+\t\t\t\tfs->tx_queue = txq + j % nb_tx_queue;\n+\t\t\t\tfs->peer_addr = fs->tx_port;\n+\t\t\t}\n+\t\t\tfwd_lcores[lc_id]->stream_nb +=\n+\t\t\t\trxp_dcb_info.tc_queue.tc_rxq[i][tc].nb_queue;\n \t\t}\n+\t\tsm_id = (streamid_t) (sm_id + fwd_lcores[lc_id]->stream_nb);\n+\n+\t\ttc++;\n+\t\tif (tc < rxp_dcb_info.nb_tcs)\n+\t\t\tcontinue;\n+\t\t/* Restart from TC 0 on next RX port */\n+\t\ttc = 0;\n+\t\tif (numa_support && (nb_fwd_ports <= (nb_ports >> 1)))\n+\t\t\trxp = (portid_t)\n+\t\t\t\t(rxp + ((nb_ports >> 1) / nb_fwd_ports));\n+\t\telse\n+\t\t\trxp++;\n+\t\tif (rxp >= nb_fwd_ports)\n+\t\t\treturn;\n+\t\t/* get the dcb information on next RX and TX ports */\n+\t\tif ((rxp & 0x1) == 0)\n+\t\t\ttxp = (portid_t) (rxp + 1);\n+\t\telse\n+\t\t\ttxp = (portid_t) (rxp - 1);\n+\t\trte_eth_dev_get_dcb_info(fwd_ports_ids[rxp], &rxp_dcb_info);\n+\t\trte_eth_dev_get_dcb_info(fwd_ports_ids[txp], &txp_dcb_info);\n \t}\n }\n \n@@ -1354,10 +1333,6 @@ pkt_fwd_config_display(struct fwd_config *cfg)\n void\n fwd_config_display(void)\n {\n-\tif((dcb_config) && (nb_fwd_lcores == 1)) {\n-\t\tprintf(\"In DCB mode,the nb forwarding cores should be larger than 1\\n\");\n-\t\treturn;\n-\t}\n \tfwd_config_setup();\n \tpkt_fwd_config_display(&cur_fwd_config);\n }\ndiff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c\nindex 4c6aec6..2e302bb 100644\n--- a/app/test-pmd/testpmd.c\n+++ b/app/test-pmd/testpmd.c\n@@ -182,9 +182,6 @@ uint8_t dcb_config = 0;\n /* Whether the dcb is in testing status */\n uint8_t dcb_test = 0;\n \n-/* DCB on and VT on mapping is default */\n-enum dcb_queue_mapping_mode dcb_q_mapping = DCB_VT_Q_MAPPING;\n-\n /*\n  * Configurable number of RX/TX queues.\n  */\n@@ -1852,115 +1849,131 @@ const uint16_t vlan_tags[] = {\n };\n \n static  int\n-get_eth_dcb_conf(struct rte_eth_conf *eth_conf, struct dcb_config *dcb_conf)\n+get_eth_dcb_conf(struct rte_eth_conf *eth_conf,\n+\t\t enum dcb_mode_enable dcb_mode,\n+\t\t enum rte_eth_nb_tcs num_tcs,\n+\t\t uint8_t pfc_en)\n {\n-        uint8_t i;\n+\tuint8_t i;\n \n \t/*\n \t * Builds up the correct configuration for dcb+vt based on the vlan tags array\n \t * given above, and the number of traffic classes available for use.\n \t */\n-\tif (dcb_conf->dcb_mode == DCB_VT_ENABLED) {\n-\t\tstruct rte_eth_vmdq_dcb_conf vmdq_rx_conf;\n-\t\tstruct rte_eth_vmdq_dcb_tx_conf vmdq_tx_conf;\n+\tif (dcb_mode == DCB_VT_ENABLED) {\n+\t\tstruct rte_eth_vmdq_dcb_conf *vmdq_rx_conf =\n+\t\t\t\t&eth_conf->rx_adv_conf.vmdq_dcb_conf;\n+\t\tstruct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =\n+\t\t\t\t&eth_conf->tx_adv_conf.vmdq_dcb_tx_conf;\n \n \t\t/* VMDQ+DCB RX and TX configrations */\n-\t\tvmdq_rx_conf.enable_default_pool = 0;\n-\t\tvmdq_rx_conf.default_pool = 0;\n-\t\tvmdq_rx_conf.nb_queue_pools =\n-\t\t\t(dcb_conf->num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);\n-\t\tvmdq_tx_conf.nb_queue_pools =\n-\t\t\t(dcb_conf->num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);\n-\n-\t\tvmdq_rx_conf.nb_pool_maps = sizeof( vlan_tags )/sizeof( vlan_tags[ 0 ]);\n-\t\tfor (i = 0; i < vmdq_rx_conf.nb_pool_maps; i++) {\n-\t\t\tvmdq_rx_conf.pool_map[i].vlan_id = vlan_tags[ i ];\n-\t\t\tvmdq_rx_conf.pool_map[i].pools = 1 << (i % vmdq_rx_conf.nb_queue_pools);\n+\t\tvmdq_rx_conf->enable_default_pool = 0;\n+\t\tvmdq_rx_conf->default_pool = 0;\n+\t\tvmdq_rx_conf->nb_queue_pools =\n+\t\t\t(num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);\n+\t\tvmdq_tx_conf->nb_queue_pools =\n+\t\t\t(num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);\n+\n+\t\tvmdq_rx_conf->nb_pool_maps = vmdq_rx_conf->nb_queue_pools;\n+\t\tfor (i = 0; i < vmdq_rx_conf->nb_pool_maps; i++) {\n+\t\t\tvmdq_rx_conf->pool_map[i].vlan_id = vlan_tags[i];\n+\t\t\tvmdq_rx_conf->pool_map[i].pools =\n+\t\t\t\t1 << (i % vmdq_rx_conf->nb_queue_pools);\n \t\t}\n \t\tfor (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {\n-\t\t\tvmdq_rx_conf.dcb_tc[i] = i;\n-\t\t\tvmdq_tx_conf.dcb_tc[i] = i;\n+\t\t\tvmdq_rx_conf->dcb_tc[i] = i;\n+\t\t\tvmdq_tx_conf->dcb_tc[i] = i;\n \t\t}\n \n-\t\t/*set DCB mode of RX and TX of multiple queues*/\n+\t\t/* set DCB mode of RX and TX of multiple queues */\n \t\teth_conf->rxmode.mq_mode = ETH_MQ_RX_VMDQ_DCB;\n \t\teth_conf->txmode.mq_mode = ETH_MQ_TX_VMDQ_DCB;\n-\t\tif (dcb_conf->pfc_en)\n-\t\t\teth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT|ETH_DCB_PFC_SUPPORT;\n-\t\telse\n-\t\t\teth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT;\n-\n-\t\t(void)(rte_memcpy(&eth_conf->rx_adv_conf.vmdq_dcb_conf, &vmdq_rx_conf,\n-                                sizeof(struct rte_eth_vmdq_dcb_conf)));\n-\t\t(void)(rte_memcpy(&eth_conf->tx_adv_conf.vmdq_dcb_tx_conf, &vmdq_tx_conf,\n-                                sizeof(struct rte_eth_vmdq_dcb_tx_conf)));\n-\t}\n-\telse {\n-\t\tstruct rte_eth_dcb_rx_conf rx_conf;\n-\t\tstruct rte_eth_dcb_tx_conf tx_conf;\n-\n-\t\t/* queue mapping configuration of DCB RX and TX */\n-\t\tif (dcb_conf->num_tcs == ETH_4_TCS)\n-\t\t\tdcb_q_mapping = DCB_4_TCS_Q_MAPPING;\n-\t\telse\n-\t\t\tdcb_q_mapping = DCB_8_TCS_Q_MAPPING;\n-\n-\t\trx_conf.nb_tcs = dcb_conf->num_tcs;\n-\t\ttx_conf.nb_tcs = dcb_conf->num_tcs;\n-\n-\t\tfor (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++){\n-\t\t\trx_conf.dcb_tc[i] = i;\n-\t\t\ttx_conf.dcb_tc[i] = i;\n+\t} else {\n+\t\tstruct rte_eth_dcb_rx_conf *rx_conf =\n+\t\t\t\t&eth_conf->rx_adv_conf.dcb_rx_conf;\n+\t\tstruct rte_eth_dcb_tx_conf *tx_conf =\n+\t\t\t\t&eth_conf->tx_adv_conf.dcb_tx_conf;\n+\n+\t\trx_conf->nb_tcs = num_tcs;\n+\t\ttx_conf->nb_tcs = num_tcs;\n+\n+\t\tfor (i = 0; i < num_tcs; i++) {\n+\t\t\trx_conf->dcb_tc[i] = i;\n+\t\t\ttx_conf->dcb_tc[i] = i;\n \t\t}\n-\t\teth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB;\n+\t\teth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB_RSS;\n+\t\teth_conf->rx_adv_conf.rss_conf.rss_hf = rss_hf;\n \t\teth_conf->txmode.mq_mode = ETH_MQ_TX_DCB;\n-\t\tif (dcb_conf->pfc_en)\n-\t\t\teth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT|ETH_DCB_PFC_SUPPORT;\n-\t\telse\n-\t\t\teth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT;\n-\n-\t\t(void)(rte_memcpy(&eth_conf->rx_adv_conf.dcb_rx_conf, &rx_conf,\n-                                sizeof(struct rte_eth_dcb_rx_conf)));\n-\t\t(void)(rte_memcpy(&eth_conf->tx_adv_conf.dcb_tx_conf, &tx_conf,\n-                                sizeof(struct rte_eth_dcb_tx_conf)));\n \t}\n \n+\tif (pfc_en)\n+\t\teth_conf->dcb_capability_en =\n+\t\t\t\tETH_DCB_PG_SUPPORT | ETH_DCB_PFC_SUPPORT;\n+\telse\n+\t\teth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT;\n+\n \treturn 0;\n }\n \n int\n-init_port_dcb_config(portid_t pid,struct dcb_config *dcb_conf)\n+init_port_dcb_config(portid_t pid,\n+\t\t     enum dcb_mode_enable dcb_mode,\n+\t\t     enum rte_eth_nb_tcs num_tcs,\n+\t\t     uint8_t pfc_en)\n {\n \tstruct rte_eth_conf port_conf;\n+\tstruct rte_eth_dev_info dev_info;\n \tstruct rte_port *rte_port;\n \tint retval;\n-\tuint16_t nb_vlan;\n \tuint16_t i;\n \n-\t/* rxq and txq configuration in dcb mode */\n-\tnb_rxq = 128;\n-\tnb_txq = 128;\n+\trte_eth_dev_info_get(pid, &dev_info);\n+\n+\t/* If dev_info.vmdq_pool_base is greater than 0,\n+\t * the queue id of vmdq pools is started after pf queues.\n+\t */\n+\tif (dcb_mode == DCB_VT_ENABLED && dev_info.vmdq_pool_base > 0) {\n+\t\tprintf(\"VMDQ_DCB multi-queue mode is nonsensical\"\n+\t\t\t\" for port %d.\", pid);\n+\t\treturn -1;\n+\t}\n+\n+\t/* Assume the ports in testpmd have the same dcb capability\n+\t * and has the same number of rxq and txq in dcb mode\n+\t */\n+\tif (dcb_mode == DCB_VT_ENABLED) {\n+\t\tnb_rxq = dev_info.max_rx_queues;\n+\t\tnb_txq = dev_info.max_tx_queues;\n+\t} else {\n+\t\t/*if vt is disabled, use all pf queues */\n+\t\tif (dev_info.vmdq_pool_base == 0) {\n+\t\t\tnb_rxq = dev_info.max_rx_queues;\n+\t\t\tnb_txq = dev_info.max_tx_queues;\n+\t\t} else {\n+\t\t\tnb_rxq = (queueid_t)num_tcs;\n+\t\t\tnb_txq = (queueid_t)num_tcs;\n+\n+\t\t}\n+\t}\n \trx_free_thresh = 64;\n \n-\tmemset(&port_conf,0,sizeof(struct rte_eth_conf));\n+\tmemset(&port_conf, 0, sizeof(struct rte_eth_conf));\n \t/* Enter DCB configuration status */\n \tdcb_config = 1;\n \n-\tnb_vlan = sizeof( vlan_tags )/sizeof( vlan_tags[ 0 ]);\n \t/*set configuration of DCB in vt mode and DCB in non-vt mode*/\n-\tretval = get_eth_dcb_conf(&port_conf, dcb_conf);\n+\tretval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);\n \tif (retval < 0)\n \t\treturn retval;\n \n \trte_port = &ports[pid];\n-\tmemcpy(&rte_port->dev_conf, &port_conf,sizeof(struct rte_eth_conf));\n+\tmemcpy(&rte_port->dev_conf, &port_conf, sizeof(struct rte_eth_conf));\n \n \trxtx_port_config(rte_port);\n \t/* VLAN filter */\n \trte_port->dev_conf.rxmode.hw_vlan_filter = 1;\n-\tfor (i = 0; i < nb_vlan; i++){\n+\tfor (i = 0; i < RTE_DIM(vlan_tags); i++)\n \t\trx_vft_set(pid, vlan_tags[i], 1);\n-\t}\n \n \trte_eth_macaddr_get(pid, &rte_port->eth_addr);\n \tmap_port_queue_stats_mapping_registers(pid, rte_port);\ndiff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h\nindex f925df7..3661755 100644\n--- a/app/test-pmd/testpmd.h\n+++ b/app/test-pmd/testpmd.h\n@@ -255,25 +255,6 @@ enum dcb_mode_enable\n \tDCB_ENABLED\n };\n \n-/*\n- * DCB general config info\n- */\n-struct dcb_config {\n-\tenum dcb_mode_enable dcb_mode;\n-\tuint8_t vt_en;\n-\tenum rte_eth_nb_tcs num_tcs;\n-\tuint8_t pfc_en;\n-};\n-\n-/*\n- * In DCB io FWD mode, 128 RX queue to 128 TX queue mapping\n- */\n-enum dcb_queue_mapping_mode {\n-\tDCB_VT_Q_MAPPING = 0,\n-\tDCB_4_TCS_Q_MAPPING,\n-\tDCB_8_TCS_Q_MAPPING\n-};\n-\n #define MAX_TX_QUEUE_STATS_MAPPINGS 1024 /* MAX_PORT of 32 @ 32 tx_queues/port */\n #define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */\n \n@@ -536,7 +517,9 @@ void dev_set_link_down(portid_t pid);\n void init_port_config(void);\n void set_port_slave_flag(portid_t slave_pid);\n void clear_port_slave_flag(portid_t slave_pid);\n-int init_port_dcb_config(portid_t pid,struct dcb_config *dcb_conf);\n+int init_port_dcb_config(portid_t pid, enum dcb_mode_enable dcb_mode,\n+\t\t     enum rte_eth_nb_tcs num_tcs,\n+\t\t     uint8_t pfc_en);\n int start_port(portid_t pid);\n void stop_port(portid_t pid);\n void close_port(portid_t pid);\n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "8/9"
    ]
}