diff options
author | Jakub Kicinski <kuba@kernel.org> | 2021-12-29 23:31:39 +0300 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2021-12-29 23:31:39 +0300 |
commit | cfcad56b208957b410ce251e895a728993d72298 (patch) | |
tree | 595ea610c3512b1c17863a046bb91ab149e268fa | |
parent | 9ed319e411915e882bb4ed99be3ae78667a70022 (diff) | |
parent | cfe355c56e3a5eb993fd4ea807b60f34f91b0cde (diff) | |
download | linux-cfcad56b208957b410ce251e895a728993d72298.tar.xz |
Merge branch 'net-define-new-hwtstamp-flag-and-return-it-to-userspace'
Hangbin Liu says:
====================
net: define new hwtstamp flag and return it to userspace
This patchset defined the new hwtstamp flag HWTSTAMP_FLAG_BONDED_PHC_INDEX
to make userspace program build pass with old kernel header by settting ifdef.
Let's also return the flag when do SIOC[G/S]HWTSTAMP to let userspace know
that it's necessary for a given netdev.
====================
Link: https://lore.kernel.org/r/20211229080938.231324-1-liuhangbin@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r-- | drivers/net/bonding/bond_main.c | 42 | ||||
-rw-r--r-- | include/uapi/linux/net_tstamp.h | 1 |
2 files changed, 27 insertions, 16 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index b60e22f6394a..1bb8fa9fd3aa 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -4124,28 +4124,38 @@ static int bond_eth_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cm break; case SIOCSHWTSTAMP: - case SIOCGHWTSTAMP: if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) return -EFAULT; - if (cfg.flags & HWTSTAMP_FLAG_BONDED_PHC_INDEX) { - rcu_read_lock(); - real_dev = bond_option_active_slave_get_rcu(bond); - rcu_read_unlock(); - if (real_dev) { - strscpy_pad(ifrr.ifr_name, real_dev->name, IFNAMSIZ); - ifrr.ifr_ifru = ifr->ifr_ifru; + if (!(cfg.flags & HWTSTAMP_FLAG_BONDED_PHC_INDEX)) + return -EOPNOTSUPP; - ops = real_dev->netdev_ops; - if (netif_device_present(real_dev) && ops->ndo_eth_ioctl) { - res = ops->ndo_eth_ioctl(real_dev, &ifrr, cmd); + fallthrough; + case SIOCGHWTSTAMP: + rcu_read_lock(); + real_dev = bond_option_active_slave_get_rcu(bond); + rcu_read_unlock(); + if (!real_dev) + return -EOPNOTSUPP; - if (!res) - ifr->ifr_ifru = ifrr.ifr_ifru; + strscpy_pad(ifrr.ifr_name, real_dev->name, IFNAMSIZ); + ifrr.ifr_ifru = ifr->ifr_ifru; - return res; - } - } + ops = real_dev->netdev_ops; + if (netif_device_present(real_dev) && ops->ndo_eth_ioctl) { + res = ops->ndo_eth_ioctl(real_dev, &ifrr, cmd); + if (res) + return res; + + ifr->ifr_ifru = ifrr.ifr_ifru; + if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) + return -EFAULT; + + /* Set the BOND_PHC_INDEX flag to notify user space */ + cfg.flags |= HWTSTAMP_FLAG_BONDED_PHC_INDEX; + + return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? + -EFAULT : 0; } fallthrough; default: diff --git a/include/uapi/linux/net_tstamp.h b/include/uapi/linux/net_tstamp.h index e258e52cfd1f..55501e5e7ac8 100644 --- a/include/uapi/linux/net_tstamp.h +++ b/include/uapi/linux/net_tstamp.h @@ -87,6 +87,7 @@ enum hwtstamp_flags { * will be the PHC index. */ HWTSTAMP_FLAG_BONDED_PHC_INDEX = (1<<0), +#define HWTSTAMP_FLAG_BONDED_PHC_INDEX HWTSTAMP_FLAG_BONDED_PHC_INDEX HWTSTAMP_FLAG_LAST = HWTSTAMP_FLAG_BONDED_PHC_INDEX, HWTSTAMP_FLAG_MASK = (HWTSTAMP_FLAG_LAST - 1) | HWTSTAMP_FLAG_LAST |