Networking fixes for 6.3-rc2, including fixes from netfilter, bpf
Current release - regressions: - core: avoid skb end_offset change in __skb_unclone_keeptruesize() - sched: - act_connmark: handle errno on tcf_idr_check_alloc - flower: fix fl_change() error recovery path - ieee802154: prevent user from crashing the host Current release - new code bugs: - eth: bnxt_en: fix the double free during device removal - tools: ynl: - fix enum-as-flags in the generic CLI - fully inherit attrs in subsets - re-license uniformly under GPL-2.0 or BSD-3-clause Previous releases - regressions: - core: use indirect calls helpers for sk_exit_memory_pressure() - tls: - fix return value for async crypto - avoid hanging tasks on the tx_lock - eth: ice: copy last block omitted in ice_get_module_eeprom() Previous releases - always broken: - core: avoid double iput when sock_alloc_file fails - af_unix: fix struct pid leaks in OOB support - tls: - fix possible race condition - fix device-offloaded sendpage straddling records - bpf: - sockmap: fix an infinite loop error - test_run: fix &xdp_frame misplacement for LIVE_FRAMES - fix resolving BTF_KIND_VAR after ARRAY, STRUCT, UNION, PTR - netfilter: tproxy: fix deadlock due to missing BH disable - phylib: get rid of unnecessary locking - eth: bgmac: fix *initial* chip reset to support BCM5358 - eth: nfp: fix csum for ipsec offload - eth: mtk_eth_soc: fix RX data corruption issue Misc: - usb: qmi_wwan: add telit 0x1080 composition Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmQJzQISHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOky5YP/04Dbsbeqpk0Q94axmjoaS0J/4rW49js RaA7v8ci7sL1omW8k5tILPXniAouN4YHNOCW1KbLBMR5O7lyn9qM1RteHOIpOmte TLzAw+6Wl7CyGiiqirv2GU96Wd/jZoZpPXFZz/gXP59GnkChSHzQcpexmz0nrmxI eCRSs+qm+re3wmDKTYm5C+g+420PNXu9JItPnTNf+nTkTBxpmOEMyry03I0taXKS wceQHB2q5E0sSWXDfkxG/pmUuYTj3AdRSQ+vo+FLevSs/LWeThs2I6pT5sn8XS76 1S8Lh6FytfBhyalFmRtrpqIJYyGae5MwEXQ29ddfmF4OFFLedx3IH0+JFQxTE9So i4gaXmM5SUI7c5vhib097xUISoLxKqqXQVQQSQ1MPZRfXtVubbA2gCv+vh6fXVoj zQYatZOLM7KT9q4Pw8A+9bJPof/FV+ObC67pbGQbJJgBoy+oOixDuP+x5DYT384L /5XS+23OZiFe7bvQoE/0SQMeRk3lF2XkS5l9gSbdSnGQPiaOqKhDgkoCmdkn1jvg qtkBS6+tRRoOBNsjC4r4eFXBVOQ1+myyjZetBnEOaSp22FaTJFQh9qX3AMFIHbUy m0jDi9OJZSWHICd6KNWPm3JK43cMjiyZbGftYqOHhuY5HN30vQN6sl7DXIJ0rIcE myHMfizwqmGT =hSXM -----END PGP SIGNATURE----- Merge tag 'net-6.3-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from netfilter and bpf. Current release - regressions: - core: avoid skb end_offset change in __skb_unclone_keeptruesize() - sched: - act_connmark: handle errno on tcf_idr_check_alloc - flower: fix fl_change() error recovery path - ieee802154: prevent user from crashing the host Current release - new code bugs: - eth: bnxt_en: fix the double free during device removal - tools: ynl: - fix enum-as-flags in the generic CLI - fully inherit attrs in subsets - re-license uniformly under GPL-2.0 or BSD-3-clause Previous releases - regressions: - core: use indirect calls helpers for sk_exit_memory_pressure() - tls: - fix return value for async crypto - avoid hanging tasks on the tx_lock - eth: ice: copy last block omitted in ice_get_module_eeprom() Previous releases - always broken: - core: avoid double iput when sock_alloc_file fails - af_unix: fix struct pid leaks in OOB support - tls: - fix possible race condition - fix device-offloaded sendpage straddling records - bpf: - sockmap: fix an infinite loop error - test_run: fix &xdp_frame misplacement for LIVE_FRAMES - fix resolving BTF_KIND_VAR after ARRAY, STRUCT, UNION, PTR - netfilter: tproxy: fix deadlock due to missing BH disable - phylib: get rid of unnecessary locking - eth: bgmac: fix *initial* chip reset to support BCM5358 - eth: nfp: fix csum for ipsec offload - eth: mtk_eth_soc: fix RX data corruption issue Misc: - usb: qmi_wwan: add telit 0x1080 composition" * tag 'net-6.3-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (64 commits) tools: ynl: fix enum-as-flags in the generic CLI tools: ynl: move the enum classes to shared code net: avoid double iput when sock_alloc_file fails af_unix: fix struct pid leaks in OOB support eth: fealnx: bring back this old driver net: dsa: mt7530: permit port 5 to work without port 6 on MT7621 SoC net: microchip: sparx5: fix deletion of existing DSCP mappings octeontx2-af: Unlock contexts in the queue context cache in case of fault detection net/smc: fix fallback failed while sendmsg with fastopen ynl: re-license uniformly under GPL-2.0 OR BSD-3-Clause mailmap: update entries for Stephen Hemminger mailmap: add entry for Maxim Mikityanskiy nfc: change order inside nfc_se_io error path ethernet: ice: avoid gcc-9 integer overflow warning ice: don't ignore return codes in VSI related code ice: Fix DSCP PFC TLV creation net: usb: qmi_wwan: add Telit 0x1080 composition net: usb: cdc_mbim: avoid altsetting toggling for Telit FE990 netfilter: conntrack: adopt safer max chain length net: tls: fix device-offloaded sendpage straddling records ...
This commit is contained in:
Коммит
44889ba56c
7
.mailmap
7
.mailmap
|
@ -306,6 +306,8 @@ Mauro Carvalho Chehab <mchehab@kernel.org> <mchehab@osg.samsung.com>
|
||||||
Mauro Carvalho Chehab <mchehab@kernel.org> <mchehab@redhat.com>
|
Mauro Carvalho Chehab <mchehab@kernel.org> <mchehab@redhat.com>
|
||||||
Mauro Carvalho Chehab <mchehab@kernel.org> <m.chehab@samsung.com>
|
Mauro Carvalho Chehab <mchehab@kernel.org> <m.chehab@samsung.com>
|
||||||
Mauro Carvalho Chehab <mchehab@kernel.org> <mchehab@s-opensource.com>
|
Mauro Carvalho Chehab <mchehab@kernel.org> <mchehab@s-opensource.com>
|
||||||
|
Maxim Mikityanskiy <maxtram95@gmail.com> <maximmi@mellanox.com>
|
||||||
|
Maxim Mikityanskiy <maxtram95@gmail.com> <maximmi@nvidia.com>
|
||||||
Maxime Ripard <mripard@kernel.org> <maxime.ripard@bootlin.com>
|
Maxime Ripard <mripard@kernel.org> <maxime.ripard@bootlin.com>
|
||||||
Maxime Ripard <mripard@kernel.org> <maxime.ripard@free-electrons.com>
|
Maxime Ripard <mripard@kernel.org> <maxime.ripard@free-electrons.com>
|
||||||
Mayuresh Janorkar <mayur@ti.com>
|
Mayuresh Janorkar <mayur@ti.com>
|
||||||
|
@ -411,7 +413,10 @@ Shuah Khan <shuah@kernel.org> <shuah.kh@samsung.com>
|
||||||
Simon Arlott <simon@octiron.net> <simon@fire.lp0.eu>
|
Simon Arlott <simon@octiron.net> <simon@fire.lp0.eu>
|
||||||
Simon Kelley <simon@thekelleys.org.uk>
|
Simon Kelley <simon@thekelleys.org.uk>
|
||||||
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
||||||
Stephen Hemminger <shemminger@osdl.org>
|
Stephen Hemminger <stephen@networkplumber.org> <shemminger@linux-foundation.org>
|
||||||
|
Stephen Hemminger <stephen@networkplumber.org> <shemminger@osdl.org>
|
||||||
|
Stephen Hemminger <stephen@networkplumber.org> <sthemmin@microsoft.com>
|
||||||
|
Stephen Hemminger <stephen@networkplumber.org> <sthemmin@vyatta.com>
|
||||||
Steve Wise <larrystevenwise@gmail.com> <swise@chelsio.com>
|
Steve Wise <larrystevenwise@gmail.com> <swise@chelsio.com>
|
||||||
Steve Wise <larrystevenwise@gmail.com> <swise@opengridcomputing.com>
|
Steve Wise <larrystevenwise@gmail.com> <swise@opengridcomputing.com>
|
||||||
Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
|
Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
|
||||||
|
|
|
@ -7,8 +7,8 @@ workflows related to reporting bugs, submitting patches, and queueing
|
||||||
patches for stable kernels.
|
patches for stable kernels.
|
||||||
|
|
||||||
For general information about submitting patches, please refer to
|
For general information about submitting patches, please refer to
|
||||||
`Documentation/process/`_. This document only describes additional specifics
|
Documentation/process/submitting-patches.rst. This document only describes
|
||||||
related to BPF.
|
additional specifics related to BPF.
|
||||||
|
|
||||||
.. contents::
|
.. contents::
|
||||||
:local:
|
:local:
|
||||||
|
@ -461,15 +461,15 @@ needed::
|
||||||
|
|
||||||
$ sudo make run_tests
|
$ sudo make run_tests
|
||||||
|
|
||||||
See the kernels selftest `Documentation/dev-tools/kselftest.rst`_
|
See :doc:`kernel selftest documentation </dev-tools/kselftest>`
|
||||||
document for further documentation.
|
for details.
|
||||||
|
|
||||||
To maximize the number of tests passing, the .config of the kernel
|
To maximize the number of tests passing, the .config of the kernel
|
||||||
under test should match the config file fragment in
|
under test should match the config file fragment in
|
||||||
tools/testing/selftests/bpf as closely as possible.
|
tools/testing/selftests/bpf as closely as possible.
|
||||||
|
|
||||||
Finally to ensure support for latest BPF Type Format features -
|
Finally to ensure support for latest BPF Type Format features -
|
||||||
discussed in `Documentation/bpf/btf.rst`_ - pahole version 1.16
|
discussed in Documentation/bpf/btf.rst - pahole version 1.16
|
||||||
is required for kernels built with CONFIG_DEBUG_INFO_BTF=y.
|
is required for kernels built with CONFIG_DEBUG_INFO_BTF=y.
|
||||||
pahole is delivered in the dwarves package or can be built
|
pahole is delivered in the dwarves package or can be built
|
||||||
from source at
|
from source at
|
||||||
|
@ -684,12 +684,8 @@ when:
|
||||||
|
|
||||||
|
|
||||||
.. Links
|
.. Links
|
||||||
.. _Documentation/process/: https://www.kernel.org/doc/html/latest/process/
|
|
||||||
.. _netdev-FAQ: Documentation/process/maintainer-netdev.rst
|
.. _netdev-FAQ: Documentation/process/maintainer-netdev.rst
|
||||||
.. _selftests:
|
.. _selftests:
|
||||||
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/bpf/
|
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/bpf/
|
||||||
.. _Documentation/dev-tools/kselftest.rst:
|
|
||||||
https://www.kernel.org/doc/html/latest/dev-tools/kselftest.html
|
|
||||||
.. _Documentation/bpf/btf.rst: btf.rst
|
|
||||||
|
|
||||||
Happy BPF hacking!
|
Happy BPF hacking!
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: http://kernel.org/schemas/netlink/genetlink-c.yaml#
|
$id: http://kernel.org/schemas/netlink/genetlink-c.yaml#
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: http://kernel.org/schemas/netlink/genetlink-legacy.yaml#
|
$id: http://kernel.org/schemas/netlink/genetlink-legacy.yaml#
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: http://kernel.org/schemas/netlink/genetlink-legacy.yaml#
|
$id: http://kernel.org/schemas/netlink/genetlink-legacy.yaml#
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
name: ethtool
|
name: ethtool
|
||||||
|
|
||||||
protocol: genetlink-legacy
|
protocol: genetlink-legacy
|
||||||
|
@ -11,7 +13,6 @@ attribute-sets:
|
||||||
-
|
-
|
||||||
name: dev-index
|
name: dev-index
|
||||||
type: u32
|
type: u32
|
||||||
value: 1
|
|
||||||
-
|
-
|
||||||
name: dev-name
|
name: dev-name
|
||||||
type: string
|
type: string
|
||||||
|
@ -25,7 +26,6 @@ attribute-sets:
|
||||||
-
|
-
|
||||||
name: index
|
name: index
|
||||||
type: u32
|
type: u32
|
||||||
value: 1
|
|
||||||
-
|
-
|
||||||
name: name
|
name: name
|
||||||
type: string
|
type: string
|
||||||
|
@ -39,14 +39,12 @@ attribute-sets:
|
||||||
name: bit
|
name: bit
|
||||||
type: nest
|
type: nest
|
||||||
nested-attributes: bitset-bit
|
nested-attributes: bitset-bit
|
||||||
value: 1
|
|
||||||
-
|
-
|
||||||
name: bitset
|
name: bitset
|
||||||
attributes:
|
attributes:
|
||||||
-
|
-
|
||||||
name: nomask
|
name: nomask
|
||||||
type: flag
|
type: flag
|
||||||
value: 1
|
|
||||||
-
|
-
|
||||||
name: size
|
name: size
|
||||||
type: u32
|
type: u32
|
||||||
|
@ -61,7 +59,6 @@ attribute-sets:
|
||||||
-
|
-
|
||||||
name: index
|
name: index
|
||||||
type: u32
|
type: u32
|
||||||
value: 1
|
|
||||||
-
|
-
|
||||||
name: value
|
name: value
|
||||||
type: string
|
type: string
|
||||||
|
@ -71,7 +68,6 @@ attribute-sets:
|
||||||
-
|
-
|
||||||
name: string
|
name: string
|
||||||
type: nest
|
type: nest
|
||||||
value: 1
|
|
||||||
multi-attr: true
|
multi-attr: true
|
||||||
nested-attributes: string
|
nested-attributes: string
|
||||||
-
|
-
|
||||||
|
@ -80,7 +76,6 @@ attribute-sets:
|
||||||
-
|
-
|
||||||
name: id
|
name: id
|
||||||
type: u32
|
type: u32
|
||||||
value: 1
|
|
||||||
-
|
-
|
||||||
name: count
|
name: count
|
||||||
type: u32
|
type: u32
|
||||||
|
@ -96,14 +91,12 @@ attribute-sets:
|
||||||
name: stringset
|
name: stringset
|
||||||
type: nest
|
type: nest
|
||||||
multi-attr: true
|
multi-attr: true
|
||||||
value: 1
|
|
||||||
nested-attributes: stringset
|
nested-attributes: stringset
|
||||||
-
|
-
|
||||||
name: strset
|
name: strset
|
||||||
attributes:
|
attributes:
|
||||||
-
|
-
|
||||||
name: header
|
name: header
|
||||||
value: 1
|
|
||||||
type: nest
|
type: nest
|
||||||
nested-attributes: header
|
nested-attributes: header
|
||||||
-
|
-
|
||||||
|
@ -119,7 +112,6 @@ attribute-sets:
|
||||||
attributes:
|
attributes:
|
||||||
-
|
-
|
||||||
name: header
|
name: header
|
||||||
value: 1
|
|
||||||
type: nest
|
type: nest
|
||||||
nested-attributes: header
|
nested-attributes: header
|
||||||
-
|
-
|
||||||
|
@ -132,7 +124,6 @@ attribute-sets:
|
||||||
attributes:
|
attributes:
|
||||||
-
|
-
|
||||||
name: header
|
name: header
|
||||||
value: 1
|
|
||||||
type: nest
|
type: nest
|
||||||
nested-attributes: header
|
nested-attributes: header
|
||||||
-
|
-
|
||||||
|
@ -180,7 +171,6 @@ attribute-sets:
|
||||||
attributes:
|
attributes:
|
||||||
-
|
-
|
||||||
name: pad
|
name: pad
|
||||||
value: 1
|
|
||||||
type: pad
|
type: pad
|
||||||
-
|
-
|
||||||
name: reassembly-errors
|
name: reassembly-errors
|
||||||
|
@ -205,7 +195,6 @@ attribute-sets:
|
||||||
attributes:
|
attributes:
|
||||||
-
|
-
|
||||||
name: header
|
name: header
|
||||||
value: 1
|
|
||||||
type: nest
|
type: nest
|
||||||
nested-attributes: header
|
nested-attributes: header
|
||||||
-
|
-
|
||||||
|
@ -251,13 +240,11 @@ operations:
|
||||||
|
|
||||||
do: &strset-get-op
|
do: &strset-get-op
|
||||||
request:
|
request:
|
||||||
value: 1
|
|
||||||
attributes:
|
attributes:
|
||||||
- header
|
- header
|
||||||
- stringsets
|
- stringsets
|
||||||
- counts-only
|
- counts-only
|
||||||
reply:
|
reply:
|
||||||
value: 1
|
|
||||||
attributes:
|
attributes:
|
||||||
- header
|
- header
|
||||||
- stringsets
|
- stringsets
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
name: fou
|
name: fou
|
||||||
|
|
||||||
protocol: genetlink-legacy
|
protocol: genetlink-legacy
|
||||||
|
@ -26,6 +28,7 @@ attribute-sets:
|
||||||
-
|
-
|
||||||
name: unspec
|
name: unspec
|
||||||
type: unused
|
type: unused
|
||||||
|
value: 0
|
||||||
-
|
-
|
||||||
name: port
|
name: port
|
||||||
type: u16
|
type: u16
|
||||||
|
@ -71,6 +74,7 @@ operations:
|
||||||
-
|
-
|
||||||
name: unspec
|
name: unspec
|
||||||
doc: unused
|
doc: unused
|
||||||
|
value: 0
|
||||||
|
|
||||||
-
|
-
|
||||||
name: add
|
name: add
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
name: netdev
|
name: netdev
|
||||||
|
|
||||||
doc:
|
doc:
|
||||||
|
@ -48,7 +50,6 @@ attribute-sets:
|
||||||
name: ifindex
|
name: ifindex
|
||||||
doc: netdev ifindex
|
doc: netdev ifindex
|
||||||
type: u32
|
type: u32
|
||||||
value: 1
|
|
||||||
checks:
|
checks:
|
||||||
min: 1
|
min: 1
|
||||||
-
|
-
|
||||||
|
@ -66,7 +67,6 @@ operations:
|
||||||
-
|
-
|
||||||
name: dev-get
|
name: dev-get
|
||||||
doc: Get / dump information about a netdev.
|
doc: Get / dump information about a netdev.
|
||||||
value: 1
|
|
||||||
attribute-set: dev
|
attribute-set: dev
|
||||||
do:
|
do:
|
||||||
request:
|
request:
|
||||||
|
|
|
@ -24,6 +24,9 @@ YAML specifications can be found under ``Documentation/netlink/specs/``
|
||||||
This document describes details of the schema.
|
This document describes details of the schema.
|
||||||
See :doc:`intro-specs` for a practical starting guide.
|
See :doc:`intro-specs` for a practical starting guide.
|
||||||
|
|
||||||
|
All specs must be licensed under ``GPL-2.0-only OR BSD-3-Clause``
|
||||||
|
to allow for easy adoption in user space code.
|
||||||
|
|
||||||
Compatibility levels
|
Compatibility levels
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
@ -197,9 +200,15 @@ value
|
||||||
Numerical attribute ID, used in serialized Netlink messages.
|
Numerical attribute ID, used in serialized Netlink messages.
|
||||||
The ``value`` property can be skipped, in which case the attribute ID
|
The ``value`` property can be skipped, in which case the attribute ID
|
||||||
will be the value of the previous attribute plus one (recursively)
|
will be the value of the previous attribute plus one (recursively)
|
||||||
and ``0`` for the first attribute in the attribute set.
|
and ``1`` for the first attribute in the attribute set.
|
||||||
|
|
||||||
Note that the ``value`` of an attribute is defined only in its main set.
|
Attributes (and operations) use ``1`` as the default value for the first
|
||||||
|
entry (unlike enums in definitions which start from ``0``) because
|
||||||
|
entry ``0`` is almost always reserved as undefined. Spec can explicitly
|
||||||
|
set value to ``0`` if needed.
|
||||||
|
|
||||||
|
Note that the ``value`` of an attribute is defined only in its main set
|
||||||
|
(not in subsets).
|
||||||
|
|
||||||
enum
|
enum
|
||||||
~~~~
|
~~~~
|
||||||
|
|
|
@ -284,6 +284,7 @@ CONFIG_IXGB=m
|
||||||
CONFIG_SKGE=m
|
CONFIG_SKGE=m
|
||||||
CONFIG_SKY2=m
|
CONFIG_SKY2=m
|
||||||
CONFIG_MYRI10GE=m
|
CONFIG_MYRI10GE=m
|
||||||
|
CONFIG_FEALNX=m
|
||||||
CONFIG_NATSEMI=m
|
CONFIG_NATSEMI=m
|
||||||
CONFIG_NS83820=m
|
CONFIG_NS83820=m
|
||||||
CONFIG_S2IO=m
|
CONFIG_S2IO=m
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "fsl,T1040RDB-REV-A";
|
model = "fsl,T1040RDB-REV-A";
|
||||||
compatible = "fsl,T1040RDB-REV-A";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
&seville_port0 {
|
&seville_port0 {
|
||||||
|
|
|
@ -180,6 +180,9 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&seville_port8 {
|
&seville_port8 {
|
||||||
ethernet = <&enet0>;
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&seville_port9 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -686,6 +686,7 @@
|
||||||
seville_port8: port@8 {
|
seville_port8: port@8 {
|
||||||
reg = <8>;
|
reg = <8>;
|
||||||
phy-mode = "internal";
|
phy-mode = "internal";
|
||||||
|
ethernet = <&enet0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
fixed-link {
|
fixed-link {
|
||||||
|
@ -697,6 +698,7 @@
|
||||||
seville_port9: port@9 {
|
seville_port9: port@9 {
|
||||||
reg = <9>;
|
reg = <9>;
|
||||||
phy-mode = "internal";
|
phy-mode = "internal";
|
||||||
|
ethernet = <&enet1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
fixed-link {
|
fixed-link {
|
||||||
|
|
|
@ -461,6 +461,7 @@ CONFIG_MV643XX_ETH=m
|
||||||
CONFIG_SKGE=m
|
CONFIG_SKGE=m
|
||||||
CONFIG_SKY2=m
|
CONFIG_SKY2=m
|
||||||
CONFIG_MYRI10GE=m
|
CONFIG_MYRI10GE=m
|
||||||
|
CONFIG_FEALNX=m
|
||||||
CONFIG_NATSEMI=m
|
CONFIG_NATSEMI=m
|
||||||
CONFIG_NS83820=m
|
CONFIG_NS83820=m
|
||||||
CONFIG_PCMCIA_AXNET=m
|
CONFIG_PCMCIA_AXNET=m
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/filter.h>
|
#include <linux/filter.h>
|
||||||
#include <linux/memory.h>
|
#include <linux/memory.h>
|
||||||
#include <linux/stop_machine.h>
|
#include <linux/stop_machine.h>
|
||||||
|
#include <asm/patch.h>
|
||||||
#include "bpf_jit.h"
|
#include "bpf_jit.h"
|
||||||
|
|
||||||
#define RV_REG_TCC RV_REG_A6
|
#define RV_REG_TCC RV_REG_A6
|
||||||
|
|
|
@ -393,6 +393,24 @@ mt7530_fdb_write(struct mt7530_priv *priv, u16 vid,
|
||||||
mt7530_write(priv, MT7530_ATA1 + (i * 4), reg[i]);
|
mt7530_write(priv, MT7530_ATA1 + (i * 4), reg[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set up switch core clock for MT7530 */
|
||||||
|
static void mt7530_pll_setup(struct mt7530_priv *priv)
|
||||||
|
{
|
||||||
|
/* Disable PLL */
|
||||||
|
core_write(priv, CORE_GSWPLL_GRP1, 0);
|
||||||
|
|
||||||
|
/* Set core clock into 500Mhz */
|
||||||
|
core_write(priv, CORE_GSWPLL_GRP2,
|
||||||
|
RG_GSWPLL_POSDIV_500M(1) |
|
||||||
|
RG_GSWPLL_FBKDIV_500M(25));
|
||||||
|
|
||||||
|
/* Enable PLL */
|
||||||
|
core_write(priv, CORE_GSWPLL_GRP1,
|
||||||
|
RG_GSWPLL_EN_PRE |
|
||||||
|
RG_GSWPLL_POSDIV_200M(2) |
|
||||||
|
RG_GSWPLL_FBKDIV_200M(32));
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup TX circuit including relevant PAD and driving */
|
/* Setup TX circuit including relevant PAD and driving */
|
||||||
static int
|
static int
|
||||||
mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
|
mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
|
||||||
|
@ -453,21 +471,6 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
|
||||||
core_clear(priv, CORE_TRGMII_GSW_CLK_CG,
|
core_clear(priv, CORE_TRGMII_GSW_CLK_CG,
|
||||||
REG_GSWCK_EN | REG_TRGMIICK_EN);
|
REG_GSWCK_EN | REG_TRGMIICK_EN);
|
||||||
|
|
||||||
/* Setup core clock for MT7530 */
|
|
||||||
/* Disable PLL */
|
|
||||||
core_write(priv, CORE_GSWPLL_GRP1, 0);
|
|
||||||
|
|
||||||
/* Set core clock into 500Mhz */
|
|
||||||
core_write(priv, CORE_GSWPLL_GRP2,
|
|
||||||
RG_GSWPLL_POSDIV_500M(1) |
|
|
||||||
RG_GSWPLL_FBKDIV_500M(25));
|
|
||||||
|
|
||||||
/* Enable PLL */
|
|
||||||
core_write(priv, CORE_GSWPLL_GRP1,
|
|
||||||
RG_GSWPLL_EN_PRE |
|
|
||||||
RG_GSWPLL_POSDIV_200M(2) |
|
|
||||||
RG_GSWPLL_FBKDIV_200M(32));
|
|
||||||
|
|
||||||
/* Setup the MT7530 TRGMII Tx Clock */
|
/* Setup the MT7530 TRGMII Tx Clock */
|
||||||
core_write(priv, CORE_PLL_GROUP5, RG_LCDDS_PCW_NCPO1(ncpo1));
|
core_write(priv, CORE_PLL_GROUP5, RG_LCDDS_PCW_NCPO1(ncpo1));
|
||||||
core_write(priv, CORE_PLL_GROUP6, RG_LCDDS_PCW_NCPO0(0));
|
core_write(priv, CORE_PLL_GROUP6, RG_LCDDS_PCW_NCPO0(0));
|
||||||
|
@ -2196,6 +2199,8 @@ mt7530_setup(struct dsa_switch *ds)
|
||||||
SYS_CTRL_PHY_RST | SYS_CTRL_SW_RST |
|
SYS_CTRL_PHY_RST | SYS_CTRL_SW_RST |
|
||||||
SYS_CTRL_REG_RST);
|
SYS_CTRL_REG_RST);
|
||||||
|
|
||||||
|
mt7530_pll_setup(priv);
|
||||||
|
|
||||||
/* Enable Port 6 only; P5 as GMAC5 which currently is not supported */
|
/* Enable Port 6 only; P5 as GMAC5 which currently is not supported */
|
||||||
val = mt7530_read(priv, MT7530_MHWTRAP);
|
val = mt7530_read(priv, MT7530_MHWTRAP);
|
||||||
val &= ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS;
|
val &= ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS;
|
||||||
|
|
|
@ -132,6 +132,16 @@ source "drivers/net/ethernet/mscc/Kconfig"
|
||||||
source "drivers/net/ethernet/microsoft/Kconfig"
|
source "drivers/net/ethernet/microsoft/Kconfig"
|
||||||
source "drivers/net/ethernet/moxa/Kconfig"
|
source "drivers/net/ethernet/moxa/Kconfig"
|
||||||
source "drivers/net/ethernet/myricom/Kconfig"
|
source "drivers/net/ethernet/myricom/Kconfig"
|
||||||
|
|
||||||
|
config FEALNX
|
||||||
|
tristate "Myson MTD-8xx PCI Ethernet support"
|
||||||
|
depends on PCI
|
||||||
|
select CRC32
|
||||||
|
select MII
|
||||||
|
help
|
||||||
|
Say Y here to support the Myson MTD-800 family of PCI-based Ethernet
|
||||||
|
cards. <http://www.myson.com.tw/>
|
||||||
|
|
||||||
source "drivers/net/ethernet/ni/Kconfig"
|
source "drivers/net/ethernet/ni/Kconfig"
|
||||||
source "drivers/net/ethernet/natsemi/Kconfig"
|
source "drivers/net/ethernet/natsemi/Kconfig"
|
||||||
source "drivers/net/ethernet/neterion/Kconfig"
|
source "drivers/net/ethernet/neterion/Kconfig"
|
||||||
|
|
|
@ -64,6 +64,7 @@ obj-$(CONFIG_NET_VENDOR_MICROCHIP) += microchip/
|
||||||
obj-$(CONFIG_NET_VENDOR_MICROSEMI) += mscc/
|
obj-$(CONFIG_NET_VENDOR_MICROSEMI) += mscc/
|
||||||
obj-$(CONFIG_NET_VENDOR_MOXART) += moxa/
|
obj-$(CONFIG_NET_VENDOR_MOXART) += moxa/
|
||||||
obj-$(CONFIG_NET_VENDOR_MYRI) += myricom/
|
obj-$(CONFIG_NET_VENDOR_MYRI) += myricom/
|
||||||
|
obj-$(CONFIG_FEALNX) += fealnx.o
|
||||||
obj-$(CONFIG_NET_VENDOR_NATSEMI) += natsemi/
|
obj-$(CONFIG_NET_VENDOR_NATSEMI) += natsemi/
|
||||||
obj-$(CONFIG_NET_VENDOR_NETERION) += neterion/
|
obj-$(CONFIG_NET_VENDOR_NETERION) += neterion/
|
||||||
obj-$(CONFIG_NET_VENDOR_NETRONOME) += netronome/
|
obj-$(CONFIG_NET_VENDOR_NETRONOME) += netronome/
|
||||||
|
|
|
@ -890,13 +890,13 @@ static void bgmac_chip_reset_idm_config(struct bgmac *bgmac)
|
||||||
|
|
||||||
if (iost & BGMAC_BCMA_IOST_ATTACHED) {
|
if (iost & BGMAC_BCMA_IOST_ATTACHED) {
|
||||||
flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
|
flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
|
||||||
if (!bgmac->has_robosw)
|
if (bgmac->in_init || !bgmac->has_robosw)
|
||||||
flags |= BGMAC_BCMA_IOCTL_SW_RESET;
|
flags |= BGMAC_BCMA_IOCTL_SW_RESET;
|
||||||
}
|
}
|
||||||
bgmac_clk_enable(bgmac, flags);
|
bgmac_clk_enable(bgmac, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
|
if (iost & BGMAC_BCMA_IOST_ATTACHED && (bgmac->in_init || !bgmac->has_robosw))
|
||||||
bgmac_idm_write(bgmac, BCMA_IOCTL,
|
bgmac_idm_write(bgmac, BCMA_IOCTL,
|
||||||
bgmac_idm_read(bgmac, BCMA_IOCTL) &
|
bgmac_idm_read(bgmac, BCMA_IOCTL) &
|
||||||
~BGMAC_BCMA_IOCTL_SW_RESET);
|
~BGMAC_BCMA_IOCTL_SW_RESET);
|
||||||
|
@ -1490,6 +1490,8 @@ int bgmac_enet_probe(struct bgmac *bgmac)
|
||||||
struct net_device *net_dev = bgmac->net_dev;
|
struct net_device *net_dev = bgmac->net_dev;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
bgmac->in_init = true;
|
||||||
|
|
||||||
bgmac_chip_intrs_off(bgmac);
|
bgmac_chip_intrs_off(bgmac);
|
||||||
|
|
||||||
net_dev->irq = bgmac->irq;
|
net_dev->irq = bgmac->irq;
|
||||||
|
@ -1542,6 +1544,8 @@ int bgmac_enet_probe(struct bgmac *bgmac)
|
||||||
/* Omit FCS from max MTU size */
|
/* Omit FCS from max MTU size */
|
||||||
net_dev->max_mtu = BGMAC_RX_MAX_FRAME_SIZE - ETH_FCS_LEN;
|
net_dev->max_mtu = BGMAC_RX_MAX_FRAME_SIZE - ETH_FCS_LEN;
|
||||||
|
|
||||||
|
bgmac->in_init = false;
|
||||||
|
|
||||||
err = register_netdev(bgmac->net_dev);
|
err = register_netdev(bgmac->net_dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(bgmac->dev, "Cannot register net device\n");
|
dev_err(bgmac->dev, "Cannot register net device\n");
|
||||||
|
|
|
@ -472,6 +472,8 @@ struct bgmac {
|
||||||
int irq;
|
int irq;
|
||||||
u32 int_mask;
|
u32 int_mask;
|
||||||
|
|
||||||
|
bool in_init;
|
||||||
|
|
||||||
/* Current MAC state */
|
/* Current MAC state */
|
||||||
int mac_speed;
|
int mac_speed;
|
||||||
int mac_duplex;
|
int mac_duplex;
|
||||||
|
|
|
@ -3145,7 +3145,7 @@ static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)
|
||||||
|
|
||||||
static void bnxt_free_tpa_info(struct bnxt *bp)
|
static void bnxt_free_tpa_info(struct bnxt *bp)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < bp->rx_nr_rings; i++) {
|
for (i = 0; i < bp->rx_nr_rings; i++) {
|
||||||
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
|
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
|
||||||
|
@ -3153,8 +3153,10 @@ static void bnxt_free_tpa_info(struct bnxt *bp)
|
||||||
kfree(rxr->rx_tpa_idx_map);
|
kfree(rxr->rx_tpa_idx_map);
|
||||||
rxr->rx_tpa_idx_map = NULL;
|
rxr->rx_tpa_idx_map = NULL;
|
||||||
if (rxr->rx_tpa) {
|
if (rxr->rx_tpa) {
|
||||||
kfree(rxr->rx_tpa[0].agg_arr);
|
for (j = 0; j < bp->max_tpa; j++) {
|
||||||
rxr->rx_tpa[0].agg_arr = NULL;
|
kfree(rxr->rx_tpa[j].agg_arr);
|
||||||
|
rxr->rx_tpa[j].agg_arr = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
kfree(rxr->rx_tpa);
|
kfree(rxr->rx_tpa);
|
||||||
rxr->rx_tpa = NULL;
|
rxr->rx_tpa = NULL;
|
||||||
|
@ -3163,14 +3165,13 @@ static void bnxt_free_tpa_info(struct bnxt *bp)
|
||||||
|
|
||||||
static int bnxt_alloc_tpa_info(struct bnxt *bp)
|
static int bnxt_alloc_tpa_info(struct bnxt *bp)
|
||||||
{
|
{
|
||||||
int i, j, total_aggs = 0;
|
int i, j;
|
||||||
|
|
||||||
bp->max_tpa = MAX_TPA;
|
bp->max_tpa = MAX_TPA;
|
||||||
if (bp->flags & BNXT_FLAG_CHIP_P5) {
|
if (bp->flags & BNXT_FLAG_CHIP_P5) {
|
||||||
if (!bp->max_tpa_v2)
|
if (!bp->max_tpa_v2)
|
||||||
return 0;
|
return 0;
|
||||||
bp->max_tpa = max_t(u16, bp->max_tpa_v2, MAX_TPA_P5);
|
bp->max_tpa = max_t(u16, bp->max_tpa_v2, MAX_TPA_P5);
|
||||||
total_aggs = bp->max_tpa * MAX_SKB_FRAGS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < bp->rx_nr_rings; i++) {
|
for (i = 0; i < bp->rx_nr_rings; i++) {
|
||||||
|
@ -3184,12 +3185,12 @@ static int bnxt_alloc_tpa_info(struct bnxt *bp)
|
||||||
|
|
||||||
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
|
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
|
||||||
continue;
|
continue;
|
||||||
agg = kcalloc(total_aggs, sizeof(*agg), GFP_KERNEL);
|
for (j = 0; j < bp->max_tpa; j++) {
|
||||||
rxr->rx_tpa[0].agg_arr = agg;
|
agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL);
|
||||||
if (!agg)
|
if (!agg)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
for (j = 1; j < bp->max_tpa; j++)
|
rxr->rx_tpa[j].agg_arr = agg;
|
||||||
rxr->rx_tpa[j].agg_arr = agg + j * MAX_SKB_FRAGS;
|
}
|
||||||
rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map),
|
rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!rxr->rx_tpa_idx_map)
|
if (!rxr->rx_tpa_idx_map)
|
||||||
|
@ -13204,8 +13205,6 @@ static void bnxt_remove_one(struct pci_dev *pdev)
|
||||||
bnxt_free_hwrm_resources(bp);
|
bnxt_free_hwrm_resources(bp);
|
||||||
bnxt_ethtool_free(bp);
|
bnxt_ethtool_free(bp);
|
||||||
bnxt_dcb_free(bp);
|
bnxt_dcb_free(bp);
|
||||||
kfree(bp->edev);
|
|
||||||
bp->edev = NULL;
|
|
||||||
kfree(bp->ptp_cfg);
|
kfree(bp->ptp_cfg);
|
||||||
bp->ptp_cfg = NULL;
|
bp->ptp_cfg = NULL;
|
||||||
kfree(bp->fw_health);
|
kfree(bp->fw_health);
|
||||||
|
|
|
@ -317,9 +317,11 @@ static void bnxt_aux_dev_release(struct device *dev)
|
||||||
{
|
{
|
||||||
struct bnxt_aux_priv *aux_priv =
|
struct bnxt_aux_priv *aux_priv =
|
||||||
container_of(dev, struct bnxt_aux_priv, aux_dev.dev);
|
container_of(dev, struct bnxt_aux_priv, aux_dev.dev);
|
||||||
|
struct bnxt *bp = netdev_priv(aux_priv->edev->net);
|
||||||
|
|
||||||
ida_free(&bnxt_aux_dev_ids, aux_priv->id);
|
ida_free(&bnxt_aux_dev_ids, aux_priv->id);
|
||||||
kfree(aux_priv->edev->ulp_tbl);
|
kfree(aux_priv->edev->ulp_tbl);
|
||||||
|
bp->edev = NULL;
|
||||||
kfree(aux_priv->edev);
|
kfree(aux_priv->edev);
|
||||||
kfree(aux_priv);
|
kfree(aux_priv);
|
||||||
}
|
}
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1411,7 +1411,7 @@ ice_add_dscp_pfc_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg)
|
||||||
tlv->ouisubtype = htonl(ouisubtype);
|
tlv->ouisubtype = htonl(ouisubtype);
|
||||||
|
|
||||||
buf[0] = dcbcfg->pfc.pfccap & 0xF;
|
buf[0] = dcbcfg->pfc.pfccap & 0xF;
|
||||||
buf[1] = dcbcfg->pfc.pfcena & 0xF;
|
buf[1] = dcbcfg->pfc.pfcena;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -4331,6 +4331,8 @@ ice_get_module_eeprom(struct net_device *netdev,
|
||||||
* SFP modules only ever use page 0.
|
* SFP modules only ever use page 0.
|
||||||
*/
|
*/
|
||||||
if (page == 0 || !(data[0x2] & 0x4)) {
|
if (page == 0 || !(data[0x2] & 0x4)) {
|
||||||
|
u32 copy_len;
|
||||||
|
|
||||||
/* If i2c bus is busy due to slow page change or
|
/* If i2c bus is busy due to slow page change or
|
||||||
* link management access, call can fail. This is normal.
|
* link management access, call can fail. This is normal.
|
||||||
* So we retry this a few times.
|
* So we retry this a few times.
|
||||||
|
@ -4354,8 +4356,8 @@ ice_get_module_eeprom(struct net_device *netdev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure we have enough room for the new block */
|
/* Make sure we have enough room for the new block */
|
||||||
if ((i + SFF_READ_BLOCK_SIZE) < ee->len)
|
copy_len = min_t(u32, SFF_READ_BLOCK_SIZE, ee->len - i);
|
||||||
memcpy(data + i, value, SFF_READ_BLOCK_SIZE);
|
memcpy(data + i, value, copy_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2126,7 +2126,7 @@ int ice_vsi_cfg_xdp_txqs(struct ice_vsi *vsi)
|
||||||
ice_for_each_rxq(vsi, i)
|
ice_for_each_rxq(vsi, i)
|
||||||
ice_tx_xsk_pool(vsi, i);
|
ice_tx_xsk_pool(vsi, i);
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2693,12 +2693,14 @@ ice_vsi_cfg_def(struct ice_vsi *vsi, struct ice_vsi_cfg_params *params)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* allocate memory for Tx/Rx ring stat pointers */
|
/* allocate memory for Tx/Rx ring stat pointers */
|
||||||
if (ice_vsi_alloc_stat_arrays(vsi))
|
ret = ice_vsi_alloc_stat_arrays(vsi);
|
||||||
|
if (ret)
|
||||||
goto unroll_vsi_alloc;
|
goto unroll_vsi_alloc;
|
||||||
|
|
||||||
ice_alloc_fd_res(vsi);
|
ice_alloc_fd_res(vsi);
|
||||||
|
|
||||||
if (ice_vsi_get_qs(vsi)) {
|
ret = ice_vsi_get_qs(vsi);
|
||||||
|
if (ret) {
|
||||||
dev_err(dev, "Failed to allocate queues. vsi->idx = %d\n",
|
dev_err(dev, "Failed to allocate queues. vsi->idx = %d\n",
|
||||||
vsi->idx);
|
vsi->idx);
|
||||||
goto unroll_vsi_alloc_stat;
|
goto unroll_vsi_alloc_stat;
|
||||||
|
@ -2811,6 +2813,7 @@ ice_vsi_cfg_def(struct ice_vsi *vsi, struct ice_vsi_cfg_params *params)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* clean up the resources and exit */
|
/* clean up the resources and exit */
|
||||||
|
ret = -EINVAL;
|
||||||
goto unroll_vsi_init;
|
goto unroll_vsi_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3508,10 +3511,10 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)
|
||||||
if (vsi_flags & ICE_VSI_FLAG_INIT) {
|
if (vsi_flags & ICE_VSI_FLAG_INIT) {
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto err_vsi_cfg_tc_lan;
|
goto err_vsi_cfg_tc_lan;
|
||||||
} else {
|
|
||||||
kfree(coalesce);
|
|
||||||
return ice_schedule_reset(pf, ICE_RESET_PFR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kfree(coalesce);
|
||||||
|
return ice_schedule_reset(pf, ICE_RESET_PFR);
|
||||||
}
|
}
|
||||||
|
|
||||||
ice_vsi_realloc_stat_arrays(vsi, prev_txq, prev_rxq);
|
ice_vsi_realloc_stat_arrays(vsi, prev_txq, prev_rxq);
|
||||||
|
@ -3759,7 +3762,7 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)
|
||||||
dev = ice_pf_to_dev(pf);
|
dev = ice_pf_to_dev(pf);
|
||||||
if (vsi->tc_cfg.ena_tc == ena_tc &&
|
if (vsi->tc_cfg.ena_tc == ena_tc &&
|
||||||
vsi->mqprio_qopt.mode != TC_MQPRIO_MODE_CHANNEL)
|
vsi->mqprio_qopt.mode != TC_MQPRIO_MODE_CHANNEL)
|
||||||
return ret;
|
return 0;
|
||||||
|
|
||||||
ice_for_each_traffic_class(i) {
|
ice_for_each_traffic_class(i) {
|
||||||
/* build bitmap of enabled TCs */
|
/* build bitmap of enabled TCs */
|
||||||
|
|
|
@ -1455,8 +1455,8 @@ ice_parse_cls_flower(struct net_device *filter_dev, struct ice_vsi *vsi,
|
||||||
if (match.mask->vlan_priority) {
|
if (match.mask->vlan_priority) {
|
||||||
fltr->flags |= ICE_TC_FLWR_FIELD_VLAN_PRIO;
|
fltr->flags |= ICE_TC_FLWR_FIELD_VLAN_PRIO;
|
||||||
headers->vlan_hdr.vlan_prio =
|
headers->vlan_hdr.vlan_prio =
|
||||||
cpu_to_be16((match.key->vlan_priority <<
|
be16_encode_bits(match.key->vlan_priority,
|
||||||
VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK);
|
VLAN_PRIO_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match.mask->vlan_tpid)
|
if (match.mask->vlan_tpid)
|
||||||
|
@ -1489,8 +1489,8 @@ ice_parse_cls_flower(struct net_device *filter_dev, struct ice_vsi *vsi,
|
||||||
if (match.mask->vlan_priority) {
|
if (match.mask->vlan_priority) {
|
||||||
fltr->flags |= ICE_TC_FLWR_FIELD_CVLAN_PRIO;
|
fltr->flags |= ICE_TC_FLWR_FIELD_CVLAN_PRIO;
|
||||||
headers->cvlan_hdr.vlan_prio =
|
headers->cvlan_hdr.vlan_prio =
|
||||||
cpu_to_be16((match.key->vlan_priority <<
|
be16_encode_bits(match.key->vlan_priority,
|
||||||
VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK);
|
VLAN_PRIO_MASK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -884,6 +884,9 @@ int rvu_cpt_lf_teardown(struct rvu *rvu, u16 pcifunc, int blkaddr, int lf,
|
||||||
int rvu_cpt_ctx_flush(struct rvu *rvu, u16 pcifunc);
|
int rvu_cpt_ctx_flush(struct rvu *rvu, u16 pcifunc);
|
||||||
int rvu_cpt_init(struct rvu *rvu);
|
int rvu_cpt_init(struct rvu *rvu);
|
||||||
|
|
||||||
|
#define NDC_AF_BANK_MASK GENMASK_ULL(7, 0)
|
||||||
|
#define NDC_AF_BANK_LINE_MASK GENMASK_ULL(31, 16)
|
||||||
|
|
||||||
/* CN10K RVU */
|
/* CN10K RVU */
|
||||||
int rvu_set_channels_base(struct rvu *rvu);
|
int rvu_set_channels_base(struct rvu *rvu);
|
||||||
void rvu_program_channels(struct rvu *rvu);
|
void rvu_program_channels(struct rvu *rvu);
|
||||||
|
@ -902,6 +905,8 @@ static inline void rvu_dbg_init(struct rvu *rvu) {}
|
||||||
static inline void rvu_dbg_exit(struct rvu *rvu) {}
|
static inline void rvu_dbg_exit(struct rvu *rvu) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int rvu_ndc_fix_locked_cacheline(struct rvu *rvu, int blkaddr);
|
||||||
|
|
||||||
/* RVU Switch */
|
/* RVU Switch */
|
||||||
void rvu_switch_enable(struct rvu *rvu);
|
void rvu_switch_enable(struct rvu *rvu);
|
||||||
void rvu_switch_disable(struct rvu *rvu);
|
void rvu_switch_disable(struct rvu *rvu);
|
||||||
|
|
|
@ -198,9 +198,6 @@ enum cpt_eng_type {
|
||||||
CPT_IE_TYPE = 3,
|
CPT_IE_TYPE = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NDC_MAX_BANK(rvu, blk_addr) (rvu_read64(rvu, \
|
|
||||||
blk_addr, NDC_AF_CONST) & 0xFF)
|
|
||||||
|
|
||||||
#define rvu_dbg_NULL NULL
|
#define rvu_dbg_NULL NULL
|
||||||
#define rvu_dbg_open_NULL NULL
|
#define rvu_dbg_open_NULL NULL
|
||||||
|
|
||||||
|
@ -1448,6 +1445,7 @@ static int ndc_blk_hits_miss_stats(struct seq_file *s, int idx, int blk_addr)
|
||||||
struct nix_hw *nix_hw;
|
struct nix_hw *nix_hw;
|
||||||
struct rvu *rvu;
|
struct rvu *rvu;
|
||||||
int bank, max_bank;
|
int bank, max_bank;
|
||||||
|
u64 ndc_af_const;
|
||||||
|
|
||||||
if (blk_addr == BLKADDR_NDC_NPA0) {
|
if (blk_addr == BLKADDR_NDC_NPA0) {
|
||||||
rvu = s->private;
|
rvu = s->private;
|
||||||
|
@ -1456,7 +1454,8 @@ static int ndc_blk_hits_miss_stats(struct seq_file *s, int idx, int blk_addr)
|
||||||
rvu = nix_hw->rvu;
|
rvu = nix_hw->rvu;
|
||||||
}
|
}
|
||||||
|
|
||||||
max_bank = NDC_MAX_BANK(rvu, blk_addr);
|
ndc_af_const = rvu_read64(rvu, blk_addr, NDC_AF_CONST);
|
||||||
|
max_bank = FIELD_GET(NDC_AF_BANK_MASK, ndc_af_const);
|
||||||
for (bank = 0; bank < max_bank; bank++) {
|
for (bank = 0; bank < max_bank; bank++) {
|
||||||
seq_printf(s, "BANK:%d\n", bank);
|
seq_printf(s, "BANK:%d\n", bank);
|
||||||
seq_printf(s, "\tHits:\t%lld\n",
|
seq_printf(s, "\tHits:\t%lld\n",
|
||||||
|
|
|
@ -790,6 +790,7 @@ static int nix_aq_enqueue_wait(struct rvu *rvu, struct rvu_block *block,
|
||||||
struct nix_aq_res_s *result;
|
struct nix_aq_res_s *result;
|
||||||
int timeout = 1000;
|
int timeout = 1000;
|
||||||
u64 reg, head;
|
u64 reg, head;
|
||||||
|
int ret;
|
||||||
|
|
||||||
result = (struct nix_aq_res_s *)aq->res->base;
|
result = (struct nix_aq_res_s *)aq->res->base;
|
||||||
|
|
||||||
|
@ -813,9 +814,22 @@ static int nix_aq_enqueue_wait(struct rvu *rvu, struct rvu_block *block,
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result->compcode != NIX_AQ_COMP_GOOD)
|
if (result->compcode != NIX_AQ_COMP_GOOD) {
|
||||||
/* TODO: Replace this with some error code */
|
/* TODO: Replace this with some error code */
|
||||||
|
if (result->compcode == NIX_AQ_COMP_CTX_FAULT ||
|
||||||
|
result->compcode == NIX_AQ_COMP_LOCKERR ||
|
||||||
|
result->compcode == NIX_AQ_COMP_CTX_POISON) {
|
||||||
|
ret = rvu_ndc_fix_locked_cacheline(rvu, BLKADDR_NDC_NIX0_RX);
|
||||||
|
ret |= rvu_ndc_fix_locked_cacheline(rvu, BLKADDR_NDC_NIX0_TX);
|
||||||
|
ret |= rvu_ndc_fix_locked_cacheline(rvu, BLKADDR_NDC_NIX1_RX);
|
||||||
|
ret |= rvu_ndc_fix_locked_cacheline(rvu, BLKADDR_NDC_NIX1_TX);
|
||||||
|
if (ret)
|
||||||
|
dev_err(rvu->dev,
|
||||||
|
"%s: Not able to unlock cachelines\n", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Copyright (C) 2018 Marvell.
|
* Copyright (C) 2018 Marvell.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#include <linux/bitfield.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
|
||||||
|
@ -42,9 +42,18 @@ static int npa_aq_enqueue_wait(struct rvu *rvu, struct rvu_block *block,
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result->compcode != NPA_AQ_COMP_GOOD)
|
if (result->compcode != NPA_AQ_COMP_GOOD) {
|
||||||
/* TODO: Replace this with some error code */
|
/* TODO: Replace this with some error code */
|
||||||
|
if (result->compcode == NPA_AQ_COMP_CTX_FAULT ||
|
||||||
|
result->compcode == NPA_AQ_COMP_LOCKERR ||
|
||||||
|
result->compcode == NPA_AQ_COMP_CTX_POISON) {
|
||||||
|
if (rvu_ndc_fix_locked_cacheline(rvu, BLKADDR_NDC_NPA0))
|
||||||
|
dev_err(rvu->dev,
|
||||||
|
"%s: Not able to unlock cachelines\n", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -545,3 +554,48 @@ void rvu_npa_lf_teardown(struct rvu *rvu, u16 pcifunc, int npalf)
|
||||||
|
|
||||||
npa_ctx_free(rvu, pfvf);
|
npa_ctx_free(rvu, pfvf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Due to an Hardware errata, in some corner cases, AQ context lock
|
||||||
|
* operations can result in a NDC way getting into an illegal state
|
||||||
|
* of not valid but locked.
|
||||||
|
*
|
||||||
|
* This API solves the problem by clearing the lock bit of the NDC block.
|
||||||
|
* The operation needs to be done for each line of all the NDC banks.
|
||||||
|
*/
|
||||||
|
int rvu_ndc_fix_locked_cacheline(struct rvu *rvu, int blkaddr)
|
||||||
|
{
|
||||||
|
int bank, max_bank, line, max_line, err;
|
||||||
|
u64 reg, ndc_af_const;
|
||||||
|
|
||||||
|
/* Set the ENABLE bit(63) to '0' */
|
||||||
|
reg = rvu_read64(rvu, blkaddr, NDC_AF_CAMS_RD_INTERVAL);
|
||||||
|
rvu_write64(rvu, blkaddr, NDC_AF_CAMS_RD_INTERVAL, reg & GENMASK_ULL(62, 0));
|
||||||
|
|
||||||
|
/* Poll until the BUSY bits(47:32) are set to '0' */
|
||||||
|
err = rvu_poll_reg(rvu, blkaddr, NDC_AF_CAMS_RD_INTERVAL, GENMASK_ULL(47, 32), true);
|
||||||
|
if (err) {
|
||||||
|
dev_err(rvu->dev, "Timed out while polling for NDC CAM busy bits.\n");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ndc_af_const = rvu_read64(rvu, blkaddr, NDC_AF_CONST);
|
||||||
|
max_bank = FIELD_GET(NDC_AF_BANK_MASK, ndc_af_const);
|
||||||
|
max_line = FIELD_GET(NDC_AF_BANK_LINE_MASK, ndc_af_const);
|
||||||
|
for (bank = 0; bank < max_bank; bank++) {
|
||||||
|
for (line = 0; line < max_line; line++) {
|
||||||
|
/* Check if 'cache line valid bit(63)' is not set
|
||||||
|
* but 'cache line lock bit(60)' is set and on
|
||||||
|
* success, reset the lock bit(60).
|
||||||
|
*/
|
||||||
|
reg = rvu_read64(rvu, blkaddr,
|
||||||
|
NDC_AF_BANKX_LINEX_METADATA(bank, line));
|
||||||
|
if (!(reg & BIT_ULL(63)) && (reg & BIT_ULL(60))) {
|
||||||
|
rvu_write64(rvu, blkaddr,
|
||||||
|
NDC_AF_BANKX_LINEX_METADATA(bank, line),
|
||||||
|
reg & ~BIT_ULL(60));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -694,6 +694,7 @@
|
||||||
#define NDC_AF_INTR_ENA_W1S (0x00068)
|
#define NDC_AF_INTR_ENA_W1S (0x00068)
|
||||||
#define NDC_AF_INTR_ENA_W1C (0x00070)
|
#define NDC_AF_INTR_ENA_W1C (0x00070)
|
||||||
#define NDC_AF_ACTIVE_PC (0x00078)
|
#define NDC_AF_ACTIVE_PC (0x00078)
|
||||||
|
#define NDC_AF_CAMS_RD_INTERVAL (0x00080)
|
||||||
#define NDC_AF_BP_TEST_ENABLE (0x001F8)
|
#define NDC_AF_BP_TEST_ENABLE (0x001F8)
|
||||||
#define NDC_AF_BP_TEST(a) (0x00200 | (a) << 3)
|
#define NDC_AF_BP_TEST(a) (0x00200 | (a) << 3)
|
||||||
#define NDC_AF_BLK_RST (0x002F0)
|
#define NDC_AF_BLK_RST (0x002F0)
|
||||||
|
@ -709,6 +710,8 @@
|
||||||
(0x00F00 | (a) << 5 | (b) << 4)
|
(0x00F00 | (a) << 5 | (b) << 4)
|
||||||
#define NDC_AF_BANKX_HIT_PC(a) (0x01000 | (a) << 3)
|
#define NDC_AF_BANKX_HIT_PC(a) (0x01000 | (a) << 3)
|
||||||
#define NDC_AF_BANKX_MISS_PC(a) (0x01100 | (a) << 3)
|
#define NDC_AF_BANKX_MISS_PC(a) (0x01100 | (a) << 3)
|
||||||
|
#define NDC_AF_BANKX_LINEX_METADATA(a, b) \
|
||||||
|
(0x10000 | (a) << 12 | (b) << 3)
|
||||||
|
|
||||||
/* LBK */
|
/* LBK */
|
||||||
#define LBK_CONST (0x10ull)
|
#define LBK_CONST (0x10ull)
|
||||||
|
|
|
@ -616,7 +616,8 @@ static int mtk_mac_finish(struct phylink_config *config, unsigned int mode,
|
||||||
mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
|
mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
|
||||||
mcr_new = mcr_cur;
|
mcr_new = mcr_cur;
|
||||||
mcr_new |= MAC_MCR_IPG_CFG | MAC_MCR_FORCE_MODE |
|
mcr_new |= MAC_MCR_IPG_CFG | MAC_MCR_FORCE_MODE |
|
||||||
MAC_MCR_BACKOFF_EN | MAC_MCR_BACKPR_EN | MAC_MCR_FORCE_LINK;
|
MAC_MCR_BACKOFF_EN | MAC_MCR_BACKPR_EN | MAC_MCR_FORCE_LINK |
|
||||||
|
MAC_MCR_RX_FIFO_CLR_DIS;
|
||||||
|
|
||||||
/* Only update control register when needed! */
|
/* Only update control register when needed! */
|
||||||
if (mcr_new != mcr_cur)
|
if (mcr_new != mcr_cur)
|
||||||
|
|
|
@ -397,6 +397,7 @@
|
||||||
#define MAC_MCR_FORCE_MODE BIT(15)
|
#define MAC_MCR_FORCE_MODE BIT(15)
|
||||||
#define MAC_MCR_TX_EN BIT(14)
|
#define MAC_MCR_TX_EN BIT(14)
|
||||||
#define MAC_MCR_RX_EN BIT(13)
|
#define MAC_MCR_RX_EN BIT(13)
|
||||||
|
#define MAC_MCR_RX_FIFO_CLR_DIS BIT(12)
|
||||||
#define MAC_MCR_BACKOFF_EN BIT(9)
|
#define MAC_MCR_BACKOFF_EN BIT(9)
|
||||||
#define MAC_MCR_BACKPR_EN BIT(8)
|
#define MAC_MCR_BACKPR_EN BIT(8)
|
||||||
#define MAC_MCR_FORCE_RX_FC BIT(5)
|
#define MAC_MCR_FORCE_RX_FC BIT(5)
|
||||||
|
|
|
@ -194,7 +194,7 @@ int lan966x_police_port_del(struct lan966x_port *port,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = lan966x_police_del(port, port->tc.police_id);
|
err = lan966x_police_del(port, POL_IDX_PORT + port->chip_port);
|
||||||
if (err) {
|
if (err) {
|
||||||
NL_SET_ERR_MSG_MOD(extack,
|
NL_SET_ERR_MSG_MOD(extack,
|
||||||
"Failed to add policer to port");
|
"Failed to add policer to port");
|
||||||
|
|
|
@ -249,6 +249,21 @@ static int sparx5_dcb_ieee_dscp_setdel(struct net_device *dev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sparx5_dcb_ieee_delapp(struct net_device *dev, struct dcb_app *app)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
|
||||||
|
err = sparx5_dcb_ieee_dscp_setdel(dev, app, dcb_ieee_delapp);
|
||||||
|
else
|
||||||
|
err = dcb_ieee_delapp(dev, app);
|
||||||
|
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
return sparx5_dcb_app_update(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static int sparx5_dcb_ieee_setapp(struct net_device *dev, struct dcb_app *app)
|
static int sparx5_dcb_ieee_setapp(struct net_device *dev, struct dcb_app *app)
|
||||||
{
|
{
|
||||||
struct dcb_app app_itr;
|
struct dcb_app app_itr;
|
||||||
|
@ -264,7 +279,7 @@ static int sparx5_dcb_ieee_setapp(struct net_device *dev, struct dcb_app *app)
|
||||||
if (prio) {
|
if (prio) {
|
||||||
app_itr = *app;
|
app_itr = *app;
|
||||||
app_itr.priority = prio;
|
app_itr.priority = prio;
|
||||||
dcb_ieee_delapp(dev, &app_itr);
|
sparx5_dcb_ieee_delapp(dev, &app_itr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
|
if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
|
||||||
|
@ -281,21 +296,6 @@ out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sparx5_dcb_ieee_delapp(struct net_device *dev, struct dcb_app *app)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
|
|
||||||
err = sparx5_dcb_ieee_dscp_setdel(dev, app, dcb_ieee_delapp);
|
|
||||||
else
|
|
||||||
err = dcb_ieee_delapp(dev, app);
|
|
||||||
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
return sparx5_dcb_app_update(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sparx5_dcb_setapptrust(struct net_device *dev, u8 *selectors,
|
static int sparx5_dcb_setapptrust(struct net_device *dev, u8 *selectors,
|
||||||
int nselectors)
|
int nselectors)
|
||||||
{
|
{
|
||||||
|
|
|
@ -324,14 +324,15 @@ netdev_tx_t nfp_nfd3_tx(struct sk_buff *skb, struct net_device *netdev)
|
||||||
|
|
||||||
/* Do not reorder - tso may adjust pkt cnt, vlan may override fields */
|
/* Do not reorder - tso may adjust pkt cnt, vlan may override fields */
|
||||||
nfp_nfd3_tx_tso(r_vec, txbuf, txd, skb, md_bytes);
|
nfp_nfd3_tx_tso(r_vec, txbuf, txd, skb, md_bytes);
|
||||||
nfp_nfd3_tx_csum(dp, r_vec, txbuf, txd, skb);
|
if (ipsec)
|
||||||
|
nfp_nfd3_ipsec_tx(txd, skb);
|
||||||
|
else
|
||||||
|
nfp_nfd3_tx_csum(dp, r_vec, txbuf, txd, skb);
|
||||||
if (skb_vlan_tag_present(skb) && dp->ctrl & NFP_NET_CFG_CTRL_TXVLAN) {
|
if (skb_vlan_tag_present(skb) && dp->ctrl & NFP_NET_CFG_CTRL_TXVLAN) {
|
||||||
txd->flags |= NFD3_DESC_TX_VLAN;
|
txd->flags |= NFD3_DESC_TX_VLAN;
|
||||||
txd->vlan = cpu_to_le16(skb_vlan_tag_get(skb));
|
txd->vlan = cpu_to_le16(skb_vlan_tag_get(skb));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ipsec)
|
|
||||||
nfp_nfd3_ipsec_tx(txd, skb);
|
|
||||||
/* Gather DMA */
|
/* Gather DMA */
|
||||||
if (nr_frags > 0) {
|
if (nr_frags > 0) {
|
||||||
__le64 second_half;
|
__le64 second_half;
|
||||||
|
|
|
@ -10,9 +10,30 @@
|
||||||
void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb)
|
void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct xfrm_state *x = xfrm_input_state(skb);
|
struct xfrm_state *x = xfrm_input_state(skb);
|
||||||
|
struct xfrm_offload *xo = xfrm_offload(skb);
|
||||||
|
struct iphdr *iph = ip_hdr(skb);
|
||||||
|
int l4_proto;
|
||||||
|
|
||||||
if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) {
|
if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) {
|
||||||
txd->flags |= NFD3_DESC_TX_CSUM | NFD3_DESC_TX_IP4_CSUM |
|
txd->flags |= NFD3_DESC_TX_CSUM;
|
||||||
NFD3_DESC_TX_TCP_CSUM | NFD3_DESC_TX_UDP_CSUM;
|
|
||||||
|
if (iph->version == 4)
|
||||||
|
txd->flags |= NFD3_DESC_TX_IP4_CSUM;
|
||||||
|
|
||||||
|
if (x->props.mode == XFRM_MODE_TRANSPORT)
|
||||||
|
l4_proto = xo->proto;
|
||||||
|
else if (x->props.mode == XFRM_MODE_TUNNEL)
|
||||||
|
l4_proto = xo->inner_ipproto;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (l4_proto) {
|
||||||
|
case IPPROTO_UDP:
|
||||||
|
txd->flags |= NFD3_DESC_TX_UDP_CSUM;
|
||||||
|
return;
|
||||||
|
case IPPROTO_TCP:
|
||||||
|
txd->flags |= NFD3_DESC_TX_TCP_CSUM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -387,7 +387,8 @@ netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev)
|
||||||
if (!skb_is_gso(skb)) {
|
if (!skb_is_gso(skb)) {
|
||||||
real_len = skb->len;
|
real_len = skb->len;
|
||||||
/* Metadata desc */
|
/* Metadata desc */
|
||||||
metadata = nfp_nfdk_tx_csum(dp, r_vec, 1, skb, metadata);
|
if (!ipsec)
|
||||||
|
metadata = nfp_nfdk_tx_csum(dp, r_vec, 1, skb, metadata);
|
||||||
txd->raw = cpu_to_le64(metadata);
|
txd->raw = cpu_to_le64(metadata);
|
||||||
txd++;
|
txd++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -395,7 +396,8 @@ netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev)
|
||||||
(txd + 1)->raw = nfp_nfdk_tx_tso(r_vec, txbuf, skb);
|
(txd + 1)->raw = nfp_nfdk_tx_tso(r_vec, txbuf, skb);
|
||||||
real_len = txbuf->real_len;
|
real_len = txbuf->real_len;
|
||||||
/* Metadata desc */
|
/* Metadata desc */
|
||||||
metadata = nfp_nfdk_tx_csum(dp, r_vec, txbuf->pkt_cnt, skb, metadata);
|
if (!ipsec)
|
||||||
|
metadata = nfp_nfdk_tx_csum(dp, r_vec, txbuf->pkt_cnt, skb, metadata);
|
||||||
txd->raw = cpu_to_le64(metadata);
|
txd->raw = cpu_to_le64(metadata);
|
||||||
txd += 2;
|
txd += 2;
|
||||||
txbuf++;
|
txbuf++;
|
||||||
|
|
|
@ -9,9 +9,13 @@
|
||||||
u64 nfp_nfdk_ipsec_tx(u64 flags, struct sk_buff *skb)
|
u64 nfp_nfdk_ipsec_tx(u64 flags, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct xfrm_state *x = xfrm_input_state(skb);
|
struct xfrm_state *x = xfrm_input_state(skb);
|
||||||
|
struct iphdr *iph = ip_hdr(skb);
|
||||||
|
|
||||||
if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM))
|
if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) {
|
||||||
flags |= NFDK_DESC_TX_L3_CSUM | NFDK_DESC_TX_L4_CSUM;
|
if (iph->version == 4)
|
||||||
|
flags |= NFDK_DESC_TX_L3_CSUM;
|
||||||
|
flags |= NFDK_DESC_TX_L4_CSUM;
|
||||||
|
}
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <net/tls.h>
|
#include <net/tls.h>
|
||||||
#include <net/vxlan.h>
|
#include <net/vxlan.h>
|
||||||
#include <net/xdp_sock_drv.h>
|
#include <net/xdp_sock_drv.h>
|
||||||
|
#include <net/xfrm.h>
|
||||||
|
|
||||||
#include "nfpcore/nfp_dev.h"
|
#include "nfpcore/nfp_dev.h"
|
||||||
#include "nfpcore/nfp_nsp.h"
|
#include "nfpcore/nfp_nsp.h"
|
||||||
|
@ -1897,6 +1898,9 @@ nfp_net_features_check(struct sk_buff *skb, struct net_device *dev,
|
||||||
features &= ~NETIF_F_GSO_MASK;
|
features &= ~NETIF_F_GSO_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (xfrm_offload(skb))
|
||||||
|
return features;
|
||||||
|
|
||||||
/* VXLAN/GRE check */
|
/* VXLAN/GRE check */
|
||||||
switch (vlan_get_protocol(skb)) {
|
switch (vlan_get_protocol(skb)) {
|
||||||
case htons(ETH_P_IP):
|
case htons(ETH_P_IP):
|
||||||
|
|
|
@ -1170,6 +1170,7 @@ static int stmmac_init_phy(struct net_device *dev)
|
||||||
|
|
||||||
phylink_ethtool_get_wol(priv->phylink, &wol);
|
phylink_ethtool_get_wol(priv->phylink, &wol);
|
||||||
device_set_wakeup_capable(priv->device, !!wol.supported);
|
device_set_wakeup_capable(priv->device, !!wol.supported);
|
||||||
|
device_set_wakeup_enable(priv->device, !!wol.wolopts);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1913,6 +1913,8 @@ static int ca8210_skb_tx(
|
||||||
* packet
|
* packet
|
||||||
*/
|
*/
|
||||||
mac_len = ieee802154_hdr_peek_addrs(skb, &header);
|
mac_len = ieee802154_hdr_peek_addrs(skb, &header);
|
||||||
|
if (mac_len < 0)
|
||||||
|
return mac_len;
|
||||||
|
|
||||||
secspec.security_level = header.sec.level;
|
secspec.security_level = header.sec.level;
|
||||||
secspec.key_id_mode = header.sec.key_id_mode;
|
secspec.key_id_mode = header.sec.key_id_mode;
|
||||||
|
|
|
@ -342,6 +342,37 @@ static int lan88xx_config_aneg(struct phy_device *phydev)
|
||||||
return genphy_config_aneg(phydev);
|
return genphy_config_aneg(phydev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void lan88xx_link_change_notify(struct phy_device *phydev)
|
||||||
|
{
|
||||||
|
int temp;
|
||||||
|
|
||||||
|
/* At forced 100 F/H mode, chip may fail to set mode correctly
|
||||||
|
* when cable is switched between long(~50+m) and short one.
|
||||||
|
* As workaround, set to 10 before setting to 100
|
||||||
|
* at forced 100 F/H mode.
|
||||||
|
*/
|
||||||
|
if (!phydev->autoneg && phydev->speed == 100) {
|
||||||
|
/* disable phy interrupt */
|
||||||
|
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
||||||
|
temp &= ~LAN88XX_INT_MASK_MDINTPIN_EN_;
|
||||||
|
phy_write(phydev, LAN88XX_INT_MASK, temp);
|
||||||
|
|
||||||
|
temp = phy_read(phydev, MII_BMCR);
|
||||||
|
temp &= ~(BMCR_SPEED100 | BMCR_SPEED1000);
|
||||||
|
phy_write(phydev, MII_BMCR, temp); /* set to 10 first */
|
||||||
|
temp |= BMCR_SPEED100;
|
||||||
|
phy_write(phydev, MII_BMCR, temp); /* set to 100 later */
|
||||||
|
|
||||||
|
/* clear pending interrupt generated while workaround */
|
||||||
|
temp = phy_read(phydev, LAN88XX_INT_STS);
|
||||||
|
|
||||||
|
/* enable phy interrupt back */
|
||||||
|
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
||||||
|
temp |= LAN88XX_INT_MASK_MDINTPIN_EN_;
|
||||||
|
phy_write(phydev, LAN88XX_INT_MASK, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct phy_driver microchip_phy_driver[] = {
|
static struct phy_driver microchip_phy_driver[] = {
|
||||||
{
|
{
|
||||||
.phy_id = 0x0007c132,
|
.phy_id = 0x0007c132,
|
||||||
|
@ -359,6 +390,7 @@ static struct phy_driver microchip_phy_driver[] = {
|
||||||
|
|
||||||
.config_init = lan88xx_config_init,
|
.config_init = lan88xx_config_init,
|
||||||
.config_aneg = lan88xx_config_aneg,
|
.config_aneg = lan88xx_config_aneg,
|
||||||
|
.link_change_notify = lan88xx_link_change_notify,
|
||||||
|
|
||||||
.config_intr = lan88xx_phy_config_intr,
|
.config_intr = lan88xx_phy_config_intr,
|
||||||
.handle_interrupt = lan88xx_handle_interrupt,
|
.handle_interrupt = lan88xx_handle_interrupt,
|
||||||
|
|
|
@ -3098,8 +3098,6 @@ static int phy_probe(struct device *dev)
|
||||||
if (phydrv->flags & PHY_IS_INTERNAL)
|
if (phydrv->flags & PHY_IS_INTERNAL)
|
||||||
phydev->is_internal = true;
|
phydev->is_internal = true;
|
||||||
|
|
||||||
mutex_lock(&phydev->lock);
|
|
||||||
|
|
||||||
/* Deassert the reset signal */
|
/* Deassert the reset signal */
|
||||||
phy_device_reset(phydev, 0);
|
phy_device_reset(phydev, 0);
|
||||||
|
|
||||||
|
@ -3146,7 +3144,7 @@ static int phy_probe(struct device *dev)
|
||||||
*/
|
*/
|
||||||
err = genphy_c45_read_eee_adv(phydev, phydev->advertising_eee);
|
err = genphy_c45_read_eee_adv(phydev, phydev->advertising_eee);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
goto out;
|
||||||
|
|
||||||
/* There is no "enabled" flag. If PHY is advertising, assume it is
|
/* There is no "enabled" flag. If PHY is advertising, assume it is
|
||||||
* kind of enabled.
|
* kind of enabled.
|
||||||
|
@ -3188,12 +3186,10 @@ static int phy_probe(struct device *dev)
|
||||||
phydev->state = PHY_READY;
|
phydev->state = PHY_READY;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Assert the reset signal */
|
/* Re-assert the reset signal on error */
|
||||||
if (err)
|
if (err)
|
||||||
phy_device_reset(phydev, 1);
|
phy_device_reset(phydev, 1);
|
||||||
|
|
||||||
mutex_unlock(&phydev->lock);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3203,9 +3199,7 @@ static int phy_remove(struct device *dev)
|
||||||
|
|
||||||
cancel_delayed_work_sync(&phydev->state_queue);
|
cancel_delayed_work_sync(&phydev->state_queue);
|
||||||
|
|
||||||
mutex_lock(&phydev->lock);
|
|
||||||
phydev->state = PHY_DOWN;
|
phydev->state = PHY_DOWN;
|
||||||
mutex_unlock(&phydev->lock);
|
|
||||||
|
|
||||||
sfp_bus_del_upstream(phydev->sfp_bus);
|
sfp_bus_del_upstream(phydev->sfp_bus);
|
||||||
phydev->sfp_bus = NULL;
|
phydev->sfp_bus = NULL;
|
||||||
|
|
|
@ -44,7 +44,6 @@ static struct smsc_hw_stat smsc_hw_stats[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct smsc_phy_priv {
|
struct smsc_phy_priv {
|
||||||
u16 intmask;
|
|
||||||
bool energy_enable;
|
bool energy_enable;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -57,7 +56,6 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev)
|
||||||
|
|
||||||
static int smsc_phy_config_intr(struct phy_device *phydev)
|
static int smsc_phy_config_intr(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
struct smsc_phy_priv *priv = phydev->priv;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
|
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
|
||||||
|
@ -65,14 +63,9 @@ static int smsc_phy_config_intr(struct phy_device *phydev)
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
priv->intmask = MII_LAN83C185_ISF_INT4 | MII_LAN83C185_ISF_INT6;
|
rc = phy_write(phydev, MII_LAN83C185_IM,
|
||||||
if (priv->energy_enable)
|
MII_LAN83C185_ISF_INT_PHYLIB_EVENTS);
|
||||||
priv->intmask |= MII_LAN83C185_ISF_INT7;
|
|
||||||
|
|
||||||
rc = phy_write(phydev, MII_LAN83C185_IM, priv->intmask);
|
|
||||||
} else {
|
} else {
|
||||||
priv->intmask = 0;
|
|
||||||
|
|
||||||
rc = phy_write(phydev, MII_LAN83C185_IM, 0);
|
rc = phy_write(phydev, MII_LAN83C185_IM, 0);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -85,7 +78,6 @@ static int smsc_phy_config_intr(struct phy_device *phydev)
|
||||||
|
|
||||||
static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
|
static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
struct smsc_phy_priv *priv = phydev->priv;
|
|
||||||
int irq_status;
|
int irq_status;
|
||||||
|
|
||||||
irq_status = phy_read(phydev, MII_LAN83C185_ISF);
|
irq_status = phy_read(phydev, MII_LAN83C185_ISF);
|
||||||
|
@ -96,7 +88,7 @@ static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(irq_status & priv->intmask))
|
if (!(irq_status & MII_LAN83C185_ISF_INT_PHYLIB_EVENTS))
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
|
||||||
phy_trigger_machine(phydev);
|
phy_trigger_machine(phydev);
|
||||||
|
|
|
@ -665,6 +665,11 @@ static const struct usb_device_id mbim_devs[] = {
|
||||||
.driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
|
.driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/* Telit FE990 */
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1081, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||||
|
.driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
|
||||||
|
},
|
||||||
|
|
||||||
/* default entry */
|
/* default entry */
|
||||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||||
.driver_info = (unsigned long)&cdc_mbim_info_zlp,
|
.driver_info = (unsigned long)&cdc_mbim_info_zlp,
|
||||||
|
|
|
@ -2115,33 +2115,8 @@ static void lan78xx_remove_mdio(struct lan78xx_net *dev)
|
||||||
static void lan78xx_link_status_change(struct net_device *net)
|
static void lan78xx_link_status_change(struct net_device *net)
|
||||||
{
|
{
|
||||||
struct phy_device *phydev = net->phydev;
|
struct phy_device *phydev = net->phydev;
|
||||||
int temp;
|
|
||||||
|
|
||||||
/* At forced 100 F/H mode, chip may fail to set mode correctly
|
phy_print_status(phydev);
|
||||||
* when cable is switched between long(~50+m) and short one.
|
|
||||||
* As workaround, set to 10 before setting to 100
|
|
||||||
* at forced 100 F/H mode.
|
|
||||||
*/
|
|
||||||
if (!phydev->autoneg && (phydev->speed == 100)) {
|
|
||||||
/* disable phy interrupt */
|
|
||||||
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
|
||||||
temp &= ~LAN88XX_INT_MASK_MDINTPIN_EN_;
|
|
||||||
phy_write(phydev, LAN88XX_INT_MASK, temp);
|
|
||||||
|
|
||||||
temp = phy_read(phydev, MII_BMCR);
|
|
||||||
temp &= ~(BMCR_SPEED100 | BMCR_SPEED1000);
|
|
||||||
phy_write(phydev, MII_BMCR, temp); /* set to 10 first */
|
|
||||||
temp |= BMCR_SPEED100;
|
|
||||||
phy_write(phydev, MII_BMCR, temp); /* set to 100 later */
|
|
||||||
|
|
||||||
/* clear pending interrupt generated while workaround */
|
|
||||||
temp = phy_read(phydev, LAN88XX_INT_STS);
|
|
||||||
|
|
||||||
/* enable phy interrupt back */
|
|
||||||
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
|
||||||
temp |= LAN88XX_INT_MASK_MDINTPIN_EN_;
|
|
||||||
phy_write(phydev, LAN88XX_INT_MASK, temp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int irq_map(struct irq_domain *d, unsigned int irq,
|
static int irq_map(struct irq_domain *d, unsigned int irq,
|
||||||
|
|
|
@ -1364,6 +1364,7 @@ static const struct usb_device_id products[] = {
|
||||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1057, 2)}, /* Telit FN980 */
|
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1057, 2)}, /* Telit FN980 */
|
||||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */
|
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */
|
||||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */
|
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */
|
||||||
|
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1080, 2)}, /* Telit FE990 */
|
||||||
{QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */
|
{QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */
|
||||||
{QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */
|
{QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */
|
||||||
{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
|
{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
|
||||||
|
|
|
@ -247,6 +247,9 @@ static void fdp_nci_i2c_read_device_properties(struct device *dev,
|
||||||
len, sizeof(**fw_vsc_cfg),
|
len, sizeof(**fw_vsc_cfg),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!*fw_vsc_cfg)
|
||||||
|
goto alloc_err;
|
||||||
|
|
||||||
r = device_property_read_u8_array(dev, FDP_DP_FW_VSC_CFG_NAME,
|
r = device_property_read_u8_array(dev, FDP_DP_FW_VSC_CFG_NAME,
|
||||||
*fw_vsc_cfg, len);
|
*fw_vsc_cfg, len);
|
||||||
|
|
||||||
|
@ -260,6 +263,7 @@ vsc_read_err:
|
||||||
*fw_vsc_cfg = NULL;
|
*fw_vsc_cfg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alloc_err:
|
||||||
dev_dbg(dev, "Clock type: %d, clock frequency: %d, VSC: %s",
|
dev_dbg(dev, "Clock type: %d, clock frequency: %d, VSC: %s",
|
||||||
*clock_type, *clock_freq, *fw_vsc_cfg != NULL ? "yes" : "no");
|
*clock_type, *clock_freq, *fw_vsc_cfg != NULL ? "yes" : "no");
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,13 @@ static inline bool nf_tproxy_sk_is_transparent(struct sock *sk)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void nf_tproxy_twsk_deschedule_put(struct inet_timewait_sock *tw)
|
||||||
|
{
|
||||||
|
local_bh_disable();
|
||||||
|
inet_twsk_deschedule_put(tw);
|
||||||
|
local_bh_enable();
|
||||||
|
}
|
||||||
|
|
||||||
/* assign a socket to the skb -- consumes sk */
|
/* assign a socket to the skb -- consumes sk */
|
||||||
static inline void nf_tproxy_assign_sock(struct sk_buff *skb, struct sock *sk)
|
static inline void nf_tproxy_assign_sock(struct sk_buff *skb, struct sock *sk)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause */
|
||||||
/* Do not edit directly, auto-generated from: */
|
/* Do not edit directly, auto-generated from: */
|
||||||
/* Documentation/netlink/specs/fou.yaml */
|
/* Documentation/netlink/specs/fou.yaml */
|
||||||
/* YNL-GEN uapi header */
|
/* YNL-GEN uapi header */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause */
|
||||||
/* Do not edit directly, auto-generated from: */
|
/* Do not edit directly, auto-generated from: */
|
||||||
/* Documentation/netlink/specs/netdev.yaml */
|
/* Documentation/netlink/specs/netdev.yaml */
|
||||||
/* YNL-GEN uapi header */
|
/* YNL-GEN uapi header */
|
||||||
|
|
|
@ -4569,6 +4569,7 @@ static int btf_datasec_resolve(struct btf_verifier_env *env,
|
||||||
struct btf *btf = env->btf;
|
struct btf *btf = env->btf;
|
||||||
u16 i;
|
u16 i;
|
||||||
|
|
||||||
|
env->resolve_mode = RESOLVE_TBD;
|
||||||
for_each_vsi_from(i, v->next_member, v->t, vsi) {
|
for_each_vsi_from(i, v->next_member, v->t, vsi) {
|
||||||
u32 var_type_id = vsi->type, type_id, type_size = 0;
|
u32 var_type_id = vsi->type, type_id, type_size = 0;
|
||||||
const struct btf_type *var_type = btf_type_by_id(env->btf,
|
const struct btf_type *var_type = btf_type_by_id(env->btf,
|
||||||
|
|
|
@ -97,8 +97,11 @@ reset:
|
||||||
struct xdp_page_head {
|
struct xdp_page_head {
|
||||||
struct xdp_buff orig_ctx;
|
struct xdp_buff orig_ctx;
|
||||||
struct xdp_buff ctx;
|
struct xdp_buff ctx;
|
||||||
struct xdp_frame frm;
|
union {
|
||||||
u8 data[];
|
/* ::data_hard_start starts here */
|
||||||
|
DECLARE_FLEX_ARRAY(struct xdp_frame, frame);
|
||||||
|
DECLARE_FLEX_ARRAY(u8, data);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct xdp_test_data {
|
struct xdp_test_data {
|
||||||
|
@ -113,6 +116,10 @@ struct xdp_test_data {
|
||||||
u32 frame_cnt;
|
u32 frame_cnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* tools/testing/selftests/bpf/prog_tests/xdp_do_redirect.c:%MAX_PKT_SIZE
|
||||||
|
* must be updated accordingly this gets changed, otherwise BPF selftests
|
||||||
|
* will fail.
|
||||||
|
*/
|
||||||
#define TEST_XDP_FRAME_SIZE (PAGE_SIZE - sizeof(struct xdp_page_head))
|
#define TEST_XDP_FRAME_SIZE (PAGE_SIZE - sizeof(struct xdp_page_head))
|
||||||
#define TEST_XDP_MAX_BATCH 256
|
#define TEST_XDP_MAX_BATCH 256
|
||||||
|
|
||||||
|
@ -132,8 +139,8 @@ static void xdp_test_run_init_page(struct page *page, void *arg)
|
||||||
headroom -= meta_len;
|
headroom -= meta_len;
|
||||||
|
|
||||||
new_ctx = &head->ctx;
|
new_ctx = &head->ctx;
|
||||||
frm = &head->frm;
|
frm = head->frame;
|
||||||
data = &head->data;
|
data = head->data;
|
||||||
memcpy(data + headroom, orig_ctx->data_meta, frm_len);
|
memcpy(data + headroom, orig_ctx->data_meta, frm_len);
|
||||||
|
|
||||||
xdp_init_buff(new_ctx, TEST_XDP_FRAME_SIZE, &xdp->rxq);
|
xdp_init_buff(new_ctx, TEST_XDP_FRAME_SIZE, &xdp->rxq);
|
||||||
|
@ -223,7 +230,7 @@ static void reset_ctx(struct xdp_page_head *head)
|
||||||
head->ctx.data = head->orig_ctx.data;
|
head->ctx.data = head->orig_ctx.data;
|
||||||
head->ctx.data_meta = head->orig_ctx.data_meta;
|
head->ctx.data_meta = head->orig_ctx.data_meta;
|
||||||
head->ctx.data_end = head->orig_ctx.data_end;
|
head->ctx.data_end = head->orig_ctx.data_end;
|
||||||
xdp_update_frame_from_buff(&head->ctx, &head->frm);
|
xdp_update_frame_from_buff(&head->ctx, head->frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xdp_recv_frames(struct xdp_frame **frames, int nframes,
|
static int xdp_recv_frames(struct xdp_frame **frames, int nframes,
|
||||||
|
@ -285,7 +292,7 @@ static int xdp_test_run_batch(struct xdp_test_data *xdp, struct bpf_prog *prog,
|
||||||
head = phys_to_virt(page_to_phys(page));
|
head = phys_to_virt(page_to_phys(page));
|
||||||
reset_ctx(head);
|
reset_ctx(head);
|
||||||
ctx = &head->ctx;
|
ctx = &head->ctx;
|
||||||
frm = &head->frm;
|
frm = head->frame;
|
||||||
xdp->frame_cnt++;
|
xdp->frame_cnt++;
|
||||||
|
|
||||||
act = bpf_prog_run_xdp(prog, ctx);
|
act = bpf_prog_run_xdp(prog, ctx);
|
||||||
|
|
|
@ -134,6 +134,9 @@ static int cfusbl_device_notify(struct notifier_block *me, unsigned long what,
|
||||||
struct usb_device *usbdev;
|
struct usb_device *usbdev;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
if (what == NETDEV_UNREGISTER && dev->reg_state >= NETREG_UNREGISTERED)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Check whether we have a NCM device, and find its VID/PID. */
|
/* Check whether we have a NCM device, and find its VID/PID. */
|
||||||
if (!(dev->dev.parent && dev->dev.parent->driver &&
|
if (!(dev->dev.parent && dev->dev.parent->driver &&
|
||||||
strcmp(dev->dev.parent->driver->name, "cdc_ncm") == 0))
|
strcmp(dev->dev.parent->driver->name, "cdc_ncm") == 0))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
/* Do not edit directly, auto-generated from: */
|
/* Do not edit directly, auto-generated from: */
|
||||||
/* Documentation/netlink/specs/netdev.yaml */
|
/* Documentation/netlink/specs/netdev.yaml */
|
||||||
/* YNL-GEN kernel source */
|
/* YNL-GEN kernel source */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* SPDX-License-Identifier: BSD-3-Clause */
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||||
/* Do not edit directly, auto-generated from: */
|
/* Do not edit directly, auto-generated from: */
|
||||||
/* Documentation/netlink/specs/netdev.yaml */
|
/* Documentation/netlink/specs/netdev.yaml */
|
||||||
/* YNL-GEN kernel header */
|
/* YNL-GEN kernel header */
|
||||||
|
|
|
@ -517,18 +517,16 @@ static void *kmalloc_reserve(unsigned int *size, gfp_t flags, int node,
|
||||||
#ifdef HAVE_SKB_SMALL_HEAD_CACHE
|
#ifdef HAVE_SKB_SMALL_HEAD_CACHE
|
||||||
if (obj_size <= SKB_SMALL_HEAD_CACHE_SIZE &&
|
if (obj_size <= SKB_SMALL_HEAD_CACHE_SIZE &&
|
||||||
!(flags & KMALLOC_NOT_NORMAL_BITS)) {
|
!(flags & KMALLOC_NOT_NORMAL_BITS)) {
|
||||||
|
|
||||||
/* skb_small_head_cache has non power of two size,
|
|
||||||
* likely forcing SLUB to use order-3 pages.
|
|
||||||
* We deliberately attempt a NOMEMALLOC allocation only.
|
|
||||||
*/
|
|
||||||
obj = kmem_cache_alloc_node(skb_small_head_cache,
|
obj = kmem_cache_alloc_node(skb_small_head_cache,
|
||||||
flags | __GFP_NOMEMALLOC | __GFP_NOWARN,
|
flags | __GFP_NOMEMALLOC | __GFP_NOWARN,
|
||||||
node);
|
node);
|
||||||
if (obj) {
|
*size = SKB_SMALL_HEAD_CACHE_SIZE;
|
||||||
*size = SKB_SMALL_HEAD_CACHE_SIZE;
|
if (obj || !(gfp_pfmemalloc_allowed(flags)))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
/* Try again but now we are using pfmemalloc reserves */
|
||||||
|
ret_pfmemalloc = true;
|
||||||
|
obj = kmem_cache_alloc_node(skb_small_head_cache, flags, node);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
*size = obj_size = kmalloc_size_roundup(obj_size);
|
*size = obj_size = kmalloc_size_roundup(obj_size);
|
||||||
|
@ -2082,6 +2080,7 @@ struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(skb_realloc_headroom);
|
EXPORT_SYMBOL(skb_realloc_headroom);
|
||||||
|
|
||||||
|
/* Note: We plan to rework this in linux-6.4 */
|
||||||
int __skb_unclone_keeptruesize(struct sk_buff *skb, gfp_t pri)
|
int __skb_unclone_keeptruesize(struct sk_buff *skb, gfp_t pri)
|
||||||
{
|
{
|
||||||
unsigned int saved_end_offset, saved_truesize;
|
unsigned int saved_end_offset, saved_truesize;
|
||||||
|
@ -2100,6 +2099,22 @@ int __skb_unclone_keeptruesize(struct sk_buff *skb, gfp_t pri)
|
||||||
if (likely(skb_end_offset(skb) == saved_end_offset))
|
if (likely(skb_end_offset(skb) == saved_end_offset))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_SKB_SMALL_HEAD_CACHE
|
||||||
|
/* We can not change skb->end if the original or new value
|
||||||
|
* is SKB_SMALL_HEAD_HEADROOM, as it might break skb_kfree_head().
|
||||||
|
*/
|
||||||
|
if (saved_end_offset == SKB_SMALL_HEAD_HEADROOM ||
|
||||||
|
skb_end_offset(skb) == SKB_SMALL_HEAD_HEADROOM) {
|
||||||
|
/* We think this path should not be taken.
|
||||||
|
* Add a temporary trace to warn us just in case.
|
||||||
|
*/
|
||||||
|
pr_err_once("__skb_unclone_keeptruesize() skb_end_offset() %u -> %u\n",
|
||||||
|
saved_end_offset, skb_end_offset(skb));
|
||||||
|
WARN_ON_ONCE(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
shinfo = skb_shinfo(skb);
|
shinfo = skb_shinfo(skb);
|
||||||
|
|
||||||
/* We are about to change back skb->end,
|
/* We are about to change back skb->end,
|
||||||
|
|
|
@ -2818,7 +2818,8 @@ static void sk_enter_memory_pressure(struct sock *sk)
|
||||||
static void sk_leave_memory_pressure(struct sock *sk)
|
static void sk_leave_memory_pressure(struct sock *sk)
|
||||||
{
|
{
|
||||||
if (sk->sk_prot->leave_memory_pressure) {
|
if (sk->sk_prot->leave_memory_pressure) {
|
||||||
sk->sk_prot->leave_memory_pressure(sk);
|
INDIRECT_CALL_INET_1(sk->sk_prot->leave_memory_pressure,
|
||||||
|
tcp_leave_memory_pressure, sk);
|
||||||
} else {
|
} else {
|
||||||
unsigned long *memory_pressure = sk->sk_prot->memory_pressure;
|
unsigned long *memory_pressure = sk->sk_prot->memory_pressure;
|
||||||
|
|
||||||
|
|
|
@ -1412,7 +1412,7 @@ static int nl802154_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nla_get_u8(info->attrs[NL802154_ATTR_SCAN_TYPE])) {
|
if (!info->attrs[NL802154_ATTR_SCAN_TYPE]) {
|
||||||
NL_SET_ERR_MSG(info->extack, "Malformed request, missing scan type");
|
NL_SET_ERR_MSG(info->extack, "Malformed request, missing scan type");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
/* Do not edit directly, auto-generated from: */
|
/* Do not edit directly, auto-generated from: */
|
||||||
/* Documentation/netlink/specs/fou.yaml */
|
/* Documentation/netlink/specs/fou.yaml */
|
||||||
/* YNL-GEN kernel source */
|
/* YNL-GEN kernel source */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* SPDX-License-Identifier: BSD-3-Clause */
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||||
/* Do not edit directly, auto-generated from: */
|
/* Do not edit directly, auto-generated from: */
|
||||||
/* Documentation/netlink/specs/fou.yaml */
|
/* Documentation/netlink/specs/fou.yaml */
|
||||||
/* YNL-GEN kernel header */
|
/* YNL-GEN kernel header */
|
||||||
|
|
|
@ -38,7 +38,7 @@ nf_tproxy_handle_time_wait4(struct net *net, struct sk_buff *skb,
|
||||||
hp->source, lport ? lport : hp->dest,
|
hp->source, lport ? lport : hp->dest,
|
||||||
skb->dev, NF_TPROXY_LOOKUP_LISTENER);
|
skb->dev, NF_TPROXY_LOOKUP_LISTENER);
|
||||||
if (sk2) {
|
if (sk2) {
|
||||||
inet_twsk_deschedule_put(inet_twsk(sk));
|
nf_tproxy_twsk_deschedule_put(inet_twsk(sk));
|
||||||
sk = sk2;
|
sk = sk2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -186,6 +186,9 @@ static int tcp_bpf_recvmsg_parser(struct sock *sk,
|
||||||
if (unlikely(flags & MSG_ERRQUEUE))
|
if (unlikely(flags & MSG_ERRQUEUE))
|
||||||
return inet_recv_error(sk, msg, len, addr_len);
|
return inet_recv_error(sk, msg, len, addr_len);
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
psock = sk_psock_get(sk);
|
psock = sk_psock_get(sk);
|
||||||
if (unlikely(!psock))
|
if (unlikely(!psock))
|
||||||
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
|
@ -244,6 +247,9 @@ static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
if (unlikely(flags & MSG_ERRQUEUE))
|
if (unlikely(flags & MSG_ERRQUEUE))
|
||||||
return inet_recv_error(sk, msg, len, addr_len);
|
return inet_recv_error(sk, msg, len, addr_len);
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
psock = sk_psock_get(sk);
|
psock = sk_psock_get(sk);
|
||||||
if (unlikely(!psock))
|
if (unlikely(!psock))
|
||||||
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
|
|
|
@ -68,6 +68,9 @@ static int udp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
if (unlikely(flags & MSG_ERRQUEUE))
|
if (unlikely(flags & MSG_ERRQUEUE))
|
||||||
return inet_recv_error(sk, msg, len, addr_len);
|
return inet_recv_error(sk, msg, len, addr_len);
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
psock = sk_psock_get(sk);
|
psock = sk_psock_get(sk);
|
||||||
if (unlikely(!psock))
|
if (unlikely(!psock))
|
||||||
return sk_udp_recvmsg(sk, msg, len, flags, addr_len);
|
return sk_udp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
|
|
|
@ -477,6 +477,7 @@ int ila_xlat_nl_cmd_get_mapping(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
|
ret = -ESRCH;
|
||||||
ila = ila_lookup_by_params(&xp, ilan);
|
ila = ila_lookup_by_params(&xp, ilan);
|
||||||
if (ila) {
|
if (ila) {
|
||||||
ret = ila_dump_info(ila,
|
ret = ila_dump_info(ila,
|
||||||
|
|
|
@ -63,7 +63,7 @@ nf_tproxy_handle_time_wait6(struct sk_buff *skb, int tproto, int thoff,
|
||||||
lport ? lport : hp->dest,
|
lport ? lport : hp->dest,
|
||||||
skb->dev, NF_TPROXY_LOOKUP_LISTENER);
|
skb->dev, NF_TPROXY_LOOKUP_LISTENER);
|
||||||
if (sk2) {
|
if (sk2) {
|
||||||
inet_twsk_deschedule_put(inet_twsk(sk));
|
nf_tproxy_twsk_deschedule_put(inet_twsk(sk));
|
||||||
sk = sk2;
|
sk = sk2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,8 +96,8 @@ static DEFINE_MUTEX(nf_conntrack_mutex);
|
||||||
#define GC_SCAN_MAX_DURATION msecs_to_jiffies(10)
|
#define GC_SCAN_MAX_DURATION msecs_to_jiffies(10)
|
||||||
#define GC_SCAN_EXPIRED_MAX (64000u / HZ)
|
#define GC_SCAN_EXPIRED_MAX (64000u / HZ)
|
||||||
|
|
||||||
#define MIN_CHAINLEN 8u
|
#define MIN_CHAINLEN 50u
|
||||||
#define MAX_CHAINLEN (32u - MIN_CHAINLEN)
|
#define MAX_CHAINLEN (80u - MIN_CHAINLEN)
|
||||||
|
|
||||||
static struct conntrack_gc_work conntrack_gc_work;
|
static struct conntrack_gc_work conntrack_gc_work;
|
||||||
|
|
||||||
|
|
|
@ -328,11 +328,12 @@ nla_put_failure:
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NF_CONNTRACK_MARK
|
#ifdef CONFIG_NF_CONNTRACK_MARK
|
||||||
static int ctnetlink_dump_mark(struct sk_buff *skb, const struct nf_conn *ct)
|
static int ctnetlink_dump_mark(struct sk_buff *skb, const struct nf_conn *ct,
|
||||||
|
bool dump)
|
||||||
{
|
{
|
||||||
u32 mark = READ_ONCE(ct->mark);
|
u32 mark = READ_ONCE(ct->mark);
|
||||||
|
|
||||||
if (!mark)
|
if (!mark && !dump)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (nla_put_be32(skb, CTA_MARK, htonl(mark)))
|
if (nla_put_be32(skb, CTA_MARK, htonl(mark)))
|
||||||
|
@ -343,7 +344,7 @@ nla_put_failure:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define ctnetlink_dump_mark(a, b) (0)
|
#define ctnetlink_dump_mark(a, b, c) (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_NF_CONNTRACK_SECMARK
|
#ifdef CONFIG_NF_CONNTRACK_SECMARK
|
||||||
|
@ -548,7 +549,7 @@ static int ctnetlink_dump_extinfo(struct sk_buff *skb,
|
||||||
static int ctnetlink_dump_info(struct sk_buff *skb, struct nf_conn *ct)
|
static int ctnetlink_dump_info(struct sk_buff *skb, struct nf_conn *ct)
|
||||||
{
|
{
|
||||||
if (ctnetlink_dump_status(skb, ct) < 0 ||
|
if (ctnetlink_dump_status(skb, ct) < 0 ||
|
||||||
ctnetlink_dump_mark(skb, ct) < 0 ||
|
ctnetlink_dump_mark(skb, ct, true) < 0 ||
|
||||||
ctnetlink_dump_secctx(skb, ct) < 0 ||
|
ctnetlink_dump_secctx(skb, ct) < 0 ||
|
||||||
ctnetlink_dump_id(skb, ct) < 0 ||
|
ctnetlink_dump_id(skb, ct) < 0 ||
|
||||||
ctnetlink_dump_use(skb, ct) < 0 ||
|
ctnetlink_dump_use(skb, ct) < 0 ||
|
||||||
|
@ -831,8 +832,7 @@ ctnetlink_conntrack_event(unsigned int events, const struct nf_ct_event *item)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NF_CONNTRACK_MARK
|
#ifdef CONFIG_NF_CONNTRACK_MARK
|
||||||
if (events & (1 << IPCT_MARK) &&
|
if (ctnetlink_dump_mark(skb, ct, events & (1 << IPCT_MARK)))
|
||||||
ctnetlink_dump_mark(skb, ct) < 0)
|
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
#endif
|
#endif
|
||||||
nlmsg_end(skb, nlh);
|
nlmsg_end(skb, nlh);
|
||||||
|
@ -2735,7 +2735,7 @@ static int __ctnetlink_glue_build(struct sk_buff *skb, struct nf_conn *ct)
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
#ifdef CONFIG_NF_CONNTRACK_MARK
|
#ifdef CONFIG_NF_CONNTRACK_MARK
|
||||||
if (ctnetlink_dump_mark(skb, ct) < 0)
|
if (ctnetlink_dump_mark(skb, ct, true) < 0)
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
#endif
|
#endif
|
||||||
if (ctnetlink_dump_labels(skb, ct) < 0)
|
if (ctnetlink_dump_labels(skb, ct) < 0)
|
||||||
|
|
|
@ -105,11 +105,15 @@ static void nft_last_destroy(const struct nft_ctx *ctx,
|
||||||
static int nft_last_clone(struct nft_expr *dst, const struct nft_expr *src)
|
static int nft_last_clone(struct nft_expr *dst, const struct nft_expr *src)
|
||||||
{
|
{
|
||||||
struct nft_last_priv *priv_dst = nft_expr_priv(dst);
|
struct nft_last_priv *priv_dst = nft_expr_priv(dst);
|
||||||
|
struct nft_last_priv *priv_src = nft_expr_priv(src);
|
||||||
|
|
||||||
priv_dst->last = kzalloc(sizeof(*priv_dst->last), GFP_ATOMIC);
|
priv_dst->last = kzalloc(sizeof(*priv_dst->last), GFP_ATOMIC);
|
||||||
if (!priv_dst->last)
|
if (!priv_dst->last)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
priv_dst->last->set = priv_src->last->set;
|
||||||
|
priv_dst->last->jiffies = priv_src->last->jiffies;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -236,12 +236,16 @@ static void nft_quota_destroy(const struct nft_ctx *ctx,
|
||||||
static int nft_quota_clone(struct nft_expr *dst, const struct nft_expr *src)
|
static int nft_quota_clone(struct nft_expr *dst, const struct nft_expr *src)
|
||||||
{
|
{
|
||||||
struct nft_quota *priv_dst = nft_expr_priv(dst);
|
struct nft_quota *priv_dst = nft_expr_priv(dst);
|
||||||
|
struct nft_quota *priv_src = nft_expr_priv(src);
|
||||||
|
|
||||||
|
priv_dst->quota = priv_src->quota;
|
||||||
|
priv_dst->flags = priv_src->flags;
|
||||||
|
|
||||||
priv_dst->consumed = kmalloc(sizeof(*priv_dst->consumed), GFP_ATOMIC);
|
priv_dst->consumed = kmalloc(sizeof(*priv_dst->consumed), GFP_ATOMIC);
|
||||||
if (!priv_dst->consumed)
|
if (!priv_dst->consumed)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
atomic64_set(priv_dst->consumed, 0);
|
*priv_dst->consumed = *priv_src->consumed;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1446,8 +1446,8 @@ static int nfc_se_io(struct nfc_dev *dev, u32 se_idx,
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
kfree(cb_context);
|
|
||||||
device_unlock(&dev->dev);
|
device_unlock(&dev->dev);
|
||||||
|
kfree(cb_context);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -158,6 +158,9 @@ static int tcf_connmark_init(struct net *net, struct nlattr *nla,
|
||||||
nparms->zone = parm->zone;
|
nparms->zone = parm->zone;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
err = ret;
|
||||||
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tcf_action_check_ctrlact(parm->action, tp, &goto_ch, extack);
|
err = tcf_action_check_ctrlact(parm->action, tp, &goto_ch, extack);
|
||||||
|
|
|
@ -2200,8 +2200,9 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
|
||||||
fnew->flags = nla_get_u32(tb[TCA_FLOWER_FLAGS]);
|
fnew->flags = nla_get_u32(tb[TCA_FLOWER_FLAGS]);
|
||||||
|
|
||||||
if (!tc_flags_valid(fnew->flags)) {
|
if (!tc_flags_valid(fnew->flags)) {
|
||||||
|
kfree(fnew);
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto errout;
|
goto errout_tb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2226,8 +2227,10 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
|
||||||
}
|
}
|
||||||
spin_unlock(&tp->lock);
|
spin_unlock(&tp->lock);
|
||||||
|
|
||||||
if (err)
|
if (err) {
|
||||||
goto errout;
|
kfree(fnew);
|
||||||
|
goto errout_tb;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fnew->handle = handle;
|
fnew->handle = handle;
|
||||||
|
|
||||||
|
@ -2337,7 +2340,6 @@ errout_mask:
|
||||||
fl_mask_put(head, fnew->mask);
|
fl_mask_put(head, fnew->mask);
|
||||||
errout_idr:
|
errout_idr:
|
||||||
idr_remove(&head->handle_idr, fnew->handle);
|
idr_remove(&head->handle_idr, fnew->handle);
|
||||||
errout:
|
|
||||||
__fl_put(fnew);
|
__fl_put(fnew);
|
||||||
errout_tb:
|
errout_tb:
|
||||||
kfree(tb);
|
kfree(tb);
|
||||||
|
|
|
@ -2657,16 +2657,14 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
struct smc_sock *smc;
|
struct smc_sock *smc;
|
||||||
int rc = -EPIPE;
|
int rc;
|
||||||
|
|
||||||
smc = smc_sk(sk);
|
smc = smc_sk(sk);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
if ((sk->sk_state != SMC_ACTIVE) &&
|
|
||||||
(sk->sk_state != SMC_APPCLOSEWAIT1) &&
|
|
||||||
(sk->sk_state != SMC_INIT))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
|
/* SMC does not support connect with fastopen */
|
||||||
if (msg->msg_flags & MSG_FASTOPEN) {
|
if (msg->msg_flags & MSG_FASTOPEN) {
|
||||||
|
/* not connected yet, fallback */
|
||||||
if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) {
|
if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) {
|
||||||
rc = smc_switch_to_fallback(smc, SMC_CLC_DECL_OPTUNSUPP);
|
rc = smc_switch_to_fallback(smc, SMC_CLC_DECL_OPTUNSUPP);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -2675,6 +2673,11 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
} else if ((sk->sk_state != SMC_ACTIVE) &&
|
||||||
|
(sk->sk_state != SMC_APPCLOSEWAIT1) &&
|
||||||
|
(sk->sk_state != SMC_INIT)) {
|
||||||
|
rc = -EPIPE;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (smc->use_fallback) {
|
if (smc->use_fallback) {
|
||||||
|
|
11
net/socket.c
11
net/socket.c
|
@ -450,7 +450,9 @@ static struct file_system_type sock_fs_type = {
|
||||||
*
|
*
|
||||||
* Returns the &file bound with @sock, implicitly storing it
|
* Returns the &file bound with @sock, implicitly storing it
|
||||||
* in sock->file. If dname is %NULL, sets to "".
|
* in sock->file. If dname is %NULL, sets to "".
|
||||||
* On failure the return is a ERR pointer (see linux/err.h).
|
*
|
||||||
|
* On failure @sock is released, and an ERR pointer is returned.
|
||||||
|
*
|
||||||
* This function uses GFP_KERNEL internally.
|
* This function uses GFP_KERNEL internally.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1638,7 +1640,6 @@ static struct socket *__sys_socket_create(int family, int type, int protocol)
|
||||||
struct file *__sys_socket_file(int family, int type, int protocol)
|
struct file *__sys_socket_file(int family, int type, int protocol)
|
||||||
{
|
{
|
||||||
struct socket *sock;
|
struct socket *sock;
|
||||||
struct file *file;
|
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
sock = __sys_socket_create(family, type, protocol);
|
sock = __sys_socket_create(family, type, protocol);
|
||||||
|
@ -1649,11 +1650,7 @@ struct file *__sys_socket_file(int family, int type, int protocol)
|
||||||
if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
|
if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
|
||||||
flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
|
flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
|
||||||
|
|
||||||
file = sock_alloc_file(sock, flags, NULL);
|
return sock_alloc_file(sock, flags, NULL);
|
||||||
if (IS_ERR(file))
|
|
||||||
sock_release(sock);
|
|
||||||
|
|
||||||
return file;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int __sys_socket(int family, int type, int protocol)
|
int __sys_socket(int family, int type, int protocol)
|
||||||
|
|
|
@ -508,6 +508,8 @@ handle_error:
|
||||||
zc_pfrag.offset = iter_offset.offset;
|
zc_pfrag.offset = iter_offset.offset;
|
||||||
zc_pfrag.size = copy;
|
zc_pfrag.size = copy;
|
||||||
tls_append_frag(record, &zc_pfrag, copy);
|
tls_append_frag(record, &zc_pfrag, copy);
|
||||||
|
|
||||||
|
iter_offset.offset += copy;
|
||||||
} else if (copy) {
|
} else if (copy) {
|
||||||
copy = min_t(size_t, copy, pfrag->size - pfrag->offset);
|
copy = min_t(size_t, copy, pfrag->size - pfrag->offset);
|
||||||
|
|
||||||
|
|
|
@ -405,13 +405,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(crypto_info_aes_gcm_128->iv,
|
memcpy(crypto_info_aes_gcm_128->iv,
|
||||||
cctx->iv + TLS_CIPHER_AES_GCM_128_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_AES_GCM_128_SALT_SIZE,
|
||||||
TLS_CIPHER_AES_GCM_128_IV_SIZE);
|
TLS_CIPHER_AES_GCM_128_IV_SIZE);
|
||||||
memcpy(crypto_info_aes_gcm_128->rec_seq, cctx->rec_seq,
|
memcpy(crypto_info_aes_gcm_128->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
|
TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval,
|
if (copy_to_user(optval,
|
||||||
crypto_info_aes_gcm_128,
|
crypto_info_aes_gcm_128,
|
||||||
sizeof(*crypto_info_aes_gcm_128)))
|
sizeof(*crypto_info_aes_gcm_128)))
|
||||||
|
@ -429,13 +427,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(crypto_info_aes_gcm_256->iv,
|
memcpy(crypto_info_aes_gcm_256->iv,
|
||||||
cctx->iv + TLS_CIPHER_AES_GCM_256_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_AES_GCM_256_SALT_SIZE,
|
||||||
TLS_CIPHER_AES_GCM_256_IV_SIZE);
|
TLS_CIPHER_AES_GCM_256_IV_SIZE);
|
||||||
memcpy(crypto_info_aes_gcm_256->rec_seq, cctx->rec_seq,
|
memcpy(crypto_info_aes_gcm_256->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE);
|
TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval,
|
if (copy_to_user(optval,
|
||||||
crypto_info_aes_gcm_256,
|
crypto_info_aes_gcm_256,
|
||||||
sizeof(*crypto_info_aes_gcm_256)))
|
sizeof(*crypto_info_aes_gcm_256)))
|
||||||
|
@ -451,13 +447,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(aes_ccm_128->iv,
|
memcpy(aes_ccm_128->iv,
|
||||||
cctx->iv + TLS_CIPHER_AES_CCM_128_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_AES_CCM_128_SALT_SIZE,
|
||||||
TLS_CIPHER_AES_CCM_128_IV_SIZE);
|
TLS_CIPHER_AES_CCM_128_IV_SIZE);
|
||||||
memcpy(aes_ccm_128->rec_seq, cctx->rec_seq,
|
memcpy(aes_ccm_128->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_AES_CCM_128_REC_SEQ_SIZE);
|
TLS_CIPHER_AES_CCM_128_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval, aes_ccm_128, sizeof(*aes_ccm_128)))
|
if (copy_to_user(optval, aes_ccm_128, sizeof(*aes_ccm_128)))
|
||||||
rc = -EFAULT;
|
rc = -EFAULT;
|
||||||
break;
|
break;
|
||||||
|
@ -472,13 +466,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(chacha20_poly1305->iv,
|
memcpy(chacha20_poly1305->iv,
|
||||||
cctx->iv + TLS_CIPHER_CHACHA20_POLY1305_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_CHACHA20_POLY1305_SALT_SIZE,
|
||||||
TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE);
|
TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE);
|
||||||
memcpy(chacha20_poly1305->rec_seq, cctx->rec_seq,
|
memcpy(chacha20_poly1305->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE);
|
TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval, chacha20_poly1305,
|
if (copy_to_user(optval, chacha20_poly1305,
|
||||||
sizeof(*chacha20_poly1305)))
|
sizeof(*chacha20_poly1305)))
|
||||||
rc = -EFAULT;
|
rc = -EFAULT;
|
||||||
|
@ -493,13 +485,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(sm4_gcm_info->iv,
|
memcpy(sm4_gcm_info->iv,
|
||||||
cctx->iv + TLS_CIPHER_SM4_GCM_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_SM4_GCM_SALT_SIZE,
|
||||||
TLS_CIPHER_SM4_GCM_IV_SIZE);
|
TLS_CIPHER_SM4_GCM_IV_SIZE);
|
||||||
memcpy(sm4_gcm_info->rec_seq, cctx->rec_seq,
|
memcpy(sm4_gcm_info->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_SM4_GCM_REC_SEQ_SIZE);
|
TLS_CIPHER_SM4_GCM_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval, sm4_gcm_info, sizeof(*sm4_gcm_info)))
|
if (copy_to_user(optval, sm4_gcm_info, sizeof(*sm4_gcm_info)))
|
||||||
rc = -EFAULT;
|
rc = -EFAULT;
|
||||||
break;
|
break;
|
||||||
|
@ -513,13 +503,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(sm4_ccm_info->iv,
|
memcpy(sm4_ccm_info->iv,
|
||||||
cctx->iv + TLS_CIPHER_SM4_CCM_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_SM4_CCM_SALT_SIZE,
|
||||||
TLS_CIPHER_SM4_CCM_IV_SIZE);
|
TLS_CIPHER_SM4_CCM_IV_SIZE);
|
||||||
memcpy(sm4_ccm_info->rec_seq, cctx->rec_seq,
|
memcpy(sm4_ccm_info->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE);
|
TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval, sm4_ccm_info, sizeof(*sm4_ccm_info)))
|
if (copy_to_user(optval, sm4_ccm_info, sizeof(*sm4_ccm_info)))
|
||||||
rc = -EFAULT;
|
rc = -EFAULT;
|
||||||
break;
|
break;
|
||||||
|
@ -535,13 +523,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(crypto_info_aria_gcm_128->iv,
|
memcpy(crypto_info_aria_gcm_128->iv,
|
||||||
cctx->iv + TLS_CIPHER_ARIA_GCM_128_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_ARIA_GCM_128_SALT_SIZE,
|
||||||
TLS_CIPHER_ARIA_GCM_128_IV_SIZE);
|
TLS_CIPHER_ARIA_GCM_128_IV_SIZE);
|
||||||
memcpy(crypto_info_aria_gcm_128->rec_seq, cctx->rec_seq,
|
memcpy(crypto_info_aria_gcm_128->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE);
|
TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval,
|
if (copy_to_user(optval,
|
||||||
crypto_info_aria_gcm_128,
|
crypto_info_aria_gcm_128,
|
||||||
sizeof(*crypto_info_aria_gcm_128)))
|
sizeof(*crypto_info_aria_gcm_128)))
|
||||||
|
@ -559,13 +545,11 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
|
||||||
memcpy(crypto_info_aria_gcm_256->iv,
|
memcpy(crypto_info_aria_gcm_256->iv,
|
||||||
cctx->iv + TLS_CIPHER_ARIA_GCM_256_SALT_SIZE,
|
cctx->iv + TLS_CIPHER_ARIA_GCM_256_SALT_SIZE,
|
||||||
TLS_CIPHER_ARIA_GCM_256_IV_SIZE);
|
TLS_CIPHER_ARIA_GCM_256_IV_SIZE);
|
||||||
memcpy(crypto_info_aria_gcm_256->rec_seq, cctx->rec_seq,
|
memcpy(crypto_info_aria_gcm_256->rec_seq, cctx->rec_seq,
|
||||||
TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE);
|
TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE);
|
||||||
release_sock(sk);
|
|
||||||
if (copy_to_user(optval,
|
if (copy_to_user(optval,
|
||||||
crypto_info_aria_gcm_256,
|
crypto_info_aria_gcm_256,
|
||||||
sizeof(*crypto_info_aria_gcm_256)))
|
sizeof(*crypto_info_aria_gcm_256)))
|
||||||
|
@ -614,11 +598,9 @@ static int do_tls_getsockopt_no_pad(struct sock *sk, char __user *optval,
|
||||||
if (len < sizeof(value))
|
if (len < sizeof(value))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lock_sock(sk);
|
|
||||||
value = -EINVAL;
|
value = -EINVAL;
|
||||||
if (ctx->rx_conf == TLS_SW || ctx->rx_conf == TLS_HW)
|
if (ctx->rx_conf == TLS_SW || ctx->rx_conf == TLS_HW)
|
||||||
value = ctx->rx_no_pad;
|
value = ctx->rx_no_pad;
|
||||||
release_sock(sk);
|
|
||||||
if (value < 0)
|
if (value < 0)
|
||||||
return value;
|
return value;
|
||||||
|
|
||||||
|
@ -635,6 +617,8 @@ static int do_tls_getsockopt(struct sock *sk, int optname,
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
lock_sock(sk);
|
||||||
|
|
||||||
switch (optname) {
|
switch (optname) {
|
||||||
case TLS_TX:
|
case TLS_TX:
|
||||||
case TLS_RX:
|
case TLS_RX:
|
||||||
|
@ -651,6 +635,9 @@ static int do_tls_getsockopt(struct sock *sk, int optname,
|
||||||
rc = -ENOPROTOOPT;
|
rc = -ENOPROTOOPT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
release_sock(sk);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -956,7 +956,9 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
|
||||||
MSG_CMSG_COMPAT))
|
MSG_CMSG_COMPAT))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
mutex_lock(&tls_ctx->tx_lock);
|
ret = mutex_lock_interruptible(&tls_ctx->tx_lock);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
|
|
||||||
if (unlikely(msg->msg_controllen)) {
|
if (unlikely(msg->msg_controllen)) {
|
||||||
|
@ -1290,7 +1292,9 @@ int tls_sw_sendpage(struct sock *sk, struct page *page,
|
||||||
MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY))
|
MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
mutex_lock(&tls_ctx->tx_lock);
|
ret = mutex_lock_interruptible(&tls_ctx->tx_lock);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
ret = tls_sw_do_sendpage(sk, page, offset, size, flags);
|
ret = tls_sw_do_sendpage(sk, page, offset, size, flags);
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
|
@ -2127,7 +2131,7 @@ recv_end:
|
||||||
else
|
else
|
||||||
err = process_rx_list(ctx, msg, &control, 0,
|
err = process_rx_list(ctx, msg, &control, 0,
|
||||||
async_copy_bytes, is_peek);
|
async_copy_bytes, is_peek);
|
||||||
decrypted = max(err, 0);
|
decrypted += max(err, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
copied += decrypted;
|
copied += decrypted;
|
||||||
|
@ -2435,11 +2439,19 @@ static void tx_work_handler(struct work_struct *work)
|
||||||
|
|
||||||
if (!test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
|
if (!test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
|
||||||
return;
|
return;
|
||||||
mutex_lock(&tls_ctx->tx_lock);
|
|
||||||
lock_sock(sk);
|
if (mutex_trylock(&tls_ctx->tx_lock)) {
|
||||||
tls_tx_records(sk, -1);
|
lock_sock(sk);
|
||||||
release_sock(sk);
|
tls_tx_records(sk, -1);
|
||||||
mutex_unlock(&tls_ctx->tx_lock);
|
release_sock(sk);
|
||||||
|
mutex_unlock(&tls_ctx->tx_lock);
|
||||||
|
} else if (!test_and_set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask)) {
|
||||||
|
/* Someone is holding the tx_lock, they will likely run Tx
|
||||||
|
* and cancel the work on their way out of the lock section.
|
||||||
|
* Schedule a long delay just in case.
|
||||||
|
*/
|
||||||
|
schedule_delayed_work(&ctx->tx_work.work, msecs_to_jiffies(10));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tls_is_tx_ready(struct tls_sw_context_tx *ctx)
|
static bool tls_is_tx_ready(struct tls_sw_context_tx *ctx)
|
||||||
|
|
|
@ -2105,7 +2105,8 @@ out:
|
||||||
#define UNIX_SKB_FRAGS_SZ (PAGE_SIZE << get_order(32768))
|
#define UNIX_SKB_FRAGS_SZ (PAGE_SIZE << get_order(32768))
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
||||||
static int queue_oob(struct socket *sock, struct msghdr *msg, struct sock *other)
|
static int queue_oob(struct socket *sock, struct msghdr *msg, struct sock *other,
|
||||||
|
struct scm_cookie *scm, bool fds_sent)
|
||||||
{
|
{
|
||||||
struct unix_sock *ousk = unix_sk(other);
|
struct unix_sock *ousk = unix_sk(other);
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
@ -2116,6 +2117,11 @@ static int queue_oob(struct socket *sock, struct msghdr *msg, struct sock *other
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
err = unix_scm_to_skb(scm, skb, !fds_sent);
|
||||||
|
if (err < 0) {
|
||||||
|
kfree_skb(skb);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
skb_put(skb, 1);
|
skb_put(skb, 1);
|
||||||
err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, 1);
|
err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, 1);
|
||||||
|
|
||||||
|
@ -2243,7 +2249,7 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
|
||||||
if (msg->msg_flags & MSG_OOB) {
|
if (msg->msg_flags & MSG_OOB) {
|
||||||
err = queue_oob(sock, msg, other);
|
err = queue_oob(sock, msg, other, &scm, fds_sent);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
sent++;
|
sent++;
|
||||||
|
|
|
@ -54,6 +54,9 @@ static int unix_bpf_recvmsg(struct sock *sk, struct msghdr *msg,
|
||||||
struct sk_psock *psock;
|
struct sk_psock *psock;
|
||||||
int copied;
|
int copied;
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
psock = sk_psock_get(sk);
|
psock = sk_psock_get(sk);
|
||||||
if (unlikely(!psock))
|
if (unlikely(!psock))
|
||||||
return __unix_recvmsg(sk, msg, len, flags);
|
return __unix_recvmsg(sk, msg, len, flags);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause */
|
||||||
/* Do not edit directly, auto-generated from: */
|
/* Do not edit directly, auto-generated from: */
|
||||||
/* Documentation/netlink/specs/netdev.yaml */
|
/* Documentation/netlink/specs/netdev.yaml */
|
||||||
/* YNL-GEN uapi header */
|
/* YNL-GEN uapi header */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
from .nlspec import SpecAttr, SpecAttrSet, SpecFamily, SpecOperation
|
from .nlspec import SpecAttr, SpecAttrSet, SpecEnumEntry, SpecEnumSet, \
|
||||||
|
SpecFamily, SpecOperation
|
||||||
from .ynl import YnlFamily
|
from .ynl import YnlFamily
|
||||||
|
|
||||||
__all__ = ["SpecAttr", "SpecAttrSet", "SpecFamily", "SpecOperation",
|
__all__ = ["SpecAttr", "SpecAttrSet", "SpecEnumEntry", "SpecEnumSet",
|
||||||
"YnlFamily"]
|
"SpecFamily", "SpecOperation", "YnlFamily"]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
import importlib
|
import importlib
|
||||||
|
@ -57,6 +57,94 @@ class SpecElement:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class SpecEnumEntry(SpecElement):
|
||||||
|
""" Entry within an enum declared in the Netlink spec.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
doc documentation string
|
||||||
|
enum_set back reference to the enum
|
||||||
|
value numerical value of this enum (use accessors in most situations!)
|
||||||
|
|
||||||
|
Methods:
|
||||||
|
raw_value raw value, i.e. the id in the enum, unlike user value which is a mask for flags
|
||||||
|
user_value user value, same as raw value for enums, for flags it's the mask
|
||||||
|
"""
|
||||||
|
def __init__(self, enum_set, yaml, prev, value_start):
|
||||||
|
if isinstance(yaml, str):
|
||||||
|
yaml = {'name': yaml}
|
||||||
|
super().__init__(enum_set.family, yaml)
|
||||||
|
|
||||||
|
self.doc = yaml.get('doc', '')
|
||||||
|
self.enum_set = enum_set
|
||||||
|
|
||||||
|
if 'value' in yaml:
|
||||||
|
self.value = yaml['value']
|
||||||
|
elif prev:
|
||||||
|
self.value = prev.value + 1
|
||||||
|
else:
|
||||||
|
self.value = value_start
|
||||||
|
|
||||||
|
def has_doc(self):
|
||||||
|
return bool(self.doc)
|
||||||
|
|
||||||
|
def raw_value(self):
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
def user_value(self):
|
||||||
|
if self.enum_set['type'] == 'flags':
|
||||||
|
return 1 << self.value
|
||||||
|
else:
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
|
class SpecEnumSet(SpecElement):
|
||||||
|
""" Enum type
|
||||||
|
|
||||||
|
Represents an enumeration (list of numerical constants)
|
||||||
|
as declared in the "definitions" section of the spec.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
type enum or flags
|
||||||
|
entries entries by name
|
||||||
|
entries_by_val entries by value
|
||||||
|
Methods:
|
||||||
|
get_mask for flags compute the mask of all defined values
|
||||||
|
"""
|
||||||
|
def __init__(self, family, yaml):
|
||||||
|
super().__init__(family, yaml)
|
||||||
|
|
||||||
|
self.type = yaml['type']
|
||||||
|
|
||||||
|
prev_entry = None
|
||||||
|
value_start = self.yaml.get('value-start', 0)
|
||||||
|
self.entries = dict()
|
||||||
|
self.entries_by_val = dict()
|
||||||
|
for entry in self.yaml['entries']:
|
||||||
|
e = self.new_entry(entry, prev_entry, value_start)
|
||||||
|
self.entries[e.name] = e
|
||||||
|
self.entries_by_val[e.raw_value()] = e
|
||||||
|
prev_entry = e
|
||||||
|
|
||||||
|
def new_entry(self, entry, prev_entry, value_start):
|
||||||
|
return SpecEnumEntry(self, entry, prev_entry, value_start)
|
||||||
|
|
||||||
|
def has_doc(self):
|
||||||
|
if 'doc' in self.yaml:
|
||||||
|
return True
|
||||||
|
for entry in self.entries.values():
|
||||||
|
if entry.has_doc():
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_mask(self):
|
||||||
|
mask = 0
|
||||||
|
idx = self.yaml.get('value-start', 0)
|
||||||
|
for _ in self.entries.values():
|
||||||
|
mask |= 1 << idx
|
||||||
|
idx += 1
|
||||||
|
return mask
|
||||||
|
|
||||||
|
|
||||||
class SpecAttr(SpecElement):
|
class SpecAttr(SpecElement):
|
||||||
""" Single Netlink atttribute type
|
""" Single Netlink atttribute type
|
||||||
|
|
||||||
|
@ -95,15 +183,22 @@ class SpecAttrSet(SpecElement):
|
||||||
self.attrs = collections.OrderedDict()
|
self.attrs = collections.OrderedDict()
|
||||||
self.attrs_by_val = collections.OrderedDict()
|
self.attrs_by_val = collections.OrderedDict()
|
||||||
|
|
||||||
val = 0
|
if self.subset_of is None:
|
||||||
for elem in self.yaml['attributes']:
|
val = 1
|
||||||
if 'value' in elem:
|
for elem in self.yaml['attributes']:
|
||||||
val = elem['value']
|
if 'value' in elem:
|
||||||
|
val = elem['value']
|
||||||
|
|
||||||
attr = self.new_attr(elem, val)
|
attr = self.new_attr(elem, val)
|
||||||
self.attrs[attr.name] = attr
|
self.attrs[attr.name] = attr
|
||||||
self.attrs_by_val[attr.value] = attr
|
self.attrs_by_val[attr.value] = attr
|
||||||
val += 1
|
val += 1
|
||||||
|
else:
|
||||||
|
real_set = family.attr_sets[self.subset_of]
|
||||||
|
for elem in self.yaml['attributes']:
|
||||||
|
attr = real_set[elem['name']]
|
||||||
|
self.attrs[attr.name] = attr
|
||||||
|
self.attrs_by_val[attr.value] = attr
|
||||||
|
|
||||||
def new_attr(self, elem, value):
|
def new_attr(self, elem, value):
|
||||||
return SpecAttr(self.family, self, elem, value)
|
return SpecAttr(self.family, self, elem, value)
|
||||||
|
@ -186,6 +281,7 @@ class SpecFamily(SpecElement):
|
||||||
msgs dict of all messages (index by name)
|
msgs dict of all messages (index by name)
|
||||||
msgs_by_value dict of all messages (indexed by name)
|
msgs_by_value dict of all messages (indexed by name)
|
||||||
ops dict of all valid requests / responses
|
ops dict of all valid requests / responses
|
||||||
|
consts dict of all constants/enums
|
||||||
"""
|
"""
|
||||||
def __init__(self, spec_path, schema_path=None):
|
def __init__(self, spec_path, schema_path=None):
|
||||||
with open(spec_path, "r") as stream:
|
with open(spec_path, "r") as stream:
|
||||||
|
@ -215,6 +311,7 @@ class SpecFamily(SpecElement):
|
||||||
self.req_by_value = collections.OrderedDict()
|
self.req_by_value = collections.OrderedDict()
|
||||||
self.rsp_by_value = collections.OrderedDict()
|
self.rsp_by_value = collections.OrderedDict()
|
||||||
self.ops = collections.OrderedDict()
|
self.ops = collections.OrderedDict()
|
||||||
|
self.consts = collections.OrderedDict()
|
||||||
|
|
||||||
last_exception = None
|
last_exception = None
|
||||||
while len(self._resolution_list) > 0:
|
while len(self._resolution_list) > 0:
|
||||||
|
@ -235,6 +332,9 @@ class SpecFamily(SpecElement):
|
||||||
if len(resolved) == 0:
|
if len(resolved) == 0:
|
||||||
raise last_exception
|
raise last_exception
|
||||||
|
|
||||||
|
def new_enum(self, elem):
|
||||||
|
return SpecEnumSet(self, elem)
|
||||||
|
|
||||||
def new_attr_set(self, elem):
|
def new_attr_set(self, elem):
|
||||||
return SpecAttrSet(self, elem)
|
return SpecAttrSet(self, elem)
|
||||||
|
|
||||||
|
@ -245,7 +345,7 @@ class SpecFamily(SpecElement):
|
||||||
self._resolution_list.append(elem)
|
self._resolution_list.append(elem)
|
||||||
|
|
||||||
def _dictify_ops_unified(self):
|
def _dictify_ops_unified(self):
|
||||||
val = 0
|
val = 1
|
||||||
for elem in self.yaml['operations']['list']:
|
for elem in self.yaml['operations']['list']:
|
||||||
if 'value' in elem:
|
if 'value' in elem:
|
||||||
val = elem['value']
|
val = elem['value']
|
||||||
|
@ -256,7 +356,7 @@ class SpecFamily(SpecElement):
|
||||||
self.msgs[op.name] = op
|
self.msgs[op.name] = op
|
||||||
|
|
||||||
def _dictify_ops_directional(self):
|
def _dictify_ops_directional(self):
|
||||||
req_val = rsp_val = 0
|
req_val = rsp_val = 1
|
||||||
for elem in self.yaml['operations']['list']:
|
for elem in self.yaml['operations']['list']:
|
||||||
if 'notify' in elem:
|
if 'notify' in elem:
|
||||||
if 'value' in elem:
|
if 'value' in elem:
|
||||||
|
@ -289,6 +389,12 @@ class SpecFamily(SpecElement):
|
||||||
def resolve(self):
|
def resolve(self):
|
||||||
self.resolve_up(super())
|
self.resolve_up(super())
|
||||||
|
|
||||||
|
for elem in self.yaml['definitions']:
|
||||||
|
if elem['type'] == 'enum' or elem['type'] == 'flags':
|
||||||
|
self.consts[elem['name']] = self.new_enum(elem)
|
||||||
|
else:
|
||||||
|
self.consts[elem['name']] = elem
|
||||||
|
|
||||||
for elem in self.yaml['attribute-sets']:
|
for elem in self.yaml['attribute-sets']:
|
||||||
attr_set = self.new_attr_set(elem)
|
attr_set = self.new_attr_set(elem)
|
||||||
self.attr_sets[elem['name']] = attr_set
|
self.attr_sets[elem['name']] = attr_set
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
import functools
|
import functools
|
||||||
import os
|
import os
|
||||||
|
@ -303,11 +303,6 @@ class YnlFamily(SpecFamily):
|
||||||
self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_CAP_ACK, 1)
|
self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_CAP_ACK, 1)
|
||||||
self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_EXT_ACK, 1)
|
self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_EXT_ACK, 1)
|
||||||
|
|
||||||
self._types = dict()
|
|
||||||
|
|
||||||
for elem in self.yaml.get('definitions', []):
|
|
||||||
self._types[elem['name']] = elem
|
|
||||||
|
|
||||||
self.async_msg_ids = set()
|
self.async_msg_ids = set()
|
||||||
self.async_msg_queue = []
|
self.async_msg_queue = []
|
||||||
|
|
||||||
|
@ -353,13 +348,13 @@ class YnlFamily(SpecFamily):
|
||||||
|
|
||||||
def _decode_enum(self, rsp, attr_spec):
|
def _decode_enum(self, rsp, attr_spec):
|
||||||
raw = rsp[attr_spec['name']]
|
raw = rsp[attr_spec['name']]
|
||||||
enum = self._types[attr_spec['enum']]
|
enum = self.consts[attr_spec['enum']]
|
||||||
i = attr_spec.get('value-start', 0)
|
i = attr_spec.get('value-start', 0)
|
||||||
if 'enum-as-flags' in attr_spec and attr_spec['enum-as-flags']:
|
if 'enum-as-flags' in attr_spec and attr_spec['enum-as-flags']:
|
||||||
value = set()
|
value = set()
|
||||||
while raw:
|
while raw:
|
||||||
if raw & 1:
|
if raw & 1:
|
||||||
value.add(enum['entries'][i])
|
value.add(enum.entries_by_val[i].name)
|
||||||
raw >>= 1
|
raw >>= 1
|
||||||
i += 1
|
i += 1
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import collections
|
import collections
|
||||||
import os
|
import os
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation
|
from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, SpecEnumEntry
|
||||||
|
|
||||||
|
|
||||||
def c_upper(name):
|
def c_upper(name):
|
||||||
|
@ -566,97 +567,37 @@ class Struct:
|
||||||
self.inherited = [c_lower(x) for x in sorted(self._inherited)]
|
self.inherited = [c_lower(x) for x in sorted(self._inherited)]
|
||||||
|
|
||||||
|
|
||||||
class EnumEntry:
|
class EnumEntry(SpecEnumEntry):
|
||||||
def __init__(self, enum_set, yaml, prev, value_start):
|
def __init__(self, enum_set, yaml, prev, value_start):
|
||||||
if isinstance(yaml, str):
|
super().__init__(enum_set, yaml, prev, value_start)
|
||||||
self.name = yaml
|
|
||||||
yaml = {}
|
|
||||||
self.doc = ''
|
|
||||||
else:
|
|
||||||
self.name = yaml['name']
|
|
||||||
self.doc = yaml.get('doc', '')
|
|
||||||
|
|
||||||
self.yaml = yaml
|
if prev:
|
||||||
self.enum_set = enum_set
|
self.value_change = (self.value != prev.value + 1)
|
||||||
self.c_name = c_upper(enum_set.value_pfx + self.name)
|
|
||||||
|
|
||||||
if 'value' in yaml:
|
|
||||||
self.value = yaml['value']
|
|
||||||
if prev:
|
|
||||||
self.value_change = (self.value != prev.value + 1)
|
|
||||||
elif prev:
|
|
||||||
self.value_change = False
|
|
||||||
self.value = prev.value + 1
|
|
||||||
else:
|
else:
|
||||||
self.value = value_start
|
|
||||||
self.value_change = (self.value != 0)
|
self.value_change = (self.value != 0)
|
||||||
|
|
||||||
self.value_change = self.value_change or self.enum_set['type'] == 'flags'
|
self.value_change = self.value_change or self.enum_set['type'] == 'flags'
|
||||||
|
|
||||||
def __getitem__(self, key):
|
# Added by resolve:
|
||||||
return self.yaml[key]
|
self.c_name = None
|
||||||
|
delattr(self, "c_name")
|
||||||
|
|
||||||
def __contains__(self, key):
|
def resolve(self):
|
||||||
return key in self.yaml
|
self.resolve_up(super())
|
||||||
|
|
||||||
def has_doc(self):
|
self.c_name = c_upper(self.enum_set.value_pfx + self.name)
|
||||||
return bool(self.doc)
|
|
||||||
|
|
||||||
# raw value, i.e. the id in the enum, unlike user value which is a mask for flags
|
|
||||||
def raw_value(self):
|
|
||||||
return self.value
|
|
||||||
|
|
||||||
# user value, same as raw value for enums, for flags it's the mask
|
|
||||||
def user_value(self):
|
|
||||||
if self.enum_set['type'] == 'flags':
|
|
||||||
return 1 << self.value
|
|
||||||
else:
|
|
||||||
return self.value
|
|
||||||
|
|
||||||
|
|
||||||
class EnumSet:
|
class EnumSet(SpecEnumSet):
|
||||||
def __init__(self, family, yaml):
|
def __init__(self, family, yaml):
|
||||||
self.yaml = yaml
|
|
||||||
self.family = family
|
|
||||||
|
|
||||||
self.render_name = c_lower(family.name + '-' + yaml['name'])
|
self.render_name = c_lower(family.name + '-' + yaml['name'])
|
||||||
self.enum_name = 'enum ' + self.render_name
|
self.enum_name = 'enum ' + self.render_name
|
||||||
|
|
||||||
self.value_pfx = yaml.get('name-prefix', f"{family.name}-{yaml['name']}-")
|
self.value_pfx = yaml.get('name-prefix', f"{family.name}-{yaml['name']}-")
|
||||||
|
|
||||||
self.type = yaml['type']
|
super().__init__(family, yaml)
|
||||||
|
|
||||||
prev_entry = None
|
def new_entry(self, entry, prev_entry, value_start):
|
||||||
value_start = self.yaml.get('value-start', 0)
|
return EnumEntry(self, entry, prev_entry, value_start)
|
||||||
self.entries = {}
|
|
||||||
self.entry_list = []
|
|
||||||
for entry in self.yaml['entries']:
|
|
||||||
e = EnumEntry(self, entry, prev_entry, value_start)
|
|
||||||
self.entries[e.name] = e
|
|
||||||
self.entry_list.append(e)
|
|
||||||
prev_entry = e
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
|
||||||
return self.yaml[key]
|
|
||||||
|
|
||||||
def __contains__(self, key):
|
|
||||||
return key in self.yaml
|
|
||||||
|
|
||||||
def has_doc(self):
|
|
||||||
if 'doc' in self.yaml:
|
|
||||||
return True
|
|
||||||
for entry in self.entry_list:
|
|
||||||
if entry.has_doc():
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def get_mask(self):
|
|
||||||
mask = 0
|
|
||||||
idx = self.yaml.get('value-start', 0)
|
|
||||||
for _ in self.entry_list:
|
|
||||||
mask |= 1 << idx
|
|
||||||
idx += 1
|
|
||||||
return mask
|
|
||||||
|
|
||||||
|
|
||||||
class AttrSet(SpecAttrSet):
|
class AttrSet(SpecAttrSet):
|
||||||
|
@ -791,8 +732,6 @@ class Family(SpecFamily):
|
||||||
|
|
||||||
self.mcgrps = self.yaml.get('mcast-groups', {'list': []})
|
self.mcgrps = self.yaml.get('mcast-groups', {'list': []})
|
||||||
|
|
||||||
self.consts = dict()
|
|
||||||
|
|
||||||
self.hooks = dict()
|
self.hooks = dict()
|
||||||
for when in ['pre', 'post']:
|
for when in ['pre', 'post']:
|
||||||
self.hooks[when] = dict()
|
self.hooks[when] = dict()
|
||||||
|
@ -819,6 +758,9 @@ class Family(SpecFamily):
|
||||||
if self.kernel_policy == 'global':
|
if self.kernel_policy == 'global':
|
||||||
self._load_global_policy()
|
self._load_global_policy()
|
||||||
|
|
||||||
|
def new_enum(self, elem):
|
||||||
|
return EnumSet(self, elem)
|
||||||
|
|
||||||
def new_attr_set(self, elem):
|
def new_attr_set(self, elem):
|
||||||
return AttrSet(self, elem)
|
return AttrSet(self, elem)
|
||||||
|
|
||||||
|
@ -836,12 +778,6 @@ class Family(SpecFamily):
|
||||||
}
|
}
|
||||||
|
|
||||||
def _dictify(self):
|
def _dictify(self):
|
||||||
for elem in self.yaml['definitions']:
|
|
||||||
if elem['type'] == 'enum' or elem['type'] == 'flags':
|
|
||||||
self.consts[elem['name']] = EnumSet(self, elem)
|
|
||||||
else:
|
|
||||||
self.consts[elem['name']] = elem
|
|
||||||
|
|
||||||
ntf = []
|
ntf = []
|
||||||
for msg in self.msgs.values():
|
for msg in self.msgs.values():
|
||||||
if 'notify' in msg:
|
if 'notify' in msg:
|
||||||
|
@ -1979,7 +1915,7 @@ def render_uapi(family, cw):
|
||||||
if 'doc' in enum:
|
if 'doc' in enum:
|
||||||
doc = ' - ' + enum['doc']
|
doc = ' - ' + enum['doc']
|
||||||
cw.write_doc_line(enum.enum_name + doc)
|
cw.write_doc_line(enum.enum_name + doc)
|
||||||
for entry in enum.entry_list:
|
for entry in enum.entries.values():
|
||||||
if entry.has_doc():
|
if entry.has_doc():
|
||||||
doc = '@' + entry.c_name + ': ' + entry['doc']
|
doc = '@' + entry.c_name + ': ' + entry['doc']
|
||||||
cw.write_doc_line(doc)
|
cw.write_doc_line(doc)
|
||||||
|
@ -1987,7 +1923,7 @@ def render_uapi(family, cw):
|
||||||
|
|
||||||
uapi_enum_start(family, cw, const, 'name')
|
uapi_enum_start(family, cw, const, 'name')
|
||||||
name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")
|
name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")
|
||||||
for entry in enum.entry_list:
|
for entry in enum.entries.values():
|
||||||
suffix = ','
|
suffix = ','
|
||||||
if entry.value_change:
|
if entry.value_change:
|
||||||
suffix = f" = {entry.user_value()}" + suffix
|
suffix = f" = {entry.user_value()}" + suffix
|
||||||
|
@ -2044,14 +1980,17 @@ def render_uapi(family, cw):
|
||||||
max_value = f"({cnt_name} - 1)"
|
max_value = f"({cnt_name} - 1)"
|
||||||
|
|
||||||
uapi_enum_start(family, cw, family['operations'], 'enum-name')
|
uapi_enum_start(family, cw, family['operations'], 'enum-name')
|
||||||
|
val = 0
|
||||||
for op in family.msgs.values():
|
for op in family.msgs.values():
|
||||||
if separate_ntf and ('notify' in op or 'event' in op):
|
if separate_ntf and ('notify' in op or 'event' in op):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
suffix = ','
|
suffix = ','
|
||||||
if 'value' in op:
|
if op.value != val:
|
||||||
suffix = f" = {op['value']},"
|
suffix = f" = {op.value},"
|
||||||
|
val = op.value
|
||||||
cw.p(op.enum_name + suffix)
|
cw.p(op.enum_name + suffix)
|
||||||
|
val += 1
|
||||||
cw.nl()
|
cw.nl()
|
||||||
cw.p(cnt_name + ('' if max_by_define else ','))
|
cw.p(cnt_name + ('' if max_by_define else ','))
|
||||||
if not max_by_define:
|
if not max_by_define:
|
||||||
|
@ -2124,12 +2063,12 @@ def main():
|
||||||
|
|
||||||
_, spec_kernel = find_kernel_root(args.spec)
|
_, spec_kernel = find_kernel_root(args.spec)
|
||||||
if args.mode == 'uapi':
|
if args.mode == 'uapi':
|
||||||
cw.p('/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */')
|
cw.p('/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause */')
|
||||||
else:
|
else:
|
||||||
if args.header:
|
if args.header:
|
||||||
cw.p('/* SPDX-License-Identifier: BSD-3-Clause */')
|
cw.p('/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */')
|
||||||
else:
|
else:
|
||||||
cw.p('// SPDX-License-Identifier: BSD-3-Clause')
|
cw.p('// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause')
|
||||||
cw.p("/* Do not edit directly, auto-generated from: */")
|
cw.p("/* Do not edit directly, auto-generated from: */")
|
||||||
cw.p(f"/*\t{spec_kernel} */")
|
cw.p(f"/*\t{spec_kernel} */")
|
||||||
cw.p(f"/* YNL-GEN {args.mode} {'header' if args.header else 'source'} */")
|
cw.p(f"/* YNL-GEN {args.mode} {'header' if args.header else 'source'} */")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||||
|
|
||||||
TOOL=$(dirname $(realpath $0))/ynl-gen-c.py
|
TOOL=$(dirname $(realpath $0))/ynl-gen-c.py
|
||||||
|
|
||||||
|
|
|
@ -879,6 +879,34 @@ static struct btf_raw_test raw_tests[] = {
|
||||||
.btf_load_err = true,
|
.btf_load_err = true,
|
||||||
.err_str = "Invalid elem",
|
.err_str = "Invalid elem",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.descr = "var after datasec, ptr followed by modifier",
|
||||||
|
.raw_types = {
|
||||||
|
/* .bss section */ /* [1] */
|
||||||
|
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2),
|
||||||
|
sizeof(void*)+4),
|
||||||
|
BTF_VAR_SECINFO_ENC(4, 0, sizeof(void*)),
|
||||||
|
BTF_VAR_SECINFO_ENC(6, sizeof(void*), 4),
|
||||||
|
/* int */ /* [2] */
|
||||||
|
BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
|
||||||
|
/* int* */ /* [3] */
|
||||||
|
BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
|
||||||
|
BTF_VAR_ENC(NAME_TBD, 3, 0), /* [4] */
|
||||||
|
/* const int */ /* [5] */
|
||||||
|
BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
|
||||||
|
BTF_VAR_ENC(NAME_TBD, 5, 0), /* [6] */
|
||||||
|
BTF_END_RAW,
|
||||||
|
},
|
||||||
|
.str_sec = "\0a\0b\0c\0",
|
||||||
|
.str_sec_size = sizeof("\0a\0b\0c\0"),
|
||||||
|
.map_type = BPF_MAP_TYPE_ARRAY,
|
||||||
|
.map_name = ".bss",
|
||||||
|
.key_size = sizeof(int),
|
||||||
|
.value_size = sizeof(void*)+4,
|
||||||
|
.key_type_id = 0,
|
||||||
|
.value_type_id = 1,
|
||||||
|
.max_entries = 1,
|
||||||
|
},
|
||||||
/* Test member exceeds the size of struct.
|
/* Test member exceeds the size of struct.
|
||||||
*
|
*
|
||||||
* struct A {
|
* struct A {
|
||||||
|
|
|
@ -65,12 +65,13 @@ static int attach_tc_prog(struct bpf_tc_hook *hook, int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The maximum permissible size is: PAGE_SIZE - sizeof(struct xdp_page_head) -
|
/* The maximum permissible size is: PAGE_SIZE - sizeof(struct xdp_page_head) -
|
||||||
* sizeof(struct skb_shared_info) - XDP_PACKET_HEADROOM = 3368 bytes
|
* SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) - XDP_PACKET_HEADROOM =
|
||||||
|
* 3408 bytes for 64-byte cacheline and 3216 for 256-byte one.
|
||||||
*/
|
*/
|
||||||
#if defined(__s390x__)
|
#if defined(__s390x__)
|
||||||
#define MAX_PKT_SIZE 3176
|
#define MAX_PKT_SIZE 3216
|
||||||
#else
|
#else
|
||||||
#define MAX_PKT_SIZE 3368
|
#define MAX_PKT_SIZE 3408
|
||||||
#endif
|
#endif
|
||||||
static void test_max_pkt_size(int fd)
|
static void test_max_pkt_size(int fd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -404,6 +404,8 @@ EOF
|
||||||
echo SERVER-$family | ip netns exec "$ns1" timeout 5 socat -u STDIN TCP-LISTEN:2000 &
|
echo SERVER-$family | ip netns exec "$ns1" timeout 5 socat -u STDIN TCP-LISTEN:2000 &
|
||||||
sc_s=$!
|
sc_s=$!
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
result=$(ip netns exec "$ns0" timeout 1 socat TCP:$daddr:2000 STDOUT)
|
result=$(ip netns exec "$ns0" timeout 1 socat TCP:$daddr:2000 STDOUT)
|
||||||
|
|
||||||
if [ "$result" = "SERVER-inet" ];then
|
if [ "$result" = "SERVER-inet" ];then
|
||||||
|
|
Загрузка…
Ссылка в новой задаче