mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-12 01:20:14 +00:00
Including fixes from bluetooth and wireless.
Current release - regressions:
- bridge: fix use-after-free during router port configuration
Current release - new code bugs:
- eth: wangxun: fix the creation of page_pool
Previous releases - regressions:
- netpoll: initialize UDP checksum field before checksumming
- wifi: mac80211: finish link init before RCU publish
- bluetooth: fix use-after-free in vhci_flush()
- eth: ionic: fix DMA mapping test
- eth: bnxt: properly flush XDP redirect lists
Previous releases - always broken:
- netlink: specs: enforce strict naming of properties
- unix: don't leave consecutive consumed OOB skbs.
- vsock: fix linux/vm_sockets.h userspace compilation errors
- selftests: fix TCP packet checksum
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-----BEGIN PGP SIGNATURE-----
iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmhdIbESHHBhYmVuaUBy
ZWRoYXQuY29tAAoJECkkeY3MjxOkB70P/21uclzfzXS9Ijlata4aFjBtRB0Ebvat
FqHZaB6ldVceRZYG4vb2FVoQawi5Ex6Aju4fgS0y34KDiwAA7wkmTVMbmSHOxPuy
5oHDPilUv4T1cbiMBU7/BncT0XFwgA1pDsD8OBQtAB0ghSCidKdmberWZXeEW4Va
J65Crdf8VLBgUb/enowRUA/TJ0SfZouAC/N+GmqfewxHCXM0a0JwJ9Kp1UjcTpEz
7JifBHJbepa3mCCqHlXcJP87Q7soMz/V0o3B6IVm75MjgmR5I/BTiBKvsWurNqLZ
AUtTy4icVOr6gSFmGjeiDH2OT6silF2JwqrR+ajNKNvgWJOOxFjEY+fy3RrRYLBD
WLXkO20AdRsl77CdiDQkHl8Y3R88aeils7AnZVwJ91QjcDRfnRbr5U57bdCrxAGv
ZJR9jWnFrTyC7UZeil7LMf/f09mb8jQqxKwKQAvO5tLgUh9TEaqlveapLHSUdN67
ZyMZpzF5hGfslGf3Gc6tl324NkAtZB7bfAhTG8FyEIZqeOBYcL2Drr9dBLgAVTmS
tTjgsoEQVGxLcDz6y5HK5kScTM5WnZybWBkGKRLl4/n5pU05SkMxjXmSr/nTpB2F
CxVEjmutbfM/1tiClXCiHLLmV5DguAUV4Dz01/uiaOLjbxQb8NBzPDmRK9TNrfqh
KFDQro/JEcdH
=ywOM
-----END PGP SIGNATURE-----
Merge tag 'net-6.16-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni:
"Including fixes from bluetooth and wireless.
Current release - regressions:
- bridge: fix use-after-free during router port configuration
Current release - new code bugs:
- eth: wangxun: fix the creation of page_pool
Previous releases - regressions:
- netpoll: initialize UDP checksum field before checksumming
- wifi: mac80211: finish link init before RCU publish
- bluetooth: fix use-after-free in vhci_flush()
- eth:
- ionic: fix DMA mapping test
- bnxt: properly flush XDP redirect lists
Previous releases - always broken:
- netlink: specs: enforce strict naming of properties
- unix: don't leave consecutive consumed OOB skbs.
- vsock: fix linux/vm_sockets.h userspace compilation errors
- selftests: fix TCP packet checksum"
* tag 'net-6.16-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (38 commits)
net: libwx: fix the creation of page_pool
net: selftests: fix TCP packet checksum
atm: Release atm_dev_mutex after removing procfs in atm_dev_deregister().
netlink: specs: enforce strict naming of properties
netlink: specs: tc: replace underscores with dashes in names
netlink: specs: rt-link: replace underscores with dashes in names
netlink: specs: mptcp: replace underscores with dashes in names
netlink: specs: ovs_flow: replace underscores with dashes in names
netlink: specs: devlink: replace underscores with dashes in names
netlink: specs: dpll: replace underscores with dashes in names
netlink: specs: ethtool: replace underscores with dashes in names
netlink: specs: fou: replace underscores with dashes in names
netlink: specs: nfsd: replace underscores with dashes in names
net: enetc: Correct endianness handling in _enetc_rd_reg64
atm: idt77252: Add missing `dma_map_error()`
bnxt: properly flush XDP redirect lists
vsock/uapi: fix linux/vm_sockets.h userspace compilation errors
wifi: mac80211: finish link init before RCU publish
wifi: iwlwifi: mvm: assume '1' as the default mac_config_cmd version
selftest: af_unix: Add tests for -ECONNRESET.
...
This commit is contained in:
commit
e34a79b96a
5
CREDITS
5
CREDITS
@ -2981,6 +2981,11 @@ S: 521 Pleasant Valley Road
|
||||
S: Potsdam, New York 13676
|
||||
S: USA
|
||||
|
||||
N: Shannon Nelson
|
||||
E: sln@onemain.com
|
||||
D: Worked on several network drivers including
|
||||
D: ixgbe, i40e, ionic, pds_core, pds_vdpa, pds_fwctl
|
||||
|
||||
N: Dave Neuer
|
||||
E: dave.neuer@pobox.com
|
||||
D: Helped implement support for Compaq's H31xx series iPAQs
|
||||
|
||||
@ -6,6 +6,9 @@ $schema: https://json-schema.org/draft-07/schema
|
||||
|
||||
# Common defines
|
||||
$defs:
|
||||
name:
|
||||
type: string
|
||||
pattern: ^[0-9a-z-]+$
|
||||
uint:
|
||||
type: integer
|
||||
minimum: 0
|
||||
@ -76,7 +79,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
header:
|
||||
description: For C-compatible languages, header which already defines this value.
|
||||
type: string
|
||||
@ -103,7 +106,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
value:
|
||||
type: integer
|
||||
doc:
|
||||
@ -132,7 +135,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
type:
|
||||
description: The netlink attribute type
|
||||
enum: [ u8, u16, u32, u64, s8, s16, s32, s64, string, binary ]
|
||||
@ -169,7 +172,7 @@ properties:
|
||||
name:
|
||||
description: |
|
||||
Name used when referring to this space in other definitions, not used outside of the spec.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
name-prefix:
|
||||
description: |
|
||||
Prefix for the C enum name of the attributes. Default family[name]-set[name]-a-
|
||||
@ -206,7 +209,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
type: &attr-type
|
||||
description: The netlink attribute type
|
||||
enum: [ unused, pad, flag, binary, bitfield32,
|
||||
@ -348,7 +351,7 @@ properties:
|
||||
properties:
|
||||
name:
|
||||
description: Name of the operation, also defining its C enum value in uAPI.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
doc:
|
||||
description: Documentation for the command.
|
||||
type: string
|
||||
|
||||
@ -6,6 +6,9 @@ $schema: https://json-schema.org/draft-07/schema
|
||||
|
||||
# Common defines
|
||||
$defs:
|
||||
name:
|
||||
type: string
|
||||
pattern: ^[0-9a-z-]+$
|
||||
uint:
|
||||
type: integer
|
||||
minimum: 0
|
||||
@ -29,7 +32,7 @@ additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
description: Name of the genetlink family.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
doc:
|
||||
type: string
|
||||
protocol:
|
||||
@ -48,7 +51,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
header:
|
||||
description: For C-compatible languages, header which already defines this value.
|
||||
type: string
|
||||
@ -75,7 +78,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
value:
|
||||
type: integer
|
||||
doc:
|
||||
@ -96,7 +99,7 @@ properties:
|
||||
name:
|
||||
description: |
|
||||
Name used when referring to this space in other definitions, not used outside of the spec.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
name-prefix:
|
||||
description: |
|
||||
Prefix for the C enum name of the attributes. Default family[name]-set[name]-a-
|
||||
@ -121,7 +124,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
type: &attr-type
|
||||
enum: [ unused, pad, flag, binary,
|
||||
uint, sint, u8, u16, u32, u64, s8, s16, s32, s64,
|
||||
@ -243,7 +246,7 @@ properties:
|
||||
properties:
|
||||
name:
|
||||
description: Name of the operation, also defining its C enum value in uAPI.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
doc:
|
||||
description: Documentation for the command.
|
||||
type: string
|
||||
@ -327,7 +330,7 @@ properties:
|
||||
name:
|
||||
description: |
|
||||
The name for the group, used to form the define and the value of the define.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
flags: *cmd_flags
|
||||
|
||||
kernel-family:
|
||||
|
||||
@ -6,6 +6,12 @@ $schema: https://json-schema.org/draft-07/schema
|
||||
|
||||
# Common defines
|
||||
$defs:
|
||||
name:
|
||||
type: string
|
||||
pattern: ^[0-9a-z-]+$
|
||||
name-cap:
|
||||
type: string
|
||||
pattern: ^[0-9a-zA-Z-]+$
|
||||
uint:
|
||||
type: integer
|
||||
minimum: 0
|
||||
@ -71,7 +77,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
header:
|
||||
description: For C-compatible languages, header which already defines this value.
|
||||
type: string
|
||||
@ -98,7 +104,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
value:
|
||||
type: integer
|
||||
doc:
|
||||
@ -124,7 +130,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name-cap'
|
||||
type:
|
||||
description: |
|
||||
The netlink attribute type. Members of type 'binary' or 'pad'
|
||||
@ -183,7 +189,7 @@ properties:
|
||||
name:
|
||||
description: |
|
||||
Name used when referring to this space in other definitions, not used outside of the spec.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
name-prefix:
|
||||
description: |
|
||||
Prefix for the C enum name of the attributes. Default family[name]-set[name]-a-
|
||||
@ -220,7 +226,7 @@ properties:
|
||||
additionalProperties: False
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
type: &attr-type
|
||||
description: The netlink attribute type
|
||||
enum: [ unused, pad, flag, binary, bitfield32,
|
||||
@ -408,7 +414,7 @@ properties:
|
||||
properties:
|
||||
name:
|
||||
description: Name of the operation, also defining its C enum value in uAPI.
|
||||
type: string
|
||||
$ref: '#/$defs/name'
|
||||
doc:
|
||||
description: Documentation for the command.
|
||||
type: string
|
||||
|
||||
@ -38,15 +38,15 @@ definitions:
|
||||
-
|
||||
name: dsa
|
||||
-
|
||||
name: pci_pf
|
||||
name: pci-pf
|
||||
-
|
||||
name: pci_vf
|
||||
name: pci-vf
|
||||
-
|
||||
name: virtual
|
||||
-
|
||||
name: unused
|
||||
-
|
||||
name: pci_sf
|
||||
name: pci-sf
|
||||
-
|
||||
type: enum
|
||||
name: port-fn-state
|
||||
@ -220,7 +220,7 @@ definitions:
|
||||
-
|
||||
name: flag
|
||||
-
|
||||
name: nul_string
|
||||
name: nul-string
|
||||
value: 10
|
||||
-
|
||||
name: binary
|
||||
|
||||
@ -188,7 +188,7 @@ definitions:
|
||||
value: 10000
|
||||
-
|
||||
type: const
|
||||
name: pin-frequency-77_5-khz
|
||||
name: pin-frequency-77-5-khz
|
||||
value: 77500
|
||||
-
|
||||
type: const
|
||||
|
||||
@ -48,7 +48,7 @@ definitions:
|
||||
name: started
|
||||
doc: The firmware flashing process has started.
|
||||
-
|
||||
name: in_progress
|
||||
name: in-progress
|
||||
doc: The firmware flashing process is in progress.
|
||||
-
|
||||
name: completed
|
||||
@ -1422,7 +1422,7 @@ attribute-sets:
|
||||
name: hkey
|
||||
type: binary
|
||||
-
|
||||
name: input_xfrm
|
||||
name: input-xfrm
|
||||
type: u32
|
||||
-
|
||||
name: start-context
|
||||
@ -2238,7 +2238,7 @@ operations:
|
||||
- hfunc
|
||||
- indir
|
||||
- hkey
|
||||
- input_xfrm
|
||||
- input-xfrm
|
||||
dump:
|
||||
request:
|
||||
attributes:
|
||||
|
||||
@ -15,7 +15,7 @@ kernel-policy: global
|
||||
definitions:
|
||||
-
|
||||
type: enum
|
||||
name: encap_type
|
||||
name: encap-type
|
||||
name-prefix: fou-encap-
|
||||
enum-name:
|
||||
entries: [ unspec, direct, gue ]
|
||||
@ -43,26 +43,26 @@ attribute-sets:
|
||||
name: type
|
||||
type: u8
|
||||
-
|
||||
name: remcsum_nopartial
|
||||
name: remcsum-nopartial
|
||||
type: flag
|
||||
-
|
||||
name: local_v4
|
||||
name: local-v4
|
||||
type: u32
|
||||
-
|
||||
name: local_v6
|
||||
name: local-v6
|
||||
type: binary
|
||||
checks:
|
||||
min-len: 16
|
||||
-
|
||||
name: peer_v4
|
||||
name: peer-v4
|
||||
type: u32
|
||||
-
|
||||
name: peer_v6
|
||||
name: peer-v6
|
||||
type: binary
|
||||
checks:
|
||||
min-len: 16
|
||||
-
|
||||
name: peer_port
|
||||
name: peer-port
|
||||
type: u16
|
||||
byte-order: big-endian
|
||||
-
|
||||
@ -90,12 +90,12 @@ operations:
|
||||
- port
|
||||
- ipproto
|
||||
- type
|
||||
- remcsum_nopartial
|
||||
- local_v4
|
||||
- peer_v4
|
||||
- local_v6
|
||||
- peer_v6
|
||||
- peer_port
|
||||
- remcsum-nopartial
|
||||
- local-v4
|
||||
- peer-v4
|
||||
- local-v6
|
||||
- peer-v6
|
||||
- peer-port
|
||||
- ifindex
|
||||
|
||||
-
|
||||
@ -112,11 +112,11 @@ operations:
|
||||
- af
|
||||
- ifindex
|
||||
- port
|
||||
- peer_port
|
||||
- local_v4
|
||||
- peer_v4
|
||||
- local_v6
|
||||
- peer_v6
|
||||
- peer-port
|
||||
- local-v4
|
||||
- peer-v4
|
||||
- local-v6
|
||||
- peer-v6
|
||||
|
||||
-
|
||||
name: get
|
||||
|
||||
@ -57,21 +57,21 @@ definitions:
|
||||
doc: >-
|
||||
A new subflow has been established. 'error' should not be set.
|
||||
Attributes: token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 |
|
||||
daddr6, sport, dport, backup, if_idx [, error].
|
||||
daddr6, sport, dport, backup, if-idx [, error].
|
||||
-
|
||||
name: sub-closed
|
||||
doc: >-
|
||||
A subflow has been closed. An error (copy of sk_err) could be set if an
|
||||
error has been detected for this subflow.
|
||||
Attributes: token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 |
|
||||
daddr6, sport, dport, backup, if_idx [, error].
|
||||
daddr6, sport, dport, backup, if-idx [, error].
|
||||
-
|
||||
name: sub-priority
|
||||
value: 13
|
||||
doc: >-
|
||||
The priority of a subflow has changed. 'error' should not be set.
|
||||
Attributes: token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 |
|
||||
daddr6, sport, dport, backup, if_idx [, error].
|
||||
daddr6, sport, dport, backup, if-idx [, error].
|
||||
-
|
||||
name: listener-created
|
||||
value: 15
|
||||
@ -255,7 +255,7 @@ attribute-sets:
|
||||
name: timeout
|
||||
type: u32
|
||||
-
|
||||
name: if_idx
|
||||
name: if-idx
|
||||
type: u32
|
||||
-
|
||||
name: reset-reason
|
||||
|
||||
@ -27,7 +27,7 @@ attribute-sets:
|
||||
name: proc
|
||||
type: u32
|
||||
-
|
||||
name: service_time
|
||||
name: service-time
|
||||
type: s64
|
||||
-
|
||||
name: pad
|
||||
@ -139,7 +139,7 @@ operations:
|
||||
- prog
|
||||
- version
|
||||
- proc
|
||||
- service_time
|
||||
- service-time
|
||||
- saddr4
|
||||
- daddr4
|
||||
- saddr6
|
||||
|
||||
@ -216,7 +216,7 @@ definitions:
|
||||
type: struct
|
||||
members:
|
||||
-
|
||||
name: nd_target
|
||||
name: nd-target
|
||||
type: binary
|
||||
len: 16
|
||||
byte-order: big-endian
|
||||
@ -258,12 +258,12 @@ definitions:
|
||||
type: struct
|
||||
members:
|
||||
-
|
||||
name: vlan_tpid
|
||||
name: vlan-tpid
|
||||
type: u16
|
||||
byte-order: big-endian
|
||||
doc: Tag protocol identifier (TPID) to push.
|
||||
-
|
||||
name: vlan_tci
|
||||
name: vlan-tci
|
||||
type: u16
|
||||
byte-order: big-endian
|
||||
doc: Tag control identifier (TCI) to push.
|
||||
|
||||
@ -603,7 +603,7 @@ definitions:
|
||||
name: optmask
|
||||
type: u32
|
||||
-
|
||||
name: if_stats_msg
|
||||
name: if-stats-msg
|
||||
type: struct
|
||||
members:
|
||||
-
|
||||
@ -2486,7 +2486,7 @@ operations:
|
||||
name: getstats
|
||||
doc: Get / dump link stats.
|
||||
attribute-set: stats-attrs
|
||||
fixed-header: if_stats_msg
|
||||
fixed-header: if-stats-msg
|
||||
do:
|
||||
request:
|
||||
value: 94
|
||||
|
||||
@ -232,7 +232,7 @@ definitions:
|
||||
type: u8
|
||||
doc: log(P_max / (qth-max - qth-min))
|
||||
-
|
||||
name: Scell_log
|
||||
name: Scell-log
|
||||
type: u8
|
||||
doc: cell size for idle damping
|
||||
-
|
||||
@ -253,7 +253,7 @@ definitions:
|
||||
name: DPs
|
||||
type: u32
|
||||
-
|
||||
name: def_DP
|
||||
name: def-DP
|
||||
type: u32
|
||||
-
|
||||
name: grio
|
||||
|
||||
@ -66,7 +66,7 @@ Admin Function driver
|
||||
As mentioned above RVU PF0 is called the admin function (AF), this driver
|
||||
supports resource provisioning and configuration of functional blocks.
|
||||
Doesn't handle any I/O. It sets up few basic stuff but most of the
|
||||
funcionality is achieved via configuration requests from PFs and VFs.
|
||||
functionality is achieved via configuration requests from PFs and VFs.
|
||||
|
||||
PF/VFs communicates with AF via a shared memory region (mailbox). Upon
|
||||
receiving requests AF does resource provisioning and other HW configuration.
|
||||
|
||||
@ -852,6 +852,8 @@ queue_skb(struct idt77252_dev *card, struct vc_map *vc,
|
||||
|
||||
IDT77252_PRV_PADDR(skb) = dma_map_single(&card->pcidev->dev, skb->data,
|
||||
skb->len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(&card->pcidev->dev, IDT77252_PRV_PADDR(skb)))
|
||||
return -ENOMEM;
|
||||
|
||||
error = -EINVAL;
|
||||
|
||||
@ -1857,6 +1859,8 @@ add_rx_skb(struct idt77252_dev *card, int queue,
|
||||
paddr = dma_map_single(&card->pcidev->dev, skb->data,
|
||||
skb_end_pointer(skb) - skb->data,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(&card->pcidev->dev, paddr))
|
||||
goto outpoolrm;
|
||||
IDT77252_PRV_PADDR(skb) = paddr;
|
||||
|
||||
if (push_rx_skb(card, skb, queue)) {
|
||||
@ -1871,6 +1875,7 @@ outunmap:
|
||||
dma_unmap_single(&card->pcidev->dev, IDT77252_PRV_PADDR(skb),
|
||||
skb_end_pointer(skb) - skb->data, DMA_FROM_DEVICE);
|
||||
|
||||
outpoolrm:
|
||||
handle = IDT77252_PRV_POOL(skb);
|
||||
card->sbpool[POOL_QUEUE(handle)].skb[POOL_INDEX(handle)] = NULL;
|
||||
|
||||
|
||||
@ -2033,6 +2033,28 @@ static void btintel_pcie_release_hdev(struct btintel_pcie_data *data)
|
||||
data->hdev = NULL;
|
||||
}
|
||||
|
||||
static void btintel_pcie_disable_interrupts(struct btintel_pcie_data *data)
|
||||
{
|
||||
spin_lock(&data->irq_lock);
|
||||
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, data->fh_init_mask);
|
||||
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, data->hw_init_mask);
|
||||
spin_unlock(&data->irq_lock);
|
||||
}
|
||||
|
||||
static void btintel_pcie_enable_interrupts(struct btintel_pcie_data *data)
|
||||
{
|
||||
spin_lock(&data->irq_lock);
|
||||
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, ~data->fh_init_mask);
|
||||
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, ~data->hw_init_mask);
|
||||
spin_unlock(&data->irq_lock);
|
||||
}
|
||||
|
||||
static void btintel_pcie_synchronize_irqs(struct btintel_pcie_data *data)
|
||||
{
|
||||
for (int i = 0; i < data->alloc_vecs; i++)
|
||||
synchronize_irq(data->msix_entries[i].vector);
|
||||
}
|
||||
|
||||
static int btintel_pcie_setup_internal(struct hci_dev *hdev)
|
||||
{
|
||||
struct btintel_pcie_data *data = hci_get_drvdata(hdev);
|
||||
@ -2152,6 +2174,8 @@ static int btintel_pcie_setup(struct hci_dev *hdev)
|
||||
bt_dev_err(hdev, "Firmware download retry count: %d",
|
||||
fw_dl_retry);
|
||||
btintel_pcie_dump_debug_registers(hdev);
|
||||
btintel_pcie_disable_interrupts(data);
|
||||
btintel_pcie_synchronize_irqs(data);
|
||||
err = btintel_pcie_reset_bt(data);
|
||||
if (err) {
|
||||
bt_dev_err(hdev, "Failed to do shr reset: %d", err);
|
||||
@ -2159,6 +2183,7 @@ static int btintel_pcie_setup(struct hci_dev *hdev)
|
||||
}
|
||||
usleep_range(10000, 12000);
|
||||
btintel_pcie_reset_ia(data);
|
||||
btintel_pcie_enable_interrupts(data);
|
||||
btintel_pcie_config_msix(data);
|
||||
err = btintel_pcie_enable_bt(data);
|
||||
if (err) {
|
||||
@ -2291,6 +2316,12 @@ static void btintel_pcie_remove(struct pci_dev *pdev)
|
||||
|
||||
data = pci_get_drvdata(pdev);
|
||||
|
||||
btintel_pcie_disable_interrupts(data);
|
||||
|
||||
btintel_pcie_synchronize_irqs(data);
|
||||
|
||||
flush_work(&data->rx_work);
|
||||
|
||||
btintel_pcie_reset_bt(data);
|
||||
for (int i = 0; i < data->alloc_vecs; i++) {
|
||||
struct msix_entry *msix_entry;
|
||||
@ -2303,8 +2334,6 @@ static void btintel_pcie_remove(struct pci_dev *pdev)
|
||||
|
||||
btintel_pcie_release_hdev(data);
|
||||
|
||||
flush_work(&data->rx_work);
|
||||
|
||||
destroy_workqueue(data->workqueue);
|
||||
|
||||
btintel_pcie_free(data);
|
||||
|
||||
@ -2392,10 +2392,17 @@ static int qca_serdev_probe(struct serdev_device *serdev)
|
||||
*/
|
||||
qcadev->bt_power->pwrseq = devm_pwrseq_get(&serdev->dev,
|
||||
"bluetooth");
|
||||
if (IS_ERR(qcadev->bt_power->pwrseq))
|
||||
return PTR_ERR(qcadev->bt_power->pwrseq);
|
||||
|
||||
break;
|
||||
/*
|
||||
* Some modules have BT_EN enabled via a hardware pull-up,
|
||||
* meaning it is not defined in the DTS and is not controlled
|
||||
* through the power sequence. In such cases, fall through
|
||||
* to follow the legacy flow.
|
||||
*/
|
||||
if (IS_ERR(qcadev->bt_power->pwrseq))
|
||||
qcadev->bt_power->pwrseq = NULL;
|
||||
else
|
||||
break;
|
||||
}
|
||||
fallthrough;
|
||||
case QCA_WCN3950:
|
||||
|
||||
@ -2989,6 +2989,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
||||
{
|
||||
struct bnxt_napi *bnapi = cpr->bnapi;
|
||||
u32 raw_cons = cpr->cp_raw_cons;
|
||||
bool flush_xdp = false;
|
||||
u32 cons;
|
||||
int rx_pkts = 0;
|
||||
u8 event = 0;
|
||||
@ -3042,6 +3043,8 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
||||
else
|
||||
rc = bnxt_force_rx_discard(bp, cpr, &raw_cons,
|
||||
&event);
|
||||
if (event & BNXT_REDIRECT_EVENT)
|
||||
flush_xdp = true;
|
||||
if (likely(rc >= 0))
|
||||
rx_pkts += rc;
|
||||
/* Increment rx_pkts when rc is -ENOMEM to count towards
|
||||
@ -3066,7 +3069,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
||||
}
|
||||
}
|
||||
|
||||
if (event & BNXT_REDIRECT_EVENT) {
|
||||
if (flush_xdp) {
|
||||
xdp_do_flush();
|
||||
event &= ~BNXT_REDIRECT_EVENT;
|
||||
}
|
||||
|
||||
@ -507,7 +507,7 @@ static inline u64 _enetc_rd_reg64(void __iomem *reg)
|
||||
tmp = ioread32(reg + 4);
|
||||
} while (high != tmp);
|
||||
|
||||
return le64_to_cpu((__le64)high << 32 | low);
|
||||
return (u64)high << 32 | low;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -31,6 +31,9 @@ static void mana_gd_init_pf_regs(struct pci_dev *pdev)
|
||||
gc->db_page_base = gc->bar0_va +
|
||||
mana_gd_r64(gc, GDMA_PF_REG_DB_PAGE_OFF);
|
||||
|
||||
gc->phys_db_page_base = gc->bar0_pa +
|
||||
mana_gd_r64(gc, GDMA_PF_REG_DB_PAGE_OFF);
|
||||
|
||||
sriov_base_off = mana_gd_r64(gc, GDMA_SRIOV_REG_CFG_BASE_OFF);
|
||||
|
||||
sriov_base_va = gc->bar0_va + sriov_base_off;
|
||||
|
||||
@ -321,7 +321,7 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
|
||||
len, DMA_TO_DEVICE);
|
||||
} else /* XDP_REDIRECT */ {
|
||||
dma_addr = ionic_tx_map_single(q, frame->data, len);
|
||||
if (!dma_addr)
|
||||
if (dma_addr == DMA_MAPPING_ERROR)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -357,7 +357,7 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
|
||||
} else {
|
||||
dma_addr = ionic_tx_map_frag(q, frag, 0,
|
||||
skb_frag_size(frag));
|
||||
if (dma_mapping_error(q->dev, dma_addr)) {
|
||||
if (dma_addr == DMA_MAPPING_ERROR) {
|
||||
ionic_tx_desc_unmap_bufs(q, desc_info);
|
||||
return -EIO;
|
||||
}
|
||||
@ -1083,7 +1083,7 @@ static dma_addr_t ionic_tx_map_single(struct ionic_queue *q,
|
||||
net_warn_ratelimited("%s: DMA single map failed on %s!\n",
|
||||
dev_name(dev), q->name);
|
||||
q_to_tx_stats(q)->dma_map_err++;
|
||||
return 0;
|
||||
return DMA_MAPPING_ERROR;
|
||||
}
|
||||
return dma_addr;
|
||||
}
|
||||
@ -1100,7 +1100,7 @@ static dma_addr_t ionic_tx_map_frag(struct ionic_queue *q,
|
||||
net_warn_ratelimited("%s: DMA frag map failed on %s!\n",
|
||||
dev_name(dev), q->name);
|
||||
q_to_tx_stats(q)->dma_map_err++;
|
||||
return 0;
|
||||
return DMA_MAPPING_ERROR;
|
||||
}
|
||||
return dma_addr;
|
||||
}
|
||||
@ -1116,7 +1116,7 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
|
||||
int frag_idx;
|
||||
|
||||
dma_addr = ionic_tx_map_single(q, skb->data, skb_headlen(skb));
|
||||
if (!dma_addr)
|
||||
if (dma_addr == DMA_MAPPING_ERROR)
|
||||
return -EIO;
|
||||
buf_info->dma_addr = dma_addr;
|
||||
buf_info->len = skb_headlen(skb);
|
||||
@ -1126,7 +1126,7 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
|
||||
nfrags = skb_shinfo(skb)->nr_frags;
|
||||
for (frag_idx = 0; frag_idx < nfrags; frag_idx++, frag++) {
|
||||
dma_addr = ionic_tx_map_frag(q, frag, 0, skb_frag_size(frag));
|
||||
if (!dma_addr)
|
||||
if (dma_addr == DMA_MAPPING_ERROR)
|
||||
goto dma_fail;
|
||||
buf_info->dma_addr = dma_addr;
|
||||
buf_info->len = skb_frag_size(frag);
|
||||
|
||||
@ -242,7 +242,7 @@ static int qed_mfw_get_tlv_group(u8 tlv_type, u8 *tlv_group)
|
||||
}
|
||||
|
||||
/* Returns size of the data buffer or, -1 in case TLV data is not available. */
|
||||
static int
|
||||
static noinline_for_stack int
|
||||
qed_mfw_get_gen_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
|
||||
struct qed_mfw_tlv_generic *p_drv_buf,
|
||||
struct qed_tlv_parsed_buf *p_buf)
|
||||
@ -304,7 +304,7 @@ qed_mfw_get_gen_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
static noinline_for_stack int
|
||||
qed_mfw_get_eth_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
|
||||
struct qed_mfw_tlv_eth *p_drv_buf,
|
||||
struct qed_tlv_parsed_buf *p_buf)
|
||||
@ -438,7 +438,7 @@ qed_mfw_get_tlv_time_value(struct qed_mfw_tlv_time *p_time,
|
||||
return QED_MFW_TLV_TIME_SIZE;
|
||||
}
|
||||
|
||||
static int
|
||||
static noinline_for_stack int
|
||||
qed_mfw_get_fcoe_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
|
||||
struct qed_mfw_tlv_fcoe *p_drv_buf,
|
||||
struct qed_tlv_parsed_buf *p_buf)
|
||||
@ -1073,7 +1073,7 @@ qed_mfw_get_fcoe_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
static noinline_for_stack int
|
||||
qed_mfw_get_iscsi_tlv_value(struct qed_drv_tlv_hdr *p_tlv,
|
||||
struct qed_mfw_tlv_iscsi *p_drv_buf,
|
||||
struct qed_tlv_parsed_buf *p_buf)
|
||||
|
||||
@ -2623,7 +2623,7 @@ static int wx_alloc_page_pool(struct wx_ring *rx_ring)
|
||||
struct page_pool_params pp_params = {
|
||||
.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV,
|
||||
.order = 0,
|
||||
.pool_size = rx_ring->size,
|
||||
.pool_size = rx_ring->count,
|
||||
.nid = dev_to_node(rx_ring->dev),
|
||||
.dev = rx_ring->dev,
|
||||
.dma_dir = DMA_FROM_DEVICE,
|
||||
|
||||
@ -1426,6 +1426,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_QUIRK_SET_DTR(0x22de, 0x9051, 2)}, /* Hucom Wireless HM-211S/K */
|
||||
{QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
|
||||
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */
|
||||
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9071, 3)}, /* SIMCom 8230C ++ */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0195, 4)}, /* Quectel EG95 */
|
||||
|
||||
@ -203,7 +203,8 @@ il4965_rs_extract_rate(u32 rate_n_flags)
|
||||
return (u8) (rate_n_flags & 0xFF);
|
||||
}
|
||||
|
||||
static void
|
||||
/* noinline works around https://github.com/llvm/llvm-project/issues/143908 */
|
||||
static noinline_for_stack void
|
||||
il4965_rs_rate_scale_clear_win(struct il_rate_scale_data *win)
|
||||
{
|
||||
win->data = 0;
|
||||
|
||||
@ -32,9 +32,9 @@ static void iwl_mvm_mld_mac_ctxt_cmd_common(struct iwl_mvm *mvm,
|
||||
unsigned int link_id;
|
||||
int cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw,
|
||||
WIDE_ID(MAC_CONF_GROUP,
|
||||
MAC_CONFIG_CMD), 0);
|
||||
MAC_CONFIG_CMD), 1);
|
||||
|
||||
if (WARN_ON(cmd_ver < 1 || cmd_ver > 3))
|
||||
if (WARN_ON(cmd_ver > 3))
|
||||
return;
|
||||
|
||||
cmd->id_and_color = cpu_to_le32(mvmvif->id);
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
#include <linux/idr.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/srcu.h>
|
||||
|
||||
#include <net/bluetooth/hci.h>
|
||||
#include <net/bluetooth/hci_drv.h>
|
||||
@ -347,6 +348,7 @@ struct adv_monitor {
|
||||
|
||||
struct hci_dev {
|
||||
struct list_head list;
|
||||
struct srcu_struct srcu;
|
||||
struct mutex lock;
|
||||
|
||||
struct ida unset_handle_ida;
|
||||
|
||||
@ -27,14 +27,14 @@
|
||||
* token, rem_id.
|
||||
* @MPTCP_EVENT_SUB_ESTABLISHED: A new subflow has been established. 'error'
|
||||
* should not be set. Attributes: token, family, loc_id, rem_id, saddr4 |
|
||||
* saddr6, daddr4 | daddr6, sport, dport, backup, if_idx [, error].
|
||||
* saddr6, daddr4 | daddr6, sport, dport, backup, if-idx [, error].
|
||||
* @MPTCP_EVENT_SUB_CLOSED: A subflow has been closed. An error (copy of
|
||||
* sk_err) could be set if an error has been detected for this subflow.
|
||||
* Attributes: token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 |
|
||||
* daddr6, sport, dport, backup, if_idx [, error].
|
||||
* daddr6, sport, dport, backup, if-idx [, error].
|
||||
* @MPTCP_EVENT_SUB_PRIORITY: The priority of a subflow has changed. 'error'
|
||||
* should not be set. Attributes: token, family, loc_id, rem_id, saddr4 |
|
||||
* saddr6, daddr4 | daddr6, sport, dport, backup, if_idx [, error].
|
||||
* saddr6, daddr4 | daddr6, sport, dport, backup, if-idx [, error].
|
||||
* @MPTCP_EVENT_LISTENER_CREATED: A new PM listener is created. Attributes:
|
||||
* family, sport, saddr4 | saddr6.
|
||||
* @MPTCP_EVENT_LISTENER_CLOSED: A PM listener is closed. Attributes: family,
|
||||
|
||||
@ -17,6 +17,10 @@
|
||||
#ifndef _UAPI_VM_SOCKETS_H
|
||||
#define _UAPI_VM_SOCKETS_H
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#include <sys/socket.h> /* for struct sockaddr and sa_family_t */
|
||||
#endif
|
||||
|
||||
#include <linux/socket.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
|
||||
@ -193,12 +193,6 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb)
|
||||
|
||||
pr_debug("\n");
|
||||
|
||||
if (!clip_devs) {
|
||||
atm_return(vcc, skb->truesize);
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!skb) {
|
||||
pr_debug("removing VCC %p\n", clip_vcc);
|
||||
if (clip_vcc->entry)
|
||||
@ -208,6 +202,11 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb)
|
||||
return;
|
||||
}
|
||||
atm_return(vcc, skb->truesize);
|
||||
if (!clip_devs) {
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
skb->dev = clip_vcc->entry ? clip_vcc->entry->neigh->dev : clip_devs;
|
||||
/* clip_vcc->entry == NULL if we don't have an IP address yet */
|
||||
if (!skb->dev) {
|
||||
|
||||
@ -146,11 +146,10 @@ void atm_dev_deregister(struct atm_dev *dev)
|
||||
*/
|
||||
mutex_lock(&atm_dev_mutex);
|
||||
list_del(&dev->dev_list);
|
||||
mutex_unlock(&atm_dev_mutex);
|
||||
|
||||
atm_dev_release_vccs(dev);
|
||||
atm_unregister_sysfs(dev);
|
||||
atm_proc_dev_deregister(dev);
|
||||
mutex_unlock(&atm_dev_mutex);
|
||||
|
||||
atm_dev_put(dev);
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ static DEFINE_IDA(hci_index_ida);
|
||||
|
||||
/* Get HCI device by index.
|
||||
* Device is held on return. */
|
||||
struct hci_dev *hci_dev_get(int index)
|
||||
static struct hci_dev *__hci_dev_get(int index, int *srcu_index)
|
||||
{
|
||||
struct hci_dev *hdev = NULL, *d;
|
||||
|
||||
@ -77,6 +77,8 @@ struct hci_dev *hci_dev_get(int index)
|
||||
list_for_each_entry(d, &hci_dev_list, list) {
|
||||
if (d->id == index) {
|
||||
hdev = hci_dev_hold(d);
|
||||
if (srcu_index)
|
||||
*srcu_index = srcu_read_lock(&d->srcu);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -84,6 +86,22 @@ struct hci_dev *hci_dev_get(int index)
|
||||
return hdev;
|
||||
}
|
||||
|
||||
struct hci_dev *hci_dev_get(int index)
|
||||
{
|
||||
return __hci_dev_get(index, NULL);
|
||||
}
|
||||
|
||||
static struct hci_dev *hci_dev_get_srcu(int index, int *srcu_index)
|
||||
{
|
||||
return __hci_dev_get(index, srcu_index);
|
||||
}
|
||||
|
||||
static void hci_dev_put_srcu(struct hci_dev *hdev, int srcu_index)
|
||||
{
|
||||
srcu_read_unlock(&hdev->srcu, srcu_index);
|
||||
hci_dev_put(hdev);
|
||||
}
|
||||
|
||||
/* ---- Inquiry support ---- */
|
||||
|
||||
bool hci_discovery_active(struct hci_dev *hdev)
|
||||
@ -568,9 +586,9 @@ static int hci_dev_do_reset(struct hci_dev *hdev)
|
||||
int hci_dev_reset(__u16 dev)
|
||||
{
|
||||
struct hci_dev *hdev;
|
||||
int err;
|
||||
int err, srcu_index;
|
||||
|
||||
hdev = hci_dev_get(dev);
|
||||
hdev = hci_dev_get_srcu(dev, &srcu_index);
|
||||
if (!hdev)
|
||||
return -ENODEV;
|
||||
|
||||
@ -592,7 +610,7 @@ int hci_dev_reset(__u16 dev)
|
||||
err = hci_dev_do_reset(hdev);
|
||||
|
||||
done:
|
||||
hci_dev_put(hdev);
|
||||
hci_dev_put_srcu(hdev, srcu_index);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -2433,6 +2451,11 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv)
|
||||
if (!hdev)
|
||||
return NULL;
|
||||
|
||||
if (init_srcu_struct(&hdev->srcu)) {
|
||||
kfree(hdev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1);
|
||||
hdev->esco_type = (ESCO_HV1);
|
||||
hdev->link_mode = (HCI_LM_ACCEPT);
|
||||
@ -2678,6 +2701,9 @@ void hci_unregister_dev(struct hci_dev *hdev)
|
||||
list_del(&hdev->list);
|
||||
write_unlock(&hci_dev_list_lock);
|
||||
|
||||
synchronize_srcu(&hdev->srcu);
|
||||
cleanup_srcu_struct(&hdev->srcu);
|
||||
|
||||
disable_work_sync(&hdev->rx_work);
|
||||
disable_work_sync(&hdev->cmd_work);
|
||||
disable_work_sync(&hdev->tx_work);
|
||||
|
||||
@ -3415,7 +3415,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data
|
||||
struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
|
||||
struct l2cap_conf_efs efs;
|
||||
u8 remote_efs = 0;
|
||||
u16 mtu = L2CAP_DEFAULT_MTU;
|
||||
u16 mtu = 0;
|
||||
u16 result = L2CAP_CONF_SUCCESS;
|
||||
u16 size;
|
||||
|
||||
@ -3520,6 +3520,13 @@ done:
|
||||
/* Configure output options and let the other side know
|
||||
* which ones we don't like. */
|
||||
|
||||
/* If MTU is not provided in configure request, use the most recently
|
||||
* explicitly or implicitly accepted value for the other direction,
|
||||
* or the default value.
|
||||
*/
|
||||
if (mtu == 0)
|
||||
mtu = chan->imtu ? chan->imtu : L2CAP_DEFAULT_MTU;
|
||||
|
||||
if (mtu < L2CAP_DEFAULT_MIN_MTU)
|
||||
result = L2CAP_CONF_UNACCEPT;
|
||||
else {
|
||||
|
||||
@ -2015,10 +2015,19 @@ void br_multicast_port_ctx_init(struct net_bridge_port *port,
|
||||
|
||||
void br_multicast_port_ctx_deinit(struct net_bridge_mcast_port *pmctx)
|
||||
{
|
||||
struct net_bridge *br = pmctx->port->br;
|
||||
bool del = false;
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
timer_delete_sync(&pmctx->ip6_mc_router_timer);
|
||||
#endif
|
||||
timer_delete_sync(&pmctx->ip4_mc_router_timer);
|
||||
|
||||
spin_lock_bh(&br->multicast_lock);
|
||||
del |= br_ip6_multicast_rport_del(pmctx);
|
||||
del |= br_ip4_multicast_rport_del(pmctx);
|
||||
br_multicast_rport_del_notify(pmctx, del);
|
||||
spin_unlock_bh(&br->multicast_lock);
|
||||
}
|
||||
|
||||
int br_multicast_add_port(struct net_bridge_port *port)
|
||||
|
||||
@ -432,6 +432,7 @@ int netpoll_send_udp(struct netpoll *np, const char *msg, int len)
|
||||
udph->dest = htons(np->remote_port);
|
||||
udph->len = htons(udp_len);
|
||||
|
||||
udph->check = 0;
|
||||
if (np->ipv6) {
|
||||
udph->check = csum_ipv6_magic(&np->local_ip.in6,
|
||||
&np->remote_ip.in6,
|
||||
@ -460,7 +461,6 @@ int netpoll_send_udp(struct netpoll *np, const char *msg, int len)
|
||||
skb_reset_mac_header(skb);
|
||||
skb->protocol = eth->h_proto = htons(ETH_P_IPV6);
|
||||
} else {
|
||||
udph->check = 0;
|
||||
udph->check = csum_tcpudp_magic(np->local_ip.ip,
|
||||
np->remote_ip.ip,
|
||||
udp_len, IPPROTO_UDP,
|
||||
|
||||
@ -160,8 +160,9 @@ static struct sk_buff *net_test_get_skb(struct net_device *ndev,
|
||||
skb->csum = 0;
|
||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||
if (attr->tcp) {
|
||||
thdr->check = ~tcp_v4_check(skb->len, ihdr->saddr,
|
||||
ihdr->daddr, 0);
|
||||
int l4len = skb->len - skb_transport_offset(skb);
|
||||
|
||||
thdr->check = ~tcp_v4_check(l4len, ihdr->saddr, ihdr->daddr, 0);
|
||||
skb->csum_start = skb_transport_header(skb) - skb->head;
|
||||
skb->csum_offset = offsetof(struct tcphdr, check);
|
||||
} else {
|
||||
|
||||
@ -93,9 +93,6 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
|
||||
if (link_id < 0)
|
||||
link_id = 0;
|
||||
|
||||
rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf);
|
||||
rcu_assign_pointer(sdata->link[link_id], link);
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
|
||||
struct ieee80211_sub_if_data *ap_bss;
|
||||
struct ieee80211_bss_conf *ap_bss_conf;
|
||||
@ -145,6 +142,9 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
ieee80211_link_debugfs_add(link);
|
||||
}
|
||||
|
||||
rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf);
|
||||
rcu_assign_pointer(sdata->link[link_id], link);
|
||||
}
|
||||
|
||||
void ieee80211_link_stop(struct ieee80211_link_data *link)
|
||||
|
||||
@ -3884,7 +3884,7 @@ void ieee80211_recalc_dtim(struct ieee80211_local *local,
|
||||
{
|
||||
u64 tsf = drv_get_tsf(local, sdata);
|
||||
u64 dtim_count = 0;
|
||||
u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024;
|
||||
u32 beacon_int = sdata->vif.bss_conf.beacon_int * 1024;
|
||||
u8 dtim_period = sdata->vif.bss_conf.dtim_period;
|
||||
struct ps_data *ps;
|
||||
u8 bcns_from_dtim;
|
||||
|
||||
@ -660,6 +660,11 @@ static void unix_sock_destructor(struct sock *sk)
|
||||
#endif
|
||||
}
|
||||
|
||||
static unsigned int unix_skb_len(const struct sk_buff *skb)
|
||||
{
|
||||
return skb->len - UNIXCB(skb).consumed;
|
||||
}
|
||||
|
||||
static void unix_release_sock(struct sock *sk, int embrion)
|
||||
{
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
@ -694,10 +699,16 @@ static void unix_release_sock(struct sock *sk, int embrion)
|
||||
|
||||
if (skpair != NULL) {
|
||||
if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
|
||||
struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
|
||||
|
||||
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
||||
if (skb && !unix_skb_len(skb))
|
||||
skb = skb_peek_next(skb, &sk->sk_receive_queue);
|
||||
#endif
|
||||
unix_state_lock(skpair);
|
||||
/* No more writes */
|
||||
WRITE_ONCE(skpair->sk_shutdown, SHUTDOWN_MASK);
|
||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue) || embrion)
|
||||
if (skb || embrion)
|
||||
WRITE_ONCE(skpair->sk_err, ECONNRESET);
|
||||
unix_state_unlock(skpair);
|
||||
skpair->sk_state_change(skpair);
|
||||
@ -2661,11 +2672,6 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,
|
||||
return timeo;
|
||||
}
|
||||
|
||||
static unsigned int unix_skb_len(const struct sk_buff *skb)
|
||||
{
|
||||
return skb->len - UNIXCB(skb).consumed;
|
||||
}
|
||||
|
||||
struct unix_stream_read_state {
|
||||
int (*recv_actor)(struct sk_buff *, int, int,
|
||||
struct unix_stream_read_state *);
|
||||
@ -2680,11 +2686,11 @@ struct unix_stream_read_state {
|
||||
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
||||
static int unix_stream_recv_urg(struct unix_stream_read_state *state)
|
||||
{
|
||||
struct sk_buff *oob_skb, *read_skb = NULL;
|
||||
struct socket *sock = state->socket;
|
||||
struct sock *sk = sock->sk;
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
int chunk = 1;
|
||||
struct sk_buff *oob_skb;
|
||||
|
||||
mutex_lock(&u->iolock);
|
||||
unix_state_lock(sk);
|
||||
@ -2699,9 +2705,16 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state)
|
||||
|
||||
oob_skb = u->oob_skb;
|
||||
|
||||
if (!(state->flags & MSG_PEEK))
|
||||
if (!(state->flags & MSG_PEEK)) {
|
||||
WRITE_ONCE(u->oob_skb, NULL);
|
||||
|
||||
if (oob_skb->prev != (struct sk_buff *)&sk->sk_receive_queue &&
|
||||
!unix_skb_len(oob_skb->prev)) {
|
||||
read_skb = oob_skb->prev;
|
||||
__skb_unlink(read_skb, &sk->sk_receive_queue);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
unix_state_unlock(sk);
|
||||
|
||||
@ -2712,6 +2725,8 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state)
|
||||
|
||||
mutex_unlock(&u->iolock);
|
||||
|
||||
consume_skb(read_skb);
|
||||
|
||||
if (chunk < 0)
|
||||
return -EFAULT;
|
||||
|
||||
|
||||
@ -38,7 +38,7 @@ def test_rss_input_xfrm(cfg, ipver):
|
||||
raise KsftSkipEx("socket.SO_INCOMING_CPU was added in Python 3.11")
|
||||
|
||||
input_xfrm = cfg.ethnl.rss_get(
|
||||
{'header': {'dev-name': cfg.ifname}}).get('input_xfrm')
|
||||
{'header': {'dev-name': cfg.ifname}}).get('input-xfrm')
|
||||
|
||||
# Check for symmetric xor/or-xor
|
||||
if not input_xfrm or (input_xfrm != 1 and input_xfrm != 2):
|
||||
|
||||
@ -210,7 +210,7 @@ static void __sendpair(struct __test_metadata *_metadata,
|
||||
static void __recvpair(struct __test_metadata *_metadata,
|
||||
FIXTURE_DATA(msg_oob) *self,
|
||||
const char *expected_buf, int expected_len,
|
||||
int buf_len, int flags)
|
||||
int buf_len, int flags, bool is_sender)
|
||||
{
|
||||
int i, ret[2], recv_errno[2], expected_errno = 0;
|
||||
char recv_buf[2][BUF_SZ] = {};
|
||||
@ -221,7 +221,9 @@ static void __recvpair(struct __test_metadata *_metadata,
|
||||
errno = 0;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
ret[i] = recv(self->fd[i * 2 + 1], recv_buf[i], buf_len, flags);
|
||||
int index = is_sender ? i * 2 : i * 2 + 1;
|
||||
|
||||
ret[i] = recv(self->fd[index], recv_buf[i], buf_len, flags);
|
||||
recv_errno[i] = errno;
|
||||
}
|
||||
|
||||
@ -308,6 +310,20 @@ static void __siocatmarkpair(struct __test_metadata *_metadata,
|
||||
ASSERT_EQ(answ[0], answ[1]);
|
||||
}
|
||||
|
||||
static void __resetpair(struct __test_metadata *_metadata,
|
||||
FIXTURE_DATA(msg_oob) *self,
|
||||
const FIXTURE_VARIANT(msg_oob) *variant,
|
||||
bool reset)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
close(self->fd[i * 2 + 1]);
|
||||
|
||||
__recvpair(_metadata, self, "", reset ? -ECONNRESET : 0, 1,
|
||||
variant->peek ? MSG_PEEK : 0, true);
|
||||
}
|
||||
|
||||
#define sendpair(buf, len, flags) \
|
||||
__sendpair(_metadata, self, buf, len, flags)
|
||||
|
||||
@ -316,9 +332,10 @@ static void __siocatmarkpair(struct __test_metadata *_metadata,
|
||||
if (variant->peek) \
|
||||
__recvpair(_metadata, self, \
|
||||
expected_buf, expected_len, \
|
||||
buf_len, (flags) | MSG_PEEK); \
|
||||
buf_len, (flags) | MSG_PEEK, false); \
|
||||
__recvpair(_metadata, self, \
|
||||
expected_buf, expected_len, buf_len, flags); \
|
||||
expected_buf, expected_len, \
|
||||
buf_len, flags, false); \
|
||||
} while (0)
|
||||
|
||||
#define epollpair(oob_remaining) \
|
||||
@ -330,6 +347,9 @@ static void __siocatmarkpair(struct __test_metadata *_metadata,
|
||||
#define setinlinepair() \
|
||||
__setinlinepair(_metadata, self)
|
||||
|
||||
#define resetpair(reset) \
|
||||
__resetpair(_metadata, self, variant, reset)
|
||||
|
||||
#define tcp_incompliant \
|
||||
for (self->tcp_compliant = false; \
|
||||
self->tcp_compliant == false; \
|
||||
@ -344,6 +364,21 @@ TEST_F(msg_oob, non_oob)
|
||||
recvpair("", -EINVAL, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(true);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, non_oob_no_reset)
|
||||
{
|
||||
sendpair("x", 1, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
recvpair("x", 1, 1, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, oob)
|
||||
@ -355,6 +390,19 @@ TEST_F(msg_oob, oob)
|
||||
recvpair("x", 1, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
|
||||
tcp_incompliant {
|
||||
resetpair(false); /* TCP sets -ECONNRESET for ex-OOB. */
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, oob_reset)
|
||||
{
|
||||
sendpair("x", 1, MSG_OOB);
|
||||
epollpair(true);
|
||||
siocatmarkpair(true);
|
||||
|
||||
resetpair(true);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, oob_drop)
|
||||
@ -370,6 +418,8 @@ TEST_F(msg_oob, oob_drop)
|
||||
recvpair("", -EINVAL, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, oob_ahead)
|
||||
@ -385,6 +435,10 @@ TEST_F(msg_oob, oob_ahead)
|
||||
recvpair("hell", 4, 4, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
|
||||
tcp_incompliant {
|
||||
resetpair(false); /* TCP sets -ECONNRESET for ex-OOB. */
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, oob_break)
|
||||
@ -403,6 +457,8 @@ TEST_F(msg_oob, oob_break)
|
||||
|
||||
recvpair("", -EAGAIN, 1, 0);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, oob_ahead_break)
|
||||
@ -426,6 +482,8 @@ TEST_F(msg_oob, oob_ahead_break)
|
||||
recvpair("world", 5, 5, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, oob_break_drop)
|
||||
@ -449,6 +507,8 @@ TEST_F(msg_oob, oob_break_drop)
|
||||
recvpair("", -EINVAL, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_break)
|
||||
@ -476,6 +536,8 @@ TEST_F(msg_oob, ex_oob_break)
|
||||
recvpair("ld", 2, 2, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_drop)
|
||||
@ -498,6 +560,8 @@ TEST_F(msg_oob, ex_oob_drop)
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
}
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_drop_2)
|
||||
@ -523,6 +587,8 @@ TEST_F(msg_oob, ex_oob_drop_2)
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
}
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_oob)
|
||||
@ -546,6 +612,54 @@ TEST_F(msg_oob, ex_oob_oob)
|
||||
recvpair("", -EINVAL, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_ex_oob)
|
||||
{
|
||||
sendpair("x", 1, MSG_OOB);
|
||||
epollpair(true);
|
||||
siocatmarkpair(true);
|
||||
|
||||
recvpair("x", 1, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
|
||||
sendpair("y", 1, MSG_OOB);
|
||||
epollpair(true);
|
||||
siocatmarkpair(true);
|
||||
|
||||
recvpair("y", 1, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
|
||||
tcp_incompliant {
|
||||
resetpair(false); /* TCP sets -ECONNRESET for ex-OOB. */
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_ex_oob_oob)
|
||||
{
|
||||
sendpair("x", 1, MSG_OOB);
|
||||
epollpair(true);
|
||||
siocatmarkpair(true);
|
||||
|
||||
recvpair("x", 1, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
|
||||
sendpair("y", 1, MSG_OOB);
|
||||
epollpair(true);
|
||||
siocatmarkpair(true);
|
||||
|
||||
recvpair("y", 1, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
|
||||
sendpair("z", 1, MSG_OOB);
|
||||
epollpair(true);
|
||||
siocatmarkpair(true);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_ahead_break)
|
||||
@ -576,6 +690,10 @@ TEST_F(msg_oob, ex_oob_ahead_break)
|
||||
recvpair("d", 1, 1, MSG_OOB);
|
||||
epollpair(false);
|
||||
siocatmarkpair(true);
|
||||
|
||||
tcp_incompliant {
|
||||
resetpair(false); /* TCP sets -ECONNRESET for ex-OOB. */
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, ex_oob_siocatmark)
|
||||
@ -595,6 +713,8 @@ TEST_F(msg_oob, ex_oob_siocatmark)
|
||||
recvpair("hell", 4, 4, 0); /* Intentionally stop at ex-OOB. */
|
||||
epollpair(true);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(true);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, inline_oob)
|
||||
@ -612,6 +732,8 @@ TEST_F(msg_oob, inline_oob)
|
||||
recvpair("x", 1, 1, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, inline_oob_break)
|
||||
@ -633,6 +755,8 @@ TEST_F(msg_oob, inline_oob_break)
|
||||
recvpair("o", 1, 1, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, inline_oob_ahead_break)
|
||||
@ -661,6 +785,8 @@ TEST_F(msg_oob, inline_oob_ahead_break)
|
||||
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, inline_ex_oob_break)
|
||||
@ -686,6 +812,8 @@ TEST_F(msg_oob, inline_ex_oob_break)
|
||||
recvpair("rld", 3, 3, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, inline_ex_oob_no_drop)
|
||||
@ -707,6 +835,8 @@ TEST_F(msg_oob, inline_ex_oob_no_drop)
|
||||
recvpair("y", 1, 1, 0);
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, inline_ex_oob_drop)
|
||||
@ -731,6 +861,8 @@ TEST_F(msg_oob, inline_ex_oob_drop)
|
||||
epollpair(false);
|
||||
siocatmarkpair(false);
|
||||
}
|
||||
|
||||
resetpair(false);
|
||||
}
|
||||
|
||||
TEST_F(msg_oob, inline_ex_oob_siocatmark)
|
||||
@ -752,6 +884,8 @@ TEST_F(msg_oob, inline_ex_oob_siocatmark)
|
||||
recvpair("hell", 4, 4, 0); /* Intentionally stop at ex-OOB. */
|
||||
epollpair(true);
|
||||
siocatmarkpair(false);
|
||||
|
||||
resetpair(true);
|
||||
}
|
||||
|
||||
TEST_HARNESS_MAIN
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user