This patch allows to enable hardware timestamping on macvlan intefaces and find out capabilities of the lower device.
Signed-off-by: Grzegorz Halat <grzegorz.ha...@gmail.com> --- drivers/net/macvlan.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index a0f2be8..314e878 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -23,6 +23,7 @@ #include <linux/rculist.h> #include <linux/notifier.h> #include <linux/netdevice.h> +#include <linux/net_tstamp.h> #include <linux/etherdevice.h> #include <linux/ethtool.h> #include <linux/if_arp.h> @@ -942,6 +943,30 @@ static void macvlan_dev_get_stats64(struct net_device *dev, } } +static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ + struct macvlan_dev *vlan = netdev_priv(dev); + const struct net_device_ops *ops = vlan->lowerdev->netdev_ops; + struct ifreq ifrl; + int err = -EOPNOTSUPP; + + strncpy(ifrl.ifr_name, vlan->lowerdev->name, IFNAMSIZ); + ifrl.ifr_ifru = ifr->ifr_ifru; + + switch (cmd) { + case SIOCGHWTSTAMP: + case SIOCSHWTSTAMP: + if (ops->ndo_do_ioctl) + err = ops->ndo_do_ioctl(vlan->lowerdev, &ifrl, cmd); + break; + } + + if (!err) + ifr->ifr_ifru = ifrl.ifr_ifru; + + return err; +} + static int macvlan_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid) { @@ -1022,6 +1047,22 @@ static int macvlan_ethtool_get_link_ksettings(struct net_device *dev, return __ethtool_get_link_ksettings(vlan->lowerdev, cmd); } +static int macvlan_ethtool_get_ts_info(struct net_device *dev, + struct ethtool_ts_info *ts_info) +{ + const struct macvlan_dev *vlan = netdev_priv(dev); + const struct ethtool_ops *eth_ops = vlan->lowerdev->ethtool_ops; + + if (eth_ops->get_ts_info) + return eth_ops->get_ts_info(vlan->lowerdev, ts_info); + + ts_info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | + SOF_TIMESTAMPING_SOFTWARE; + ts_info->phc_index = -1; + + return 0; +} + static netdev_features_t macvlan_fix_features(struct net_device *dev, netdev_features_t features) { @@ -1096,6 +1137,7 @@ static const struct ethtool_ops macvlan_ethtool_ops = { .get_link = ethtool_op_get_link, .get_link_ksettings = macvlan_ethtool_get_link_ksettings, .get_drvinfo = macvlan_ethtool_get_drvinfo, + .get_ts_info = macvlan_ethtool_get_ts_info, }; static const struct net_device_ops macvlan_netdev_ops = { @@ -1111,6 +1153,7 @@ static const struct net_device_ops macvlan_netdev_ops = { .ndo_set_rx_mode = macvlan_set_mac_lists, .ndo_get_stats64 = macvlan_dev_get_stats64, .ndo_validate_addr = eth_validate_addr, + .ndo_do_ioctl = macvlan_do_ioctl, .ndo_vlan_rx_add_vid = macvlan_vlan_rx_add_vid, .ndo_vlan_rx_kill_vid = macvlan_vlan_rx_kill_vid, .ndo_fdb_add = macvlan_fdb_add, -- 2.7.4