xref: /dpdk/drivers/net/vdev_netvsc/vdev_netvsc.c (revision 6086ab3bb3d2947ab3f27f7263873df9ed770c24)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2017 6WIND S.A.
3  * Copyright 2017 Mellanox Technologies, Ltd.
4  */
5 
6 #include <stddef.h>
7 
8 #include <rte_bus_vdev.h>
9 #include <rte_common.h>
10 #include <rte_config.h>
11 #include <rte_kvargs.h>
12 #include <rte_log.h>
13 
14 #define VDEV_NETVSC_DRIVER net_vdev_netvsc
15 #define VDEV_NETVSC_ARG_IFACE "iface"
16 #define VDEV_NETVSC_ARG_MAC "mac"
17 
18 #define DRV_LOG(level, ...) \
19 	rte_log(RTE_LOG_ ## level, \
20 		vdev_netvsc_logtype, \
21 		RTE_FMT(RTE_STR(VDEV_NETVSC_DRIVER) ": " \
22 			RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
23 		RTE_FMT_TAIL(__VA_ARGS__,)))
24 
25 /** Driver-specific log messages type. */
26 static int vdev_netvsc_logtype;
27 
28 /** Number of driver instances relying on context list. */
29 static unsigned int vdev_netvsc_ctx_inst;
30 
31 /**
32  * Probe NetVSC interfaces.
33  *
34  * @param dev
35  *   Virtual device context for driver instance.
36  *
37  * @return
38  *    Always 0, even in case of errors.
39  */
40 static int
41 vdev_netvsc_vdev_probe(struct rte_vdev_device *dev)
42 {
43 	static const char *const vdev_netvsc_arg[] = {
44 		VDEV_NETVSC_ARG_IFACE,
45 		VDEV_NETVSC_ARG_MAC,
46 		NULL,
47 	};
48 	const char *name = rte_vdev_device_name(dev);
49 	const char *args = rte_vdev_device_args(dev);
50 	struct rte_kvargs *kvargs = rte_kvargs_parse(args ? args : "",
51 						     vdev_netvsc_arg);
52 
53 	DRV_LOG(DEBUG, "invoked as \"%s\", using arguments \"%s\"", name, args);
54 	if (!kvargs) {
55 		DRV_LOG(ERR, "cannot parse arguments list");
56 		goto error;
57 	}
58 error:
59 	if (kvargs)
60 		rte_kvargs_free(kvargs);
61 	++vdev_netvsc_ctx_inst;
62 	return 0;
63 }
64 
65 /**
66  * Remove driver instance.
67  *
68  * @param dev
69  *   Virtual device context for driver instance.
70  *
71  * @return
72  *   Always 0.
73  */
74 static int
75 vdev_netvsc_vdev_remove(__rte_unused struct rte_vdev_device *dev)
76 {
77 	--vdev_netvsc_ctx_inst;
78 	return 0;
79 }
80 
81 /** Virtual device descriptor. */
82 static struct rte_vdev_driver vdev_netvsc_vdev = {
83 	.probe = vdev_netvsc_vdev_probe,
84 	.remove = vdev_netvsc_vdev_remove,
85 };
86 
87 RTE_PMD_REGISTER_VDEV(VDEV_NETVSC_DRIVER, vdev_netvsc_vdev);
88 RTE_PMD_REGISTER_ALIAS(VDEV_NETVSC_DRIVER, eth_vdev_netvsc);
89 RTE_PMD_REGISTER_PARAM_STRING(net_vdev_netvsc,
90 			      VDEV_NETVSC_ARG_IFACE "=<string> "
91 			      VDEV_NETVSC_ARG_MAC "=<string>");
92 
93 /** Initialize driver log type. */
94 RTE_INIT(vdev_netvsc_init_log)
95 {
96 	vdev_netvsc_logtype = rte_log_register("pmd.vdev_netvsc");
97 	if (vdev_netvsc_logtype >= 0)
98 		rte_log_set_level(vdev_netvsc_logtype, RTE_LOG_NOTICE);
99 }
100