net/vdev_netvsc: introduce Hyper-V platform driver
[dpdk.git] / drivers / net / vdev_netvsc / vdev_netvsc.c
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 }