Commit b63e78fc authored by Vladimir Oltean's avatar Vladimir Oltean Committed by Jakub Kicinski

net: netdevsim: use mock PHC driver

I'd like to make netdevsim offload tc-taprio, but currently, this Qdisc
emits a ETHTOOL_GET_TS_INFO call to the driver to make sure that it has
a PTP clock, so that it is reasonably capable of offloading the schedule.

By using the mock PHC driver, that becomes possible.

Hardware timestamping is not necessary, and netdevsim does not support
packet I/O anyway.
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/20230807193324.4128292-8-vladimir.oltean@nxp.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 40b0425f
...@@ -592,6 +592,7 @@ config NETDEVSIM ...@@ -592,6 +592,7 @@ config NETDEVSIM
depends on INET depends on INET
depends on IPV6 || IPV6=n depends on IPV6 || IPV6=n
depends on PSAMPLE || PSAMPLE=n depends on PSAMPLE || PSAMPLE=n
depends on PTP_1588_CLOCK_MOCK || PTP_1588_CLOCK_MOCK=n
select NET_DEVLINK select NET_DEVLINK
help help
This driver is a developer testing tool and software model that can This driver is a developer testing tool and software model that can
......
...@@ -140,6 +140,16 @@ nsim_set_fecparam(struct net_device *dev, struct ethtool_fecparam *fecparam) ...@@ -140,6 +140,16 @@ nsim_set_fecparam(struct net_device *dev, struct ethtool_fecparam *fecparam)
return 0; return 0;
} }
static int nsim_get_ts_info(struct net_device *dev,
struct ethtool_ts_info *info)
{
struct netdevsim *ns = netdev_priv(dev);
info->phc_index = mock_phc_index(ns->phc);
return 0;
}
static const struct ethtool_ops nsim_ethtool_ops = { static const struct ethtool_ops nsim_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_ALL_PARAMS, .supported_coalesce_params = ETHTOOL_COALESCE_ALL_PARAMS,
.get_pause_stats = nsim_get_pause_stats, .get_pause_stats = nsim_get_pause_stats,
...@@ -153,6 +163,7 @@ static const struct ethtool_ops nsim_ethtool_ops = { ...@@ -153,6 +163,7 @@ static const struct ethtool_ops nsim_ethtool_ops = {
.set_channels = nsim_set_channels, .set_channels = nsim_set_channels,
.get_fecparam = nsim_get_fecparam, .get_fecparam = nsim_get_fecparam,
.set_fecparam = nsim_set_fecparam, .set_fecparam = nsim_set_fecparam,
.get_ts_info = nsim_get_ts_info,
}; };
static void nsim_ethtool_ring_init(struct netdevsim *ns) static void nsim_ethtool_ring_init(struct netdevsim *ns)
......
...@@ -291,13 +291,19 @@ static void nsim_setup(struct net_device *dev) ...@@ -291,13 +291,19 @@ static void nsim_setup(struct net_device *dev)
static int nsim_init_netdevsim(struct netdevsim *ns) static int nsim_init_netdevsim(struct netdevsim *ns)
{ {
struct mock_phc *phc;
int err; int err;
phc = mock_phc_create(&ns->nsim_bus_dev->dev);
if (IS_ERR(phc))
return PTR_ERR(phc);
ns->phc = phc;
ns->netdev->netdev_ops = &nsim_netdev_ops; ns->netdev->netdev_ops = &nsim_netdev_ops;
err = nsim_udp_tunnels_info_create(ns->nsim_dev, ns->netdev); err = nsim_udp_tunnels_info_create(ns->nsim_dev, ns->netdev);
if (err) if (err)
return err; goto err_phc_destroy;
rtnl_lock(); rtnl_lock();
err = nsim_bpf_init(ns); err = nsim_bpf_init(ns);
...@@ -320,6 +326,8 @@ static int nsim_init_netdevsim(struct netdevsim *ns) ...@@ -320,6 +326,8 @@ static int nsim_init_netdevsim(struct netdevsim *ns)
err_utn_destroy: err_utn_destroy:
rtnl_unlock(); rtnl_unlock();
nsim_udp_tunnels_info_destroy(ns->netdev); nsim_udp_tunnels_info_destroy(ns->netdev);
err_phc_destroy:
mock_phc_destroy(ns->phc);
return err; return err;
} }
...@@ -383,6 +391,7 @@ void nsim_destroy(struct netdevsim *ns) ...@@ -383,6 +391,7 @@ void nsim_destroy(struct netdevsim *ns)
rtnl_unlock(); rtnl_unlock();
if (nsim_dev_port_is_pf(ns->nsim_dev_port)) if (nsim_dev_port_is_pf(ns->nsim_dev_port))
nsim_udp_tunnels_info_destroy(dev); nsim_udp_tunnels_info_destroy(dev);
mock_phc_destroy(ns->phc);
free_netdev(dev); free_netdev(dev);
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/ptp_mock.h>
#include <linux/u64_stats_sync.h> #include <linux/u64_stats_sync.h>
#include <net/devlink.h> #include <net/devlink.h>
#include <net/udp_tunnel.h> #include <net/udp_tunnel.h>
...@@ -93,6 +94,7 @@ struct netdevsim { ...@@ -93,6 +94,7 @@ struct netdevsim {
struct net_device *netdev; struct net_device *netdev;
struct nsim_dev *nsim_dev; struct nsim_dev *nsim_dev;
struct nsim_dev_port *nsim_dev_port; struct nsim_dev_port *nsim_dev_port;
struct mock_phc *phc;
u64 tx_packets; u64 tx_packets;
u64 tx_bytes; u64 tx_bytes;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment