.link_autoneg = ETH_LINK_FIXED,
};
-static int eth_null_logtype;
+RTE_LOG_REGISTER(eth_null_logtype, pmd.net.null, NOTICE);
#define PMD_LOG(level, fmt, args...) \
rte_log(RTE_LOG_ ## level, eth_null_logtype, \
return 0;
}
+static int
+eth_dev_close(struct rte_eth_dev *dev)
+{
+ PMD_LOG(INFO, "Closing null ethdev on NUMA socket %u",
+ rte_socket_id());
+
+ if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+ return 0;
+
+ /* mac_addrs must not be freed alone because part of dev_private */
+ dev->data->mac_addrs = NULL;
+
+ return 0;
+}
+
static const struct eth_dev_ops ops = {
+ .dev_close = eth_dev_close,
.dev_start = eth_dev_start,
.dev_stop = eth_dev_stop,
.dev_configure = eth_dev_configure,
if (!dev)
return -EINVAL;
- PMD_LOG(INFO, "Closing null ethdev on numa socket %u",
- rte_socket_id());
-
/* find the ethdev entry */
eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(dev));
if (eth_dev == NULL)
- return -1;
-
- if (rte_eal_process_type() == RTE_PROC_PRIMARY)
- /* mac_addrs must not be freed alone because part of dev_private */
- eth_dev->data->mac_addrs = NULL;
+ return 0; /* port already released */
+ eth_dev_close(eth_dev);
rte_eth_dev_release_port(eth_dev);
return 0;
"size=<int> "
"copy=<int> "
ETH_NULL_PACKET_NO_RX_ARG "=0|1");
-
-RTE_INIT(eth_null_init_log)
-{
- eth_null_logtype = rte_log_register("pmd.net.null");
- if (eth_null_logtype >= 0)
- rte_log_set_level(eth_null_logtype, RTE_LOG_NOTICE);
-}