aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2013-11-13 20:19:29 -0500
committerBen Hutchings <bhutchings@solarflare.com>2013-11-19 14:07:21 -0500
commitfd468c74bd4d6949736810a80d6ca05eb20fba84 (patch)
treec68b11620237ba704b740827ce952409b5666231
parent590d4693fb1c96ce441d11c6d1acb413a90b62e5 (diff)
net_tstamp: Add SIOCGHWTSTAMP ioctl to match SIOCSHWTSTAMP
SIOCSHWTSTAMP returns the real configuration to the application using it, but there is currently no way for any other application to find out the configuration non-destructively. Add a new ioctl for this, making it unprivileged. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
-rw-r--r--Documentation/networking/timestamping.txt9
-rw-r--r--include/uapi/linux/net_tstamp.h14
-rw-r--r--include/uapi/linux/sockios.h3
-rw-r--r--net/core/dev_ioctl.c2
-rw-r--r--net/socket.c1
5 files changed, 19 insertions, 10 deletions
diff --git a/Documentation/networking/timestamping.txt b/Documentation/networking/timestamping.txt
index 98097d8cb910..661d3c316a17 100644
--- a/Documentation/networking/timestamping.txt
+++ b/Documentation/networking/timestamping.txt
@@ -85,7 +85,7 @@ Filled in if SOF_TIMESTAMPING_SYS_HARDWARE is set. Requires support
85by the network device and will be empty without that support. 85by the network device and will be empty without that support.
86 86
87 87
88SIOCSHWTSTAMP: 88SIOCSHWTSTAMP, SIOCGHWTSTAMP:
89 89
90Hardware time stamping must also be initialized for each device driver 90Hardware time stamping must also be initialized for each device driver
91that is expected to do hardware time stamping. The parameter is defined in 91that is expected to do hardware time stamping. The parameter is defined in
@@ -115,6 +115,10 @@ Only a processes with admin rights may change the configuration. User
115space is responsible to ensure that multiple processes don't interfere 115space is responsible to ensure that multiple processes don't interfere
116with each other and that the settings are reset. 116with each other and that the settings are reset.
117 117
118Any process can read the actual configuration by passing this
119structure to ioctl(SIOCGHWTSTAMP) in the same way. However, this has
120not been implemented in all drivers.
121
118/* possible values for hwtstamp_config->tx_type */ 122/* possible values for hwtstamp_config->tx_type */
119enum { 123enum {
120 /* 124 /*
@@ -157,7 +161,8 @@ DEVICE IMPLEMENTATION
157 161
158A driver which supports hardware time stamping must support the 162A driver which supports hardware time stamping must support the
159SIOCSHWTSTAMP ioctl and update the supplied struct hwtstamp_config with 163SIOCSHWTSTAMP ioctl and update the supplied struct hwtstamp_config with
160the actual values as described in the section on SIOCSHWTSTAMP. 164the actual values as described in the section on SIOCSHWTSTAMP. It
165should also support SIOCGHWTSTAMP.
161 166
162Time stamps for received packets must be stored in the skb. To get a pointer 167Time stamps for received packets must be stored in the skb. To get a pointer
163to the shared time stamp structure of the skb call skb_hwtstamps(). Then 168to the shared time stamp structure of the skb call skb_hwtstamps(). Then
diff --git a/include/uapi/linux/net_tstamp.h b/include/uapi/linux/net_tstamp.h
index c9a7de2a6276..f53879c0f590 100644
--- a/include/uapi/linux/net_tstamp.h
+++ b/include/uapi/linux/net_tstamp.h
@@ -26,17 +26,17 @@ enum {
26}; 26};
27 27
28/** 28/**
29 * struct hwtstamp_config - %SIOCSHWTSTAMP parameter 29 * struct hwtstamp_config - %SIOCGHWTSTAMP and %SIOCSHWTSTAMP parameter
30 * 30 *
31 * @flags: no flags defined right now, must be zero 31 * @flags: no flags defined right now, must be zero for %SIOCSHWTSTAMP
32 * @tx_type: one of HWTSTAMP_TX_* 32 * @tx_type: one of HWTSTAMP_TX_*
33 * @rx_filter: one of HWTSTAMP_FILTER_* 33 * @rx_filter: one of HWTSTAMP_FILTER_*
34 * 34 *
35 * %SIOCSHWTSTAMP expects a &struct ifreq with a ifr_data pointer to 35 * %SIOCGHWTSTAMP and %SIOCSHWTSTAMP expect a &struct ifreq with a
36 * this structure. If the driver or hardware does not support the 36 * ifr_data pointer to this structure. For %SIOCSHWTSTAMP, if the
37 * requested @rx_filter value, the driver may use a more general 37 * driver or hardware does not support the requested @rx_filter value,
38 * filter mode. In this case @rx_filter will indicate the actual mode 38 * the driver may use a more general filter mode. In this case
39 * on return. 39 * @rx_filter will indicate the actual mode on return.
40 */ 40 */
41struct hwtstamp_config { 41struct hwtstamp_config {
42 int flags; 42 int flags;
diff --git a/include/uapi/linux/sockios.h b/include/uapi/linux/sockios.h
index 7997a506ad41..e888b1aed69f 100644
--- a/include/uapi/linux/sockios.h
+++ b/include/uapi/linux/sockios.h
@@ -125,7 +125,8 @@
125#define SIOCBRDELIF 0x89a3 /* remove interface from bridge */ 125#define SIOCBRDELIF 0x89a3 /* remove interface from bridge */
126 126
127/* hardware time stamping: parameters in linux/net_tstamp.h */ 127/* hardware time stamping: parameters in linux/net_tstamp.h */
128#define SIOCSHWTSTAMP 0x89b0 128#define SIOCSHWTSTAMP 0x89b0 /* set and get config */
129#define SIOCGHWTSTAMP 0x89b1 /* get config */
129 130
130/* Device private ioctl calls */ 131/* Device private ioctl calls */
131 132
diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c
index 5b7d0e1d0664..cf999e09bcd2 100644
--- a/net/core/dev_ioctl.c
+++ b/net/core/dev_ioctl.c
@@ -327,6 +327,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd)
327 cmd == SIOCBRADDIF || 327 cmd == SIOCBRADDIF ||
328 cmd == SIOCBRDELIF || 328 cmd == SIOCBRDELIF ||
329 cmd == SIOCSHWTSTAMP || 329 cmd == SIOCSHWTSTAMP ||
330 cmd == SIOCGHWTSTAMP ||
330 cmd == SIOCWANDEV) { 331 cmd == SIOCWANDEV) {
331 err = -EOPNOTSUPP; 332 err = -EOPNOTSUPP;
332 if (ops->ndo_do_ioctl) { 333 if (ops->ndo_do_ioctl) {
@@ -546,6 +547,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
546 */ 547 */
547 default: 548 default:
548 if (cmd == SIOCWANDEV || 549 if (cmd == SIOCWANDEV ||
550 cmd == SIOCGHWTSTAMP ||
549 (cmd >= SIOCDEVPRIVATE && 551 (cmd >= SIOCDEVPRIVATE &&
550 cmd <= SIOCDEVPRIVATE + 15)) { 552 cmd <= SIOCDEVPRIVATE + 15)) {
551 dev_load(net, ifr.ifr_name); 553 dev_load(net, ifr.ifr_name);
diff --git a/net/socket.c b/net/socket.c
index 7a766ab83ca5..1a548b70ef3a 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -3231,6 +3231,7 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
3231 case SIOCBONDSLAVEINFOQUERY: 3231 case SIOCBONDSLAVEINFOQUERY:
3232 case SIOCBONDINFOQUERY: 3232 case SIOCBONDINFOQUERY:
3233 case SIOCSHWTSTAMP: 3233 case SIOCSHWTSTAMP:
3234 case SIOCGHWTSTAMP:
3234 return compat_ifr_data_ioctl(net, cmd, argp); 3235 return compat_ifr_data_ioctl(net, cmd, argp);
3235 3236
3236 case FIOSETOWN: 3237 case FIOSETOWN: