From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id E1A2A6A80 for ; Mon, 26 Oct 2015 16:59:52 +0100 (CET) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP; 26 Oct 2015 08:59:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,201,1444719600"; d="scan'208";a="672006654" Received: from unknown (HELO localhost.ger.corp.intel.com) ([10.252.26.253]) by orsmga003.jf.intel.com with ESMTP; 26 Oct 2015 08:59:30 -0700 From: Remy Horton To: dev@dpdk.org Date: Mon, 26 Oct 2015 15:59:21 +0000 Message-Id: <1445875161-1808-3-git-send-email-remy.horton@intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1445875161-1808-1-git-send-email-remy.horton@intel.com> References: <1445875161-1808-1-git-send-email-remy.horton@intel.com> Subject: [dpdk-dev] [PATCH v2 2/2] doc: User-space ethtool sample application X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Oct 2015 15:59:54 -0000 Signed-off-by: Remy Horton --- doc/guides/sample_app_ug/ethtool.rst | 265 +++++++++++++++++++++++++++++++++++ doc/guides/sample_app_ug/index.rst | 1 + 2 files changed, 266 insertions(+) create mode 100644 doc/guides/sample_app_ug/ethtool.rst diff --git a/doc/guides/sample_app_ug/ethtool.rst b/doc/guides/sample_app_ug/ethtool.rst new file mode 100644 index 0000000..6d71908 --- /dev/null +++ b/doc/guides/sample_app_ug/ethtool.rst @@ -0,0 +1,265 @@ + +.. BSD LICENSE + Copyright(c) 2015 Intel Corporation. All rights reserved. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +EthTool Sample Application +========================== + +The Ethtool sample application shows an implementation of an +EthTool-like API and provides a console environment that allows +its use to query and change Ethernet card parameters. The sample +is based upon a simple L2 frame reflector. + + +Compiling the Application +------------------------- + +To compile the application: + +#. Go to the sample application directory: + + .. code-block:: console + + export RTE_SDK=/path/to/rte_sdk cd ${RTE_SD}/examples/ethtool + +#. Set the target (a default target is used if not specified). For example: + + .. code-block:: console + + export RTE_TARGET=x86_64-native-linuxapp-gcc + + See the *DPDK Getting Started Guide* for possible RTE_TARGET values. + +#. Build the application: + + .. code-block:: console + + make + +Running the Application +----------------------- + +The application requires an available core for each port, plus one. +The only available options are the standard ones for the EAL: + +.. code-block:: console + + ./build/ethtool [EAL options] + +Refer to the *DPDK Getting Started Guide* for general information on +running applications and the Environment Abstraction Layer (EAL) +options. + +Using the application +--------------------- + +The application is console-driven using the cmdline DPDK interface: + +.. code-block:: console + + EthApp> + +From this interface the available commands and descriptions of what +they do as as follows: + +drvinfo + Print driver info +eeprom + Dump EEPROM to file +link + Print port link states +macaddr + Gets/sets MAC address +mtu + Set NIC MTU +open + Open port +pause + Get/set port pause state +portstats + Print port statistics +regs + Dump port register(s) to file +ringparam + Get/set ring parameters +rxmode + Toggle port Rx mode +stop + Stop port +validate + Check that given MAC address is valid unicast address +vlan + Add/remove VLAN id +quit + Exit program + + +Explaination +------------ + +The following sections describe the most important parts of the code. + + +Base program +~~~~~~~~~~~~ + +The top-level, after some port initialisation routines, runs the following: + +.. code-block:: c + + for (idx_port = 0; idx_port < cnt_ports; idx_port++) { + ptr_port = &app_cfg.ports[idx_port]; + rte_eal_remote_launch(slave_main, ptr_port, idx_port + 1); + } + + ethapp_main(); + +Each slave core, or a subset of these cores if there are more cores then +NIC ports, runs the `slave core process`_ described below. The master core +then runs the `EthTool App`_ itself. + + +Slave core process +~~~~~~~~~~~~~~~~~~ + +Each slave core is assigned one of the available ports, and runs +the following code that implements a simple MAC frame refector: + +.. code-block:: c + + while (!ptr_port->exit_now) { + rte_spinlock_lock(&ptr_port->lock); + if (ptr_port->port_active == 0 ) { + rte_spinlock_unlock(&ptr_port->lock); + continue; + } + + /* Incoming frames */ + cnt_backlog_frames = ptr_txq->cnt_frames; + cnt_recv_frames = rte_eth_rx_burst( + ptr_port->idx_port, 0, + &buf_recv_frames[ptr_txq->cnt_frames], + MAX_BURST_LENGTH - cnt_backlog_frames + ); + if (cnt_recv_frames > 0) { + for (idx_frame = 0; + idx_frame < cnt_recv_frames; + idx_frame++) { + ptr_frame = buf_recv_frames[ + idx_frame + cnt_backlog_frames]; + process_frame(ptr_port, ptr_frame); + } + } + + /* Outgoing frames */ + if (ptr_txq->cnt_frames > 0) { + cnt_sent = rte_eth_tx_burst( + ptr_port->idx_port, 0, + ptr_txq->ptr_frames, + ptr_txq->cnt_frames + ); + /* Shuffle up unsent frame pointers */ + for (idx_frame = cnt_sent; + idx_frame < ptr_txq->cnt_frames; + idx_frame++) + ptr_txq->ptr_frames[idx_frame - cnt_sent] = + ptr_txq->ptr_frames[idx_frame]; + ptr_txq->cnt_frames -= cnt_sent; + } + rte_spinlock_unlock(&ptr_port->lock); + + } /* end for(;;) */ + +There is a check to make sure the port is in an active state. A burst +of frames is read and each frame within this burst is processed as +described below. Outgoing frames are then dispatched as a single burst, +with unsent frames being shuffled to the front of the outgoing queue if +not all of the frames could be sent. + +The processing of individial frames consists of setting the destination +address to be the source address, setting the source address to be the +MAC address of the port being handled, and then queueing the frame for +transmission: + +.. code-block:: c + + ptr_mac_hdr = rte_pktmbuf_mtod(ptr_frame, struct ether_hdr *); + ether_addr_copy(&ptr_mac_hdr->s_addr, &ptr_mac_hdr->d_addr); + rte_eth_macaddr_get(ptr_port->idx_port, &ptr_mac_hdr->s_addr); + ptr_port->tx_queue.ptr_frames[ptr_port->tx_queue.cnt_frames++] = + ptr_frame; + + +EthTool App +~~~~~~~~~~~ + +The ``foreground`` part of the EthTool sample is a console-based +interface that accepts commands as described in `using the +application`_. + +.. code-block:: c + + ctx_cmdline = cmdline_stdin_new(list_prompt_commands, "EthApp> "); + cmdline_interact(ctx_cmdline); + cmdline_stdin_exit(ctx_cmdline); + + +Individual call-back functions handle the detail associated with each +command, which make use of the functions defined in the `EthTool interface`_ +to the DPDK functions. + + +EthTool interface +~~~~~~~~~~~~~~~~~ + +The EthTool interface is built as a separate library, and implements +the following functions: + +- rte_ethtool_get_drvinfo +- rte_ethtool_get_regs_len +- rte_ethtool_get_regs +- rte_ethtool_get_link +- rte_ethtool_get_eeprom_len +- rte_ethtool_get_eeprom +- rte_ethtool_set_eeprom +- rte_ethtool_get_pauseparam +- rte_ethtool_set_pauseparam +- rte_ethtool_net_open +- rte_ethtool_net_stop +- rte_ethtool_net_get_mac_addr +- rte_ethtool_net_set_mac_addr +- rte_ethtool_net_validate_addr +- rte_ethtool_net_change_mtu +- rte_ethtool_net_get_stats64 +- rte_ethtool_net_vlan_rx_add_vid +- rte_ethtool_net_vlan_rx_kill_vid +- rte_ethtool_net_set_rx_mode +- rte_ethtool_get_ringparam +- rte_ethtool_set_ringparam diff --git a/doc/guides/sample_app_ug/index.rst b/doc/guides/sample_app_ug/index.rst index 9beedd9..086d3f2 100644 --- a/doc/guides/sample_app_ug/index.rst +++ b/doc/guides/sample_app_ug/index.rst @@ -41,6 +41,7 @@ Sample Applications User Guide intro cmd_line + ethtool exception_path hello_world skeleton -- 1.9.3