def event_send(self, event):
"""Send event to VES"""
- server_url = "http{}://{}:{}/{}eventListener/v1{}".format(
+ server_url = "http{}://{}:{}/{}eventListener/v3{}".format(
's' if self.__plugin_config['UseHttps'] else '', self.__plugin_config['Domain'],
int(self.__plugin_config['Port']), '{}/'.format(
'/{}'.format(self.__plugin_config['Path'])) if (len(self.__plugin_config['Path']) > 0) else '',
and free hugepages on a platform as well as what is available in terms of
hugepages per socket.
-* *RDT plugin*: A read plugin that provides the last level cache utilitzation and
- memory bandwidth utilization
-
* *Open vSwitch events Plugin*: A read plugin that retrieves events from OVS.
+* *Open vSwitch stats Plugin*: A read plugin that retrieve flow and interface
+ stats from OVS.
+
* *mcelog plugin*: A read plugin that uses mcelog client protocol to check for
memory Machine Check Exceptions and sends the stats for reported exceptions
+* *RDT plugin*: A read plugin that provides the last level cache utilization and
+ memory bandwidth utilization
+
All the plugins above are available on the collectd master, except for the
ceilometer plugin as it's a python based plugin and only C plugins are accepted
by the collectd community. The ceilometer plugin lives in the OpenStack
repositories.
-Other plugins under development or existing as a pull request into collectd master:
-
-* *dpdkevents*: A read plugin that retrieves DPDK link status and DPDK
- forwarding cores liveliness status (DPDK Keep Alive).
-
-* *Open vSwitch stats Plugin*: A read plugin that retrieve flow and interface
- stats from OVS.
+Other plugins existing as a pull request into collectd master:
* *SNMP Agent*: A write plugin that will act as a AgentX subagent that receives
and handles queries from SNMP master agent and returns the data collected
fanspeed, current, flow, power etc. Also, the plugin monitors Intelligent
Platform Management Interface (IPMI) System Event Log (SEL) and sends the
+
**Plugins included in the Danube release:**
* Hugepages
.. Describe the specific capabilities and usage for <XYZ> feature.
.. Provide enough information that a user will be able to operate the feature on a deployed scenario.
-**NOTE** Plugins included in the OPNFV D release will be built-in to the fuel
-plugin and available in the /opt/opnfv directory on the fuel master. You don't
-need to clone the barometer/collectd repos to use these, but you can configure
-them as shown in the examples below. Please note, the collectd plugins in OPNFV
-are configured with reasonable defaults, but can be overriden.
+.. note:: Plugins included in the OPNFV D release will be built-in to the fuel
+ plugin and available in the /opt/opnfv directory on the fuel master. You don't
+ need to clone the barometer/collectd repos to use these, but you can configure
+ them as shown in the examples below.
+
+ The collectd plugins in OPNFV are configured with reasonable defaults, but can
+ be overridden.
Building all Barometer upstreamed plugins from scratch
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The plugins that have been merged to the collectd master branch can all be
built and configured through the barometer repository.
-**NOTE: sudo permissions are required to install collectd.**
-
-**NOTE: These are instructions for Ubuntu 16.04.**
+.. note::
+ * sudo permissions are required to install collectd.
+ * These are instructions for Ubuntu 16.04
To build and install these dependencies, clone the barometer repo:
$ cd barometer/src && sudo make && sudo make install
This will install collectd as a service and the base install directory
-is /opt/collectd.
+will be /opt/collectd.
Sample configuration files can be found in '/opt/collectd/etc/collectd.conf.d'
-**Note**: Exec plugin requires non-root user to execute scripts. By default,
-`collectd_exec` user is used. Barometer scripts do *not* create this user. It
-needs to be manually added or exec plugin configuration has to be changed to use
-other, existing user before starting collectd service.
+.. note::
+ - If you plan on using the Exec plugin, the plugin requires non-root
+ user to execute scripts. By default, `collectd_exec` user is used. Barometer
+ scripts do *not* create this user. It needs to be manually added or exec plugin
+ configuration has to be changed to use other, existing user before starting
+ collectd service.
-Please note if you are using any Open vSwitch plugins you need to run:
+ - If you don't want to use one of the Barometer plugins, simply remove the
+ sample config file from '/opt/collectd/etc/collectd.conf.d'
+ - If you are using any Open vSwitch plugins you need to run:
.. code:: bash
$ sudo ovs-vsctl set-manager ptcp:6640
+
+Below is the per plugin installation and configuration guide, if you only want
+to install some/particular plugins.
+
DPDK statistics plugin
^^^^^^^^^^^^^^^^^^^^^^
Repo: https://github.com/collectd/collectd
Branch: master
-Dependencies: DPDK (http://dpdk.org/)
+Dependencies: DPDK (http://dpdk.org/) Min_Version: 16.04
To build and install DPDK to /usr please see:
https://github.com/collectd/collectd/blob/master/docs/BUILD.dpdkstat.md
For more information on the plugin parameters, please see:
https://github.com/collectd/collectd/blob/master/src/collectd.conf.pod
-Please also note that if you are not building and installing DPDK system-wide
-you will need to specify the specific paths to the header files and libraries
-using LIBDPDK_CPPFLAGS and LIBDPDK_LDFLAGS. You will also need to add the DPDK
-library symbols to the shared library path using ldconfig. Note that this
-update to the shared library path is not persistant (i.e. it will not survive a
-reboot).
+.. note:: If you are not building and installing DPDK system-wide
+ you will need to specify the specific paths to the header files and libraries
+ using LIBDPDK_CPPFLAGS and LIBDPDK_LDFLAGS. You will also need to add the DPDK
+ library symbols to the shared library path using ldconfig. Note that this
+ update to the shared library path is not persistent (i.e. it will not survive a
+ reboot).
+
+.. note:: Plugin initialization time depends on read interval. It requires
+ 5 read cycles to set up internal buffers and states. During that time
+ no statistics are submitted. Also if plugin is running and the number of DPDK
+ ports is increased, internal buffers are resized. That requires 3 read cycles
+ and no port statistics are submitted in that time.
DPDK events plugin
^^^^^^^^^^^^^^^^^^^^^^
.. code:: bash
- $ git clone https://github.com/maryamtahhan/collectd.git
+ $ git clone https://github.com/collectd/collectd.git
$ cd collectd
$ ./build.sh
$ ./configure --enable-syslog --enable-logfile --enable-debug
For more information on the plugin parameters, please see:
https://github.com/collectd/collectd/blob/master/src/collectd.conf.pod
-Please also note that if you are not building and installing DPDK system-wide
-you will need to specify the specific paths to the header files and libraries
-using LIBDPDK_CPPFLAGS and LIBDPDK_LDFLAGS. You will also need to add the DPDK
-library symbols to the shared library path using ldconfig. Note that this
-update to the shared library path is not persistant (i.e. it will not survive a
-reboot).
+
+.. note:: If you are not building and installing DPDK system-wide
+ you will need to specify the specific paths to the header files and libraries
+ using LIBDPDK_CPPFLAGS and LIBDPDK_LDFLAGS. You will also need to add the DPDK
+ library symbols to the shared library path using ldconfig. Note that this
+ update to the shared library path is not persistent (i.e. it will not survive a
+ reboot).
.. code:: bash
--- /dev/null
+INTEL-BIOS-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE
+ FROM SNMPv2-SMI
+
+ hostAssist
+ FROM Intel-SA-MIB
+
+ DisplayString
+ FROM SNMPv2-TC;
+
+--*****************************************************************************
+--
+-- MODULE IDENTITY AND REVISION GROUP
+--
+--*****************************************************************************
+
+intelBios MODULE-IDENTITY
+ LAST-UPDATED "201610241700Z" -- coordinated universal time UTC format is YYMMDDHHmmZ
+ ORGANIZATION "Intel, Server Management Software"
+ CONTACT-INFO " "
+ DESCRIPTION "This SNMP MIB module retrieves System Management BIOS (SMBIOS)
+ information from DMI table using dmidecode.
+
+ Version: 1.0 10/24/2016
+
+ Intel copyright information 2016"
+ ::= { hostAssist 2 }
+
+-------------------------------------------------------------------------------
+-- BIOS scalars
+-------------------------------------------------------------------------------
+
+biosVendor OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios vendor."
+ ::= { intelBios 1 }
+
+biosVersion OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios version."
+ ::= { intelBios 2 }
+
+biosReleaseDate OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios release date."
+ ::= { intelBios 3 }
+
+biosRevision OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios revision."
+ ::= { intelBios 4 }
+
+END
--- /dev/null
+Intel-Common-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ enterprises FROM RFC1155-SMI;
+
+-- Categories
+
+intel OBJECT IDENTIFIER ::= { enterprises 343 }
+
+--
+-- Intel Private space divides into 3 branches at the top. They are
+-- identifiers, products, and experimental.
+--
+-- 'identifers' branch typically contains objects which are used as
+-- constants. For example, if a mib contained an object identifier
+-- "appliance-type", somewhere down under identifiers would be a list
+-- containing OIDs for "refrigerator", "toaster", etc. Currently
+-- there are 3 groups under identifiers; systems, objects and
+-- comm-methods.
+-- 'systems' contains objects for system type such as PCs, hubs, etc.
+-- 'objects' contains identifiers for component pieces.
+-- 'comm-methods' refers to the transmission medium used in
+-- proxy-to-agent conversation.
+--
+-- 'products' branch contains objects which are specifically Intel
+-- products. Under this branch go all MIBs for Intel products.
+--
+-- 'experimental' is for exactly what the name implies.
+--
+-- 'information-technology' encompasses the work of the Information
+-- Technology (IT) group within Intel.
+--
+-- For example, an identifier for a toaster would exist under
+-- 'identifiers.systems.toasters' while another identifier for an
+-- Intel specific toaster MIB would live under 'products.appliances'.
+--
+
+identifiers OBJECT IDENTIFIER ::= { intel 1 }
+products OBJECT IDENTIFIER ::= { intel 2 }
+experimental OBJECT IDENTIFIER ::= { intel 3 }
+information-technology OBJECT IDENTIFIER ::= { intel 4 }
+sysProducts OBJECT IDENTIFIER ::= { intel 5 }
+mib2ext OBJECT IDENTIFIER ::= { intel 6 }
+hw OBJECT IDENTIFIER ::= { intel 7 }
+wekiva OBJECT IDENTIFIER ::= { intel 111 }
+-- Groups under 'identifiers'
+
+systems OBJECT IDENTIFIER ::= { identifiers 1 }
+objects OBJECT IDENTIFIER ::= { identifiers 2 }
+comm-methods OBJECT IDENTIFIER ::= { identifiers 3 }
+
+pc-systems OBJECT IDENTIFIER ::= { systems 1 }
+proxy-systems OBJECT IDENTIFIER ::= { systems 2 }
+hub-systems OBJECT IDENTIFIER ::= { systems 3 }
+switch-systems OBJECT IDENTIFIER ::= { systems 4 }
+
+local-proxy-1 OBJECT IDENTIFIER ::= { comm-methods 1 }
+pc-novell-1 OBJECT IDENTIFIER ::= { comm-methods 2 }
+
+-- Identifiers for 'hub-systems'
+-- Note: These items match the definitions for moduleType
+-- in intelhub.mib.
+
+express10-100Stack OBJECT IDENTIFIER ::= { hub-systems 1 }
+express12TX OBJECT IDENTIFIER ::= { hub-systems 2 }
+express24TX OBJECT IDENTIFIER ::= { hub-systems 3 }
+expressReserved OBJECT IDENTIFIER ::= { hub-systems 4 }
+expressBridge OBJECT IDENTIFIER ::= { hub-systems 6 }
+express210-12 OBJECT IDENTIFIER ::= { hub-systems 7 }
+express210-24 OBJECT IDENTIFIER ::= { hub-systems 8 }
+express220-12 OBJECT IDENTIFIER ::= { hub-systems 9 }
+express220-24 OBJECT IDENTIFIER ::= { hub-systems 10 }
+express300Stack OBJECT IDENTIFIER ::= { hub-systems 11 }
+express320-16 OBJECT IDENTIFIER ::= { hub-systems 12 }
+express320-24 OBJECT IDENTIFIER ::= { hub-systems 13 }
+
+-- Groups under 'products'
+
+pc-products OBJECT IDENTIFIER ::= { products 1 }
+hub-products OBJECT IDENTIFIER ::= { products 2 }
+proxy OBJECT IDENTIFIER ::= { products 3 }
+print-products OBJECT IDENTIFIER ::= { products 4 }
+network-products OBJECT IDENTIFIER ::= { products 5 }
+snmp-agents OBJECT IDENTIFIER ::= { products 6 }
+nic-products OBJECT IDENTIFIER ::= { products 7 }
+server-management OBJECT IDENTIFIER ::= { products 10 }
+switch-products OBJECT IDENTIFIER ::= { products 11 }
+i2o OBJECT IDENTIFIER ::= { products 120 }
+-- Groups under 'hub-products'
+
+express110 OBJECT IDENTIFIER ::= { hub-products 1 }
+
+-- Groups under 'print-products'
+
+netport-1 OBJECT IDENTIFIER ::= { print-products 1 }
+netport-2 OBJECT IDENTIFIER ::= { print-products 2 }
+netport-express OBJECT IDENTIFIER ::= { print-products 3 }
+
+-- Groups under 'network-products'
+
+lanDesk OBJECT IDENTIFIER ::= { network-products 1 }
+ld-alarms OBJECT IDENTIFIER ::= { lanDesk 1 }
+internetServer-2 OBJECT IDENTIFIER ::= { network-products 2 }
+iS-alarms OBJECT IDENTIFIER ::= { internetServer-2 1 }
+
+-- Groups under 'experimental'
+
+-- <none>
+
+--
+
+END
+
--- /dev/null
+INTEL-MCELOG-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32
+ FROM SNMPv2-SMI
+
+ hostAssist
+ FROM Intel-SA-MIB
+
+ DisplayString
+ FROM SNMPv2-TC;
+
+--*****************************************************************************
+--
+-- MODULE IDENTITY AND REVISION GROUP
+--
+--*****************************************************************************
+
+intelMcelog MODULE-IDENTITY
+ LAST-UPDATED "201610241700Z" -- coordinated universal time UTC format is YYMMDDHHmmZ
+ ORGANIZATION "Intel, Server Management Software"
+ CONTACT-INFO " "
+ DESCRIPTION "This SNMP MIB module logs and accounts machine memory, IO, and CPU
+ hardware errors on modern x86 Linux systems.
+
+ Version: 1.0 10/24/2016
+
+ Intel copyright information 2016"
+ ::= { hostAssist 3 }
+
+OneBasedIndex ::= Integer32(1..2147483647)
+
+-------------------------------------------------------------------------------
+-- Intel Mcelog Table
+-------------------------------------------------------------------------------
+
+memoryTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF MemoryTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This Group defines the Intel RDT Groups Table."
+ ::= { intelMcelog 2 }
+
+memoryTableEntry OBJECT-TYPE
+ SYNTAX MemoryTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION "This Group defines the Mcelog Memory Table Entry."
+ INDEX { memoryGroupIndex }
+ ::= { memoryTable 1 }
+
+MemoryTableEntry ::= SEQUENCE {
+ memoryGroupIndex OneBasedIndex,
+ memoryGroupDescr DisplayString,
+ memoryCorrectedErrors Integer32,
+ memoryCorrectedTimedErrors Integer32,
+ memoryUncorrectedErrors Integer32,
+ memoryUncorrectedTimedErrors Integer32
+}
+
+memoryGroupIndex OBJECT-TYPE
+ SYNTAX OneBasedIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This attribute defines the index of the Mcelog memory group."
+ ::= { memoryTableEntry 1 }
+
+memoryGroupDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual string containing information about the socket and
+ DMI name (*TODO*)."
+ ::= { memoryTableEntry 2 }
+
+memoryCorrectedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the total number of corrected errors."
+ ::= { memoryTableEntry 3 }
+
+memoryCorrectedTimedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ UNITS "in 24h"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the number of corrected errors in
+ last 24 hours."
+ ::= { memoryTableEntry 4 }
+
+memoryUncorrectedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the total number of uncorrected errors."
+ ::= { memoryTableEntry 5 }
+
+memoryUncorrectedTimedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ UNITS "in 24h"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the number of uncorrected errors in
+ last 24 hours."
+ ::= { memoryTableEntry 6 }
+
+END
--- /dev/null
+INTEL-RDT-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32, Counter64
+ FROM SNMPv2-SMI
+
+ hostAssist
+ FROM Intel-SA-MIB
+
+ DisplayString
+ FROM SNMPv2-TC;
+
+--*****************************************************************************
+--
+-- MODULE IDENTITY AND REVISION GROUP
+--
+--*****************************************************************************
+
+intelRdt MODULE-IDENTITY
+ LAST-UPDATED "201610241700Z" -- coordinated universal time UTC format is YYMMDDHHmmZ
+ ORGANIZATION "Intel, Server Management Software"
+ CONTACT-INFO " "
+ DESCRIPTION "This SNMP MIB module supports the Intel RDT SNMP subagent for monitoring
+ information provided by monitoring features of Intel Resource Director
+ Technology (Intel(R) RDT) like Cache Monitoring Technology (CMT),
+ Memory Bandwidth Monitoring (MBM). These features provide information about
+ utilization of shared resources like last level cache occupancy, local
+ memory bandwidth usage, remote memory bandwidth usage, instructions per clock.
+
+ Version: 1.0 10/24/2016
+
+ Intel copyright information 2016"
+ ::= { hostAssist 1 }
+
+OneBasedIndex ::= Integer32(1..2147483647)
+
+-------------------------------------------------------------------------------
+-- Intel RDT Table
+-------------------------------------------------------------------------------
+
+rdtGroupNumber OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of network interfaces (regardless of their
+ current state) present on this system."
+ ::= { intelRdt 1 }
+
+rdtTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF RdtTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This Group defines the Intel RDT Groups Table."
+ ::= { intelRdt 2 }
+
+rdtTableEntry OBJECT-TYPE
+ SYNTAX RdtTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION "This Group defines the Intel RDT Groups Table Entry."
+ INDEX { rdtGroupIndex }
+ ::= { rdtTable 1 }
+
+RdtTableEntry ::= SEQUENCE {
+ rdtGroupIndex OneBasedIndex,
+ rdtGroupDescr DisplayString,
+ rdtLlc Counter64,
+ rdtIpc Counter64,
+ rdtMbmRemote Counter64,
+ rdtMbmLocal Counter64
+}
+
+rdtGroupIndex OBJECT-TYPE
+ SYNTAX OneBasedIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This attribute defines the index of the Intel RDT group."
+ ::= { rdtTableEntry 1 }
+
+rdtGroupDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual string containing information about the groups of cores
+ on which to monitor supported events."
+ ::= { rdtTableEntry 2 }
+
+rdtLlc OBJECT-TYPE
+ SYNTAX Counter64
+ UNITS "bytes"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the last level cache occupancy."
+ ::= { rdtTableEntry 3 }
+
+rdtIpc OBJECT-TYPE
+ SYNTAX DisplayString
+ UNITS "ipc"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the instructions per clock."
+ ::= { rdtTableEntry 4 }
+
+rdtMbmRemote OBJECT-TYPE
+ SYNTAX Counter64
+ UNITS "bytes/sec"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the Remote (Socket) memory bandwidth usage."
+ ::= { rdtTableEntry 5 }
+
+rdtMbmLocal OBJECT-TYPE
+ SYNTAX Counter64
+ UNITS "bytes/sec"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the Local (Socket) memory bandwidth usage."
+ ::= { rdtTableEntry 6 }
+
+END
--- /dev/null
+Intel-SA-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ server-management FROM Intel-Common-MIB;
+
+software OBJECT IDENTIFIER ::= { server-management 3 }
+baseboardGroup OBJECT IDENTIFIER ::= { software 5 }
+hostAssist OBJECT IDENTIFIER ::= { baseboardGroup 1 }
+
+END
--- /dev/null
+# Copyright 2017 OPNFV
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+<LoadPlugin dpdkevents>
+ Interval 1
+</LoadPlugin>
+
+<Plugin "dpdkevents">
+ <EAL>
+# Coremask "0x1"
+# MemoryChannels "4"
+# FilePrefix "rte"
+ </EAL>
+ <Event "link_status">
+ SendEventsOnUpdate false
+ EnabledPortMask 0xffff
+ SendNotification true
+ </Event>
+ <Event "keep_alive">
+ SendEventsOnUpdate false
+ LCoreMask "0xf"
+ KeepAliveShmName "/dpdk_keepalive_shm_name"
+ SendNotification true
+ </Event>
+</Plugin>
force_make: $(TAG_DONE_FLAG)
$(AT)cd $(WORK_DIR) && git pull $(DPDK_URL) $(DPDK_TAG)
$(AT)sed -i -e 's/CONFIG_RTE_BUILD_SHARED_LIB=./CONFIG_RTE_BUILD_SHARED_LIB=y/g' $(CONFIG_FILE_LINUXAPP)
+ $(AT)sed -i -e 's/CONFIG_RTE_EAL_PMD_PATH=.*/CONFIG_RTE_EAL_PMD_PATH=\"\/usr\/lib\/dpdk-pmd\/\"/g' $(CONFIG_FILE_LINUXAPP)
$(AT)sed -i -e 's/CONFIG_RTE_LIBRTE_KNI=./CONFIG_RTE_LIBRTE_KNI=n/g' $(CONFIG_FILE_LINUXAPP)
$(AT)cd $(WORK_DIR); make config T=$(DPDK_TARGET) -j; make -j
$(AT)cd `dirname $(CONFIG_FILE_LINUXAPP)` && git checkout `basename $(CONFIG_FILE_LINUXAPP)` && cd -
install: $(INSTALL_TARGET)
$(AT)cd $(WORK_DIR); sudo make -j install prefix=/usr; cd -
+ $(AT)sudo mkdir -p /usr/lib/dpdk-pmd
+ $(AT)find /usr/lib -type f -name 'librte_pmd*' | while read path; do sudo ln -fs $$path /usr/lib/dpdk-pmd/$$(echo $$path | grep -o 'librte_.*so'); done
$(AT)sudo cp -a $(WORK_DIR)/build/kmod $(INSTALL_DIR)/lib/modules/$(KERNEL_VERSION)
@echo "install done"