Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
net_ioctl [2018/09/03 15:58] – [Kernel workflow] rpjdaynet_ioctl [2018/09/04 10:31] (current) – [send_ioctl()] rpjday
Line 18: Line 18:
       * [[https://github.com/torvalds/linux/blob/master/net/core/dev_ioctl.c|dev_ioctl.c]]       * [[https://github.com/torvalds/linux/blob/master/net/core/dev_ioctl.c|dev_ioctl.c]]
  
-===== Sample userspace call =====+===== Sample userspace call: ethtool =====
  
-From ''ethtool'', which has a ''send_ioctl()'' wrapper:+Git repo is [[https://git.kernel.org/pub/scm/network/ethtool/ethtool.git/|here]]. 
 + 
 +==== send_ioctl() ==== 
 + 
 +From ''ethtool.c'',simple wrapper around the ''ioctl()'' call:
  
 <code> <code>
Line 26: Line 30:
 int send_ioctl(struct cmd_context *ctx, void *cmd) int send_ioctl(struct cmd_context *ctx, void *cmd)
 { {
-        ctx->ifr.ifr_data = cmd;+        ctx->ifr.ifr_data = cmd;        // command-specific structure
         return ioctl(ctx->fd, SIOCETHTOOL, &ctx->ifr);         return ioctl(ctx->fd, SIOCETHTOOL, &ctx->ifr);
 } }
Line 32: Line 36:
 </code> </code>
  
-===== struct ifreq =====+QUESTION: What is returned in ifreq%%->%%cmd? 
 + 
 +==== struct cmd_context ==== 
 + 
 +From ''internal.h'', ''struct cmd_context'' showing the embedded ''struct ifreq'': 
 + 
 +<code> 
 +/* Context for sub-commands */ 
 +struct cmd_context { 
 +        const char *devname;    /* net device name */ 
 +        int fd;                 /* socket suitable for ethtool ioctl */ 
 +        struct ifreq ifr;       /* ifreq suitable for ethtool ioctl */ 
 +        int argc;               /* number of arguments to the sub-command */ 
 +        char **argp;            /* arguments to the sub-command */ 
 +}; 
 + 
 +</code> 
 + 
 +==== struct ifreq ====
  
-From ''include/uapi/linux/if.h'':+From ''include/uapi/linux/if.h'', the unsigned long arg passed with ''ioctl()'':
  
 <code> <code>
Line 112: Line 134:
 ==== sock_ioctl() ==== ==== sock_ioctl() ====
  
-Also from ''net/socket.c'':+Also from ''net/socket.c'' -- anything related to ''SIOCDEVPRIVATE'' is seriously deprecated (see [[https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/sockios.h#L135|here]]):
  
 <code> <code>
Line 136: Line 158:
                                 return -EFAULT;                                 return -EFAULT;
         } else         } else
 +</code>
 +
 +This reflects wireless extensions, which should not be relevant:
 +
 +<code>
 #ifdef CONFIG_WEXT_CORE #ifdef CONFIG_WEXT_CORE
         if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {         if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
Line 141: Line 168:
         } else         } else
 #endif #endif
 +</code>
 +
 +Finally, this is where we should end up:
 +
 +<code>
                 switch (cmd) {                 switch (cmd) {
                 case FIOSETOWN:                 case FIOSETOWN:
  • net_ioctl.1535990328.txt.gz
  • Last modified: 2018/09/03 15:58
  • by rpjday