From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <shreyansh.jain@nxp.com>
Received: from NAM03-BY2-obe.outbound.protection.outlook.com
 (mail-by2nam03on0061.outbound.protection.outlook.com [104.47.42.61])
 by dpdk.org (Postfix) with ESMTP id 0A1C691AC
 for <dev@dpdk.org>; Wed,  7 Sep 2016 16:10:13 +0200 (CEST)
Received: from BN6PR03CA0059.namprd03.prod.outlook.com (10.173.137.21) by
 BLUPR0301MB2004.namprd03.prod.outlook.com (10.164.22.18) with Microsoft SMTP
 Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id
 15.1.599.9; Wed, 7 Sep 2016 14:10:09 +0000
Received: from BY2FFO11FD055.protection.gbl (2a01:111:f400:7c0c::179) by
 BN6PR03CA0059.outlook.office365.com (2603:10b6:404:4c::21) with Microsoft
 SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384)
 id 15.1.609.9 via Frontend Transport; Wed, 7 Sep 2016 14:10:09 +0000
Authentication-Results: spf=fail (sender IP is 192.88.168.50)
 smtp.mailfrom=nxp.com; rehivetech.com; dkim=none (message not signed)
 header.d=none;rehivetech.com; dmarc=fail action=none header.from=nxp.com;
Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not
 designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; 
 client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net;
Received: from tx30smr01.am.freescale.net (192.88.168.50) by
 BY2FFO11FD055.mail.protection.outlook.com (10.1.15.192) with Microsoft SMTP
 Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.587.6
 via Frontend Transport; Wed, 7 Sep 2016 14:10:08 +0000
Received: from Tophie.ap.freescale.net ([10.232.14.87])
 by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id u87E8BD0013556;
 Wed, 7 Sep 2016 07:10:06 -0700
From: Shreyansh Jain <shreyansh.jain@nxp.com>
To: <dev@dpdk.org>
CC: <hemant.agrawal@nxp.com>, Shreyansh Jain <shreyansh.jain@nxp.com>, "Jan
 Viktorin" <viktorin@rehivetech.com>
Date: Wed, 7 Sep 2016 19:38:07 +0530
Message-ID: <1473257297-7221-16-git-send-email-shreyansh.jain@nxp.com>
X-Mailer: git-send-email 2.7.4
In-Reply-To: <1473257297-7221-1-git-send-email-shreyansh.jain@nxp.com>
References: <1466510566-9240-1-git-send-email-shreyansh.jain@nxp.com>
 <1473257297-7221-1-git-send-email-shreyansh.jain@nxp.com>
X-EOPAttributedMessage: 0
X-Matching-Connectors: 131177310091811253;
 (91ab9b29-cfa4-454e-5278-08d120cd25b8); ()
X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI;
 SFV:NSPM;
 SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(2351001)(2950100001)(19580405001)(305945005)(19580395003)(586003)(86362001)(189998001)(575784001)(8676002)(626004)(7846002)(5890100001)(8936002)(48376002)(36756003)(8666005)(68736007)(77096005)(5660300001)(5003940100001)(2906002)(110136002)(85426001)(47776003)(50466002)(229853001)(33646002)(356003)(104016004)(11100500001)(106466001)(76176999)(4326007)(50986999)(87936001)(92566002)(81166006)(81156014)(97736004)(105606002)(50226002)(7059030);
 DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR0301MB2004; H:tx30smr01.am.freescale.net;
 FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; 
X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD055;
 1:gQzAaPCKf77z4oSxfp+H336i+ZzeiYgMchKh7HqiotGMdA3yUWJzhQIU4CI4FAhrmL3jmXFy+lZLklVjrKnGC1RnFG7dU7/DYH6HZncFYqkpoyz83eNe/UJ6uOcwuftxIuTtsMgcjclxQAbfNsgcB5saP/6lVp4D+eZnGeJI1qtkS+xHaTVxqreJtSqy5Mqn1xQaoOeegeJFk9G400p1SCSRy/I5jfgNp3j6D8rp3KuboIVsTk1RJnJEvEZ8Ej47VxBAd1DcBQ3GBhjzgMT1g0hYoVyYJD7fzAORi4Jw1G4SuYqnBbhLmxhNERyNDJ2TECs2Tvk7FIC3dKch2opTsHLqcadUj2pMpzq7ln+dgNrWUiTjY3xW5ecTNh/GECLU/87SBy37cjAL53IhEAaRChKybxhdCvr2xHNiqh5vpwCgRsAG9DXsN5u/bF1EiGJN/b0SAHR+KIBA+UQMVWKrfQJ75ssyQbmqMSGH+tpXracHEMp7XO4JnCiOZ7gwmSOie5SXuy/mKY6VLbWgFi++ucq3umnc8WG/X//lPvy9kSopot5JUHMPUX6n0Mw6vxdB0sh1FfYwGtnPtiiKpcDIfpl6UgMfvcGHLGcaCacRtFq5AYtbJ67yKLDbhIykD3/9
MIME-Version: 1.0
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: 9cb338ac-bb90-4a5c-19b5-08d3d728ad14
X-Microsoft-Exchange-Diagnostics: 1; BLUPR0301MB2004;
 2:cDO6gc4KK2DV3/Oi0W2gueEXvTVAIqX9hXrpcfQv8dasy7l3bFmlcyscWywxB9FnHz3bJu1ZQj3fle+lQ9A3frZz8ZojBlEMUTF6qnFtRcwSmC6UbRP4lUkJlufyy4rnH2eon1x6xb0DtX8c15jnTzRASPzxNqj5wF7Y3O1qxIVPQtp4siuPM9x9NXi4SrfF;
 3:C0dPvabu9strnDSLeItckaC6U7P69+G3zRbNao4AQDiLKxQSOqvMm0GWQ+4p2eeZt/l08nES2l7fDjvWt1a/nUUhORGM0HSUZG5WNNq7lcYa48IwgG6sCcNNFuZoqbs3kTTeva/zcG+nrnLXEaTJrt19grEAWTcDzvMNRriz/pzgLaE34dUXund9BEea9gIhPVPnq0sKyle2on2pW18gYcwocTs1SS6xnQp7+wp2g5g=;
 25:jFLE7WkuNqilGu5uwLRBlMEuvZPUiAInJnwK0S+UCoMfJbjyi9XST5zDmkYtOIDdrGE188RHZqxu2zT2xOXnU88kjYb0DOjOusBOdnCrnHg6Q9I+zxwDRGVfy7c88qYjQD9IVJcudR9AiyHi+diKMX8PNNzKB8v3GjXNRDemEwcttlHkFrOeXOJMY7AqAIJrkbn7bfmTC8JQLkfMCXYCkcTEduUM4dQ1/MPTLoZUzh0hluxyAg7VRCYvyVrleGP9CLgG8eeVVBc8tD2g6OgYFOJ/IBmN3YUNL9U3rgz2K0cUTLsW0Rloodgq3Hqz24Mtp74t4G8mmJF6nKhoUVq+Ev6fFOWyZUUmSraElYoxKlQj2bDrUmCZAa5r+hRE4Pbin+H2A9S2tgnxTvztcSj8Slnt4+jXIoI2FUBbMEXHqNk=
X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR0301MB2004;
X-Microsoft-Exchange-Diagnostics: 1; BLUPR0301MB2004;
 31:8VBA8gl+ljDKJsUbVH53BUk9O+RVHlX7oFQKI+s85tyZedtxwzZLvcrozSEuvdpDY5oSAyhQiYjS0mtcGXiBRWBVY6eKdMRVmreUgXXVDl92y46AktJeCpBEvALa/cNJ05movPJD2WhSJ4pE7x2NFuAiuyLu6yoJCxh6wjgLydlTpD8Q5YN22Gsr18sLfupdMMPa5Y0fwkjMhejaqsxJ2wravNIP7F6zPG1mfN5T8zw=;
 4:WjMJelvmuxiDy7imoRQ/IqhgKcRowNUE2uxuSDfam018dnwusBoakG3IoFQ5/+6Po7kMpR60buWC0QoEzGDzXCFfPP2N8r7T2jdSOKwUJXHNASSrU0RRWw6JIEJxQ9ZQS+/nxMJI3irF48RkUh0NZOCy4uc5YBRzGTsby0qUeaawggmPDVtkWp+Lj8ERuCgh6RbDwermkj5EY9mowMHwm1j5gbD4O3lkSpZkLl3EObveMLAGTih85uYUuvE+daY8208s3aXl6U8ZjZMl50EZLPW9DjorfVLO4SDlXesftC4WSSjHO//HwTfWJWn3c3nAwVH8gNMp6EOT47iA3s9cbNqshmW5B6wQJyyr05f1m0jVDNfyO1SeeYerHta9nbhlJOsIcnWFDibbSAkB71GP/SaCAYh6h9TSGIGKYXiNfeg0T8IWk40bLIJLEUyq3NlfPqjD3M4Qu4OjWCSwME3mdBPHWsGCjXNncem+JB33doZKnXDLgdnU3+ZTmF3mt9VJKCaJwuMFcG7HBTwopdXlpRgwRSGpX+PiaJcbOfzWx2auT+RLbPa+EQ8IlRZ4fMvLOC6F8a94vq5Ae7yGZrtw5g==
X-Microsoft-Antispam-PRVS: <BLUPR0301MB2004CA55610CE7C100B8400890F80@BLUPR0301MB2004.namprd03.prod.outlook.com>
X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(17755550239193);
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(6040176)(601004)(2401047)(13015025)(13017025)(13023025)(13024025)(13018025)(8121501046)(5005006)(3002001)(10201501046)(6055026);
 SRVR:BLUPR0301MB2004; BCL:0; PCL:0; RULEID:(400006); SRVR:BLUPR0301MB2004; 
X-Forefront-PRVS: 0058ABBBC7
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR0301MB2004;
 23:fB+7Dqjr0LiBmWpaG0N364lPtfZdZYFYv9SynU8?=
 =?us-ascii?Q?5iCa5po2ACpV2xC8h+2gT8VQ45cfpqkvx3gw3mRpDj4MIUggIi6vZ8gEVl3q?=
 =?us-ascii?Q?HoYXRJY1CQrzEti1Yrt1C6QIlg/s50+Io5BP1LPbeD6Vg3S/v/DxE8j+UxMi?=
 =?us-ascii?Q?adGIzDI05XTPVp6kLF7TcGCBWFIKTqsCPmWiLO4GX2G5NWm6wdeqvJYyqkFi?=
 =?us-ascii?Q?52CsT5/Y02qJGKJEnf+pRTCik60Byz1gQv3moCc1qPKcdsT4unkViYt0R/a7?=
 =?us-ascii?Q?PRNNIHL3ia3WZsjwWJRaq3ZClHqVr1vMbh7um/xQ71xce6h+iuPTu2GVRT/B?=
 =?us-ascii?Q?kP1yj5GV2v7GSj8h0Cr9NuKaDPC7wCBDn9SP9s8sEerbYNbqVuQd1/3uCIT+?=
 =?us-ascii?Q?M8zeVVqiVjdXxqouwFh0dnuiVstxqbt0OBJSfAOPHXBqwZau1TElainowXvT?=
 =?us-ascii?Q?WCd7La8fXoRQzjpbgJlrx3v0ozdT79n+ENE7w6mv5qJsO+LwdGzs5rUM75RX?=
 =?us-ascii?Q?O35dUfmJQlqfhIws2pvBg1k4pRlSYvUdVyZ772L/TIB+3CqtzEzaiVdT88FK?=
 =?us-ascii?Q?cImMJAP8GA3Qth6TO1neht6f/qRMYoqaS+oJxqLPdrvPMhbKkECn3lCFHJq2?=
 =?us-ascii?Q?yW5Q9ihf56uRxE6H/TuuQHm71VO0MRt4tYPPensVVw3iePejtpZptzkLBH6g?=
 =?us-ascii?Q?j5iy5/yM70q8+2rvqURgnYcylBkm9Wgu9ROh9nBIaoG97yPNCAL7iz2Ow40X?=
 =?us-ascii?Q?vGdg1E8nYUDKBmEEk7IOslSJy62ajDTFmpSrqu4uGPJ5tiusuvPrSAO4YUfl?=
 =?us-ascii?Q?IQGB080iIhe+NOpcCdDYqkmMlYU/nkvgI2no0Fv8ZqrCvdf2hzwr5KVZoDDR?=
 =?us-ascii?Q?zke0gAG+9QDgr8PbGgYGM4RZVLAFW/7jpe72eknUPCf2zpq+NNIEZ8dVk6/a?=
 =?us-ascii?Q?n8wYbMkhvRSlLMxYdK2qWK7iqVFAC9DJsDLjYYXMpZxHTg9b+N6iKufZSh6K?=
 =?us-ascii?Q?g4KCXWyWdTeJb+gyUeCFLvgL+Hn2O8/unwSLVfbdg3z8TvKrd6PDQ7bbejaf?=
 =?us-ascii?Q?43cdX/srLKVaEOgl4d/7yABKrvehqUeFl6k36O7v26Dc7k6Yqtc81TSTf5MU?=
 =?us-ascii?Q?P3SlbifrFIcgacTBLdT3+6bXJwTMhaOqHW1euF8fAxfwqX8cwh3/a9iFYy48?=
 =?us-ascii?Q?0JmOlae8iM71C3MEcSJFH+/lTJ04YmOuQoCsRP616imvn3r7ga4//m+d2ZQ?=
 =?us-ascii?Q?=3D=3D?=
X-Microsoft-Exchange-Diagnostics: 1; BLUPR0301MB2004;
 6:xHdRrA0cIYWwAkOmNDgGlwfMWp/WPUMB1ZiYTPQj8a6cscafZZBPd3zbFjV1oSscA6Ne20MeV3nQc2AZKYnENzYpkJTf3zAjlt6CoOKBWbG9zfGzXGPnZpWb4AGBrDz5/pr6FvNW6dAotba8S9dhWlkFDYbYMYrTK1VptyRNN+tDuTN5BMLSs5HL3eyNMBq21nKZKatoRIxSF0GsfOymRekDBdMGiyRXEVfsXnoTRSFV5kvFXJPeqG7KYDcxkbFRRDgeo6X0wRwQ7AK1p1eH/1fNZN952bhznMkHhCWNNAE=;
 5:4XNqnnl/P/YwlQbGC1+kPgdtwOhwl0gUaF2+Z9+qiATP86Z6N7R0SUog7rdwqycYkVHIkGl4cJYky6NslykqicpbVpFXHbuI24NmTWbDm6ZuQpDyT+9L6/5c01A/GIesUpfjnEA5aLqP9sOyJtdaWYrJrB+u15chRw5x3c4/9d4=;
 24:NM035ZsUmQR671ApvXhzhHIJXwvpmQEjkS7342vPYTUw3qu4ejrIpmnOOaC4YR7NW8wdVWZhyP0BfJY3waXKc+PpJrVDQpP4a/zAgVMakog=;
 7:5bXHkN2KOK2JDVVYyEMUamyd8bqxCLD+9bhG9yMlfMZsai2dqZM5bq4BP4gjYm2uoPEoJvnc+wwPhwCB65Jqzdgf3Bs2ZRlAK2GYTdwGK54Vpqv3s4MgGz2QZb0DVwMUhhyqd6mL1pB6zOL8hVBMi/QHwNtlkptOJewglZ8usXvB/5y4zsoyxlRcnkVhi1Yq47eJP5+af8YkKjv52tQ6RxXFyvsJlz6/6apGvE0SYAq9gOiROwwdJW5fKPTEncgq
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Sep 2016 14:10:08.9783 (UTC)
X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e
X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50];
 Helo=[tx30smr01.am.freescale.net]
X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR0301MB2004
Subject: [dpdk-dev] [PATCH v9 15/25] eal: extract vdev infra
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>,
 <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>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 07 Sep 2016 14:10:13 -0000

Move all PMD_VDEV-specific code into a separate module and header
file to not polute the generic code anymore. There is now a list
of virtual devices available.

The rte_vdev_driver integrates the original rte_driver inside
(C inheritance). The rte_driver will be however change in the
future to serve as a common base for all other types of drivers.

The existing PMDs (PMD_VDEV) are to be modified later (there is
no change for them at the moment).

Unlike DRIVER_REGISTER_PCI, DRIVER_EXPORT_NAME is not being called on vdev
registration.

Signed-off-by: Jan Viktorin <viktorin@rehivetech.com>
Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 lib/librte_eal/bsdapp/eal/Makefile       |   1 +
 lib/librte_eal/common/Makefile           |   2 +-
 lib/librte_eal/common/eal_common_dev.c   |  54 +--------------
 lib/librte_eal/common/eal_common_vdev.c  | 110 +++++++++++++++++++++++++++++++
 lib/librte_eal/common/include/rte_vdev.h |  84 +++++++++++++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile     |   1 +
 6 files changed, 198 insertions(+), 54 deletions(-)
 create mode 100644 lib/librte_eal/common/eal_common_vdev.c
 create mode 100644 lib/librte_eal/common/include/rte_vdev.h

diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 7a0fea5..5a3fc1d 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -69,6 +69,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_launch.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci_uio.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memory.c
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index bb9810d..dfd64aa 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -38,7 +38,7 @@ INC += rte_per_lcore.h rte_random.h
 INC += rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_version.h
 INC += rte_eal_memconfig.h rte_malloc_heap.h
-INC += rte_hexdump.h rte_devargs.h rte_dev.h
+INC += rte_hexdump.h rte_devargs.h rte_dev.h rte_vdev.h
 INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
 INC += rte_malloc.h rte_keepalive.h rte_time.h
 
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
index 88f9d3f..555e0d9 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -64,32 +64,6 @@ rte_eal_driver_unregister(struct rte_driver *driver)
 }
 
 int
-rte_eal_vdev_init(const char *name, const char *args)
-{
-	struct rte_driver *driver;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	TAILQ_FOREACH(driver, &dev_driver_list, next) {
-		if (driver->type != PMD_VDEV)
-			continue;
-
-		/*
-		 * search a driver prefix in virtual device name.
-		 * For example, if the driver is pcap PMD, driver->name
-		 * will be "eth_pcap", but "name" will be "eth_pcapN".
-		 * So use strncmp to compare.
-		 */
-		if (!strncmp(driver->name, name, strlen(driver->name)))
-			return driver->init(name, args);
-	}
-
-	RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
-	return -EINVAL;
-}
-
-int
 rte_eal_dev_init(void)
 {
 	struct rte_devargs *devargs;
@@ -98,7 +72,7 @@ rte_eal_dev_init(void)
 	/*
 	 * Note that the dev_driver_list is populated here
 	 * from calls made to rte_eal_driver_register from constructor functions
-	 * embedded into PMD modules via the PMD_REGISTER_DRIVER macro
+	 * embedded into PMD modules via the DRIVER_REGISTER_VDEV macro
 	 */
 
 	/* call the init function for each virtual device */
@@ -125,32 +99,6 @@ rte_eal_dev_init(void)
 	return 0;
 }
 
-int
-rte_eal_vdev_uninit(const char *name)
-{
-	struct rte_driver *driver;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	TAILQ_FOREACH(driver, &dev_driver_list, next) {
-		if (driver->type != PMD_VDEV)
-			continue;
-
-		/*
-		 * search a driver prefix in virtual device name.
-		 * For example, if the driver is pcap PMD, driver->name
-		 * will be "eth_pcap", but "name" will be "eth_pcapN".
-		 * So use strncmp to compare.
-		 */
-		if (!strncmp(driver->name, name, strlen(driver->name)))
-			return driver->uninit(name);
-	}
-
-	RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
-	return -EINVAL;
-}
-
 int rte_eal_dev_attach(const char *name, const char *devargs)
 {
 	struct rte_pci_addr addr;
diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
new file mode 100644
index 0000000..d225e86
--- /dev/null
+++ b/lib/librte_eal/common/eal_common_vdev.c
@@ -0,0 +1,110 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. 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 RehiveTech 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.
+ */
+
+#include <string.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <sys/queue.h>
+
+#include <rte_vdev.h>
+#include <rte_common.h>
+
+struct vdev_driver_list vdev_driver_list =
+	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
+
+/* register a driver */
+void
+rte_eal_vdrv_register(struct rte_vdev_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
+}
+
+/* unregister a driver */
+void
+rte_eal_vdrv_unregister(struct rte_vdev_driver *driver)
+{
+	TAILQ_REMOVE(&vdev_driver_list, driver, next);
+}
+
+int
+rte_eal_vdev_init(const char *name, const char *args)
+{
+	struct rte_vdev_driver *driver;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
+		if (driver->driver.type != PMD_VDEV)
+			continue;
+
+		/*
+		 * search a driver prefix in virtual device name.
+		 * For example, if the driver is pcap PMD, driver->name
+		 * will be "eth_pcap", but "name" will be "eth_pcapN".
+		 * So use strncmp to compare.
+		 */
+		if (!strncmp(driver->driver.name, name, strlen(driver->driver.name)))
+			return driver->driver.init(name, args);
+	}
+
+	RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
+	return -EINVAL;
+}
+
+int
+rte_eal_vdev_uninit(const char *name)
+{
+	struct rte_vdev_driver *driver;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
+		if (driver->driver.type != PMD_VDEV)
+			continue;
+
+		/*
+		 * search a driver prefix in virtual device name.
+		 * For example, if the driver is pcap PMD, driver->name
+		 * will be "eth_pcap", but "name" will be "eth_pcapN".
+		 * So use strncmp to compare.
+		 */
+		if (!strncmp(driver->driver.name, name, strlen(driver->driver.name)))
+			return driver->driver.uninit(name);
+	}
+
+	RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
+	return -EINVAL;
+}
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
new file mode 100644
index 0000000..9a2e2d5
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_vdev.h
@@ -0,0 +1,84 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. 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 RehiveTech 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.
+ */
+
+#ifndef RTE_VDEV_H
+#define RTE_VDEV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+#include <rte_dev.h>
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
+
+/**
+ * A virtual device driver abstraction.
+ */
+struct rte_vdev_driver {
+	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
+	struct rte_driver driver;          /**< Inherited general driver. */
+};
+
+/**
+ * Register a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be registered.
+ */
+void rte_eal_vdrv_register(struct rte_vdev_driver *driver);
+
+/**
+ * Unregister a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be unregistered.
+ */
+void rte_eal_vdrv_unregister(struct rte_vdev_driver *driver);
+
+#define DRIVER_REGISTER_VDEV(nm, vdrv)\
+RTE_INIT(vdrvinitfn_ ##vdrv);\
+static void vdrvinitfn_ ##vdrv(void)\
+{\
+	(vdrv).driver.name = RTE_STR(nm);\
+	rte_eal_vdrv_register(&vdrv);\
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 193957f..4e206f0 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -77,6 +77,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_launch.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci_uio.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memory.c
-- 
2.7.4