#include <rte_bus.h>
#include <rte_bus_vdev.h>
#include <rte_common.h>
-#include <rte_config.h>
#include <rte_dev.h>
#include <rte_errno.h>
#include <rte_ethdev.h>
#define NETVSC_CLASS_ID "{f8615163-df3e-46c5-913f-f2d2f965ed0e}"
#define NETVSC_MAX_ROUTE_LINE_SIZE 300
+RTE_LOG_REGISTER_DEFAULT(vdev_netvsc_logtype, NOTICE);
+
#define DRV_LOG(level, ...) \
rte_log(RTE_LOG_ ## level, \
vdev_netvsc_logtype, \
RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
RTE_FMT_TAIL(__VA_ARGS__,)))
-/** Driver-specific log messages type. */
-static int vdev_netvsc_logtype;
-
/** Context structure for a vdev_netvsc instance. */
struct vdev_netvsc_ctx {
LIST_ENTRY(vdev_netvsc_ctx) entry; /**< Next entry in list. */
char in[RTE_MAX(sizeof(ctx->yield), 256u)];
int ret;
- ret = snprintf(in, sizeof(in) - 1, "/sys/class/net/%s/%s",
+ ret = snprintf(in, sizeof(in), "/sys/class/net/%s/%s",
if_name, relpath);
if (ret == -1 || (size_t)ret >= sizeof(in))
return -ENOBUFS;
} else if (!strcmp(pair->key, VDEV_NETVSC_ARG_MAC)) {
struct rte_ether_addr tmp;
- if (sscanf(pair->value,
- "%" SCNx8 ":%" SCNx8 ":%" SCNx8 ":"
- "%" SCNx8 ":%" SCNx8 ":%" SCNx8,
- &tmp.addr_bytes[0],
- &tmp.addr_bytes[1],
- &tmp.addr_bytes[2],
- &tmp.addr_bytes[3],
- &tmp.addr_bytes[4],
- &tmp.addr_bytes[5]) != 6) {
+ if (rte_ether_unformat_addr(pair->value, &tmp) != 0) {
DRV_LOG(ERR,
"invalid MAC address format"
" \"%s\"",
ctx->devname, ctx->devargs);
vdev_netvsc_foreach_iface(vdev_netvsc_device_probe, 0, ctx);
ret = rte_eal_hotplug_add("vdev", ctx->devname, ctx->devargs);
- if (ret)
+ if (ret < 0)
goto error;
LIST_INSERT_HEAD(&vdev_netvsc_ctx_list, ctx, entry);
++vdev_netvsc_ctx_count;
int ret;
DRV_LOG(DEBUG, "invoked as \"%s\", using arguments \"%s\"", name, args);
+ rte_eal_alarm_cancel(vdev_netvsc_alarm, NULL);
if (!kvargs) {
DRV_LOG(ERR, "cannot parse arguments list");
goto error;
!strcmp(pair->key, VDEV_NETVSC_ARG_MAC))
++specified;
}
- if (ignore) {
- if (kvargs)
- rte_kvargs_free(kvargs);
- return 0;
- }
+ if (ignore)
+ goto ignore;
if (specified > 1) {
DRV_LOG(ERR, "More than one way used to specify the netvsc"
" device.");
goto error;
}
- rte_eal_alarm_cancel(vdev_netvsc_alarm, NULL);
/* Gather interfaces. */
ret = vdev_netvsc_foreach_iface(vdev_netvsc_netvsc_probe, 1, name,
kvargs, specified, &matched);
}
DRV_LOG(WARNING, "non-netvsc device was probed as netvsc");
}
- ret = rte_eal_alarm_set(VDEV_NETVSC_PROBE_MS * 1000,
- vdev_netvsc_alarm, NULL);
- if (ret < 0) {
- DRV_LOG(ERR, "unable to schedule alarm callback: %s",
- rte_strerror(-ret));
- goto error;
- }
error:
- if (kvargs)
- rte_kvargs_free(kvargs);
++vdev_netvsc_ctx_inst;
+ignore:
+ rte_kvargs_free(kvargs);
+ /* Reset alarm if there are device context created */
+ if (vdev_netvsc_ctx_count) {
+ ret = rte_eal_alarm_set(VDEV_NETVSC_PROBE_MS * 1000,
+ vdev_netvsc_alarm, NULL);
+ if (ret < 0)
+ DRV_LOG(ERR, "unable to schedule alarm callback: %s",
+ rte_strerror(-ret));
+ }
return 0;
}
VDEV_NETVSC_ARG_FORCE "=<int> "
VDEV_NETVSC_ARG_IGNORE "=<int>");
-/** Initialize driver log type. */
-RTE_INIT(vdev_netvsc_init_log)
-{
- vdev_netvsc_logtype = rte_log_register("pmd.net.vdev_netvsc");
- if (vdev_netvsc_logtype >= 0)
- rte_log_set_level(vdev_netvsc_logtype, RTE_LOG_NOTICE);
-}
-
/** Compare function for vdev find device operation. */
static int
vdev_netvsc_cmp_rte_device(const struct rte_device *dev1,