1. 18 Mar, 2022 28 commits
    • Luiz Augusto von Dentz's avatar
      Bluetooth: Fix use after free in hci_send_acl · f63d24ba
      Luiz Augusto von Dentz authored
      This fixes the following trace caused by receiving
      HCI_EV_DISCONN_PHY_LINK_COMPLETE which does call hci_conn_del without
      first checking if conn->type is in fact AMP_LINK and in case it is
      do properly cleanup upper layers with hci_disconn_cfm:
      
       ==================================================================
          BUG: KASAN: use-after-free in hci_send_acl+0xaba/0xc50
          Read of size 8 at addr ffff88800e404818 by task bluetoothd/142
      
          CPU: 0 PID: 142 Comm: bluetoothd Not tainted
          5.17.0-rc5-00006-gda4022eeac1a #7
          Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
          rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014
          Call Trace:
           <TASK>
           dump_stack_lvl+0x45/0x59
           print_address_description.constprop.0+0x1f/0x150
           kasan_report.cold+0x7f/0x11b
           hci_send_acl+0xaba/0xc50
           l2cap_do_send+0x23f/0x3d0
           l2cap_chan_send+0xc06/0x2cc0
           l2cap_sock_sendmsg+0x201/0x2b0
           sock_sendmsg+0xdc/0x110
           sock_write_iter+0x20f/0x370
           do_iter_readv_writev+0x343/0x690
           do_iter_write+0x132/0x640
           vfs_writev+0x198/0x570
           do_writev+0x202/0x280
           do_syscall_64+0x38/0x90
           entry_SYSCALL_64_after_hwframe+0x44/0xae
          RSP: 002b:00007ffce8a099b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000014
          Code: 0f 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3
          0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 14 00 00 00 0f 05
          <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 89 54 24 1c 48 89 74 24 10
          RDX: 0000000000000001 RSI: 00007ffce8a099e0 RDI: 0000000000000015
          RAX: ffffffffffffffda RBX: 00007ffce8a099e0 RCX: 00007f788fc3cf77
          R10: 00007ffce8af7080 R11: 0000000000000246 R12: 000055e4ccf75580
          RBP: 0000000000000015 R08: 0000000000000002 R09: 0000000000000001
          </TASK>
          R13: 000055e4ccf754a0 R14: 000055e4ccf75cd0 R15: 000055e4ccf4a6b0
      
          Allocated by task 45:
              kasan_save_stack+0x1e/0x40
              __kasan_kmalloc+0x81/0xa0
              hci_chan_create+0x9a/0x2f0
              l2cap_conn_add.part.0+0x1a/0xdc0
              l2cap_connect_cfm+0x236/0x1000
              le_conn_complete_evt+0x15a7/0x1db0
              hci_le_conn_complete_evt+0x226/0x2c0
              hci_le_meta_evt+0x247/0x450
              hci_event_packet+0x61b/0xe90
              hci_rx_work+0x4d5/0xc50
              process_one_work+0x8fb/0x15a0
              worker_thread+0x576/0x1240
              kthread+0x29d/0x340
              ret_from_fork+0x1f/0x30
      
          Freed by task 45:
              kasan_save_stack+0x1e/0x40
              kasan_set_track+0x21/0x30
              kasan_set_free_info+0x20/0x30
              __kasan_slab_free+0xfb/0x130
              kfree+0xac/0x350
              hci_conn_cleanup+0x101/0x6a0
              hci_conn_del+0x27e/0x6c0
              hci_disconn_phylink_complete_evt+0xe0/0x120
              hci_event_packet+0x812/0xe90
              hci_rx_work+0x4d5/0xc50
              process_one_work+0x8fb/0x15a0
              worker_thread+0x576/0x1240
              kthread+0x29d/0x340
              ret_from_fork+0x1f/0x30
      
          The buggy address belongs to the object at ffff88800c0f0500
          The buggy address is located 24 bytes inside of
          which belongs to the cache kmalloc-128 of size 128
          The buggy address belongs to the page:
          128-byte region [ffff88800c0f0500, ffff88800c0f0580)
          flags: 0x100000000000200(slab|node=0|zone=1)
          page:00000000fe45cd86 refcount:1 mapcount:0
          mapping:0000000000000000 index:0x0 pfn:0xc0f0
          raw: 0000000000000000 0000000080100010 00000001ffffffff
          0000000000000000
          raw: 0100000000000200 ffffea00003a2c80 dead000000000004
          ffff8880078418c0
          page dumped because: kasan: bad access detected
          ffff88800c0f0400: 00 00 00 00 00 00 00 00 00 00 00 00 00 fc fc fc
          Memory state around the buggy address:
          >ffff88800c0f0500: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
          ffff88800c0f0480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
          ffff88800c0f0580: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
                                      ^
          ==================================================================
          ffff88800c0f0600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      Reported-by: default avatarSönke Huster <soenke.huster@eknoes.de>
      Tested-by: default avatarSönke Huster <soenke.huster@eknoes.de>
      Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      f63d24ba
    • Ismael Ferreras Morezuelas's avatar
      Bluetooth: btusb: Use quirk to skip HCI_FLT_CLEAR_ALL on fake CSR controllers · b3cf94c8
      Ismael Ferreras Morezuelas authored
      Another subset of the more recent batch of Chinese clones aren't
      specs-compliant and seem to lock up whenever they receive a
      HCI_OP_SET_EVENT_FLT with flt_type set to zero/HCI_FLT_CLEAR_ALL,
      which on Linux (until the recent HCI state-machine refactor) happened
      right at BR/EDR setup. As there are other less-straightforward ways
      of reaching those operations, this patch is still relevant.
      
      So, while all the previous efforts to wrangle the herd of fake CSRs
      seem to be paying off (and these also get detected as such) we
      still need to take care of this quirk; testers seem to agree
      that these dongles tend to work well enough afterwards.
      
      From some cursory USB packet capture on Windows it seems like
      that driver doesn't appear to use this clear-all functionality at all.
      
      This patch was tested on some really popular AliExpress-style
      dongles, in my case marked as "V5.0". Chip markings: UG8413,
      the backside of the PCB says "USB Dangel" (sic).
      
      Here is the `hciconfig -a` output; for completeness:
      
      hci0:	Type: Primary  Bus: USB
      	BD Address: 00:1A:7D:DA:7X:XX  ACL MTU: 679:8  SCO MTU: 48:16
      	UP RUNNING PSCAN ISCAN
      	Features: 0xbf 0x3e 0x4d 0xfa 0xdb 0x3d 0x7b 0xc7
      	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
      	Link policy: RSWITCH SNIFF
      	Link mode: PERIPHERAL ACCEPT
      	Name: 'CSR8510 A10.'
      	Class: 0x7c0104
      	Service Classes: Rendering, Capturing, Object Transfer, Audio, Telephony
      	Device Class: Computer, Desktop workstation
      	HCI Version: 4.0 (0x6)  Revision: 0x3120
      	LMP Version: 4.0 (0x6)  Subversion: 0x22bb
      	Manufacturer: Cambridge Silicon Radio (10)
      
      As well as the `lsusb -vv -d 0a12:0001`:
      
      ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
      Device Descriptor:
        bLength                18
        bDescriptorType         1
        bcdUSB               2.00
        bDeviceClass          224 Wireless
        bDeviceSubClass         1 Radio Frequency
        bDeviceProtocol         1 Bluetooth
        bMaxPacketSize0        64
        idVendor           0x0a12 Cambridge Silicon Radio, Ltd
        idProduct          0x0001 Bluetooth Dongle (HCI mode)
        bcdDevice           88.91
        iManufacturer           0
        iProduct                2 BT DONGLE10
        iSerial                 0
        bNumConfigurations      1
      
      Also, changed the benign dmesg print that shows up whenever the
      generic force-suspend fails from bt_dev_err to bt_dev_warn;
      it's okay and done on a best-effort basis, not a problem
      if that does not work.
      
      Also, swapped the HCI subver and LMP subver numbers for the Barrot
      in the comment, which I copied wrong the last time around.
      
      Fixes: 81cac64b ("Bluetooth: Deal with USB devices that are faking CSR vendor")
      Fixes: cde1a8a9 ("Bluetooth: btusb: Fix and detect most of the Chinese Bluetooth controllers")
      Fixes: d74e0ae7 ("Bluetooth: btusb: Fix detection of some fake CSR controllers with a bcdDevice val of 0x0134")
      Fixes: 0671c066 ("Bluetooth: btusb: Add workaround for remote-wakeup issues with Barrot 8041a02 fake CSR controllers")
      Fixes: f4292e2f ("Bluetooth: btusb: Make the CSR clone chip force-suspend workaround more generic")
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=60824
      Link: https://gist.github.com/nevack/6b36b82d715dc025163d9e9124840a07
      
      Cc: stable@vger.kernel.org
      Cc: Hans de Goede <hdegoede@redhat.com>
      Tested-by: default avatarGonzalo Tornaría <tornaria@cmat.edu.uy>
      Tested-by: default avatarMateus Lemos <lemonsmateus@gmail.com>
      Tested-by: default avatarIsmael Ferreras Morezuelas <swyterzone@gmail.com>
      Signed-off-by: default avatarIsmael Ferreras Morezuelas <swyterzone@gmail.com>
      Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      b3cf94c8
    • Ismael Ferreras Morezuelas's avatar
      Bluetooth: hci_sync: Add a new quirk to skip HCI_FLT_CLEAR_ALL · 0eaecfb2
      Ismael Ferreras Morezuelas authored
      Some controllers have problems with being sent a command to clear
      all filtering. While the HCI code does not unconditionally
      send a clear-all anymore at BR/EDR setup (after the state machine
      refactor), there might be more ways of hitting these codepaths
      in the future as the kernel develops.
      
      Cc: stable@vger.kernel.org
      Cc: Hans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarIsmael Ferreras Morezuelas <swyterzone@gmail.com>
      Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      0eaecfb2
    • Sean Wang's avatar
      Bluetooth: btmtkuart: fix the conflict between mtk and msft vendor event · 6ac034a7
      Sean Wang authored
      There is a conflict between MediaTek wmt event and msft vendor extension
      logic in the core layer since 145373cb ("Bluetooth: Add framework for
      Microsoft vendor extension") was introduced because we changed the type of
      mediatek wmt event to the type of msft vendor event in the driver.
      
      But the purpose we reported mediatek event to the core layer is for the
      diagnostic purpose with that we are able to see the full packet trace via
      monitoring socket with btmon. Thus, it is harmless we keep the original
      type of mediatek vendor event here to avoid breaking the msft extension
      function especially they can be supported by Mediatek future devices.
      Signed-off-by: default avatarSean Wang <sean.wang@mediatek.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      6ac034a7
    • Sean Wang's avatar
      Bluetooth: btmtkuart: add .set_bdaddr support · 3640e7f4
      Sean Wang authored
      add .set_bdaddr support
      Signed-off-by: default avatarSean Wang <sean.wang@mediatek.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      3640e7f4
    • Sean Wang's avatar
      Bluetooth: btmtkuart: rely on BT_MTK module · f5c3f989
      Sean Wang authored
      Rely on btmtk module to reduce duplicated code
      Signed-off-by: default avatarSean Wang <sean.wang@mediatek.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      f5c3f989
    • Takashi Iwai's avatar
      Bluetooth: btusb: Add missing Chicony device for Realtek RTL8723BE · cc68a041
      Takashi Iwai authored
      Chicony Electronics BT device with 04f2:b49f seems to be a missing
      entry for Realtek RTL8723BE.
      
      T:  Bus=02 Lev=01 Prnt=01 Port=03 Cnt=03 Dev#=  4 Spd=12   MxCh= 0
      D:  Ver= 2.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs=  1
      P:  Vendor=04f2 ProdID=b49f Rev= 2.00
      S:  Manufacturer=Realtek
      S:  Product=Bluetooth Radio
      S:  SerialNumber=00e04c000001
      C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA
      I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
      E:  Ad=81(I) Atr=03(Int.) MxPS=  16 Ivl=1ms
      E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
      E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
      I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
      E:  Ad=03(O) Atr=01(Isoc) MxPS=   0 Ivl=1ms
      E:  Ad=83(I) Atr=01(Isoc) MxPS=   0 Ivl=1ms
      I:  If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
      E:  Ad=03(O) Atr=01(Isoc) MxPS=   9 Ivl=1ms
      E:  Ad=83(I) Atr=01(Isoc) MxPS=   9 Ivl=1ms
      I:  If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
      E:  Ad=03(O) Atr=01(Isoc) MxPS=  17 Ivl=1ms
      E:  Ad=83(I) Atr=01(Isoc) MxPS=  17 Ivl=1ms
      I:  If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
      E:  Ad=03(O) Atr=01(Isoc) MxPS=  25 Ivl=1ms
      E:  Ad=83(I) Atr=01(Isoc) MxPS=  25 Ivl=1ms
      I:  If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
      E:  Ad=03(O) Atr=01(Isoc) MxPS=  33 Ivl=1ms
      E:  Ad=83(I) Atr=01(Isoc) MxPS=  33 Ivl=1ms
      I:  If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
      E:  Ad=03(O) Atr=01(Isoc) MxPS=  49 Ivl=1ms
      E:  Ad=83(I) Atr=01(Isoc) MxPS=  49 Ivl=1ms
      
      BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1196779Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      cc68a041
    • Colin Ian King's avatar
      Bluetooth: mgmt: remove redundant assignment to variable cur_len · 0ca8794a
      Colin Ian King authored
      Variable cur_len is being ininitialized with a value in the start of
      a for-loop but this is never read, it is being re-assigned a new value
      on the first statement in the for-loop.  The initialization is redundant
      and can be removed.
      
      Cleans up clang scan build warning:
      net/bluetooth/mgmt.c:7958:14: warning: Although the value stored to 'cur_len'
      is used in the enclosing expression, the value is never actually read
      from 'cur_len' [deadcode.DeadStores]
      Signed-off-by: default avatarColin Ian King <colin.i.king@gmail.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      0ca8794a
    • Krasnov Arseniy Vladimirovich's avatar
      af_vsock: SOCK_SEQPACKET broken buffer test · e89600eb
      Krasnov Arseniy Vladimirovich authored
      Add test where sender sends two message, each with own
      data pattern. Reader tries to read first to broken buffer:
      it has three pages size, but middle page is unmapped. Then,
      reader tries to read second message to valid buffer. Test
      checks, that uncopied part of first message was dropped
      and thus not copied as part of second message.
      Signed-off-by: default avatarKrasnov Arseniy Vladimirovich <AVKrasnov@sberdevices.ru>
      Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e89600eb
    • Krasnov Arseniy Vladimirovich's avatar
      af_vsock: SOCK_SEQPACKET receive timeout test · efb3719f
      Krasnov Arseniy Vladimirovich authored
      Test for receive timeout check: connection is established,
      receiver sets timeout, but sender does nothing. Receiver's
      'read()' call must return EAGAIN.
      Signed-off-by: default avatarKrasnov Arseniy Vladimirovich <AVKrasnov@sberdevices.ru>
      Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      efb3719f
    • David S. Miller's avatar
      Merge tag 'wireless-next-2022-03-18' of... · dca51fe7
      David S. Miller authored
      Merge tag 'wireless-next-2022-03-18' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next
      
      Kalle Valo says:
      
      ====================
      wireless-next patches for v5.18
      
      Third set of patches for v5.18. Smaller set this time, support for
      mt7921u and some work on MBSSID support. Also a workaround for rfkill
      userspace event.
      
      Major changes:
      
      mac80211
      
      * MBSSID beacon handling in AP mode
      
      rfkill
      
      * make new event layout opt-in to workaround buggy user space
      
      rtlwifi
      
      * support On Networks N150 device id
      
      mt76
      
      * mt7915: MBSSID and 6 GHz band support
      
      * new driver mt7921u
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      dca51fe7
    • David S. Miller's avatar
      Merge branch 'lan743x-PCI11010-#PCI11414' · e913c09d
      David S. Miller authored
      Raju Lakkaraju says:
      
      ====================
      net: lan743x: PCI11010 / PCI11414 devices
      
      This patch series continues with the addition of supported features
      for the Ethernet function of the PCI11010 / PCI11414 devices to
      the LAN743x driver.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e913c09d
    • Raju Lakkaraju's avatar
      net: lan743x: Add support for PTP-IO Event Output (Periodic Output) · e432dd3b
      Raju Lakkaraju authored
      Add support for PTP-IO Event Output (Periodic Output - perout) for
      PCI11010/PCI11414 chips
      Signed-off-by: default avatarRaju Lakkaraju <Raju.Lakkaraju@microchip.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e432dd3b
    • Raju Lakkaraju's avatar
      net: lan743x: Add support for PTP-IO Event Input External Timestamp (extts) · 60942c39
      Raju Lakkaraju authored
      PTP-IOs block provides for time stamping PTP-IO input events.
      PTP-IOs are numbered from 0 to 11.
      When a PTP-IO is enabled by the corresponding bit in the PTP-IO
      Capture Configuration Register, a rising or falling edge,
      respectively, will capture the 1588 Local Time Counter
      Signed-off-by: default avatarRaju Lakkaraju <Raju.Lakkaraju@microchip.com>
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      60942c39
    • Raju Lakkaraju's avatar
      net: lan743x: Add support for OTP · d808f7ca
      Raju Lakkaraju authored
      Add new the OTP read and write access functions for PCI11010/PCI11414 chips
      PCI11010/PCI11414 OTP module register offsets are different from
      LAN743x OTP module
      Signed-off-by: default avatarRaju Lakkaraju <Raju.Lakkaraju@microchip.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d808f7ca
    • Raju Lakkaraju's avatar
      net: lan743x: Add support for EEPROM · cdea83cc
      Raju Lakkaraju authored
      Add new the EEPROM read and write access functions and system lock
      protection to access by devices for PCI11010/PCI11414 chips
      Signed-off-by: default avatarRaju Lakkaraju <Raju.Lakkaraju@microchip.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      cdea83cc
    • Raju Lakkaraju's avatar
      net: lan743x: Add support to display Tx Queue statistics · bc1962e5
      Raju Lakkaraju authored
      Tx 4 queue statistics display through ethtool application
      Signed-off-by: default avatarRaju Lakkaraju <Raju.Lakkaraju@microchip.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      bc1962e5
    • Johannes Berg's avatar
      rfkill: make new event layout opt-in · 54f586a9
      Johannes Berg authored
      Again new complaints surfaced that we had broken the ABI here,
      although previously all the userspace tools had agreed that it
      was their mistake and fixed it. Yet now there are cases (e.g.
      RHEL) that want to run old userspace with newer kernels, and
      thus are broken.
      
      Since this is a bit of a whack-a-mole thing, change the whole
      extensibility scheme of rfkill to no longer just rely on the
      message lengths, but instead require userspace to opt in via a
      new ioctl to a given maximum event size that it is willing to
      understand.
      
      By default, set that to RFKILL_EVENT_SIZE_V1 (8), so that the
      behaviour for userspace not calling the ioctl will look as if
      it's just running on an older kernel.
      
      Fixes: 14486c82 ("rfkill: add a reason to the HW rfkill state")
      Cc: stable@vger.kernel.org # 5.11+
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
      Link: https://lore.kernel.org/r/20220316212749.16491491b270.Ifcb1950998330a596f29a2a162e00b7546a1d6d0@changeid
      54f586a9
    • David S. Miller's avatar
      Merge tag 'mlx5-updates-2022-03-17' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux · 5edce151
      David S. Miller authored
      Saeed Mahameed says:
      
      ====================
      mlx5-updates-2022-03-17
      
      1) From Maxim Mikityanskiy,
         Datapath improvements in preparation for XDP multi buffer
      
         This series contains general improvements for the datapath that are
         useful for the upcoming XDP multi buffer support:
      
         a. Non-linear legacy RQ: validate MTU for robustness, build the linear
            part of SKB over the first hardware fragment (instead of copying the
            packet headers), adjust headroom calculations to allow enabling headroom
            in the non-linear mode (useful for XDP multi buffer).
      
         b. XDP: do the XDP program test before function call, optimize
            parameters of mlx5e_xdp_handle.
      
      2) From Rongwei Liu, DR, reduce steering memory usage
         Currently, mlx5 driver uses mlx5_htbl/chunk/ste to organize
         steering logic. However there is a little memory waste.
      
         This update targets to reduce steering memory footprint by:
         a. Adjust struct member layout.
         b. Remove duplicated indicator by using simple functions call.
      
         With 500k TX rules(3 ste) plus 500k RX rules(6 stes), these patches
         can save around 17% memory.
      
      3) Three cleanup commits at the end of this series.
      ===================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5edce151
    • Jakub Kicinski's avatar
      Merge branch 'mirroring-for-ocelot-switches' · 3e66fd54
      Jakub Kicinski authored
      Vladimir Oltean says:
      
      ====================
      Mirroring for Ocelot switches
      
      This series adds support for tc-matchall (port-based) and tc-flower
      (flow-based) offloading of the tc-mirred action. Support has been added
      for both the ocelot switchdev driver and felix DSA driver.
      ====================
      
      Link: https://lore.kernel.org/r/20220316204144.2679277-1-vladimir.oltean@nxp.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      3e66fd54
    • Vladimir Oltean's avatar
      net: dsa: felix: add port mirroring support · 5e497497
      Vladimir Oltean authored
      Gain support for port mirroring using tc-matchall by forwarding the
      calls to the ocelot switch library.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      5e497497
    • Vladimir Oltean's avatar
      net: dsa: pass extack to dsa_switch_ops :: port_mirror_add() · 0148bb50
      Vladimir Oltean authored
      Drivers might have error messages to propagate to user space, most
      common being that they support a single mirror port.
      
      Propagate the netlink extack so that they can inform user space in a
      verbal way of their limitations.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      0148bb50
    • Vladimir Oltean's avatar
      net: mscc: ocelot: offload per-flow mirroring using tc-mirred and VCAP IS2 · f2a0e216
      Vladimir Oltean authored
      Per-flow mirroring with the VCAP IS2 TCAM (in itself handled as an
      offload for tc-flower) is done by setting the MIRROR_ENA bit from the
      action vector of the filter. The packet is mirrored to the port mask
      configured in the ANA:ANA:MIRRORPORTS register (the same port mask as
      the destinations for port-based mirroring).
      
      Functionality was tested with:
      
      tc qdisc add dev swp3 clsact
      tc filter add dev swp3 ingress protocol ip \
      	flower skip_sw ip_proto icmp \
      	action mirred egress mirror dev swp1
      
      and pinging through swp3, while seeing that the ICMP replies are
      mirrored towards swp1.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      f2a0e216
    • Vladimir Oltean's avatar
      net: mscc: ocelot: establish functions for handling VCAP aux resources · c3d427ea
      Vladimir Oltean authored
      Some VCAP filters utilize resources which are global to the switch, like
      for example VCAP IS2 policers take an index into a global policer pool.
      
      In commit c9a7fe12 ("net: mscc: ocelot: add action of police on
      vcap_is2"), Xiaoliang expressed this by hooking into the low-level
      ocelot_vcap_filter_add_to_block() and ocelot_vcap_block_remove_filter()
      functions, and allocating/freeing the policers from there.
      
      Evaluating the code, there probably isn't a better place, but we'll need
      to do something similar for the mirror ports, and the code will start to
      look even more hacked up than it is right now.
      
      Create two ocelot_vcap_filter_{add,del}_aux_resources() functions to
      contain the madness, and pollute less the body of other functions such
      as ocelot_vcap_filter_add_to_block().
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      c3d427ea
    • Vladimir Oltean's avatar
      net: mscc: ocelot: add port mirroring support using tc-matchall · ccb6ed42
      Vladimir Oltean authored
      Ocelot switches perform port-based ingress mirroring if
      ANA:PORT:PORT_CFG field SRC_MIRROR_ENA is set, and egress mirroring if
      the port is in ANA:ANA:EMIRRORPORTS.
      
      Both ingress-mirrored and egress-mirrored frames are copied to the port
      mask from ANA:ANA:MIRRORPORTS.
      
      So the choice of limiting to a single mirror port via ocelot_mirror_get()
      and ocelot_mirror_put() may seem bizarre, but the hardware model doesn't
      map very well to the user space model. If the user wants to mirror the
      ingress of swp1 towards swp2 and the ingress of swp3 towards swp4, we'd
      have to program ANA:ANA:MIRRORPORTS with BIT(2) | BIT(4), and that would
      make swp1 be mirrored towards swp4 too, and swp3 towards swp2. But there
      are no tc-matchall rules to describe those actions.
      
      Now, we could offload a matchall rule with multiple mirred actions, one
      per desired mirror port, and force the user to stick to the multi-action
      rule format for subsequent matchall filters. But both DSA and ocelot
      have the flow_offload_has_one_action() check for the matchall offload,
      plus the fact that it will get cumbersome to cross-check matchall
      mirrors with flower mirrors (which will be added in the next patch).
      
      As a result, we limit the configuration to a single mirror port, with
      the possibility of lifting the restriction in the future.
      
      Frames injected from the CPU don't get egress-mirrored, since they are
      sent with the BYPASS bit in the injection frame header, and this
      bypasses the analyzer module (effectively also the mirroring logic).
      I don't know what to do/say about this.
      
      Functionality was tested with:
      
      tc qdisc add dev swp3 clsact
      tc filter add dev swp3 ingress \
      	matchall skip_sw \
      	action mirred egress mirror dev swp1
      
      and pinging through swp3, while seeing that the ICMP replies are
      mirrored towards swp1.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      ccb6ed42
    • Vladimir Oltean's avatar
      net: mscc: ocelot: refactor policer work out of ocelot_setup_tc_cls_matchall · 4fa72108
      Vladimir Oltean authored
      In preparation for adding port mirroring support to the ocelot driver,
      the dispatching function ocelot_setup_tc_cls_matchall() must be free of
      action-specific code. Move port policer creation and deletion to
      separate functions.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      4fa72108
    • Jonathan Lemon's avatar
      ptp: ocp: Make debugfs variables the correct bitwidth · 2b341f75
      Jonathan Lemon authored
      An earlier patch mistakenly changed these variables from u32 to u16,
      leading to unintended truncation.  Restore the original logic.
      
      Fixes: a509a7c6 ("ptp: ocp: Add support for selectable SMA directions.")
      Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarJonathan Lemon <jonathan.lemon@gmail.com>
      Link: https://lore.kernel.org/r/20220316165347.599154-1-jonathan.lemon@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      2b341f75
    • Oleksij Rempel's avatar
      net: dsa: microchip: ksz8795: handle eee specif erratum · 7b6e6235
      Oleksij Rempel authored
      According to erratum described in DS80000687C[1]: "Module 2: Link drops with
      some EEE link partners.", we need to "Disable the EEE next page
      exchange in EEE Global Register 2"
      
      1 - https://ww1.microchip.com/downloads/en/DeviceDoc/KSZ87xx-Errata-DS80000687C.pdfSigned-off-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Link: https://lore.kernel.org/r/20220316125529.1489045-1-o.rempel@pengutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      7b6e6235
  2. 17 Mar, 2022 12 commits
    • Jakub Kicinski's avatar
      Merge branch 'net-bridge-multiple-spanning-trees' · 82e94d41
      Jakub Kicinski authored
      Tobias Waldekranz says:
      
      ====================
      net: bridge: Multiple Spanning Trees
      
      The bridge has had per-VLAN STP support for a while now, since:
      
      https://lore.kernel.org/netdev/20200124114022.10883-1-nikolay@cumulusnetworks.com/
      
      The current implementation has some problems:
      
      - The mapping from VLAN to STP state is fixed as 1:1, i.e. each VLAN
        is managed independently. This is awkward from an MSTP (802.1Q-2018,
        Clause 13.5) point of view, where the model is that multiple VLANs
        are grouped into MST instances.
      
        Because of the way that the standard is written, presumably, this is
        also reflected in hardware implementations. It is not uncommon for a
        switch to support the full 4k range of VIDs, but that the pool of
        MST instances is much smaller. Some examples:
      
        Marvell LinkStreet (mv88e6xxx): 4k VLANs, but only 64 MSTIs
        Marvell Prestera: 4k VLANs, but only 128 MSTIs
        Microchip SparX-5i: 4k VLANs, but only 128 MSTIs
      
      - By default, the feature is enabled, and there is no way to disable
        it. This makes it hard to add offloading in a backwards compatible
        way, since any underlying switchdevs have no way to refuse the
        function if the hardware does not support it
      
      - The port-global STP state has precedence over per-VLAN states. In
        MSTP, as far as I understand it, all VLANs will use the common
        spanning tree (CST) by default - through traffic engineering you can
        then optimize your network to group subsets of VLANs to use
        different trees (MSTI). To my understanding, the way this is
        typically managed in silicon is roughly:
      
        Incoming packet:
        .----.----.--------------.----.-------------
        | DA | SA | 802.1Q VID=X | ET | Payload ...
        '----'----'--------------'----'-------------
                              |
                              '->|\     .----------------------------.
                                 | +--> | VID | Members | ... | MSTI |
                         PVID -->|/     |-----|---------|-----|------|
                                        |   1 | 0001001 | ... |    0 |
                                        |   2 | 0001010 | ... |   10 |
                                        |   3 | 0001100 | ... |   10 |
                                        '----------------------------'
                                                                   |
                                     .-----------------------------'
                                     |  .------------------------.
                                     '->| MSTI | Fwding | Lrning |
                                        |------|--------|--------|
                                        |    0 | 111110 | 111110 |
                                        |   10 | 110111 | 110111 |
                                        '------------------------'
      
        What this is trying to show is that the STP state (whether MSTP is
        used, or ye olde STP) is always accessed via the VLAN table. If STP
        is running, all MSTI pointers in that table will reference the same
        index in the STP stable - if MSTP is running, some VLANs may point
        to other trees (like in this example).
      
        The fact that in the Linux bridge, the global state (think: index 0
        in most hardware implementations) is supposed to override the
        per-VLAN state, is very awkward to offload. In effect, this means
        that when the global state changes to blocking, drivers will have to
        iterate over all MSTIs in use, and alter them all to match. This
        also means that you have to cache whether the hardware state is
        currently tracking the global state or the per-VLAN state. In the
        first case, you also have to cache the per-VLAN state so that you
        can restore it if the global state transitions back to forwarding.
      
      This series adds a new mst_enable bridge setting (as suggested by Nik)
      that can only be changed when no VLANs are configured on the
      bridge. Enabling this mode has the following effect:
      
      - The port-global STP state is used to represent the CST (Common
        Spanning Tree) (1/15)
      
      - Ingress STP filtering is deferred until the frame's VLAN has been
        resolved (1/15)
      
      - The preexisting per-VLAN states can no longer be controlled directly
        (1/15). They are instead placed under the MST module's control,
        which is managed using a new netlink interface (described in 3/15)
      
      - VLANs can br mapped to MSTIs in an arbitrary M:N fashion, using a
        new global VLAN option (2/15)
      
      Switchdev notifications are added so that a driver can track:
      - MST enabled state
      - VID to MSTI mappings
      - MST port states
      
      An offloading implementation is this provided for mv88e6xxx.
      ====================
      
      Link: https://lore.kernel.org/r/20220316150857.2442916-1-tobias@waldekranz.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      82e94d41
    • Tobias Waldekranz's avatar
      net: dsa: mv88e6xxx: MST Offloading · acaf4d2e
      Tobias Waldekranz authored
      Allocate a SID in the STU for each MSTID in use by a bridge and handle
      the mapping of MSTIDs to VLANs using the SID field of each VTU entry.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      acaf4d2e
    • Tobias Waldekranz's avatar
      net: dsa: mv88e6xxx: Export STU as devlink region · 7dc96039
      Tobias Waldekranz authored
      Export the raw STU data in a devlink region so that it can be
      inspected from userspace and compared to the current bridge
      configuration.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      7dc96039
    • Tobias Waldekranz's avatar
      net: dsa: mv88e6xxx: Disentangle STU from VTU · 49c98c1d
      Tobias Waldekranz authored
      In early LinkStreet silicon (e.g. 6095/6185), the per-VLAN STP states
      were kept in the VTU - there was no concept of a SID. Later, the
      information was split into two tables, where the VTU only tracked
      memberships and deferred the STP state tracking to the STU via a
      pointer (SID). This meant that a group of VLANs could share the same
      STU entry. Most likely, this was done to align with MSTP (802.1Q-2018,
      Clause 13), which is built on this principle.
      
      While the VTU is still 4k lines on most devices, the STU is capped at
      64 entries. This means that the current stategy, updating STU info
      whenever a VTU entry is updated, can not easily support MSTP because:
      
      - The maximum number of VIDs would also be capped at 64, as we would
        have to allocate one SID for every VTU entry - even if many VLANs
        would effectively share the same MST.
      
      - MSTP updates would be unnecessarily slow as you would have to
        iterate over all VLANs that share the same MST.
      
      In order to support MSTP offloading in the future, manage the STU as a
      separate entity from the VTU.
      
      Only add support for newer hardware with separate VTU and
      STU. VTU-only devices can also be supported, but essentially this
      requires a software implementation of an STU (fanning out state
      changed to all VLANs tied to the same MST).
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      49c98c1d
    • Tobias Waldekranz's avatar
      net: dsa: Handle MST state changes · 7414af30
      Tobias Waldekranz authored
      Add the usual trampoline functionality from the generic DSA layer down
      to the drivers for MST state changes.
      
      When a state changes to disabled/blocking/listening, make sure to fast
      age any dynamic entries in the affected VLANs (those controlled by the
      MSTI in question).
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      7414af30
    • Tobias Waldekranz's avatar
      net: dsa: Pass VLAN MSTI migration notifications to driver · 8e6598a7
      Tobias Waldekranz authored
      Add the usual trampoline functionality from the generic DSA layer down
      to the drivers for VLAN MSTI migrations.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      8e6598a7
    • Tobias Waldekranz's avatar
      net: dsa: Validate hardware support for MST · 332afc4c
      Tobias Waldekranz authored
      When joining a bridge where MST is enabled, we validate that the
      proper offloading support is in place, otherwise we fallback to
      software bridging.
      
      When then mode is changed on a bridge in which we are members, we
      refuse the change if offloading is not supported.
      
      At the moment we only check for configurable learning, but this will
      be further restricted as we support more MST related switchdev events.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      332afc4c
    • Tobias Waldekranz's avatar
      net: bridge: mst: Add helper to query a port's MST state · f54fd0e1
      Tobias Waldekranz authored
      This is useful for switchdev drivers who are offloading MST states
      into hardware. As an example, a driver may wish to flush the FDB for a
      port when it transitions from forwarding to blocking - which means
      that the previous state must be discoverable.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      f54fd0e1
    • Tobias Waldekranz's avatar
      net: bridge: mst: Add helper to check if MST is enabled · 48d57b2e
      Tobias Waldekranz authored
      This is useful for switchdev drivers that might want to refuse to join
      a bridge where MST is enabled, if the hardware can't support it.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      48d57b2e
    • Tobias Waldekranz's avatar
      net: bridge: mst: Add helper to map an MSTI to a VID set · cceac97a
      Tobias Waldekranz authored
      br_mst_get_info answers the question: "On this bridge, which VIDs are
      mapped to the given MSTI?"
      
      This is useful in switchdev drivers, which might have to fan-out
      operations, relating to an MSTI, per VLAN.
      
      An example: When a port's MST state changes from forwarding to
      blocking, a driver may choose to flush the dynamic FDB entries on that
      port to get faster reconvergence of the network, but this should only
      be done in the VLANs that are managed by the MSTI in question.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      cceac97a
    • Tobias Waldekranz's avatar
      net: bridge: mst: Notify switchdev drivers of MST state changes · 7ae9147f
      Tobias Waldekranz authored
      Generate a switchdev notification whenever an MST state changes. This
      notification is keyed by the VLANs MSTI rather than the VID, since
      multiple VLANs may share the same MST instance.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      7ae9147f
    • Tobias Waldekranz's avatar
      net: bridge: mst: Notify switchdev drivers of VLAN MSTI migrations · 6284c723
      Tobias Waldekranz authored
      Whenever a VLAN moves to a new MSTI, send a switchdev notification so
      that switchdevs can track a bridge's VID to MSTI mappings.
      Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
      Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      6284c723