Add a CRAM test covering FEAT-105. The test consists of:
- Enable all vaps
- Enable power save on 2.4.GHz radio
- Check the behavior of radio and vaps
References: FEAT-105,PPM-3928
Signed-off-by: Houssem Dafdouf <houssem.dafdouf_ext@softathome.com>
Restore the unintentionally removed prplmesh resume step that was
pushed during FEAT-389 integration.
References: FEAT-105,PPM-3928
Signed-off-by: Houssem Dafdouf <houssem.dafdouf_ext@softathome.com>
Restore the MLDUnit relative to BH interfaces to ensure the test
environment is properly cleaned up after execution.
Not restoring the BHs MLDUnit may affect the behavior of the following
tests.
References: PPM-3928
Signed-off-by: Houssem Dafdouf <houssem.dafdouf_ext@softathome.com>
Integrates following changes:
- pwhm: Radio Off Power Save RPC (90f384b6)
- 73a00c8a: ("dm-mapper: add mapping for SetRadioPowerDown()", 2026-08-05)
References: PPM-3928, FEAT-105
Signed-off-by: prplbot <bot@prplfoundation.org>
Signed-off-by: FAOUZI YAHYA <faouzi.yahya_ext@softathome.com>
Add automated tests for container capabilities behavior
- Verify that in unprivileged mode with EnableHostCapabilities disabled,
containers cannot use assigned capabilities or bind to system ports
as non-root users.
- Verify that in unprivileged mode with EnableHostCapabilities enabled,
containers can use assigned capabilities, bind to system ports,
and run processes as non-root users, with proper filtering of blacklisted capabilities.
References: PCF-2687
Signed-off-by: Jef Steelant <jef.steelant_ext@softathome.com>
The three waits in 018-dhcpv4-client-options.t let dnsmasq record the lease
and dhcpv4-manager propagate the client and its options into
Device.DHCPv4.Server.Pool.Client. before the following ba-cli queries read
them back. On the testbed that propagation completes well within a second,
so three seconds only lengthens the run.
Reduce the three waits to one second, saving six seconds per run.
References: PPW-2188
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Problem: 017-dhcpv4-force-option.t intermittently fails with a bare [2] on
the two probes that follow the Force=0 write, while the Force=1 probe just
before them passes.
Writing a Device.DHCPv4.Server. parameter makes dhcpv4-manager rewrite the
dnsmasq configuration and restart dnsmasq. The test only waited one second
afterwards and dhcpv4_option_probe.py sent its DHCPDISCOVER exactly once,
so a request issued during that restart window was lost and the probe gave
up after the timeout instead of reporting the option state under test.
The reason was invisible: all five probe error paths wrote to stderr, which
the test discards with 2>/dev/null, so every one of them looked identical in
the .t.err artifact.
Solution:
- retransmit an unanswered DHCPDISCOVER/DHCPREQUEST, --retries (default 2)
- print the ERROR line on stdout so it stays visible in the Cram diff
- release the lease on the last probe so no lease is left behind
A passing run is unaffected: retransmission stops as soon as the reply
arrives and nothing is written to stderr on success.
References: PPW-2188
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Currently, prplMesh does not know which channel–bandwidth combinations
are valid and therefore saves all possible combinations. This results
in many errors spamming the logs.
To fix this, `getApplicableBandwidthPerChannel` was implemented. From now
on, prplMesh will only use channel–bandwidth combinations that are
reported by pwhm for a specific `Radio` object.
Integrates:
pwhm:
- a6e7f5b02: ("tests: test _getApplicableBandwidthPerChannel()", 2026-08-05)
- 45299bfe8: ("tests: unit test for wld_channel_getApplicableBwMask", 2026-08-03)
- 378ed4936: ("pwhm: radio: implement getApplicableBandwidthPerChannel", 2025-11-12)
prplmesh-dm-mapper:
- 14a466d: ("odl: add getApplicableBandwidthPerChannel()", 2026-08-11)
Closes PPM-3575
References: PPM-3575
Signed-off-by: Kysil Dmytro <d.kysil@inango-systems.com>
signed-off-by: Hela Saadani <hela.saadani_ext@softathome.com>
An automatic CRAM job waits for a manual build only when that build is
non-optional and not allowed to fail. Leaving the manual build default
in place would skip the downstream job initially and could run it after
a failed build.
Override rules on the six builds consumed by automatic CRAM jobs. Make
a build blocking exactly when its board's automatic job is armed, using
the same changes anchors and label policy. Keep variable and skip
stand-down paths manual and non-blocking.
GitLab gives a manual job selected through rules the real default of
allow_failure: false. Scope the explicit non-blocking fallback to merge
request pipelines so non-arming MRs do not block, while push, web, API,
and branch pipelines retain their existing implicit blocking form.
Preserve schedule, designated-branch, and release-tag behavior. Leave
the x86_64 and extender builds unchanged.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Merge request changes currently leave all component CRAM jobs dormant.
Reviewers cannot see the selected coverage without resolving the matrix
themselves, and playing a bucket job cannot combine affected components
into one boot.
Add per-board changes anchors and six automatic component jobs. Resolve
their content from refreshed merge request labels and the diff before
any testbed setup. Exit cleanly without DUT cleanup when selection is
empty.
An automatic selection resolves a union of components that can become a
full run, so give these jobs the full-tier 85-minute budget instead of
the 40-minute component budget they would otherwise inherit.
Add an MR-only report job that prints the complete selection matrix
without a build or hardware dependency. Keep all 24 existing bucket jobs
unchanged.
The automatic template originally extended .cram_component as the later
parent after each board template. GitLab's parent precedence therefore
reapplied generic .testbed variables over board-specific values. This
changed DUT_WAN_INTERFACE on Freedom, Omnia, Haze, Mozart, and Valyrian,
and DUT_ARCH_PACKAGES_PATH on OSPv2, Haze, Mozart, and Valyrian. The
resulting Freedom failures exposed the wrong interface:
```text
014-firewall-levels.t: grep $DUT_WAN_INTERFACE -> [1]
045-qos.t: grep $DUT_WAN_INTERFACE -> [1]
```
Make .cram_component_auto a standalone overlay because the board parent
already supplies the component script and testbed chain. Add a committed
guard that resolves all six extends chains and requires each automatic
job to preserve its full-bucket sibling's variables.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The selection matrix must remain synchronized with profile additions and
the rules that phase 2 will wire into automatic jobs. Silent divergence
would either miss required testing or arm a job with no useful work.
Require every tracked or untracked profile to match a selection row.
Lock the derived per-board changes lists with count and digest fixtures.
When automatic jobs exist, compare their rules directly. Until then,
report the missing wiring and keep the CI-7 lint invocation green.
Verify all 29 profiles are categorized. Confirm an uncategorized
synthetic profile and an invalid drift fixture both fail. Then remove
the probe.
Add an offline fixture for every matrix row and a synthetic Git-history
battery for bucketing, unions, collapse, precedence, empty outcomes,
resolution errors, and fork-shaped refs.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Automatic component jobs need one reviewed source for path-to-board and
path-to-component decisions. Keeping that policy beside the existing
test buckets lets shared code classify changed tests consistently.
Add the six-board selection matrix and all board-specific,
cross-cutting, and explicit no-op paths. Validate the matrix while
loading the manifest.
Add a resolver for variable and label precedence, Git diffs, all-match
component unions, full collapse, empty reasons, and report output.
Exercise union routing, test classification, collapse, precedence,
stand-down reasons, defensive label errors, and six-board reporting
in an offline synthetic repository. Component coverage stays green.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Multi-component changes currently require separate CRAM jobs. They
repeat the board boot. The automatic selector needs one resolver
invocation that can cover all affected component buckets.
Accept comma-separated components and build their ordered union from
the legacy full-suite order. Prefix sanity tests once, remove duplicate
tests and retain the existing behavior for every single component and
full.
Compare all five legacy selections on all six boards with the CI-7 base.
All 30 outputs are byte-identical. Verify forward and reverse
two-component unions on all six boards, including stable ordering and
uniqueness.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Keep feed pin changes isolated so diff-based CRAM selection can map each
feed update to the component it affects.
Move the three prpl_core feed entries into dedicated profile files and
include them from prpl_core. Preserve each feed entry byte-for-byte.
Run scripts/gen_config.py for all nine build-test profile argument sets
at the base pin and after the split. The offline harness allowed local
feed setup while suppressing network update/install and make
subprocesses. All 27 generated stdout, .config, and feeds.conf artifacts
were identical.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Point the feed_prplos revision at the uboot-tools fix for the host
build breakage caused by the swig 4.5.0 release on PyPI: pylibfdt's
isolated PEP 517 build environment installs swig unpinned, and the
stricter find_package(PCRE2 10.39 REQUIRED COMPONENTS 8BIT) check in
4.5.0 rejects the buildroot's static host pcre2 CMake config:
Could NOT find PCRE2: missing: 8BIT (found .../pcre2-config.cmake
(found suitable version "10.42.0", minimum required is "10.39"))
ERROR: package/feeds/feed_prplos/uboot-tools [host] failed to build.
Last good pipeline 2761854007 (2026-08-15), first bad 2781934108
(2026-08-22); the swig release date of 2026-08-21 falls between the
two runs and no commit in that range touches the package.
The feed change pins swig to 4.4.1 through a constraints file exported
via PIP_CONSTRAINT, which pip forwards into isolated build
environments. Validated with a local fail-then-pass rebuild of the
uboot-tools host package.
Closes: PPW-2321
Assisted-by: claude:fable-5
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Integrates following changes:
* 03fd769fd genEvt: ensure wds station seen and auth before assuming connection
* e628fbb44 genEvt: assume deauthTx and disassocTx as disconnection events
* 45e811b66 genVap: detect disconnected station when getting single station stats
* 1c1a40cfd nl80211: fix retcode when station entry is not found
References: PPW-1523
Signed-off-by: prplbot <bot@prplfoundation.org>
Integrates following changes:
- b604e81: ("odl: correct version information for Security.Certificate", 2026-07-30)
References: PPW-2233
Signed-off-by: Jen Freeman <jen.freeman@consult.red>
signed-off-by: Hela Saadani <hela.saadani_ext@softathome.com>
Component jobs currently inherit the full-tier 85-minute timeout.
Measured runs peak at 35.8 minutes for components and 80.8 minutes for
the full tier.
Set each tier to the smallest five-minute multiple at least four
minutes above its maximum observed duration. This gives component jobs
40 minutes and retains 85 minutes for full jobs.
Keep the full-job limit explicit because those jobs would otherwise
inherit the new component limit. A hung component job now releases its
device roughly 45 minutes sooner.
Assisted-by: claude:opus-5:orchestrator
Assisted-by: codex:gpt-5.6-sol:medium-fast
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
run_check reports a failed command by expanding its complete argument
list. A full Freedom cram run carries about 199 test paths, producing
one roughly 13,000-character log line that obscures the actual failure.
The test arguments form a contiguous .t suffix. Count and replace only
that suffix with `(N tests)` in failure diagnostics, leaving the command
head and non-test invocations unchanged. Keep executing the original
arguments and preserve status and sentinel handling.
Cram's --verbose job output still lists each test path and result. The
component resolver continues to emit the selected path list used by the
job.
Assisted-by: claude:opus-5:orchestrator
Assisted-by: codex:gpt-5.6-sol:medium-fast
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The LCM bridge carrier reflects whether its container-side port is
live. Split execution can inspect it before the LCM suite tears that
state down, so the bridge can appear either live or without carrier.
Carrier state is not the route line's only variable part: ip route
also emits a trailing separator. Account for that separator after the
optional linkdown flag so both carrier states match.
Accept both observed route and link forms in every board's copy of the
affected expectations while keeping every address, interface
attribute, and the carrier-to-state pairing constrained.
Assisted-by: codex:gpt-5
Assisted-by: claude:opus-5:orchestrator
Assisted-by: codex:gpt-5.6-sol:medium-fast
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The split prplos bucket reaches the discovery assertions sooner than the full suite and can observe an empty first root device.
Poll for the first root-device UUID for at most one minute before retaining the existing parameter assertions unchanged.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The data-model-mapper sibling test installs its package at runtime and creates Device.X_PRPLWARE-COM_SoftwareModules. The generic inventory must not depend on that sibling side effect.
Filter the mapper-only element following the cellular detachment precedent in e342d300. The mapper test continues to exercise the element in the LCM bucket.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Component jobs start automatically whenever CRAM_COMPONENTS selects
them, and the variable defaults to prplos. Every merge-request pipeline
therefore schedules six hardware jobs whether or not anybody needs
them, and the bucket choice is fixed before the pipeline exists. The
non-DUT manifest lint also starts automatically in non-scheduled
pipelines.
Testbed time is the scarce resource, and the build test jobs feeding
these DUT jobs are already manual in merge-request pipelines. The
natural flow is to pick buckets after a build finishes, not at
pipeline creation. The lint should follow the same opt-in flow.
Drop the CRAM_COMPONENTS default and add trailing manual rules so every
component job and the lint appear as optional play buttons in
non-scheduled pipelines. Manually started jobs never gate the pipeline
result. With no opt-in variable or release-tag override, no cram-related
job at all, lint included, starts automatically.
Setting CRAM_COMPONENTS still starts the listed buckets automatically
with each board's existing blocking behavior. The automatic full run in
prplware release tag pipelines is unchanged.
Assisted-by: claude:fable-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The component manifest lint currently runs only during local validation.
Merge requests get no feedback when new tests silently enter the prplos
remainder.
Add a non-DUT manifest coverage job to every pipeline. Fetch an MR base
when needed and pass it to the lint. Newly-in-remainder warnings then
appear in job output.
Give the job explicit rules: a job without rules keeps the legacy
branches-and-tags default and is never created in merge-request
pipelines, the exact place the diff-base comparison exists for. Skip
scheduled pipelines, which carry no cram work.
Use the digest-pinned testbed v1.3.0 image for Python, YAML, and git. The
MR diff-base comparison requires runtime git for cat-file, fetch, and the
lint script's child processes.
The image runs as the testbed user while the runner checkout has a
different owner. Git otherwise rejects the checkout before lint starts:
```text
fatal: detected dubious ownership in repository at
'/builds/prpl-foundation/prplos/prplos'
```
Pass a safe.directory override for CI_PROJECT_DIR through Git's inherited
configuration environment. Print the selected MR diff base so the
comparison path remains visible in job evidence. Add no hardware runner
tags or build dependencies.
Assisted-by: codex:gpt-5
Assisted-by: claude:fable-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The hardware cram jobs currently run each board's complete suite. Every
automatic pipeline therefore consumes coverage that can be selected more
cheaply by component.
Add a runtime component template so test collection happens in cram's
checkout and environment. Replace each legacy board job with four static
full, prplmesh, lcm, and prplos jobs selected through the
comma-separated CRAM_COMPONENTS variable.
Name each job `cram <board> [<component>]` and include the selected
component in the expandable test-execution section title.
Move the MXL-specific cram skip from the legacy job-name token. Use the
stable DUT board identifier instead.
Preserve skip behavior under the compact OSPv2 name.
Default automatic pipelines to prplos. Start the full jobs
automatically in prplware release tag pipelines, whose build jobs also
run automatically. Keep cram jobs out of scheduled pipelines entirely,
as with the legacy suite: schedules never create the build jobs these
jobs need, so any selected cram job would fail scheduled pipeline
creation with an unsatisfiable needs reference. Keep the test command,
post suite, timeout, run_check, and JUnit filenames unchanged.
Assisted-by: codex:gpt-5
Assisted-by: claude:fable-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The computed prplos remainder keeps existing tests covered, but it can
also hide accidental classification of newly added tests. Stale or
overlapping component globs can likewise make split jobs unreliable.
The sanity set adds another strict boundary: a sanity test must not also
belong to an explicit component bucket.
Add a location-agnostic lint using the shared bucketing implementation.
Validate the schema, glob coverage, and sanity and explicit-component
exclusivity. Check the reserved smoke and hardware-only sets. Include
sanity in the reported bucket counts. Accept either a Git ref or a file
list as the baseline for newly-in-remainder warnings. Report missing
targets for tracked test symlinks without failing the otherwise valid
manifest.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The legacy cram suite repeats nested directories to run setup-sensitive
tests early. Component jobs need the same ordered and deduplicated file
list without embedding repository locations in the CI configuration.
Some DUT and environment checks also need to run before every split
component because their failure invalidates the rest of that job.
Add a reserved sanity set and the lcm and prplmesh manifest buckets,
keeping prplos as the computed remainder. Remove sanity matches before
partitioning the other tests, and prepend the ordered sanity block when
resolving any split component. Keep full-suite resolution unchanged and
allow the sanity block to be resolved directly for inspection.
Add a shared collector which preserves cram 0.7 traversal and
first-occurrence deduplication. Retain broken test symlinks so
pre-existing tree defects cannot crash list resolution.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Upgrade iperf3 to a version that includes fixes for the CVEs identified
by the BlackDuck security scan.
Resolved vulnerabilities:
- CVE-2024-53580: DoS vulnerability (HIGH)
- CVE-2025-54349: Off-by-one heap overflow in authentication (MEDIUM)
- CVE-2025-54350: Security issue resolved by upstream release
- CVE-2025-54351: Buffer overflow in UDP MSG_TRUNC/zerocopy path (HIGH)
References: PPW-2137
Signed-off-by: FAOUZI YAHYA <faouzi.yahya_ext@softathome.com>
Changes made in this commit f694f20d9b were undone by this one 8b7913caef causing an issue with the builds
the goal of this MR is to restore that change
References: PCF-2730
Signed-off-by: Hela Saadani <hela.saadani_ext@softathome.com>
Upstep Botan from 2.19.4 to 3.12.0 to address vulnerabilities
reported by the BlackDuck scan on the Fast Track platforms.
The update covers the reported CVEs that are fixed in newer Botan releases:
CVE-2026-32877 / BDSA-2026-5921, fixed in Botan 3.11.0
CVE-2026-32884 / BDSA-2026-5922, fixed in Botan 3.11.0
CVE-2024-39312 / BDSA-2024-4197, fixed in Botan 3.5.0 and 2.19.5
CVE-2024-34702 / BDSA-2024-4196, fixed in Botan 3.5.0 and 2.19.5
References: PPW-2051
Signed-off-by: Matthias Franck <matthias.franck@softathome.com>
The packages feed revision bumped by this alignment moves hwdata from
0.387 to 0.407. Its pci.ids now carries a name for 17cb:0308, so lspci
reports "SDX61/SDX62/SDX65 [Snapdragon 5G X6X-series]" where it used to
fall back to "Device 0308".
References: PPW-1773, PPW-2138, PPW-1785
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Some default config options in the curl package changed, so let's align the tests accordingly.
See:
f693e556aca9bd8f6f58b087bf18412dbe2c0008
References: PPW-1773, PPW-2138, PPW-1785
Signed-off-by: Matthias Franck <matthias.franck@softathome.com>
Manually update the PCS driver with new proposed upstream version. This
can't be normally cherry-picked from main branch as main branch now use
standalone PCS feature that is problematic to port for very old kernel
(6.6)
Link: https://github.com/openwrt/openwrt/pull/24263
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
(cherry picked from commit 443ec4032a78cbeb52c5761b7702033904fa6a11)
changelog: https://salsa.debian.org/debian/ca-certificates/-/blob/master/debian/changelog
* Remove ca-certificates-local example (closes: #988912, #1127101).
* Update Mozilla certificate authority bundle to version 2.86
The following certificate authority was added (+):
+ e-Szigno TLS Root CA 2023
The following certificate authorities were removed (-):
- QuoVadis Root CA 2
- QuoVadis Root CA 3
- DigiCert Assured ID Root CA
- DigiCert Global Root CA
- DigiCert High Assurance EV Root CA
- SwissSign Gold CA - G2
- SecureTrust CA
- Secure Global CA
- COMODO Certification Authority
- Certigna
- certSIGN ROOT CA
- AffirmTrust Commercial
- AffirmTrust Networking
- AffirmTrust Premium
- AffirmTrust Premium ECC
- TeliaSonera Root CA v1
- Entrust Root Certification Authority - G2
- Entrust Root Certification Authority - EC1
- Trustwave Global Certification Authority
- Trustwave Global ECC P256 Certification Authority
- Trustwave Global ECC P384 Certification Authority
- GLOBALTRUST 2020
- GTS Root R2
- FIRMAPROFESIONAL CA ROOT-A WEB
The following certificate authority was renamed (~):
~ "OISTE Server Root RSA G1" (removed leading space)
Signed-off-by: Fengyu Wu <saldry@proton.me>
Link: https://github.com/openwrt/openwrt/pull/23675
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
(cherry picked from commit 8aaa8d401308d32806c080aab458c3f08208cbf0)
(cherry picked from commit 8b29bf400569335f27e6ebac22f68c5b3254238f)