diff options
author | Patrick Williams <patrick@stwcx.xyz> | 2023-06-15 13:43:17 +0300 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2023-06-15 19:22:24 +0300 |
commit | 91c4060797737f563a7b975d726f2efcb088e45f (patch) | |
tree | 0b2a543533ec0cf03a47e67056a95b0073b51524 /poky/meta/recipes-core/systemd/systemd/0001-network-remove-only-managed-configs-on-reconfigure-o.patch | |
parent | 821a859c1d68e8cfeea8c50e86f15daa87e71d59 (diff) | |
download | openbmc-kirkstone.tar.xz |
kirkstone: subtree updateskirkstone
meta-raspberrypi: 2a06e4e84b..43683cb14b:
Florin Sarbu (1):
udev-rules-rpi: Use 99-com.rules directly from upstream
meta-openembedded: df452d9d98..f95484417e:
Arsalan H. Awan (1):
meta-networking/licenses/netperf: remove unused license
Bhargav Das (2):
tslib: Add native & nativestdk package support
pointercal: Add native & nativestdk package support
Changqing Li (1):
redis: fix do_patch fuzz warning
Chee Yang Lee (3):
tinyproxy: fix CVE-2022-40468
capnproto: upgrade to 0.9.2
freerdp: fix CVE-2022-39316/39318/39319
Gianluigi Spagnuolo (1):
libbpf: add native and nativesdk BBCLASSEXTEND
Jasper Orschulko (1):
python3-gcovr: Add missing runtime dependency
Jonas Gorski (3):
frr: Security fix CVE-2022-36440 / CVE-2022-40302
frr: Security fix CVE-2022-40318
frr: Security fix CVE-2022-43681
Khem Raj (1):
nodejs: Fix build with gcc13
Martin Jansa (1):
abseil-cpp: backport a fix for build with gcc-13
Narpat Mali (3):
python3-werkzeug: fix for CVE-2023-25577
python3-django: upgrade 4.0.2 -> 4.2.1
python3-m2crypto: fix for CVE-2020-25657
Natasha Bailey (1):
libyang: backport a fix for CVE-2023-26916
Valeria Petrov (1):
apache2: upgrade 2.4.56 -> 2.4.57
Xiangyu Chen (3):
pahole: fix native package build error
Revert "pahole: fix native package build error"
libbpf: installing uapi headers for native package
poky: 4cc0e9438b..43b94d2b84:
Alexander Kanavin (1):
dhcpcd: use git instead of tarballs
Archana Polampalli (4):
nasm: fix CVE-2022-44370
git: fix CVE-2023-29007
git: fix CVE-2023-25652
git: ignore CVE-2023-25815
Arturo Buzarra (1):
run-postinsts: Set dependency for ldconfig to avoid boot issues
Bhabu Bindu (4):
curl: Fix CVE-2023-28319
curl: Fix CVE-2023-28320
curl: Fix CVE-2023-28321
curl: Fix CVE-2023-28322
Bruce Ashfield (9):
linux-yocto/5.15: update to v5.15.106
linux-yocto/5.15: update to v5.15.107
linux-yocto/5.15: update to v5.15.108
kernel: improve initramfs bundle processing time
linux-yocto/5.10: update to v5.10.176
linux-yocto/5.10: update to v5.10.177
linux-yocto/5.10: update to v5.10.178
linux-yocto/5.10: update to v5.10.179
linux-yocto/5.10: update to v5.10.180
C. Andy Martin (1):
systemd-networkd: backport fix for rm unmanaged wifi
Christoph Lauer (1):
populate_sdk_base: add zip options
Daniel Ammann (1):
overview-manual: concepts.rst: Fix a typo
Deepthi Hemraj (5):
glibc: stable 2.35 branch updates.
binutils : Fix CVE-2023-25584
binutils : Fix CVE-2023-25585
binutils : Fix CVE-2023-1972
binutils : Fix CVE-2023-25588
Dmitry Baryshkov (1):
linux-firmware: upgrade 20230210 -> 20230404
Eero Aaltonen (1):
avahi: fix D-Bus introspection
Enrico Jörns (1):
package_manager/ipk: fix config path generation in _create_custom_config()
Hitendra Prajapati (2):
connman: fix CVE-2023-28488 DoS in client.c
sysstat: Fix CVE-2023-33204
Jan Luebbe (1):
p11-kit: add native to BBCLASSEXTEND
Joe Slater (1):
ghostscript: fix CVE-2023-29979
Kai Kang (1):
webkitgtk: fix CVE-2022-32888 & CVE-2022-32923
Khem Raj (2):
gcc-runtime: Use static dummy libstdc++
quilt: Fix merge.test race condition
Lee Chee Yang (1):
migration-guides: add release notes for 4.0.10
Marek Vasut (1):
cpio: Fix wrong CRC with ASCII CRC for large files
Martin Jansa (3):
populate_sdk_ext.bbclass: set METADATA_REVISION with an DISTRO override
llvm: backport a fix for build with gcc-13
kernel-devicetree: make shell scripts posix compliant
Martin Siegumfeldt (1):
systemd-systemctl: fix instance template WantedBy symlink construction
Michael Halstead (2):
uninative: Upgrade to 3.10 to support gcc 13
uninative: Upgrade to 4.0 to include latest gcc 13.1.1
Michael Opdenacker (2):
conf.py: add macro for Mitre CVE links
migration-guides: use new cve_mitre macro
Ming Liu (1):
weston: add xwayland to DEPENDS for PACKAGECONFIG xwayland
Mingli Yu (1):
ruby: Fix CVE-2023-28755
Narpat Mali (3):
ffmpeg: fix for CVE-2022-48434
python3-cryptography: fix for CVE-2023-23931
python3-requests: fix for CVE-2023-32681
Omkar Patil (1):
curl: Correction for CVE-2023-27536
Pablo Saavedra (1):
gstreamer1.0: upgrade 1.20.5 -> 1.20.6
Pascal Bach (1):
cmake: add CMAKE_SYSROOT to generated toolchain file
Peter Bergin (1):
update-alternatives.bbclass: fix old override syntax
Peter Kjellerstedt (1):
license.bbclass: Include LICENSE in the output when it fails to parse
Peter Marko (2):
libxml2: patch CVE-2023-28484 and CVE-2023-29469
openssl: Upgrade 3.0.8 -> 3.0.9
Piotr Łobacz (1):
libarchive: Enable acls, xattr for native as well as target
Quentin Schulz (1):
Revert "docs: conf.py: fix cve extlinks caption for sphinx <4.0"
Randolph Sapp (4):
wic/bootimg-efi: if fixed-size is set then use that for mkdosfs
kernel-devicetree: allow specification of dtb directory
package: enable recursion on file globs
kernel-devicetree: recursively search for dtbs
Ranjitsinh Rathod (1):
libbsd: Add correct license for all packages
Richard Purdie (3):
maintainers.inc: Fix email address typo
maintainers.inc: Move repo to unassigned
selftest/reproducible: Allow native/cross reuse in test
Riyaz Khan (1):
openssh: Remove BSD-4-clause contents completely from codebase
Ross Burton (1):
xserver-xorg: backport fix for CVE-2023-1393
Sakib Sajal (1):
go: fix CVE-2023-24540
Shubham Kulkarni (1):
go: Security fix for CVE-2023-24538
Soumya (1):
perl: fix CVE-2023-31484
Steve Sakoman (3):
Revert "xserver-xorg: backport fix for CVE-2023-1393"
poky.conf: bump version for 4.0.10
build-appliance-image: Update to kirkstone head revision
Thomas Roos (1):
oeqa/utils/metadata.py: Fix running oe-selftest running with no distro set
Tom Hochstein (2):
piglit: Add PACKAGECONFIG for glx and opencl
piglit: Add missing glslang dependencies
Upgrade Helper (1):
waffle: upgrade 1.7.0 -> 1.7.2
Virendra Thakur (1):
qemu: Whitelist CVE-2023-0664
Vivek Kumbhar (3):
freetype: fix CVE-2023-2004 integer overflowin in tt_hvadvance_adjust() in src/truetype/ttgxvar.c
go: fix CVE-2023-24534 denial of service from excessive memory allocation
go: fix CVE-2023-24539 html/template improper sanitization of CSS values
Wang Mingyu (2):
wpebackend-fdo: upgrade 1.14.0 -> 1.14.2
xserver-xorg: upgrade 21.1.7 -> 21.1.8
Yoann Congal (1):
linux-yocto: Exclude 121 CVEs already fixed upstream
Yogita Urade (2):
xorg-lib-common: Add variable to set tarball type
libxpm: upgrade 3.5.13 -> 3.5.15
Zhixiong Chi (1):
libpam: Fix the xtests/tst-pam_motd[1|3] failures
Zoltan Boszormenyi (1):
piglit: Fix build time dependency
bkylerussell@gmail.com (1):
kernel-devsrc: depend on python3-core instead of python3
leimaohui (1):
nghttp2: Deleted the entries for -client and -server, and removed a dependency on them from the main package.
meta-security: cc20e2af2a..d398cc6ea6:
Armin Kuster (1):
apparmor: fix ownership issues
Josh Harley (1):
Add EROFS support to dm-verity-img class
Maciej Borzęcki (1):
dm-verity-img.bbclass: add squashfs images
Peter Marko (1):
tpm2-tss: upgrade to 3.2.2 to fix CVE-2023-22745
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I683201033cfd1b1135738f49b0faf6df2e6348b6
Diffstat (limited to 'poky/meta/recipes-core/systemd/systemd/0001-network-remove-only-managed-configs-on-reconfigure-o.patch')
-rw-r--r-- | poky/meta/recipes-core/systemd/systemd/0001-network-remove-only-managed-configs-on-reconfigure-o.patch | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/poky/meta/recipes-core/systemd/systemd/0001-network-remove-only-managed-configs-on-reconfigure-o.patch b/poky/meta/recipes-core/systemd/systemd/0001-network-remove-only-managed-configs-on-reconfigure-o.patch new file mode 100644 index 0000000000..8950981d2e --- /dev/null +++ b/poky/meta/recipes-core/systemd/systemd/0001-network-remove-only-managed-configs-on-reconfigure-o.patch @@ -0,0 +1,358 @@ +From 31b25c7d360a2ef2da1717aa39f190de5222d11a Mon Sep 17 00:00:00 2001 +From: Yu Watanabe <watanabe.yu+github@gmail.com> +Date: Mon, 31 Jan 2022 19:08:27 +0900 +Subject: [PATCH] network: remove only managed configs on reconfigure or + carrier lost + +Otherwise, if the carrir of the non-managed interface is lost, the +configs such as addresses or routes on the interface will be removed by +networkd. + +Upstream-Status: Backport [systemd v251 a0e99a377a2f22c0ba460d3e7228214008714c14] +Signed-off-by: C. Andy Martin <cam@myfastmail.com> +--- + src/network/networkd-address.c | 13 +++++-------- + src/network/networkd-address.h | 2 +- + src/network/networkd-link.c | 18 ++++++++++-------- + src/network/networkd-neighbor.c | 6 +++++- + src/network/networkd-neighbor.h | 2 +- + src/network/networkd-nexthop.c | 16 ++++++++++------ + src/network/networkd-nexthop.h | 2 +- + src/network/networkd-route.c | 16 ++++++++++------ + src/network/networkd-route.h | 2 +- + src/network/networkd-routing-policy-rule.c | 4 ++-- + src/network/networkd-routing-policy-rule.h | 2 +- + test/test-network/systemd-networkd-tests.py | 2 +- + 12 files changed, 48 insertions(+), 37 deletions(-) + +diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c +index 7df743efb5..01c1d88dec 100644 +--- a/src/network/networkd-address.c ++++ b/src/network/networkd-address.c +@@ -891,22 +891,19 @@ int link_drop_foreign_addresses(Link *link) { + return r; + } + +-int link_drop_addresses(Link *link) { ++int link_drop_managed_addresses(Link *link) { + Address *address; + int k, r = 0; + + assert(link); + + SET_FOREACH(address, link->addresses) { +- /* Ignore addresses not assigned yet or already removing. */ +- if (!address_exists(address)) ++ /* Do not touch addresses managed by kernel or other tools. */ ++ if (address->source == NETWORK_CONFIG_SOURCE_FOREIGN) + continue; + +- /* Do not drop IPv6LL addresses assigned by the kernel here. They will be dropped in +- * link_drop_ipv6ll_addresses() if IPv6LL addressing is disabled. */ +- if (address->source == NETWORK_CONFIG_SOURCE_FOREIGN && +- address->family == AF_INET6 && +- in6_addr_is_link_local(&address->in_addr.in6)) ++ /* Ignore addresses not assigned yet or already removing. */ ++ if (!address_exists(address)) + continue; + + k = address_remove(address); +diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h +index 41c4ce6fa4..b2110d8d21 100644 +--- a/src/network/networkd-address.h ++++ b/src/network/networkd-address.h +@@ -74,7 +74,7 @@ void address_set_broadcast(Address *a); + + DEFINE_NETWORK_SECTION_FUNCTIONS(Address, address_free); + +-int link_drop_addresses(Link *link); ++int link_drop_managed_addresses(Link *link); + int link_drop_foreign_addresses(Link *link); + int link_drop_ipv6ll_addresses(Link *link); + void link_foreignize_addresses(Link *link); +diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c +index b62a154828..12c592b257 100644 +--- a/src/network/networkd-link.c ++++ b/src/network/networkd-link.c +@@ -1070,27 +1070,27 @@ static int link_drop_foreign_config(Link *link) { + return r; + } + +-static int link_drop_config(Link *link) { ++static int link_drop_managed_config(Link *link) { + int k, r; + + assert(link); + assert(link->manager); + +- r = link_drop_routes(link); ++ r = link_drop_managed_routes(link); + +- k = link_drop_nexthops(link); ++ k = link_drop_managed_nexthops(link); + if (k < 0 && r >= 0) + r = k; + +- k = link_drop_addresses(link); ++ k = link_drop_managed_addresses(link); + if (k < 0 && r >= 0) + r = k; + +- k = link_drop_neighbors(link); ++ k = link_drop_managed_neighbors(link); + if (k < 0 && r >= 0) + r = k; + +- k = link_drop_routing_policy_rules(link); ++ k = link_drop_managed_routing_policy_rules(link); + if (k < 0 && r >= 0) + r = k; + +@@ -1318,7 +1318,9 @@ static int link_reconfigure_impl(Link *link, bool force) { + * link_drop_foreign_config() in link_configure(). */ + link_foreignize_config(link); + else { +- r = link_drop_config(link); ++ /* Remove all managed configs. Note, foreign configs are removed in later by ++ * link_configure() -> link_drop_foreign_config() if the link is managed by us. */ ++ r = link_drop_managed_config(link); + if (r < 0) + return r; + } +@@ -1705,7 +1707,7 @@ static int link_carrier_lost_impl(Link *link) { + if (r < 0) + ret = r; + +- r = link_drop_config(link); ++ r = link_drop_managed_config(link); + if (r < 0 && ret >= 0) + ret = r; + +diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c +index 1766095e53..b58898a6dc 100644 +--- a/src/network/networkd-neighbor.c ++++ b/src/network/networkd-neighbor.c +@@ -406,13 +406,17 @@ int link_drop_foreign_neighbors(Link *link) { + return r; + } + +-int link_drop_neighbors(Link *link) { ++int link_drop_managed_neighbors(Link *link) { + Neighbor *neighbor; + int k, r = 0; + + assert(link); + + SET_FOREACH(neighbor, link->neighbors) { ++ /* Do not touch nexthops managed by kernel or other tools. */ ++ if (neighbor->source == NETWORK_CONFIG_SOURCE_FOREIGN) ++ continue; ++ + /* Ignore neighbors not assigned yet or already removing. */ + if (!neighbor_exists(neighbor)) + continue; +diff --git a/src/network/networkd-neighbor.h b/src/network/networkd-neighbor.h +index e9e1854110..8e3c510cd5 100644 +--- a/src/network/networkd-neighbor.h ++++ b/src/network/networkd-neighbor.h +@@ -34,7 +34,7 @@ int neighbor_compare_func(const Neighbor *a, const Neighbor *b); + + void network_drop_invalid_neighbors(Network *network); + +-int link_drop_neighbors(Link *link); ++int link_drop_managed_neighbors(Link *link); + int link_drop_foreign_neighbors(Link *link); + void link_foreignize_neighbors(Link *link); + +diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c +index b829aaab90..42aa8c4c59 100644 +--- a/src/network/networkd-nexthop.c ++++ b/src/network/networkd-nexthop.c +@@ -613,8 +613,8 @@ static void manager_mark_nexthops(Manager *manager, bool foreign, const Link *ex + if (nexthop->protocol == RTPROT_KERNEL) + continue; + +- /* When 'foreign' is true, do not remove nexthops we configured. */ +- if (foreign && nexthop->source != NETWORK_CONFIG_SOURCE_FOREIGN) ++ /* When 'foreign' is true, mark only foreign nexthops, and vice versa. */ ++ if (foreign != (nexthop->source == NETWORK_CONFIG_SOURCE_FOREIGN)) + continue; + + /* Ignore nexthops not assigned yet or already removed. */ +@@ -641,7 +641,7 @@ static void manager_mark_nexthops(Manager *manager, bool foreign, const Link *ex + } + } + +-static int manager_drop_nexthops(Manager *manager) { ++static int manager_drop_marked_nexthops(Manager *manager) { + NextHop *nexthop; + int k, r = 0; + +@@ -704,14 +704,14 @@ int link_drop_foreign_nexthops(Link *link) { + + manager_mark_nexthops(link->manager, /* foreign = */ true, NULL); + +- k = manager_drop_nexthops(link->manager); ++ k = manager_drop_marked_nexthops(link->manager); + if (k < 0 && r >= 0) + r = k; + + return r; + } + +-int link_drop_nexthops(Link *link) { ++int link_drop_managed_nexthops(Link *link) { + NextHop *nexthop; + int k, r = 0; + +@@ -723,6 +723,10 @@ int link_drop_nexthops(Link *link) { + if (nexthop->protocol == RTPROT_KERNEL) + continue; + ++ /* Do not touch addresses managed by kernel or other tools. */ ++ if (nexthop->source == NETWORK_CONFIG_SOURCE_FOREIGN) ++ continue; ++ + /* Ignore nexthops not assigned yet or already removing. */ + if (!nexthop_exists(nexthop)) + continue; +@@ -734,7 +738,7 @@ int link_drop_nexthops(Link *link) { + + manager_mark_nexthops(link->manager, /* foreign = */ false, link); + +- k = manager_drop_nexthops(link->manager); ++ k = manager_drop_marked_nexthops(link->manager); + if (k < 0 && r >= 0) + r = k; + +diff --git a/src/network/networkd-nexthop.h b/src/network/networkd-nexthop.h +index 7a8920238c..1e54e9f211 100644 +--- a/src/network/networkd-nexthop.h ++++ b/src/network/networkd-nexthop.h +@@ -44,7 +44,7 @@ int nexthop_compare_func(const NextHop *a, const NextHop *b); + + void network_drop_invalid_nexthops(Network *network); + +-int link_drop_nexthops(Link *link); ++int link_drop_managed_nexthops(Link *link); + int link_drop_foreign_nexthops(Link *link); + void link_foreignize_nexthops(Link *link); + +diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c +index ee7a535075..7e6fe8bc11 100644 +--- a/src/network/networkd-route.c ++++ b/src/network/networkd-route.c +@@ -788,8 +788,8 @@ static void manager_mark_routes(Manager *manager, bool foreign, const Link *exce + if (route->protocol == RTPROT_KERNEL) + continue; + +- /* When 'foreign' is true, do not remove routes we configured. */ +- if (foreign && route->source != NETWORK_CONFIG_SOURCE_FOREIGN) ++ /* When 'foreign' is true, mark only foreign routes, and vice versa. */ ++ if (foreign != (route->source == NETWORK_CONFIG_SOURCE_FOREIGN)) + continue; + + /* Do not touch dynamic routes. They will removed by dhcp_pd_prefix_lost() */ +@@ -834,7 +834,7 @@ static void manager_mark_routes(Manager *manager, bool foreign, const Link *exce + } + } + +-static int manager_drop_routes(Manager *manager) { ++static int manager_drop_marked_routes(Manager *manager) { + Route *route; + int k, r = 0; + +@@ -955,14 +955,14 @@ int link_drop_foreign_routes(Link *link) { + + manager_mark_routes(link->manager, /* foreign = */ true, NULL); + +- k = manager_drop_routes(link->manager); ++ k = manager_drop_marked_routes(link->manager); + if (k < 0 && r >= 0) + r = k; + + return r; + } + +-int link_drop_routes(Link *link) { ++int link_drop_managed_routes(Link *link) { + Route *route; + int k, r = 0; + +@@ -973,6 +973,10 @@ int link_drop_routes(Link *link) { + if (route_by_kernel(route)) + continue; + ++ /* Do not touch routes managed by kernel or other tools. */ ++ if (route->source == NETWORK_CONFIG_SOURCE_FOREIGN) ++ continue; ++ + if (!route_exists(route)) + continue; + +@@ -983,7 +987,7 @@ int link_drop_routes(Link *link) { + + manager_mark_routes(link->manager, /* foreign = */ false, link); + +- k = manager_drop_routes(link->manager); ++ k = manager_drop_marked_routes(link->manager); + if (k < 0 && r >= 0) + r = k; + +diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h +index e3e22a5985..2180a196fc 100644 +--- a/src/network/networkd-route.h ++++ b/src/network/networkd-route.h +@@ -82,7 +82,7 @@ int route_remove(Route *route); + + int route_get(Manager *manager, Link *link, const Route *in, Route **ret); + +-int link_drop_routes(Link *link); ++int link_drop_managed_routes(Link *link); + int link_drop_foreign_routes(Link *link); + void link_foreignize_routes(Link *link); + +diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c +index 90086f35a7..d4363060d8 100644 +--- a/src/network/networkd-routing-policy-rule.c ++++ b/src/network/networkd-routing-policy-rule.c +@@ -653,8 +653,8 @@ static void manager_mark_routing_policy_rules(Manager *m, bool foreign, const Li + if (rule->protocol == RTPROT_KERNEL) + continue; + +- /* When 'foreign' is true, do not remove rules we configured. */ +- if (foreign && rule->source != NETWORK_CONFIG_SOURCE_FOREIGN) ++ /* When 'foreign' is true, mark only foreign rules, and vice versa. */ ++ if (foreign != (rule->source == NETWORK_CONFIG_SOURCE_FOREIGN)) + continue; + + /* Ignore rules not assigned yet or already removing. */ +diff --git a/src/network/networkd-routing-policy-rule.h b/src/network/networkd-routing-policy-rule.h +index f52943bd2e..7cc6f55c8d 100644 +--- a/src/network/networkd-routing-policy-rule.h ++++ b/src/network/networkd-routing-policy-rule.h +@@ -71,7 +71,7 @@ int manager_drop_routing_policy_rules_internal(Manager *m, bool foreign, const L + static inline int manager_drop_foreign_routing_policy_rules(Manager *m) { + return manager_drop_routing_policy_rules_internal(m, true, NULL); + } +-static inline int link_drop_routing_policy_rules(Link *link) { ++static inline int link_drop_managed_routing_policy_rules(Link *link) { + assert(link); + return manager_drop_routing_policy_rules_internal(link->manager, false, link); + } +diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py +index ac2c1ba034..ed4d4992b1 100755 +--- a/test/test-network/systemd-networkd-tests.py ++++ b/test/test-network/systemd-networkd-tests.py +@@ -3876,7 +3876,7 @@ class NetworkdBridgeTests(unittest.TestCase, Utilities): + print(output) + self.assertRegex(output, 'NO-CARRIER') + self.assertNotRegex(output, '192.168.0.15/24') +- self.assertNotRegex(output, '192.168.0.16/24') ++ self.assertRegex(output, '192.168.0.16/24') # foreign address is kept + + print('### ip -6 route list table all dev bridge99') + output = check_output('ip -6 route list table all dev bridge99') +-- +2.34.1 + |