1. 03 4月, 2023 6 次提交
    • V
      net: create a netdev notifier for DSA to reject PTP on DSA master · 88c0a6b5
      Vladimir Oltean 提交于
      The fact that PTP 2-step TX timestamping is broken on DSA switches if
      the master also timestamps the same packets is documented by commit
      f685e609 ("net: dsa: Deny PTP on master if switch supports it").
      We attempt to help the users avoid shooting themselves in the foot by
      making DSA reject the timestamping ioctls on an interface that is a DSA
      master, and the switch tree beneath it contains switches which are aware
      of PTP.
      
      The only problem is that there isn't an established way of intercepting
      ndo_eth_ioctl calls, so DSA creates avoidable burden upon the network
      stack by creating a struct dsa_netdevice_ops with overlaid function
      pointers that are manually checked from the relevant call sites. There
      used to be 2 such dsa_netdevice_ops, but now, ndo_eth_ioctl is the only
      one left.
      
      There is an ongoing effort to migrate driver-visible hardware timestamping
      control from the ndo_eth_ioctl() based API to a new ndo_hwtstamp_set()
      model, but DSA actively prevents that migration, since dsa_master_ioctl()
      is currently coded to manually call the master's legacy ndo_eth_ioctl(),
      and so, whenever a network device driver would be converted to the new
      API, DSA's restrictions would be circumvented, because any device could
      be used as a DSA master.
      
      The established way for unrelated modules to react on a net device event
      is via netdevice notifiers. So we create a new notifier which gets
      called whenever there is an attempt to change hardware timestamping
      settings on a device.
      
      Finally, there is another reason why a netdev notifier will be a good
      idea, besides strictly DSA, and this has to do with PHY timestamping.
      
      With ndo_eth_ioctl(), all MAC drivers must manually call
      phy_has_hwtstamp() before deciding whether to act upon SIOCSHWTSTAMP,
      otherwise they must pass this ioctl to the PHY driver via
      phy_mii_ioctl().
      
      With the new ndo_hwtstamp_set() API, it will be desirable to simply not
      make any calls into the MAC device driver when timestamping should be
      performed at the PHY level.
      
      But there exist drivers, such as the lan966x switch, which need to
      install packet traps for PTP regardless of whether they are the layer
      that provides the hardware timestamps, or the PHY is. That would be
      impossible to support with the new API.
      
      The proposal there, too, is to introduce a netdev notifier which acts as
      a better cue for switching drivers to add or remove PTP packet traps,
      than ndo_hwtstamp_set(). The one introduced here "almost" works there as
      well, except for the fact that packet traps should only be installed if
      the PHY driver succeeded to enable hardware timestamping, whereas here,
      we need to deny hardware timestamping on the DSA master before it
      actually gets enabled. This is why this notifier is called "PRE_", and
      the notifier that would get used for PHY timestamping and packet traps
      would be called NETDEV_CHANGE_HWTSTAMP. This isn't a new concept, for
      example NETDEV_CHANGEUPPER and NETDEV_PRECHANGEUPPER do the same thing.
      
      In expectation of future netlink UAPI, we also pass a non-NULL extack
      pointer to the netdev notifier, and we make DSA populate it with an
      informative reason for the rejection. To avoid making it go to waste, we
      make the ioctl-based dev_set_hwtstamp() create a fake extack and print
      the message to the kernel log.
      
      Link: https://lore.kernel.org/netdev/20230401191215.tvveoi3lkawgg6g4@skbuf/
      Link: https://lore.kernel.org/netdev/20230310164451.ls7bbs6pdzs4m6pw@skbuf/Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      88c0a6b5
    • V
      net: add struct kernel_hwtstamp_config and make net_hwtstamp_validate() use it · c4bffeaa
      Vladimir Oltean 提交于
      Jakub Kicinski suggested that we may want to add new UAPI for
      controlling hardware timestamping through netlink in the future, and in
      that case, we will be limited to the struct hwtstamp_config that is
      currently passed in fixed binary format through the SIOCGHWTSTAMP and
      SIOCSHWTSTAMP ioctls. It would be good if new kernel code already
      started operating on an extensible kernel variant of that structure,
      similar in concept to struct kernel_ethtool_coalesce vs struct
      ethtool_coalesce.
      
      Since struct hwtstamp_config is in include/uapi/linux/net_tstamp.h, here
      we introduce include/linux/net_tstamp.h which shadows that other header,
      but also includes it, so that existing includers of this header work as
      before. In addition to that, we add the definition for the kernel-only
      structure, and a helper which translates all fields by manual copying.
      I am doing a manual copy in order to not force the alignment (or type)
      of the fields of struct kernel_hwtstamp_config to be the same as of
      struct hwtstamp_config, even though now, they are the same.
      
      Link: https://lore.kernel.org/netdev/20230330223519.36ce7d23@kernel.org/Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c4bffeaa
    • V
      net: move copy_from_user() out of net_hwtstamp_validate() · d5d5fd8f
      Vladimir Oltean 提交于
      The kernel will want to start using the more meaningful struct
      hwtstamp_config pointer in more places, so move the copy_from_user() at
      the beginning of dev_set_hwtstamp() in order to get to that, and pass
      this argument to net_hwtstamp_validate().
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d5d5fd8f
    • V
      net: promote SIOCSHWTSTAMP and SIOCGHWTSTAMP ioctls to dedicated handlers · 4ee58e1e
      Vladimir Oltean 提交于
      DSA does not want to intercept all ioctls handled by dev_eth_ioctl(),
      only SIOCSHWTSTAMP. This can be seen from commit f685e609 ("net:
      dsa: Deny PTP on master if switch supports it"). However, the way in
      which the dsa_ndo_eth_ioctl() is called would suggest otherwise.
      
      Split the handling of SIOCSHWTSTAMP and SIOCGHWTSTAMP ioctls into
      separate case statements of dev_ifsioc(), and make each one call its own
      sub-function. This also removes the dsa_ndo_eth_ioctl() call from
      dev_eth_ioctl(), which from now on exclusively handles PHY ioctls.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      4ee58e1e
    • V
      net: simplify handling of dsa_ndo_eth_ioctl() return code · 1193db2a
      Vladimir Oltean 提交于
      In the expression "x == 0 || x != -95", the term "x == 0" does not
      change the expression's logical value, because 0 != -95, and so,
      if x is 0, the expression would still be true by virtue of the second
      term. If x is non-zero, the expression depends on the truth value of
      the second term anyway. As such, the first term is redundant and can
      be deleted.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1193db2a
    • V
      net: don't abuse "default" case for unknown ioctl in dev_ifsioc() · 00d521b3
      Vladimir Oltean 提交于
      The "switch (cmd)" block from dev_ifsioc() gained a bit too much
      unnecessary manual handling of "cmd" in the "default" case, starting
      with the private ioctls.
      
      Clean that up by using the "ellipsis" gcc extension, adding separate
      cases for the rest of the ioctls, and letting the default case only
      return -EINVAL.
      Signed-off-by: NVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: NFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      00d521b3
  2. 27 3月, 2023 1 次提交
  3. 26 10月, 2022 1 次提交
    • K
      net: dev: Convert sa_data to flexible array in struct sockaddr · b5f0de6d
      Kees Cook 提交于
      One of the worst offenders of "fake flexible arrays" is struct sockaddr,
      as it is the classic example of why GCC and Clang have been traditionally
      forced to treat all trailing arrays as fake flexible arrays: in the
      distant misty past, sa_data became too small, and code started just
      treating it as a flexible array, even though it was fixed-size. The
      special case by the compiler is specifically that sizeof(sa->sa_data)
      and FORTIFY_SOURCE (which uses __builtin_object_size(sa->sa_data, 1))
      do not agree (14 and -1 respectively), which makes FORTIFY_SOURCE treat
      it as a flexible array.
      
      However, the coming -fstrict-flex-arrays compiler flag will remove
      these special cases so that FORTIFY_SOURCE can gain coverage over all
      the trailing arrays in the kernel that are _not_ supposed to be treated
      as a flexible array. To deal with this change, convert sa_data to a true
      flexible array. To keep the structure size the same, move sa_data into
      a union with a newly introduced sa_data_min with the original size. The
      result is that FORTIFY_SOURCE can continue to have no idea how large
      sa_data may actually be, but anything using sizeof(sa->sa_data) must
      switch to sizeof(sa->sa_data_min).
      
      Cc: Jens Axboe <axboe@kernel.dk>
      Cc: Pavel Begunkov <asml.silence@gmail.com>
      Cc: David Ahern <dsahern@kernel.org>
      Cc: Dylan Yudaken <dylany@fb.com>
      Cc: Yajun Deng <yajun.deng@linux.dev>
      Cc: Petr Machata <petrm@nvidia.com>
      Cc: Hangbin Liu <liuhangbin@gmail.com>
      Cc: Leon Romanovsky <leon@kernel.org>
      Cc: syzbot <syzkaller@googlegroups.com>
      Cc: Willem de Bruijn <willemb@google.com>
      Cc: Pablo Neira Ayuso <pablo@netfilter.org>
      Signed-off-by: NKees Cook <keescook@chromium.org>
      Link: https://lore.kernel.org/r/20221018095503.never.671-kees@kernel.orgSigned-off-by: NJakub Kicinski <kuba@kernel.org>
      b5f0de6d
  4. 10 6月, 2022 1 次提交
  5. 08 4月, 2022 1 次提交
    • J
      net: extract a few internals from netdevice.h · 6264f58c
      Jakub Kicinski 提交于
      There's a number of functions and static variables used
      under net/core/ but not from the outside. We currently
      dump most of them into netdevice.h. That bad for many
      reasons:
       - netdevice.h is very cluttered, hard to figure out
         what the APIs are;
       - netdevice.h is very long;
       - we have to touch netdevice.h more which causes expensive
         incremental builds.
      
      Create a header under net/core/ and move some declarations.
      
      The new header is also a bit of a catch-all but that's
      fine, if we create more specific headers people will
      likely over-think where their declaration fit best.
      And end up putting them in netdevice.h, again.
      
      More work should be done on splitting netdevice.h into more
      targeted headers, but that'd be more time consuming so small
      steps.
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      6264f58c
  6. 14 12月, 2021 1 次提交
    • H
      net_tstamp: add new flag HWTSTAMP_FLAG_BONDED_PHC_INDEX · 9c9211a3
      Hangbin Liu 提交于
      Since commit 94dd016a ("bond: pass get_ts_info and SIOC[SG]HWTSTAMP
      ioctl to active device") the user could get bond active interface's
      PHC index directly. But when there is a failover, the bond active
      interface will change, thus the PHC index is also changed. This may
      break the user's program if they did not update the PHC timely.
      
      This patch adds a new hwtstamp_config flag HWTSTAMP_FLAG_BONDED_PHC_INDEX.
      When the user wants to get the bond active interface's PHC, they need to
      add this flag and be aware the PHC index may be changed.
      
      With the new flag. All flag checks in current drivers are removed. Only
      the checking in net_hwtstamp_validate() is kept.
      Suggested-by: NJakub Kicinski <kuba@kernel.org>
      Signed-off-by: NHangbin Liu <liuhangbin@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      9c9211a3
  7. 07 12月, 2021 1 次提交
  8. 01 11月, 2021 1 次提交
  9. 05 8月, 2021 2 次提交
    • N
      net: core: don't call SIOCBRADD/DELIF for non-bridge devices · 9384eacd
      Nikolay Aleksandrov 提交于
      Commit ad2f99ae ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      changed SIOCBRADD/DELIF to use bridge's ioctl hook (br_ioctl_hook)
      without checking if the target netdevice is actually a bridge which can
      cause crashes and generally interpreting other devices' private pointers
      as net_bridge pointers.
      
      Crash example (lo - loopback):
      $ brctl addif lo ens16
       BUG: kernel NULL pointer dereference, address: 000000000000059898
       #PF: supervisor read access in kernel modede
       #PF: error_code(0x0000) - not-present pagege
       PGD 0 P4D 0 ^Ac
       Oops: 0000 [#1] SMP NOPTI
       CPU: 2 PID: 1376 Comm: brctl Kdump: loaded Tainted: G        W         5.14.0-rc3+ #405
       Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-4.fc34 04/01/2014
       RIP: 0010:add_del_if+0x1f/0x7c [bridge]
       Code: 80 bf 1b a0 41 5c e9 c0 3c 03 e1 0f 1f 44 00 00 41 55 41 54 41 89 f4 be 0c 00 00 00 55 48 89 fd 53 48 8b 87 88 00 00 00 89 d3 <4c> 8b a8 98 05 00 00 49 8b bd d0 00 00 00 e8 17 d7 f3 e0 84 c0 74
       RSP: 0018:ffff888109d97cb0 EFLAGS: 00010202^Ac
       RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
       RDX: 0000000000000000 RSI: 000000000000000c RDI: ffff888101239bc0
       RBP: ffff888101239bc0 R08: 0000000000000001 R09: 0000000000000000
       R10: ffff888109d97cd8 R11: 00000000000000a3 R12: 0000000000000012
       R13: 0000000000000000 R14: ffff888101239bc0 R15: ffff888109d97e10
       FS:  00007fc1e365b540(0000) GS:ffff88822be80000(0000) knlGS:0000000000000000
       CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
       CR2: 0000000000000598 CR3: 0000000106506000 CR4: 00000000000006e0
       Call Trace:
        br_ioctl_stub+0x7c/0x441 [bridge]
        br_ioctl_call+0x6d/0x8a
        dev_ifsioc+0x325/0x4e8
        dev_ioctl+0x46b/0x4e1
        sock_do_ioctl+0x7b/0xad
        sock_ioctl+0x2de/0x2f2
        vfs_ioctl+0x1e/0x2b
        __do_sys_ioctl+0x63/0x86
        do_syscall_64+0xcb/0xf2
        entry_SYSCALL_64_after_hwframe+0x44/0xae
       RIP: 0033:0x7fc1e3589427
       Code: 00 00 90 48 8b 05 69 aa 0c 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 39 aa 0c 00 f7 d8 64 89 01 48
       RSP: 002b:00007ffc8d501d38 EFLAGS: 00000202 ORIG_RAX: 000000000000001010
       RAX: ffffffffffffffda RBX: 0000000000000012 RCX: 00007fc1e3589427
       RDX: 00007ffc8d501d60 RSI: 00000000000089a3 RDI: 0000000000000003
       RBP: 00007ffc8d501d60 R08: 0000000000000000 R09: fefefeff77686d74
       R10: fffffffffffff8f9 R11: 0000000000000202 R12: 00007ffc8d502e06
       R13: 00007ffc8d502e06 R14: 0000000000000000 R15: 0000000000000000
       Modules linked in: bridge stp llc bonding ipv6 virtio_net [last unloaded: llc]^Ac
       CR2: 0000000000000598
      
      Reported-by: syzbot+79f4a8692e267bdb7227@syzkaller.appspotmail.com
      Fixes: ad2f99ae ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      Signed-off-by: NNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      9384eacd
    • N
      net: bridge: fix ioctl locking · 893b1958
      Nikolay Aleksandrov 提交于
      Before commit ad2f99ae ("net: bridge: move bridge ioctls out of
      .ndo_do_ioctl") the bridge ioctl calls were divided in two parts:
      one was deviceless called by sock_ioctl and didn't expect rtnl to be held,
      the other was with a device called by dev_ifsioc() and expected rtnl to be
      held. After the commit above they were united in a single ioctl stub, but
      it didn't take care of the locking expectations.
      For sock_ioctl now we acquire  (1) br_ioctl_mutex, (2) rtnl
      and for dev_ifsioc we acquire  (1) rtnl,           (2) br_ioctl_mutex
      
      The fix is to get a refcnt on the netdev for dev_ifsioc calls and drop rtnl
      then to reacquire it in the bridge ioctl stub after br_ioctl_mutex has
      been acquired. That will avoid playing locking games and make the rules
      straight-forward: we always take br_ioctl_mutex first, and then rtnl.
      
      Reported-by: syzbot+34fe5894623c4ab1b379@syzkaller.appspotmail.com
      Fixes: ad2f99ae ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      Signed-off-by: NNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      893b1958
  10. 28 7月, 2021 7 次提交
    • A
      net: bonding: move ioctl handling to private ndo operation · 3d9d00bd
      Arnd Bergmann 提交于
      All other user triggered operations are gone from ndo_ioctl, so move
      the SIOCBOND family into a custom operation as well.
      
      The .ndo_ioctl() helper is no longer called by the dev_ioctl.c code now,
      but there are still a few definitions in obsolete wireless drivers as well
      as the appletalk and ieee802154 layers to call SIOCSIFADDR/SIOCGIFADDR
      helpers from inside the kernel.
      
      Cc: Jay Vosburgh <j.vosburgh@gmail.com>
      Cc: Veaceslav Falico <vfalico@gmail.com>
      Cc: Andy Gospodarek <andy@greyhouse.net>
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3d9d00bd
    • A
      net: bridge: move bridge ioctls out of .ndo_do_ioctl · ad2f99ae
      Arnd Bergmann 提交于
      Working towards obsoleting the .ndo_do_ioctl operation entirely,
      stop passing the SIOCBRADDIF/SIOCBRDELIF device ioctl commands
      into this callback.
      
      My first attempt was to add another ndo_siocbr() callback, but
      as there is only a single driver that takes these commands and
      there is already a hook mechanism to call directly into this
      driver, extend this hook instead, and use it for both the
      deviceless and the device specific ioctl commands.
      
      Cc: Roopa Prabhu <roopa@nvidia.com>
      Cc: Nikolay Aleksandrov <nikolay@nvidia.com>
      Cc: bridge@lists.linux-foundation.org
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ad2f99ae
    • A
      net: socket: return changed ifreq from SIOCDEVPRIVATE · 88fc023f
      Arnd Bergmann 提交于
      Some drivers that use SIOCDEVPRIVATE ioctl commands modify
      the ifreq structure and expect it to be passed back to user
      space, which has never really happened for compat mode
      because the calling these drivers through ndo_do_ioctl
      requires overwriting the ifr_data pointer.
      
      Now that all drivers are converted to ndo_siocdevprivate,
      change it to handle this correctly in both compat and
      native mode.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      88fc023f
    • A
      net: split out ndo_siowandev ioctl · ad7eab2a
      Arnd Bergmann 提交于
      In order to further reduce the scope of ndo_do_ioctl(), move
      out the SIOCWANDEV handling into a new network device operation
      function.
      
      Adjust the prototype to only pass the if_settings sub-structure
      in place of the ifreq, and remove the redundant 'cmd' argument
      in the process.
      
      Cc: Krzysztof Halasa <khc@pm.waw.pl>
      Cc: "Jan \"Yenya\" Kasprzak" <kas@fi.muni.cz>
      Cc: Kevin Curtis <kevin.curtis@farsite.co.uk>
      Cc: Zhao Qiang <qiang.zhao@nxp.com>
      Cc: Martin Schiller <ms@dev.tdt.de>
      Cc: Jiri Slaby <jirislaby@kernel.org>
      Cc: linux-x25@vger.kernel.org
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ad7eab2a
    • A
      dev_ioctl: split out ndo_eth_ioctl · a7605370
      Arnd Bergmann 提交于
      Most users of ndo_do_ioctl are ethernet drivers that implement
      the MII commands SIOCGMIIPHY/SIOCGMIIREG/SIOCSMIIREG, or hardware
      timestamping with SIOCSHWTSTAMP/SIOCGHWTSTAMP.
      
      Separate these from the few drivers that use ndo_do_ioctl to
      implement SIOCBOND, SIOCBR and SIOCWANDEV commands.
      
      This is a purely cosmetic change intended to help readers find
      their way through the implementation.
      
      Cc: Doug Ledford <dledford@redhat.com>
      Cc: Jason Gunthorpe <jgg@ziepe.ca>
      Cc: Jay Vosburgh <j.vosburgh@gmail.com>
      Cc: Veaceslav Falico <vfalico@gmail.com>
      Cc: Andy Gospodarek <andy@greyhouse.net>
      Cc: Andrew Lunn <andrew@lunn.ch>
      Cc: Vivien Didelot <vivien.didelot@gmail.com>
      Cc: Florian Fainelli <f.fainelli@gmail.com>
      Cc: Vladimir Oltean <olteanv@gmail.com>
      Cc: Leon Romanovsky <leon@kernel.org>
      Cc: linux-rdma@vger.kernel.org
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Acked-by: NJason Gunthorpe <jgg@nvidia.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a7605370
    • A
      dev_ioctl: pass SIOCDEVPRIVATE data separately · a554bf96
      Arnd Bergmann 提交于
      The compat handlers for SIOCDEVPRIVATE are incorrect for any driver that
      passes data as part of struct ifreq rather than as an ifr_data pointer, or
      that passes data back this way, since the compat_ifr_data_ioctl() helper
      overwrites the ifr_data pointer and does not copy anything back out.
      
      Since all drivers using devprivate commands are now converted to the
      new .ndo_siocdevprivate callback, fix this by adding the missing piece
      and passing the pointer separately the whole way.
      
      This further unifies the native and compat logic for socket ioctls,
      as the new code now passes the correct pointer as well as the correct
      data for both native and compat ioctls.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a554bf96
    • A
      net: split out SIOCDEVPRIVATE handling from dev_ioctl · b9067f5d
      Arnd Bergmann 提交于
      SIOCDEVPRIVATE ioctl commands are mainly used in really old
      drivers, and they have a number of problems:
      
      - They hide behind the normal .ndo_do_ioctl function that
        is also used for other things in modern drivers, so it's
        hard to spot a driver that actually uses one of these
      
      - Since drivers use a number different calling conventions,
        it is impossible to support compat mode for them in
        a generic way.
      
      - With all drivers using the same 16 commands codes, there
        is no way to introspect the data being passed through
        things like strace.
      
      Add a new net_device_ops callback pointer, to address the
      first two of these. Separating them from .ndo_do_ioctl
      makes it easy to grep for drivers with a .ndo_siocdevprivate
      callback, and the unwieldy name hopefully makes it easier
      to spot in code review.
      
      By passing the ifreq structure and the ifr_data pointer
      separately, it is no longer necessary to overload these,
      and the driver can use either one for a given command.
      
      Cc: Cong Wang <cong.wang@bytedance.com>
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b9067f5d
  11. 23 7月, 2021 3 次提交
  12. 12 2月, 2021 1 次提交
    • C
      net: fix dev_ifsioc_locked() race condition · 3b23a32a
      Cong Wang 提交于
      dev_ifsioc_locked() is called with only RCU read lock, so when
      there is a parallel writer changing the mac address, it could
      get a partially updated mac address, as shown below:
      
      Thread 1			Thread 2
      // eth_commit_mac_addr_change()
      memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
      				// dev_ifsioc_locked()
      				memcpy(ifr->ifr_hwaddr.sa_data,
      					dev->dev_addr,...);
      
      Close this race condition by guarding them with a RW semaphore,
      like netdev_get_name(). We can not use seqlock here as it does not
      allow blocking. The writers already take RTNL anyway, so this does
      not affect the slow path. To avoid bothering existing
      dev_set_mac_address() callers in drivers, introduce a new wrapper
      just for user-facing callers on ioctl and rtnetlink paths.
      
      Note, bonding also changes slave mac addresses but that requires
      a separate patch due to the complexity of bonding code.
      
      Fixes: 3710becf ("net: RCU locking for simple ioctl()")
      Reported-by: N"Gong, Sishuai" <sishuai@purdue.edu>
      Cc: Eric Dumazet <eric.dumazet@gmail.com>
      Cc: Jakub Kicinski <kuba@kernel.org>
      Signed-off-by: NCong Wang <cong.wang@bytedance.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3b23a32a
  13. 04 11月, 2020 1 次提交
  14. 24 8月, 2020 1 次提交
  15. 21 7月, 2020 2 次提交
  16. 30 3月, 2020 1 次提交
  17. 26 12月, 2019 1 次提交
  18. 28 3月, 2019 1 次提交
    • B
      net/core: Document all dev_ioctl() arguments · b3c0fd61
      Bart Van Assche 提交于
      This patch avoids that the following warnings are reported when building
      with W=1:
      
      net/core/dev_ioctl.c:378: warning: Function parameter or member 'ifr' not described in 'dev_ioctl'
      net/core/dev_ioctl.c:378: warning: Function parameter or member 'need_copyout' not described in 'dev_ioctl'
      net/core/dev_ioctl.c:378: warning: Excess function parameter 'arg' description in 'dev_ioctl'
      
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Fixes: 44c02a2c ("dev_ioctl(): move copyin/copyout to callers") # v4.16.
      Signed-off-by: NBart Van Assche <bvanassche@acm.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b3c0fd61
  19. 14 12月, 2018 1 次提交
  20. 07 12月, 2018 1 次提交
  21. 25 7月, 2018 1 次提交
    • T
      net: remove redundant input checks in SIOCSIFTXQLEN case of dev_ifsioc · 8dd30201
      Tariq Toukan 提交于
      The cited patch added a call to dev_change_tx_queue_len in
      SIOCSIFTXQLEN case.
      This obsoletes the new len comparison check done before the function call.
      Remove it here.
      
      For the desicion of keep/remove the negative value check, we examine the
      range check in dev_change_tx_queue_len.
      On 64-bit we will fail with -ERANGE.  The 32-bit int ifr_qlen will be sign
      extended to 64-bits when it is passed into dev_change_tx_queue_len(). And
      then for negative values this test triggers:
      
      	if (new_len != (unsigned int)new_len)
      		return -ERANGE;
      
      because:
      	if (0xffffffffWHATEVER != 0x00000000WHATEVER)
      
      On 32-bit the signed value will be accepted, changing behavior.
      
      Therefore, the negative value check is kept.
      
      Fixes: 3f76df19 ("net: use dev_change_tx_queue_len() for SIOCSIFTXQLEN")
      Signed-off-by: NTariq Toukan <tariqt@mellanox.com>
      Reviewed-by: NEran Ben Elisha <eranbe@mellanox.com>
      Cc: Cong Wang <xiyou.wangcong@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8dd30201
  22. 30 6月, 2018 1 次提交
  23. 08 3月, 2018 1 次提交
  24. 25 1月, 2018 2 次提交