Compare commits

...
413 Commits
Author SHA1 Message Date
Joachim WibergandGitHub 75c25201ae Merge pull request #1215 from kernelkit/robustness
Add error handling to prevent interface query failures

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 16:16:36 +01:00
Joachim Wiberg f1f2c66934 statd: wifi: Add error handling to prevent interface query failures
Wrap wpa_cli operations in try-except blocks to ensure WiFi errors don't
cause sysrepocfg to fail.  Interface queries now return data for working
interfaces even when WiFi has issues.

Fixes:

    admin@rpi-79-41-1d:/> show interfaces
    Error running sysrepocfg: Command '['sysrepocfg', '-f', 'json', '-X', '-d', 'operational', '-x', '/ietf-interfaces:interfaces']' returned non-zero exit status 1.
    No interface data retrieved.
    admin@rpi-79-41-1d:/>

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 14:44:43 +01:00
Joachim WibergandGitHub 4b37474d8e Merge pull request #1214 from kernelkit/rpi-and-more
Board refactor, sensors and NanoPi R2S, RPi 3B + CM4 support

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 14:31:18 +01:00
Joachim Wiberg b1e08bd32f doc: update ChangeLog for v25.10 release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:10 +01:00
Joachim Wiberg 2fa495b112 .github: cleanup podman state before each run
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:09 +01:00
Joachim Wiberg 02615be500 configs: rename BPi-R3 bootloader defconfig for consistency
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:09 +01:00
Joachim Wiberg daf8b29178 uttls/mkimage.sh: consolidate sdcard.img generation
This commit consolidates mkimage.sh scripts into a unified SD card image
creation tool that works for all boards.  It needs a bootloader an $ARCH
rootfs.squashfs image and a genimage.cfg.in template.

- Detects build directories from `O=` environment variable or `output/`
- Sources `.config` to discover Buildroot paths
- Uses Buildroot's `support/scripts/genimage.sh` when available
- Automatically generates `.bmap` files if `bmaptool` is available
- Fallback to direct `genimage` invocation if wrapper not found

See the online instructions for usage.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:09 +01:00
Joachim Wiberg 24755e7e5f board/aarch64: add broken-flow-control interface quirk
Add new interface quirk to allow skipping disabling of flow control on
all RPi 3B/4B devices that have the smsc95xx driver.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:08 +01:00
Joachim Wiberg 4b55e38741 board/aarch64: use %m modifier in default xPi hostnames
The xPi's usually don't have a VPD so the chassis mac-address probed at
boot is usually null in /run/system.json.  This commit adds a fallbkack
mechanism to populate this field so it can be used for unique hostnames
even on these boards.

Ths ietf-hardware.yang model does not have a notion of physical address,
so we augment one tht is generic enought to be used for other hardware
components than Ethernet, similar to what ietf-interfaces.yang use.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:08 +01:00
Joachim Wiberg c66c0b46b5 board/aarch64: update BPi-R3 factory-config
- Enable bridging of LAN ports in br0, default IP: 192.168.0.1/24
- Enable firewall with two zones: 'wan' and 'lan', policy: lan-to-wan
- Enable DHCP server on br0

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:07 +01:00
Joachim Wiberg 7784e68347 board/aarch64: bump NanoPi R2S to tier 2 status
This commit drops the board specific defconfig in favor of proper BSP
support for the FriendlyARM NanoPi R2S to Infix as part of the default
Aarch64 build.

The name FriendlyARM was elected over FriendlyELEC ("new" name) to be
consistent with both kernel and Buildroot naming standards.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:07 +01:00
Joachim Wiberg ab56c1be50 Relocate src/board/* and package/board/* to board/
This commit consolidates all BSP support files into the Buildroot standard
board/ directory.  The concept of selectable boards in menuconfig remains
as-is but now lives in board/ instead.

Drop support for board-specific post-build.sh scripts, not needed atm. and
we should really use Buildroot _POST_INSTALL_HOOKS in the board .mk files
instead.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:06 +01:00
Joachim Wiberg 8af593707a Rename raspberry-pi-4 -> raspberry-pi64
With the additional support for RPi3, including Zero 2W, this commit renames
all relevant directories and Config.In options to match.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:06 +01:00
Joachim Wiberg 20d09febeb test: fix container-upgrade $ARCH mapping on Aarch64 systems
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:05 +01:00
Joachim Wiberg 921c4c809d test: update mock data for 'show hardware'
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:05 +01:00
Joachim Wiberg d1fda087ec statd: refactor, use parent node for sensor relationships
For more advanced hardware with multiple sensor types per device
(e.g., SFP modules with temperature, voltage, current, and power
sensors), use the YANG parent/child relationship to group related
sensors together for better presentation.

Changes:
 - Remove parent/parent-rel-pos deviations from infix-hardware.yang
 - Create parent components (class: module) for multi-sensor devices
 - Add parent references to child sensor components
 - Add human-readable descriptions from hwmon labels
 - Extend hwmon discovery to support voltage, current, and power
 - Normalize sensor names: strip vendor prefixes (mt7915_phy0 -> phy0)
 - Remove redundant TYPE column, clarify units (V -> VDC, add spaces)
 - Simplify child sensor display by stripping parent prefix
 - Fix "show system" to only show CPU temperature and fan speed

Example output from "show hardware":

  NAME                     VALUE               STATUS
  ===================================================
  sfp1:
    Rx Power               0.000 W             ok
    Tx Power               0.001 W             ok
    Vcc                    3.35 VDC            ok
    Bias                   0.006 A             ok
    Temperature            30.3 °C             ok

  sfp2:
    Rx Power               0.000 W             ok
    Tx Power               0.001 W             ok
    Vcc                    3.34 VDC            ok
    Bias                   0.006 A             ok
    Temperature            32.0 °C             ok

  cpu                      42.8 °C             ok
  phy0                     47.0 °C             ok
  phy1                     53.0 °C             ok

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:04 +01:00
Joachim Wiberg 46919e2d1f statd: add chassis information to ietf-hardware.yang
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:04 +01:00
Joachim Wiberg 08c9c97823 confd: add system resource usage to ietf-system.yang
This commit adds resource usage: memory, loadavg, and filesystem usage
by augmenting ietf-system:/system-state.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:03 +01:00
Joachim Wiberg 8b10cce172 confd: add support for temperature sensors in ietf-hardware.yang
- Remove class deviation to allow iana-hardware:sensor
 - Populate sensor operational data from /sys/class/thermal
 - Extend 'show hardware'

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:03 +01:00
Joachim Wiberg ee6def793c cli: add 'reboot' option to upgrade command
Usually, when upgrading a system, you want to reboot it so the upgrade
takes effect.  This commit adds a 'reboot' option/flag, alongside the
'force' option, to facilitate this.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:02 +01:00
Joachim Wiberg ee37a19ab0 cli: add support for admin-exec 'show system' overview
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:02 +01:00
Joachim Wiberg 3265f46990 board/aarch64: ensure dwc2 controller is in host mode
The DWC2 controller is a very common IP block in ARM and RiscV SoCs.  With the
USB subsystem back to a built-in we can now enable host mode for the DWC2 (USB
2.0) ports on RPi.  It also opens up for merging the NanoPi R2S into the
generic aarch64 build.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:02 +01:00
Joachim Wiberg e39b9cfee4 board/common: allow resizing /var on any mmc block device
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:01 +01:00
Joachim Wiberg db06ddb93b board/common: move resize2fs of /var to after reboot
On some boards, and in particular with a hybrid mbr/gpt partition table,
like on the RPi64, we must resize ext *after* reboot.

Also, do some cleanup and consolidation of error handling to prevent us
from entering an endless boot loop.

Follow-up to 391e9715

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:01 +01:00
Joachim Wiberg 6aaf612095 board/common: simplify USB port discovery and fix duplicate entries
This commit refactors USB port probing to:

- Eliminate duplicates: previously, 'authorized' and 'authorized_default'
  were listed as separate USB port entries (confusing).  Now each USB
  port is represented once, with the path pointing to the USB device
  directory, confd appends the appropriate attribute file as needed

- Add support for Raspberry Pi 4B and CM4 USB port(s) using a generic
  discovery function that scans /sys/bus/usb/devices for USB root hubs.
  This should work seamlessly across all platforms

- For backwards compatibility and better UX:
   - Single USB port systems: Named "USB" (no number)
   - Multi-port systems: Named "USB1", "USB2", etc.

- Device tree-based discovery is tried first (for boards like Alder with
  explicit DT USB port definitions), with fallback to generic discovery
  for boards without DT

Fixes: #315

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:00 +01:00
Joachim Wiberg 54d88cc00e Support for Compute Module 4 IoT Router Broad Mini
This commit adds support for the Raspberry Pi CM4 based mini DFRobot IoT
Router board, SKU:DFR0767.  It comes with an additional RTL8111 PCIe NIC
hence the addidtional kernel module and firmware.  The latter fixes:

r8169 0000:01:00.0: Direct firmware load for rtl_nic/rtl8168h-2.fw failed with error -2
r8169 0000:01:00.0: Unable to load firmware rtl_nic/rtl8168h-2.fw (-2)

Please note, the change in BCMGENET from module to built-in is to ensure
it is probed before any PCIe NIC, both this board and the CM4-based NVME
NAS base board enumerate the built-in MAC as eth0.

Also, unlike the RPi 3B/4B, it is not a given fact that a CM4 based board
comes with WiFi onboard, and since most compute module setups are DYI, we
take the easy way out and leave it as an exercise to the user to add WiFi
interface to the config.

https://wiki.dfrobot.com/Compute_Module_4_IoT_Router_Board_Mini_SKU_DFR0767

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:00 +01:00
Joachim Wiberg 9b057ad547 Support for Raspberry Pi 3B (BCM2837)
The BCM2837 core is used not just in the RPi 3B but also in the Zero 2W,
both device trees have been added to the board config.

The BCM2711 support has been extended to include RPi 400 and CM4 I/O.

To support the BCM2837 family more firmware options habe been enabled,
since the RPi3 does not have bootcode.bin flashed in the SoC.  The SD
card image now uses a hybrid GPT/MBR format so the RPi3 bootcode.bin
can read all files from the first VFAT partition.

The default device tree for Linux is now chosen by the U-Boot probe and
the only exception is the "laundry room" detector that looks for a RPi4
with a 7" touch screen, which then selects the DSI enabled RPi4 variant.
This is enough to properly load an RPi 3B and a CM4 based router board.

The BCM2837 does not have PCI/PCIe or a built-in MAC so it relies on the
USB to Ethernet LAN78xx which does not support disabling pause frames.
I have opted for checking for EOPNOTSUPP instead of adding yet another
quirk, because it is likely to be a common limitation of more drivers
and chipsets, and this code is best-effort anyway.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:25:59 +01:00
Joachim Wiberg 937d4c38c7 board: make usb subsystem a built-in
Use kernel cmdline option 'usbcore.authorized_default=2' to lock all
external/user-visible USB ports by default.

The kernel distinguishes internal vs external USB ports using ACPI
methods (_UPC and _PLD) on x86/x86_64 systems.  On ACPI systems, ports
marked as non-visible but connectable are considered internal (e.g.,
hard-wired USB-to-Ethernet adapters) and are automatically authorized,
while user-visible external ports require manual authorization.

However, on device tree systems the kernel lacks a standard mechanism
for identifying internal ports. The 'authorized_default=2' setting falls
back to requiring authorization for all devices on these platforms,

We list user-accessible USB ports in the device tree ('usb-ports' and
'usb-port-names'), with unlisted ports being implicitly internal and
managed separately.

Fixes #1065

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:25:59 +01:00
Joachim Wiberg b2a41e4868 board: drop team support, add common USB to Ethernet drivers
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:25:59 +01:00
Joachim Wiberg 804fd1e08e statd: fix "show firewall" crash if no zone description
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:25:58 +01:00
Joachim WibergandGitHub eb829afb93 Merge pull request #1213 from kernelkit/copyright
Right some wrongs with `copy`

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 12:44:48 +01:00
Mattias WalströmandGitHub aad3f83a6a Merge pull request #1212 from kernelkit/kernel-upgrade 2025-10-29 16:40:36 +01:00
Tobias Waldekranz 0977ab476b bin: copy: Always get startup from sysrepo
This will make sure to apply NACM rules for all the data. It also
makes it possible for a luser access a subset of the data, even if
they to do not have read access to /cfg/startup-config.cfg.
2025-10-29 16:36:04 +01:00
Tobias Waldekranz d26e311c6d bin: copy: Refactor
copy() made some...creative...use of control flow that made it quite
difficult to follow.

Take a first priciples approach to simplify the logic.
2025-10-29 16:36:03 +01:00
Tobias Waldekranz 11cf4ddda9 bin: copy: Add a rudimenary test script
Add a simple script that verifies all the common use-cases of copy.
2025-10-29 16:35:56 +01:00
Mattias Walström b5b35e7615 Update developers guide on howto upgrade Linux kernel 2025-10-29 15:30:10 +01:00
Mattias Walström bb274dcdd7 Automate kernel updates to new minor version
This will fix #1106, in time, but only allows manual trigger for now,
needs more test and verification

utils/kernel-upgrade.sh at least automate all the manual manual processes
for upgrading the kernel.
2025-10-29 15:24:35 +01:00
Mattias Walström 483ee14dbe Upgrade Linux kernel to 6.12.56 (LTS) 2025-10-29 15:11:22 +01:00
Joachim WibergandGitHub 9d271eb7c6 Merge pull request #1033 from kernelkit/yang-add-services
Add new operational support for services

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-29 09:59:33 +01:00
Joachim WibergandGitHub b72fb8fc7d Merge pull request #1211 from kernelkit/misc-fixes 2025-10-28 20:43:19 +01:00
Joachim Wiberg 7e37fc49a3 confd: prevent IP addresses on bridge ports
Bridge ports should not have IP addresses configured. The IP address
should be configured on the bridge interface itself, not its member ports.

Add YANG must expression to enforce this rule at configuration time.

Fixes #1122

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-28 19:35:32 +01:00
Joachim Wiberg cb5d804a88 confd: add dhcp-server validation of address pool and/or static host
A valid DHCP server setup for a subnet is one of pool and/or at least one
static host entry/lease.  If pool is enabled the pool must have a start
and an end address.

To allow setting up a DHCP server with no pool and at least one static host
entry/lease, we make the pool a presence container, otherwise the pool will
always be set and trigger the below inference.

When an interactive CLI/Web user enables the address pool we infer a default
range .100-.250, but only for /24, C-class networks.  This is what most users
know and expect.

The YANG model now validates that:
- If an address pool is created, both start-address and end-address must be set
- Each subnet must have either a pool or at least one static host entry
- The pool container is now a presence container, so "no pool" fully deletes it

Fixes #1121

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-28 19:34:53 +01:00
Joachim Wiberg d80186a556 test/docker: security analysis of GHSA-cq46-m9x9-j8w2 for scapy
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-28 17:31:32 +01:00
Joachim Wiberg f8e62fb8df patch/libyang: follow-up to 77963d5, fix wrong arguments to LOGDBG()
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-28 17:31:31 +01:00
Joachim Wiberg a5fc2f797b .github: add free-disk-space action to generic x86_64 workflow
Addresses disk space issues in GitHub Actions for generic x86_64 builds
by removing unused tools (Android SDK, .NET, Docker images, etc.) before
the build starts.  This frees up ~30GB of space.

Fixes #1210

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-28 17:31:31 +01:00
Richard Alpe b6d7e4f24e test: add unit tests for system services
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-28 16:59:08 +01:00
Richard Alpe cc86463233 confd: use keyless services list, allow duplicate PIDs
Multiple services can have PID 0 when stopped/done, making PID
unsuitable as a unique key. There could also be multiple services with
the same name (I would assume?).

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-28 15:35:44 +01:00
Richard Alpe 3870bd562a cli: add new show services command
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-28 15:14:06 +01:00
Richard Alpe 99dd268682 cli-pretty: add pretty printing of system services
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-28 15:03:57 +01:00
Richard Alpe d457d43753 show: add system services command
Add the command show system services.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-28 15:02:05 +01:00
Richard Alpe c119436f97 confd: augment new services container to ietf-system
This patch adds operational data support for system services. The
data is in a generic format but is intended to be able to represent
finit information (initctl) nicely.

The reason for augmenting this to ietf-system and not to
infix-services is that we consider this generic system information
which is totally disconnected from what ever services infix might
provide.

In this first state we only support pid, name, description and state.
Making the data look something like:

  "infix-system:services": {
    "service": [
      {
        "pid": 1185,
        "name": "udevd",
        "status": "running",
        "description": "Device event daemon (udev)"
      }]

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-27 15:30:29 +01:00
Mattias WalströmandGitHub 3384507040 Merge pull request #1208 from kernelkit/coverity-fixes 2025-10-25 17:32:45 +02:00
Joachim Wiberg b7d91e4747 bin: fix Coverity Scan issues in copy command
Address two issues identified by Coverity Scan:

1. CID 550484 (TOCTOU): Remove access() check before realpath()
   - realpath() already fails if file doesn't exist, making the
     access() check redundant and introducing a TOCTOU race
   - Simplifies code while improving security

2. CID 550483 (CHECKED_RETURN): Mark unchecked remove() calls
   - Add (void) cast to two remove() calls to explicitly indicate
     we don't care about the return value
   - These are cleanup operations for temp files where failure
     is acceptable, even expected

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-25 08:10:30 +02:00
Tobias WaldekranzandGitHub 171b757acb Merge pull request #1206 from kernelkit/upgrade-kernel
Upgrade Linux kernel to 6.12.55 (LTS)
2025-10-23 22:17:25 +02:00
Mattias Walström 2903f6f472 Upgrade Linux kernel to 6.12.55 (LTS) 2025-10-23 21:07:10 +02:00
Joachim WibergandGitHub 18d177328d Merge pull request #1151 from kernelkit/recontain
Container Lifecycle and Upgrade Improvements

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 18:04:01 +02:00
Joachim Wiberg f081bef3ba doc: update changelog with fixes and new features
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:24:01 +02:00
Joachim Wiberg ef73ec6ce8 doc: explain docker image tags and rewrite upgrade section
Much of the content was made obsolete by recent changes, we now optimize
the experience for users, avoiding recreate at boot unless checksums for
configuration or base image have changed.

This was also a good time to explain the difference between mutable and
immutable tags, which sometimes is a cause for great confusion.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:24:00 +02:00
Joachim Wiberg ff175c02f7 doc: add section on container volume management
Since there is no safe way (unique hash/id) to identify unused named
volumes, we cannot automate removal of them.  Since volume data, when
compared to a container image, is quite small, it was decided that we
document this instead.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:24:00 +02:00
Joachim Wiberg 21256a8ac1 bin: add bash completion for copy command
Add bash completion for the common datastores, like we already do in the
CLI, and update the usage text accordingly.

Also, make sure to install to /usr/bin, not /bin since we've now merged
the hierarchies since a while back.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:59 +02:00
Joachim Wiberg 3e03ece1d9 cli: sanitize regular file to file copy
The regular file-to-file copy, was missing calls to cfg_adjust(), this
commit fixes that and adds some helpful comments for each use-case.

Also, drop insecure mktemp() in favor of our own version which uses the
basename of the remote source file.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:59 +02:00
Joachim Wiberg ad96965b16 cli: restrict copy and erase commands
This is a follow-up to PR #717 where path traversal protection was
discussed.  A year later and it's clear that having a user-friendly
copy tool in the shell is a good thing, but that we proably want to
restrict what it can do when called from the CLI.

A sanitize flag (-s) is added to control the behavior, when used in the
shell without -s, both commands act like traditional UNIX tools and do
assume . for relative paths, and allow ../, whereas when running from
the CLI only /media/ is allowed and otherwise files are assumed to be
in $HOME or /cfg

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:59 +02:00
Joachim Wiberg 92e80b4239 cli: fix copy to missing startup-config file
Fixes #981

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:58 +02:00
Joachim Wiberg e6a04fbd95 cli: add 'validate', or '-n', dry run to copy command
This commit adds config file validation to the copy command, discussed
in #373.  Allowing users to test their config files before restoring a
backup.  The feature could also be used for the automatic rollback when
downgrading to an earlier version of the OS.

Fixes #373

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:58 +02:00
Joachim Wiberg 3b24fab324 cli: fix 'copy FILE running-config' use-case
When copying to the running datastore we cannot use sr_copy_config(),
instead we must use sr_replace_config().  This fix covers both the case
of 'copy startup-config running-config' and 'copy FILE running-config'.

Fixes #1203

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:57 +02:00
Joachim Wiberg ce8dc0de9c test: update firewall/basic topology and doc
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:57 +02:00
Joachim Wiberg 9273f4cd1e test: remove redundant container_ prefix from test directories
Rename test directories in infix_containers/ to remove the redundant
'container_' prefix since they already live under infix_containers/:

  container_basic          -> basic
  container_bridge         -> bridge
  container_enabled        -> enabled
  container_environment    -> environment
  container_firewall_basic -> firewall_basic
  container_host_commands  -> host_commands
  container_phys           -> phys
  container_veth           -> veth
  container_volume         -> volume

Also update references in all.yaml and Readme.adoc files.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:56 +02:00
Joachim Wiberg 905df0dab7 test: verify container upgrade
This commit adds four (small) container images to the Infamy test container
which are used in the new container upgrade test.  The test verifies that a
mutable container can be upgraded and that old images are properly cleaned
up from the container store.

Fixes #624

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:56 +02:00
Joachim Wiberg 640a47bceb test: add support for 'make V=1 test-spec' to debug
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:56 +02:00
Joachim Wiberg 671fc93ce0 confd: add support for upgrade action (rpc)
Already supported in the CLI.  This makes it official, and quite handy
for users that run mutable containers.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:55 +02:00
Joachim Wiberg ea2c4be237 container: refactor and cleanup per review comments
Shell script:

 - Factor out big portions of code into more logical helper functions
 - Simplify calling setup script by checking for remote image first
 - Simplify meta/sha up-to-date handling and clarify terminology
 - Consistent use of -f instead of -e in file-exists checks
 - Fix unsafe use of 'mktemp -u'

C code:
 - Clarify meta/sha terminology: rename meta-sha256 -> meta-image-sha256
 - Refactor weird archive_offset() function to local_path() helper
 - Factor out helper function calc_sha()
 - Check len of sha256 >= 64

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:55 +02:00
Joachim Wiberg da5b4bcfff container: remove old image when upgrading at startup
One unique feature of Infix OS is that you can embed your OCI archive in
the rootfs.squashfs.  This way your container instance does not need to
download anything from the network.  To upgrade you drop in a new image
and rebuild Infix, when the new Infix boots the container script 'setup'
command will recognize that the OCI archive has changed and will reload
it into the container store.

This patch is an improvement of the way too generic 'podman image prune'
command used previously.  Instead of looking for any dangling image, we
now surgically remove the old image.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:54 +02:00
Joachim Wiberg f53d26bf34 container: upgrade fixes for mutable images
Container instances that run with mutable images, e.g., tagged with `:latest`
or similar non-versioned tags, can be upgraded without changing the config.

This commit fixes two issues found with this support:

- force container image re-fetch on upgrade, even if the file exists locally
- surgically remove old image from container store after upgrade

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:54 +02:00
Joachim Wiberg 7fbc2eba4f container: make 'container remove' cli command slightly more useful
Usually, when your system is up and running properly, you want to clean
up anything unused from your previous experiments.  This change alllows
that by calling the interactive 'podman image prune -a -f' command from
the CLI command 'container remove all'

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:54 +02:00
Joachim Wiberg 5b7325261a container: use 'nice' for podman load and create
When loading big OCI images at boot the `podman load` process completely
monopolizes all cores of an Arm Cortex-A72.  It blocks on I/O, sure, but
with 'nice' we can get some attention at least to more critical services
at boot.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:53 +02:00
Joachim Wiberg 0eddd1ba64 container: refactor cleanup on instance removal
This commit reverts 477f7ae and bb19d06, which intended to fix an issue
with lingering old images, see #1098.  However, as detailed in #1147,
this caused severe side effects while working with multiple larger
containers.  Basically, the prune operation of one container removed
images of other containers that are just being created in parallel.

Instead of using the podman prune command we can use the meta datain the
start script to pinpoint exactly which image(s) to remove, including any
downloaded OCI archives when the container instance is removed.

Fixes #1147

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:53 +02:00
Joachim Wiberg 68bb01545c container: optimize startup of preexisting containers
This commit adds metadata to track loaded OCI archives to allow skipping
'delete + load' of OCI images when restarting either the container or the
system as a whole.  The sha256 of all loaded OCI archives is stored in a
sidecar file in our downloads directory.  Then we verify the checksum of
the OCI archives against their same-named sidecar to determine if the OCI
archive is already loaded or not.

Additionally, the instance using the image is labled with metadata to detect
changes in the container configuration.  This in turn allow skipping the
delete + create phase also of the instance.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:52 +02:00
Joachim Wiberg c6f3e75aa4 container: only retry remote images on network changes
Fixes #1148

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:52 +02:00
Joachim Wiberg af7c2d7801 container: increase podman stop timeout
The default timeout for 'podman stop foo' is 10 seconds, which for
heavily loaded systems with intricate shutdown process is *waaaay*
too short.  Increase it to the container script default 30s, which
coincidentally is also the container@.conf template's kill delay.

Fixes #1149

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:51 +02:00
Joachim Wiberg e5da7f0473 confd: create container script even if disabled
Not only great for debugging, but also allows users to start their
containers manually in another way.  But yeah, mostly for debug.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:51 +02:00
Joachim Wiberg a880939a2e confd: add new container and volume name type
This rectifies an omission from the initial yang model.  Not all
charachters are supported in container and volume names.  E.g.,
simply attempting to create a volume or container with a space
in the name causes this error message from podman:

 podman: Error: running volume create option: names must match [a-zA-Z0-9][a-zA-Z0-9_.-]*: invalid argument

In addition to the regexp, the new 'ident' type also enforces a
minimum and maximum length.  Sure, technically a single char is
allowed, but let's be reasonable, and who in their right mind
wants an identifier > 64 chars?  We have description for that.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:51 +02:00
Joachim Wiberg 6c742b5cda package/finit: backport support for longer service identifiers
Fixes #1146

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:48 +02:00
Mattias WalströmandGitHub 2aab13088c Merge pull request #1205 from kernelkit/add-wifi-bridgable
yang: Make possible to add WiFi interfaces to bridge
2025-10-23 14:00:13 +02:00
Mattias Walström bc24a8b64e yang: Make possible to add WiFi interfaces to bridge 2025-10-23 13:05:26 +02:00
Tobias WaldekranzandGitHub 365618526d Merge pull request #1204 from kernelkit/upgrade-kernel
Upgrade Linux kernel to 6.12.54 (LTS)
2025-10-20 14:04:43 +02:00
Joachim WibergandGitHub 30104bd1b6 Merge pull request #1201 from kernelkit/badge 2025-10-20 10:51:58 +02:00
Mattias Walström f5496b3c6a Upgrade Linux kernel to 6.12.54 (LTS) 2025-10-20 10:15:11 +02:00
Tobias WaldekranzandGitHub bafad20ef2 Merge pull request #1202 from kernelkit/upgrade-kernel
Upgrade Linux kernel to 6.12.53 (LTS)
2025-10-15 20:15:18 +02:00
Mattias Walström 5a4c676782 Upgrade Linux kernel to 6.12.53 (LTS) 2025-10-15 12:55:07 +02:00
Joachim Wiberg 57dd35f419 Add releae badge and reposition bitSign
Slight refactor of page, adding another badge for the latest release,
and restructuring the Technical Details section a bit.

[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-14 21:57:35 +02:00
Mattias WalströmandGitHub 8e6323d663 Merge pull request #1199 from kernelkit/upgrade-kernel
Upgrade kernel and buildroot
2025-10-14 17:13:46 +02:00
Mattias Walström 7fd3a47bf1 Upgrade Buildroot to 2025.02.7 (LTS) 2025-10-14 14:22:59 +02:00
Mattias Walström e2aef716b3 Upgrade Linux kernel to 6.12.52 (LTS) 2025-10-14 13:10:04 +02:00
Joachim WibergandGitHub 042f9f8c51 Merge pull request #1198 from kernelkit/misc
Mixed bag of fixes mostly for RPi4

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-14 09:20:44 +02:00
Joachim Wiberg acb6cdc043 doc: update changelog with latest features and fixes in v25.10
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:18 +02:00
Joachim Wiberg 887e34e0ef doc: fix RESTCONF scripting examples and curl.sh wrapper
The curl.sh wrapper script had several issues:
- Used 'shift 2' incorrectly without proper argument validation
- Required hostname as enviroment variable instead of option
- Lacked proper option parsing, should behave like a cross between
  curl and sysrepocfg

All examples have been updated to match the refactored script, and
a local copy in utils/curl.sh has been added.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:17 +02:00
Joachim Wiberg c972eebaac doc: drop TODO.org file, replaced entirely with issues and project
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:17 +02:00
Joachim Wiberg 151f3491a2 cli: fix error handling in text-editor and change commands
Fixes #1194

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:16 +02:00
Joachim Wiberg 948247254b board/bpi: minor, whitespace cleanup
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:16 +02:00
Joachim Wiberg c76f3ea164 board/rpi: support standalone run of mkimage.sh
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:15 +02:00
Joachim Wiberg 4123074272 board/rpi: match bpi rootfs partition sizes
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:15 +02:00
Joachim Wiberg b3ea0f3207 board/aarch64: add support for std partition labels on cmdline
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:15 +02:00
Joachim Wiberg 391e971573 board/common: expand var partition on sdcard
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:14 +02:00
Joachim Wiberg 0957fc3c11 board/common: wait for mmc probe on rpi
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:14 +02:00
Joachim Wiberg 81f1da6272 package/board: fix RPi4 boot from aarch64 image
Fixes a minor regression after merge of BPi-R3.  The RPi4 device tree,
specifically regulator-sd-io-1v8 in bcm2711-rpi-4-b.dts, requires the
GPIO voltage regulator be built-in for the SD card controller.

Fixes #1197

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 21:24:11 +02:00
Joachim Wiberg 20316daf2d confd: fix possible resource leak in firewall conf change
Coverity scan detected a memory leak in the new firewall change() cb
where allocated memory from ietf_interfaces_get_all_l3() was not freed
on error paths when srx_get_diff() failed or returned NULL.

This commit consolidates all cleanup paths to use the 'done:' label,
ensuring ifaces, diff, and cfg are properly freed in all exit scenarios.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-13 11:31:47 +02:00
Richard AlpeandGitHub 5f00184bb1 Merge pull request #1162 from kernelkit/sign-with-bitsign
Add workflow for signing releases using bitSign (https://bitsign.se)
2025-10-13 11:20:24 +02:00
Joachim WibergandGitHub f91aa0b705 Merge pull request #1114 from kernelkit/fw
Add basic zone-based firewall
2025-10-10 16:25:33 +02:00
Joachim Wiberg 5903d36861 Minor, update slogan also in alt text
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:15 +02:00
Joachim Wiberg 23ed6e2f03 test: new test, zone migration, custom service, and IPv6
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:15 +02:00
Joachim Wiberg e6d945b77c test: new test, IPv6 version of lan-wan firewall
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:14 +02:00
Joachim Wiberg c069308c27 test: new test, wan-dmz-lan firewall with snat and dnat
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:14 +02:00
Joachim Wiberg a81f7c82e9 test: new test, lan-wan gateway with snat
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:14 +02:00
Joachim Wiberg 47c4ddfb7d test: new test, basic firewall zone verification
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:13 +02:00
Joachim Wiberg 1735a97dce test/infamy: add nmap to test container
- Sort packages alphabetically
 - Add nmap for firewall tests

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:13 +02:00
Joachim Wiberg 7c87034d5e doc: add firewall documentation
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:12 +02:00
Joachim Wiberg 3224f49b65 confd: initial zone-based firewall support, based on firewalld
Add supoprt for infix-firewall.yang, modeled on the zone-based firewalld
The terminology is a mix of firewalld, classic netfilter and inspired by
Ubiquity.  E.g., zone 'policy' -> 'action', and the zone matrix overview.

 - Port forwarding allows forwarding a range of ports
 - Operational data comes from firewalld active rules
 - Firewall logging goes to /var/log/firewall.log
 - Show implicit/built-in rules and zones (HOST) in firewall matrix,
   includes "locked" policy for the default-drop behavior
 - The zone services field in admin-exec 'show firewall' shows ANY when
   the zone default action is set to 'accept'
 - Zone 'forwarding' and 'masquerade' settings live in Infix in the
   policys instead, meaning users need to explicitly add a policy
   to allow both intra-zone and inter-zone forwarding
 - Support for emergency lockdown (kill switch)
 - Pre-defined services (xml+enums) are filtered and included as a
   separate YANG model, extensions added for netconf and restconf
 - Includes initial support for firewalld rich rules

firewalld policy rules, including rich rules, have an obnoxious priority
field which is extremely hard to get right, so in Infix we use the far
superior YANG construct 'ordered-by user;'.  This ensure all rules are
generated in that order by setting the priority field, on read-back from
firewalld (operational) the priority field is used to sort the output
of rules in the CLI.

Fixes #448

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 15:14:12 +02:00
Joachim Wiberg c4ac9e44a7 confd: new helper function, get all l3 interfaces
Used by infix-firewall.c when figuring out interfaces that are not
explicitly assigned to any zone.  Placing them in the default zone

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 12:57:22 +02:00
Joachim Wiberg d1f7abcc3e libsrx: new helper, srx_set_bool()
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 12:57:22 +02:00
Joachim Wiberg 4790806d8d buildroot: bump firewalld, v2.0.2 to v2.3.1
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-10 12:57:19 +02:00
Joachim WibergandGitHub af2de7708a Merge pull request #1185 from kernelkit/fix-latest
Only publish to latest release from main branch
2025-10-03 16:19:57 +02:00
Joachim Wiberg 1ef8465095 .github; only publish to latest release from main branch
[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-03 16:14:02 +02:00
Joachim WibergandGitHub 9bc5f06d4c Merge pull request #1183 from kernelkit/ospf-neigh-regression-test
Verify OSPF neighbors in setup with non-OSPF interface
2025-10-03 13:04:08 +02:00
Joachim Wiberg 5f51ef065e test: verify ospf neighbors in setup with non-ospf interface
Extend OSPF basic with a regression test for issue #1169

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-03 12:55:43 +02:00
Joachim WibergandGitHub 4cfd0eb7a0 Merge pull request #1182 from kernelkit/doc2
doc: update scripting with restconf and add similar for netconf
2025-10-03 08:59:58 +02:00
Joachim Wiberg e12920bd67 doc: update scripting with restconf and add similar for netconf
Fixes #1156

[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-03 08:59:16 +02:00
Joachim WibergandGitHub e91ffebfda Merge pull request #1180 from kernelkit/misc
Build, test, and release workflow fixes
2025-10-02 19:47:38 +02:00
Joachim WibergandGitHub 701dcda535 Merge pull request #1181 from kernelkit/upgrade-kernel
Upgrade Linux kernel to 6.12.50 (LTS)
2025-10-02 18:15:14 +02:00
Joachim Wiberg 1125f3b549 .github: update release checklist
Fixes #1175

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 17:09:44 +02:00
Joachim Wiberg 0c52bac4d7 doc: sync example output from 'show interfaces'
The 'brief' keyword has been gone for a while now.  Also, update the
ouput to match the "new" cli-pretty formatting.

Fixes #1174

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 17:02:44 +02:00
Joachim Wiberg fcd2e15019 .github: include link to GNS3 appliance in Release changelog snippet.
Fixes #1173

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 17:02:43 +02:00
Joachim Wiberg 1ba91236b7 .github: clean up stale containers and ports
Fixes the following issue, see also https://devops.stackexchange.com/a/17853/26590:

make[1]: Entering directory '/home/github-jaffa/actions-runner/_work/infix/infix/buildroot'
/home/github-jaffa/actions-runner/_work/infix/infix/test/env -r -b /home/github-jaffa/actions-runner/_work/infix/infix
/home/github-jaffa/actions-runner/_work/infix/infix/test/9pm/9pm.py -v
/home/github-jaffa/actions-runner/_work/infix/infix/test/case/all-repo.yaml
/home/github-jaffa/actions-runner/_work/infix/infix/test/case/all-unit.yaml
Error: rootlessport conflict with ID 1
make[1]: *** [/home/github-jaffa/actions-runner/_work/infix/infix/test/test.mk:58: test-unit] Error 126
make[1]: Leaving directory '/home/github-jaffa/actions-runner/_work/infix/infix/buildroot'
make: *** [Makefile:31: test-unit] Error 2

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 17:02:42 +02:00
Joachim Wiberg 2d7cb12afe .github: new weekly workflow to verify release workflow
Fixes #1003

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 17:02:41 +02:00
Joachim Wiberg ff5b5f98b4 .github: simplify a bit now that we have a check-trigger
With all jobs now depending on check-trigger we can do the evaluations
there and set some variables that can be reused later.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 17:02:40 +02:00
Joachim Wiberg 97fd671c12 .github: alternative fix to issue #1154
Here we use a check-trigger job that all the others depend on, which
should prevent duplicate workflows starting a bit more elegantly than
killing one of them with the concurrency checker.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 17:02:39 +02:00
Tobias WaldekranzandGitHub ebb37732f4 Merge pull request #1177 from kernelkit/multi-dsa-tree-fixes
Multi DSA tree fixes
2025-10-02 16:09:19 +02:00
Mattias Walström 3cc7923058 Upgrade Linux kernel to 6.12.50 (LTS) 2025-10-02 15:58:03 +02:00
Tobias Waldekranz 94f8d1a700 common: nameif: Handle nested dsa ports
In setups like this...

    CPU
    eth0
     |
.----0----.
| dst0sw0 |
'-1-2-3-4-'
        |
   .----0----.
   | dst1sw0 |
   '-1-2-3-4-'

...both eth0 and dst0sw0p4 are DSA ports. But the latter is _also_ a
physical port as far as devlink is concerned. As a result, it would
first be marked as "internal" and is then instantly reclassified as a
"port".

Catch this condition and stick with the initial "internal"
classification.
2025-10-02 14:51:34 +02:00
Tobias Waldekranz 39b4101d19 common: has-quirk: Add support for matching based on "ethtool -i"
In addition to matching on interface names, add support for matching
on ethtool information.

Example:

    {
        "@ethtool:driver=st_gmac": {
	    "broken-mqprio": true
	}
    }

This would mark any interface using the "st_gmac" driver as having a
broken mqprio implementation. Whereas this:

    {
        "@ethtool:driver=st_gmac;bus-info:30bf0000.ethernet": {
	    "broken-mqprio": true
	}
    }

Only matches an st_gmac-backed interface at the specified location.

As matching becomes more complicated, use the shell implementation
from confd as well, to make sure that they are always in agreement.
2025-10-02 14:51:29 +02:00
Joachim Wiberg 5cd9197fa8 .github: re-enable massive parallel build
Fixes #1152

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 10:30:14 +02:00
Joachim Wiberg dcc39da87d test/9m: bump to latest version
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-02 10:30:14 +02:00
Joachim WibergandGitHub a096a56428 Merge pull request #1170 from kernelkit/ospf-show-neighbor-fix
OSPF: skip interfaces without OSPF enabled
2025-09-30 09:33:20 +02:00
Richard Alpe 0b81e46306 OSPF: skip interfaces without OSPF enabled
Fix a bug where systems with OSPF enabled on some, but not all,
interfaces would cause the OSPF iterator to fail when accessing
iface['area'], which was missing. This caused the ospf_status.py
tool to return {}, resulting in empty OSPF data in sysrepo.

Fixes #1169 Expected neighbors not shown in sysrepocfg

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-09-29 14:38:25 +02:00
Joachim WibergandGitHub 3720e09779 Merge pull request #1167 from kernelkit/kernel-update
Upgrade Linux kernel to 6.12.49 (LTS)
2025-09-29 14:34:28 +02:00
Mattias Walström 91fdf6144c Upgrade Linux kernel to 6.12.49 (LTS) 2025-09-29 12:33:26 +02:00
Mattias WalströmandGitHub c23c2245f2 Merge pull request #1168 from kernelkit/doc-updates
Doc updates
2025-09-29 11:28:17 +02:00
Joachim Wiberg cb85b6fc43 doc: update changelog, error in log message, and prep for release
[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-29 11:07:20 +02:00
Joachim Wiberg 9ca0dd6cdc Minor update, mention new Banana Pi-R3 support
Also, split out the i.MX8MP EVK to a separate item.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-29 11:07:07 +02:00
Joachim WibergandGitHub c59f53eeed Merge pull request #1163 from kernelkit/finit-warning
Fix log error at boot about unsupported command
2025-09-29 09:40:11 +02:00
Joachim Wiberg 040bd5b10c doc: update changelog, error in log message, and prep for release
[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-29 09:39:45 +02:00
Joachim Wiberg bb07f87f9c confd: simplify dnsmasq management during DHCP server reconf
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-29 09:37:12 +02:00
Joachim Wiberg 40755424ee Fix error in log during boot about unsupported command
Sep 27 04:10:06 infix finit[1]: api_cb():Unsupported command
	(cmd: 13, data: dnsmasq) in runlevel S and 6/0.

Fixes #1161

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-29 09:37:06 +02:00
Joachim WibergandGitHub fe8610b30d Merge pull request #1166 from kernelkit/infamy
Mix of test framework fixes and improvements
2025-09-29 08:49:31 +02:00
Joachim Wiberg a0a4051c8a test/infamy: fix xpath_to_uri() to handle multiple predicates
The xpath_to_uri() method only processed the first predicate in XPath
expressions with multiple [key='value'] patterns.  Each re.sub() call
was performed on the original xpath instead of the result the previous
substitutions, causing subsequent predicates to be ignored.

Example XPath that would fail:

    /infix-firewall:firewall/zone[name='untrusted']/interface[.='e2']

Would incorrectly convert to:

    /infix-firewall:firewall/zone[name='untrusted']/interface=e2

Instead of the correct RESTCONF URL:

    /infix-firewall:firewall/zone=untrusted/interface=e2

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 22:02:58 +02:00
Joachim WibergandGitHub d38c3f3406 Merge pull request #1164 from kernelkit/rauc-fixes
Rauc integration fixes
2025-09-28 21:44:29 +02:00
Joachim Wiberg 9d9e099cdb test/infamy: slight improvement to tap.py::Test.__exit__()
Before this change:

  ok 2 - Configure basic end-device firewall
  not ok 3 - Verify unused interface assigned to default zone
  # Exiting (2025-09-25 11:33:00)
  # Traceback (most recent call last):
  #   File "/home/jocke/src/x-misc/test/./case/infix_firewall/basic/test.py", line 127, in <module>
  #     assert unused_if not in public_zone["interface"], \
  #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  # AssertionError: Unused interface e4 should be in default zone 'public', got interfaces: ['e2', 'e3', 'e5', 'e7', 'e8']

After this change:

  ok 2 - Configure basic end-device firewall
  not ok 3 - Verify unused interface assigned to default zone
  # Exiting (2025-09-25 11:35:00)
  #   File "/home/jocke/src/x-misc/test/./case/infix_firewall/basic/test.py", line 127, in <module>
  #     assert unused_if not in public_zone["interface"], \
  #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  # Unused interface e4 should be in default zone 'public', got interfaces: ['e2', 'e3', 'e5', 'e7', 'e8']

Slightly shorter and arguably easier to read for a non-pythonic human.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 21:35:32 +02:00
Joachim Wiberg a9430070d2 test/infamy: add optional msg support to tap.py::Test.fail()
A very common pattern in our tests is:

  if (condition):
    print(f"the condition failed with {output}")
    test.fail()

This change allows us to write:

  if (condition):
    test.fail(f"the condition failed with {output}")

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 21:35:32 +02:00
Joachim Wiberg a3d30eb32f test/infamy: minor, whitespace only
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 21:35:31 +02:00
Joachim Wiberg 6bd00d8403 doc: update changelog
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 21:34:08 +02:00
Joachim Wiberg d715f02da0 board: enable rauc upgrade history and event logging (json)
The rauc event logger is a separate glib logger that by default logs to
the system console, with annoying ANSI escape sequences.  This commit
drops the default stdout/stderr redirect of these log messages and adds
a more exhaustive bundle install and event log, in json format, instead.

For more information about event logging, see the rauc documentation:
https://rauc.readthedocs.io/en/latest/advanced.html

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 21:32:59 +02:00
Joachim Wiberg 81a56fe304 confd: replace depracated rauc install d-bus method
Fixes #1080

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 21:32:57 +02:00
Joachim WibergandGitHub 99c87d0f1d Merge pull request #1165 from kernelkit/misc
Misc fixes
2025-09-28 21:18:44 +02:00
Joachim Wiberg 3a164e294d doc: update changelog
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:45 +02:00
Joachim Wiberg c42b0b536d test: minor, cleanup of specifications
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:45 +02:00
Joachim Wiberg c61b4361ab test: simplify and skip UNIX backup files
- Drop 'local', not available in POSIX shell scripts
 - Check for an assortment of backup file combos
 - Simplify nested if-statements, skip whitelist first

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:45 +02:00
Joachim Wiberg 065f86a74c confd: minor, replace hard-coded string with define
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:44 +02:00
Joachim Wiberg 0f6c7608ec package/confd: simplify, relocate netconf service
Follow the good example set by the restconf service.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:44 +02:00
Joachim Wiberg 93d59b024a package/rousette: add '--log-level LEVEL' command line option
The default 'trace' log level is quite verbose for our production systems.
This commit changes the default to 'info' and adds a command line option
to control the log level if needed.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:43 +02:00
Joachim Wiberg 096a8ab2e2 package/rousette: use v2-kkit branch for reduced patch set
To be able to maintain our own set of patches on top rousette, a kkit
branch have been set up with a reduced set of backported fixes.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:43 +02:00
Joachim Wiberg 1a3e1dcabc package/nghttp2-asio: bump to CESNET fork
This is the CESNET fork of nghttp2-asio, introduced here:
https://github.com/CESNET/rousette/commit/fff3429

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 07:26:42 +02:00
Joachim Wiberg 69056bfb2c board/common: fixes for unicode translation in log/pager commands
- cli: add '-r' to log/pager/follow for "raw" control chars, including unicode
 - sysklogd: backport unicode fix for em-dash character (—) in slogan
 - sysklogd: drop old patches
 - sysklogd: run in 8-bit safe mode

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 03:50:23 +02:00
Joachim Wiberg dd4221802f utils: silence srload (debug messages)
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 03:50:22 +02:00
Joachim Wiberg e1783f3c23 cli: minor, xml optimization
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 03:50:22 +02:00
Joachim Wiberg 0957774208 cli: add terminal reset|resize commands
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 03:50:22 +02:00
Joachim Wiberg 77963d5267 patches/libyang: follow-up to e7f68be
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-28 03:50:14 +02:00
Richard Alpe 03f4a8d044 doc: mention bitSign code signing in main README
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-09-24 14:43:42 +02:00
Richard Alpe 8cca8913a7 .github: add bitSign workflow for signing releases
This is currently a standalone workflow that needs manual trigger via
workflow_dispatch, but the end goal here is to chain it to the release
job.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-09-23 14:44:55 +02:00
Mattias WalströmandGitHub 2f13fc7843 Merge pull request #1160 from kernelkit/upgrade-sysrepo
Bump sysrepo, netopeer,libyang and libnetconf2, libyang-cpp, rousette
2025-09-17 10:41:04 +02:00
Mattias Walström e7f68be143 Bump sysrepo, netopeer,libyang and libnetconf2, libyang-cpp, sysrepo-cpp, rousette 2025-09-17 08:51:31 +02:00
Mattias WalströmandGitHub 197bb1507e Merge pull request #1159 from kernelkit/misc
Misc fixes
2025-09-16 09:27:42 +02:00
Joachim Wiberg b18a719cee Add repobeats analytics
[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-16 07:55:05 +02:00
Joachim Wiberg b330c6c70d .github: prevent duplicate builds when ci:main label is added to PRs
Add concurrency control to trigger workflow to cancel in-progress builds
when new events (like adding ci:main label) occur on the same PR.  This
prevents resource waste from duplicate builds and handles the common
workflow where developers add the ci:main label after PR creation.

Fixes #1154
2025-09-15 19:12:51 +02:00
Joachim Wiberg 64a3770a76 doc: update changelog with latest changes
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 18:58:16 +02:00
Joachim Wiberg 6a745f50f8 board/common: adjust log level of udhcpc script, fix missing iface
Issue #1100

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 18:08:40 +02:00
Joachim Wiberg f41ff6d3e7 confd: reduce dhcp client logging overhead by 70%
Adjust DHCP client retry behavior:

 -t 3  (was -t 10) : Maximum discovery attempts per cycle
 -T 5  (was -T 3)  : Seconds to wait between attempts
 -A 30 (was -A 10) : Seconds to wait after all attempts fail

Before: 10 attempts × 3 seconds = 30 seconds of rapid trying, then 10
        second pause = 40 second total cycle

After: 3 attempts × 5 seconds = 15 seconds of trying, then 30 second
       pause = 45 second total cycle

=> 70% fewer log messages during active attempts, with longer quiet
       periods between cycles.

Fixes #1100

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 18:07:50 +02:00
Joachim Wiberg 400691af85 package/klish-plugin-sysrepo: improve CLI UX for no enabled command
Fixes #1119

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 17:25:23 +02:00
Joachim Wiberg 0bada691fc Add neofetch
Fixes #1143
2025-09-15 17:08:08 +02:00
Joachim Wiberg 164a1018a0 board/common: improve default bash settings for better UX
Add HISTCONTROL=ignoreboth to ignore duplicate commands and those
starting with space, enable histappend, and improve tab completion
behavior.  Also add /etc/inputrc for better readline key bindings.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 16:55:55 +02:00
Joachim Wiberg 805acdf782 test: bump 9pm for test ID and meta data section in report
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 16:23:20 +02:00
Joachim Wiberg df3f9f2e40 Add mtr and iperf3
Fixes #1144

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 16:22:13 +02:00
Joachim Wiberg 2761a17abc cli: fix 'show ospf' commands regression, introduced in 827dc098e
Fixes #1155

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 16:22:13 +02:00
Joachim Wiberg 77b364d682 board/common: set show-legacy wrapper as executable
Fix #1150

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 16:22:10 +02:00
Joachim WibergandGitHub 1989effaad Merge pull request #1135 from kernelkit/test-fixes
Test fixes

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 16:21:23 +02:00
Joachim Wiberg 142e4e95b7 test: consistent naming for all yaml files
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 14:26:06 +02:00
Joachim Wiberg 44d37808f1 test/case: use 9pm 'name:' for all test names
To reduce the duplication of effort between 9pm and the Infamy framework
this change consolidates the move from local 'infamy: title:' extension
to 9pm 'name:'.

For the parameterized tunnel tests we leverage the 9pm dynamic test-spec
variable, which looks for a correspodning <case>.adoc instead of static
Readme.adoc, when generating the test report.

Each test documentation should cover all aspects of the test, much like
the usage text of a UNIX program.  To this end, the tunnel test docs are
now more spelled out, including all invariants.

Some refactoring of these tests were also necessary, e.g., replacing any
reserved Python keywords like 'type', and other PEP-8 fixes.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 14:26:06 +02:00
Joachim Wiberg eb3e64d243 test/case: rename foo.adoc -> test.adoc and update all Readme.adoc
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 14:26:05 +02:00
Joachim Wiberg 2171fd12ca test/case/infix_dhcp: allow generating subsystem test resports
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 14:26:04 +02:00
Joachim Wiberg 249af70dcd test: add intro blurb to each subsystem
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 14:26:04 +02:00
Joachim Wiberg b4a5b35c0e test/spec: refactor test spec & report generation
Import new 9pm version for improved test report generation.  With this
in place we can take the opportunity to also refactor and simplify the
test spec. generation.

Fixes #1129

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 14:26:03 +02:00
Joachim Wiberg fe2d0f488d test/case: simplify AsciiDoc image references
This commit greatly simplifies AsciiDoc image references in generated
Readme.adoc files.  The two focused use-cases that remain after this
change are working references in:

 - Generated output/images/test-report.pdf
 - Viewing test's Readme.adoc from GitHub

Previously we aimed to have working images also when the test's Readme
was included in the parent directory's Readme.adoc.  This, however, is
not supported as of this commit.  It seems unlikely also to ever be a
supported feature of AsciiDoc on GitHub, for details, see the following
issue: <https://github.com/github/markup/issues/1095>

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 06:40:38 +02:00
Joachim Wiberg c14140a8fe test: relocate logic for creating test-report.pdf from workflow
It should be possible to create test reports manually, so logically
the GitHub workflow should call a make rule in test.mk

Untested: branding, or any case where Infix is used as a BR2_EXTERNAL

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 06:40:38 +02:00
Joachim Wiberg 9fe661f422 test/infamy: silence schema download in restconf backend
NETCONF backedn already silenced.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 06:40:38 +02:00
Joachim Wiberg 87f9b58957 test/spec: pep-8 fixes, minor cleanup only
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 06:40:37 +02:00
Joachim Wiberg b657183209 test/case/infix_services: refactor mdns-allow-deny
Major refactor to redesign how listeners and traffic is started in parallel.

Fixes #1130

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 06:40:37 +02:00
Joachim Wiberg 1aad255846 test/case/infix_container: refactor container-environment
Refactor test to use httpd container instead and return ENV with a CGI.

Fixes #1131

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 06:40:36 +02:00
Joachim Wiberg 52beeb5814 test/infamy: refactor Furl class to support list of needles
Also, add some documentation to lower barrier of entry/use.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 06:40:35 +02:00
Joachim Wiberg c1ad8075a8 board/common: ensure efi-part.vfat is saved in build tree
Fixes #1132

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-14 22:05:23 +02:00
Mattias WalströmandGitHub 3fcb6a376a Merge pull request #1142 from kernelkit/banana-pi
Add support for Banana Pi (BPi-R3)
2025-09-14 14:56:12 +02:00
Mattias Walström 33e873c2fa workflows: create-image: add banana pi r3 as target board
No eMMC support added yet, only SD card.
2025-09-14 13:37:49 +02:00
Mattias Walström 56fce18d66 workflows/build-boot: Add mt7976 bootloader
It is the chipset used on banana pi r3.
2025-09-14 13:37:49 +02:00
Mattias Walström 399894e9a1 Add new board banana pi r3
The Banana Pi R3 is a high-performance networking board featuring:
- MediaTek MT7986 ARM Cortex-A53 quad-core processor
- 4x Gigabit LAN ports (lan1-lan4)
- 1x Gigabit WAN port
- 2x SFP ports (sfp1, sfp2) for fiber connectivity
- Dual WiFi interfaces (wifi0 for 2.4GHz, wifi1 for 5GHz)
- USB support
- SD card boot support
2025-09-14 13:37:48 +02:00
Mattias Walström 8146e0570e gen-interfaces: Fix bug when generating on boards with mounted Wi-Fi chipsets
These should not appear in a generated factory-config or failure-config.
2025-09-12 23:23:14 +02:00
Mattias WalströmandGitHub 153ceda2f4 Merge pull request #1153 from kernelkit/upgrade-buildroot
Upgrade buildroot and linux kernel
2025-09-11 14:12:49 +02:00
Mattias Walström b134733dd2 Upgrade Buildroot to 2025.02.6 (LTS) 2025-09-11 09:21:39 +02:00
Mattias Walström 8082b271d9 Upgrade Linux kernel to 6.12.46 (LTS) 2025-09-11 09:21:38 +02:00
Mattias WalströmandGitHub 02d8c97e98 Merge pull request #1145 from kernelkit/add-resize
Add resize2fs to be able to resize ext partitions
2025-09-08 10:44:09 +02:00
Mattias Walström 7bb3f64191 Add resize2fs to be able to resize ext partitions
This is useful when using sdcard images, to expand /var to cover rest of disk.
2025-09-08 08:27:16 +02:00
Joachim WibergandGitHub f2af4d6cdf Merge pull request #1141 from kernelkit/defconfig-branding
Update factory-configs and links and description in defconfigs
2025-09-07 23:00:14 +02:00
Joachim Wiberg 4417465135 Update factory-config.cfg for NanoPi and RPi
The motd-banner was behind on the new slogan:

.-------.
|  . .  | Infix OS — Immutable.Friendly.Secure
|-. v .-| https://kernelkit.org
'-'---'-'

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-07 19:30:21 +02:00
Joachim Wiberg cf50c75a3e Update links to vendor + docs, and a more relevant description
Fixes #1134

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-07 19:30:12 +02:00
Joachim WibergandGitHub 7ab265992a Merge pull request #1140 from kernelkit/more-logo-sizes 2025-09-07 18:43:08 +02:00
Joachim Wiberg 35cf9e4cc9 doc: add more logos for convenience
This commit completes the collection.  We now have small, medium, and
large sizes.  Useful for easy conversion to other formats, e.g., bmp.

[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-07 18:21:36 +02:00
Mattias WalströmandGitHub 3fbbd16690 Merge pull request #1118 from kernelkit/create-sdcard
Create sdcard
2025-09-07 18:07:40 +02:00
Mattias Walström 01029321c9 board: rpi4: Add splashscreen on boot
Show splash in uboot.
2025-09-07 18:06:43 +02:00
Mattias Walström 0477446e49 package/bootloader-splashscreen: New packet for adding/modify bootloader splash 2025-09-07 18:06:43 +02:00
Mattias Walström 700ec2f855 Add crete SD Card workflow 2025-09-07 13:43:27 +02:00
Mattias Walström 709f2769ce Build aux when build infix 2025-09-07 13:43:26 +02:00
Mattias Walström 19b965ac41 RPI4: dts: Create a new device tree for the DSI display 2025-09-07 13:43:26 +02:00
Mattias Walström 28d8748bdb uboot: Att uboot patches for 2025.01
- Fix CTRL-C misbehave
- Add new command to detect RPI standard display
2025-09-07 13:43:25 +02:00
Mattias WalströmandGitHub 497990a2d3 Merge pull request #1138 from kernelkit/test-sanity 2025-09-05 18:55:18 +02:00
Mattias Walström dce9a9c53d test: Add new sanity check tests
One to verify it is the correct version on the duts and one
that check that it is the correct bootorder.
2025-09-05 16:34:11 +02:00
Mattias Walström 4f0aded5a0 utils: Add script to add a new version to GNS3 marketplace
You need first to clone gns3-registry from https://github.com/GNS3/gns3-registry

Follow this steps:
1. ./utils/bump-gns3.py 25.08.0 ../../gns3/gns3-registry/appliances/infix.gns3a
2. TEST in gns3, just add the new version, start it.
3. run python3 check.py inside gns3-registry, verify infix is ok.
4. Create a pull request to gns3-registry

This fix #1107
2025-09-04 17:48:43 +02:00
Mattias Walström 73298469d5 Upgrade Linux kernel to 6.12.45 (LTS) 2025-09-04 17:48:42 +02:00
Mattias WalströmandGitHub 7c019190c8 Merge pull request #1133 from kernelkit/ci-fixes
CI: Only build minimal for PRs without ci:main tag
2025-09-02 14:22:33 +02:00
Richard Alpe 17df77ca0f .github: rename ci work branch
This branch can be used to test push events which is especially
useful when working on the CI infrastructure.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-09-02 13:16:05 +02:00
Richard Alpe a188f4269d .github: only run _minimal build for PRs
PRs which doesn't have the label ci:main.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-09-02 13:14:39 +02:00
Mattias WalströmandGitHub 6cdcd5775d Merge pull request #1126 from kernelkit/misc
Upgrade podman to fix critical container issues
2025-09-02 12:05:17 +02:00
Joachim Wiberg 1d0c2be515 patches: silence libyang "Obsolete schema node" warnings in log
Fixes #1127

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-02 10:53:49 +02:00
Joachim Wiberg fc7e1d0745 test/case/infix_containers: extend retry for containers
For a heavily loaded system, 10 seconds/retries is not enough time to
expect containers to have started up.  Particularly after the changes
done recently to do prune before and after a container is started.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-02 10:53:49 +02:00
Joachim Wiberg 950a6ef794 test/case/infix_containers: new test, verify environment
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-02 10:53:48 +02:00
Joachim Wiberg 7f829cfbdf test/case/infix_containers: new test, verify enable/disable
Regression test for issue #1123

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-02 10:53:48 +02:00
Joachim Wiberg 86df54c107 test/case/infix_containers: ensure IP forwarding is enabled
Usually the CNI bridge plugin "takes care" of enabling IPv4 forwarding
on all interfaces, see issue #1125, but when the container tests are run
in a different order from the infix_containers.yaml, Infix may reset the
IPv4 forwarding on this critical interface.

This change is both future proof and also ensures the test works as it
was intended even if tests are run out-of-order.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-02 10:53:47 +02:00
Joachim Wiberg 34dead1a50 test/case: disable mdns-allow-deny for release, unstable
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-02 10:53:47 +02:00
Joachim Wiberg 313554d12e test/case: minor, cleanup
- Drop redundant comments
 - Drop redundant imports
 - PEP-8 fixes

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 14:03:51 +02:00
Joachim Wiberg 8b39d3fdc7 confd: explicitly declare cni backends
- the port-mapping plugin supports iptables or nftables
 - the firewall plugin support only iptables or firewalld

Enforce use of iptables wrapper for nftables, for now, in both plugins.
This all needs to be refactored to run podman with "unmanaged" networks
in the future.

Related to issue #1125

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 14:03:51 +02:00
Joachim Wiberg 66a5e5304b board/common: fix container network change detection on pull
When a container's image is on an inaccessible remote server, the
container wrapper script waits in the background for any netowrk
changes to retry download of the image.

This change avoids the dangerous previous construct, and is also
easier to read: timeuot after 60 seconds unless ip monitor reads
at least one event before that.

Fixes #1124

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 14:03:50 +02:00
Joachim Wiberg 12df83e6d2 board/common: allow containers to shut down properly
The extended kill delay (10 sec) is sometimes not enough for complex
system containers.  Also, podman sometimes take the opportunity to do
housekeeping tasks when stopping a container.  So, allow for up to 30
sec. grace period before we send SIGKILL.

With the latest image prune extension, set a 60 sec. timeout for the
cleanup task, in case podman gets stuck.  This to prevent any future
mishaps.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 14:03:50 +02:00
Joachim Wiberg 6b0145f92e board/common: minor fix to usage text, and silence logs
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 14:03:50 +02:00
Joachim Wiberg b21043c7e5 package/podman: bump 4.5.0 -> 4.9.5
This major upgrade, along with the upgrade to Finit v4.14, is what is
needed to fix #1123, which was caused by some odd futex locking bug in
Podman that left lingering issues in /var/lib/containers state files.
The root cause as fixed already in v4.7.x, but since CNI is supported
up to and including 4.9.5, going with a later release seemd prudent.

Full changelogs at:
 - <https://github.com/containers/podman/releases/tag/v4.5.1>
 - <https://github.com/containers/podman/releases/tag/v4.6.0>
 - <https://github.com/containers/podman/releases/tag/v4.6.1>
 - <https://github.com/containers/podman/releases/tag/v4.6.2>
 - <https://github.com/containers/podman/releases/tag/v4.7.0>
 - <https://github.com/containers/podman/releases/tag/v4.7.1>
 - <https://github.com/containers/podman/releases/tag/v4.7.2>
 - <https://github.com/containers/podman/releases/tag/v4.8.0>
 - <https://github.com/containers/podman/releases/tag/v4.8.1>
 - <https://github.com/containers/podman/releases/tag/v4.8.2>
 - <https://github.com/containers/podman/releases/tag/v4.8.3>
 - <https://github.com/containers/podman/releases/tag/v4.9.0>
 - <https://github.com/containers/podman/releases/tag/v4.9.1>
 - <https://github.com/containers/podman/releases/tag/v4.9.2>
 - <https://github.com/containers/podman/releases/tag/v4.9.3>
 - <https://github.com/containers/podman/releases/tag/v4.9.4>
 - <https://github.com/containers/podman/releases/tag/v4.9.5>

Fixes #1123

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 12:25:55 +02:00
Joachim Wiberg ab9b2f555b package/finit: bump to v4.14
Highlights:
 - fixes to systemd and s6 type services
 - bare-bones libsystemd replacement with #include <systemd/sd-daemon.h>
 - new reload:script mimicking systemd ExecReload, and
 - new stop:script mimicking systemd ExecStop
 - exit status/signal info when a process dies
 - service kill:SEC now support up to 300 sec.
 - the /tmp/norespawn trick now also covers service_retry()
 - the sysv 'stop' command process environment is now same as 'start'
 - State machine ordering issue: enter new config generation after
   services disabled in previous generation have been stopped

Full changelog at:
 - <https://github.com/troglobit/finit/releases/tag/4.13>
 - <https://github.com/troglobit/finit/releases/tag/4.14>

Fixes #1123

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 12:25:54 +02:00
Joachim Wiberg cfeefc1d86 doc: slight refresh and pivot
As Infix matures as an operating system it is quickly becoming more and
more useful also for end-device use-cases.  The README should reflect
this change in focus.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 12:25:54 +02:00
Joachim Wiberg d65c478a28 doc: update logo with new slogan
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 11:05:36 +02:00
Joachim Wiberg 477f7aed72 Follow-up to bb19d064, prune *all* unused images
From the documentation:

> 'podman image prune' removes all dangling images from local storage.
> With the all option, all unused images are deleted (i.e., images not
> in use by any container).
>
> The image prune command does not prune cache images that only use
> layers that are necessary for other images.

So, when the container script is called in the cleanup phase of the
lifetime of a container, we can use the '--all' option to ensure we also
remove this container's loaded image.  In the case this happens before
a reboot of the system, there will be no old version of the image loaded
to /var/lib/containers after boot.

Issue #1098

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-01 11:05:35 +02:00
Joachim WibergandGitHub da3bf57515 Merge pull request #1116 from kernelkit/ci-fixes
.github: various small improvements

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-31 23:51:58 +02:00
Joachim WibergandGitHub 0d43e135a9 Merge pull request #1120 from kernelkit/upgrade-kernel
Upgrade Linux kernel to 6.12.44 (LTS)
2025-08-29 09:53:34 +02:00
Mattias Walström ddd5172a6b Upgrade Linux kernel to 6.12.44 (LTS) 2025-08-29 08:41:18 +02:00
Tobias WaldekranzandGitHub 6717bbbe26 Merge pull request #1117 from kernelkit/test-stability
Test stability
2025-08-27 13:23:15 +02:00
Mattias Walström 7683466424 test: infamy: Silence reachability check
This was to verbose.
2025-08-26 14:38:42 +02:00
Mattias Walström 6cc380d8ce test: Remove meta test case wait
It is now redundant, check has been moved to attach in Env.
2025-08-26 14:38:42 +02:00
Mattias Walström 8740b2eb23 test: infamy: Add a timeout when starting each test if the DUTs is not reachable
This to cover if you run one test, but the DUTs are still booting.
2025-08-26 14:38:42 +02:00
Richard Alpe 7244fad2e8 .github: include flavor in target
There are 2 main reasons for this:

1) It's almost impossible to write complex logical expressions in GH
workflows. I wanted to pass "" as flavor when not building _minimal.
So that the end target string would become TARGET + FLAVOR where
FLAVOR is empty, making it x86_64 for example.

As it turns out "" is false in GH workflow logical expressions, this
in conjunction with the limitations the interpreter has made it hard
to actually write sane expressions in the "with:" variables when
calling downstream jobs via workflow calls.

Here's an example of what I was trying to do and could not:

with:
  flavor: ${{ (
    github.event_name == 'pull_request' &&
    contains(github.event.pull_request.labels.*.name, 'ci:main')
  ) && '' || '_minimal' }}

As '' is false, the first sets of expressions always evaluates to
false making the string "_minimal". I tried bracing this in various
ways and to use "null" or various JSON objects, all in vain.

2) It reduces complexity instead of adding additional.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-26 14:37:13 +02:00
Mattias Walström edbc28a48b test: container_host_commands: Test more than one time
Have been seen Occasionally in tests that hostname not have been set,
try harder to check if it is set.
2025-08-25 16:47:09 +02:00
Richard Alpe 33c95e860b .github: replace existing artifacts
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-25 13:51:23 +02:00
Mattias WalströmandGitHub a60968b7b2 Merge pull request #1113 from kernelkit/upgrade-kernel 2025-08-24 10:19:38 +02:00
Mattias Walström 8abc27e698 board: rpi4: Use a more minimal xorg.conf 2025-08-23 23:45:41 +02:00
Mattias Walström 2646a48227 Remove rpi4_defconfig
RPI4 is now located in normal aarch64 image
2025-08-23 22:22:22 +02:00
Mattias Walström a8f57618b8 Upgrade linux kernel to 6.12.43 (LTS) 2025-08-23 22:22:21 +02:00
Mattias Walström 9374feefb0 board: rpi-4: Reserve memory correct for GPU 2025-08-23 22:22:21 +02:00
Mattias Walström d4726aff82 board: rpi-4: Do not rotate display in device tree 2025-08-23 19:51:12 +02:00
Mattias WalströmandGitHub 3ac6eaa16b Merge pull request #1111 from kernelkit/rpi-4-dsi-display
Raspberry Pi 4 DSI display
2025-08-22 23:46:26 +02:00
Mattias Walström e6bd55c0be doc: Document Raspberry pi support
Including touchscreen support.
2025-08-22 22:23:07 +02:00
Mattias Walström c3975f4ce5 board/rpi-4: Add support for RPI official touchscreen
This adds support for Raspberry Pi Official touchscreen (only version 1)
Can be seen here: https://www.raspberrypi.com/products/raspberry-pi-touch-display/

Sound is enabled in the kernel due to it is required by the GPU.
2025-08-22 22:23:06 +02:00
Mattias Walström 611c1a6d51 Rename rpi postimage to what it actually is, sdcard creater. 2025-08-22 21:43:44 +02:00
Mattias Walström d5536fa536 board/common/post-image: Remove hack for building sdcards images
Bootloaders is not built during normal build, not possible to create
sdcard images.
2025-08-22 21:43:44 +02:00
Mattias Walström ce895a4c59 boards/rpi-4: Remove stuff related to bootloader build 2025-08-22 21:43:43 +02:00
Joachim WibergandGitHub a7d91b4f80 Merge pull request #1104 from kernelkit/prune-dangling-containers
containers: prune dangling images
2025-08-20 17:30:12 +02:00
Richard Alpe bb19d064d5 containers: prune dangling images
Previously, upgrading Podman containers with the same tag left
behind dangling images, causing overlay storage to grow and fill
disk space.

This change ensures dangling images are cleaned up using
podman image prune. The command is run without -a, so only
unreferenced images are removed. This provides safe cleanup while
preventing unnecessary overlay growth.

Fixes #1098

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-19 12:57:35 +02:00
Mattias WalströmandGitHub fa7c743843 Merge pull request #1101 from kernelkit/upgrade-kernel2
Upgrade Linux kernel to 6.12.42 (LTS)
2025-08-15 14:10:26 +02:00
Mattias Walström a2a11e816a Upgrade Linux kernel to 6.12.42 (LTS) 2025-08-15 12:46:52 +02:00
Joachim WibergandGitHub 7c73ddeaaf Merge pull request #1099 from kernelkit/x86-64-debug-info 2025-08-14 17:19:41 +02:00
Tobias Waldekranz bc6180680d x86_64: Build kernel with debug info, like all other archs
The defconfigs for all architectures other than x86_64 has this
enabled, so align it with the rest.

This has no on-target impact, but it enables us to attach to a live VM
instance and debug it, or do offline debugging like resolving stack
trace lines from oops messages to source locations.
2025-08-14 13:03:07 +02:00
Joachim WibergandGitHub 21df66d221 Merge pull request #1097 from kernelkit/doc
Drop doc build on PR, only main and doc branch triggers
2025-08-12 14:44:56 +02:00
Joachim WibergandGitHub 684bbafad5 Merge pull request #1096 from kernelkit/dependabot
Fix dependabot moderate CVE warning in Infamy container
2025-08-12 14:35:03 +02:00
Mattias WalströmandGitHub ce6b4729cd Merge pull request #1095 from kernelkit/upgrade-kerneln
Upgrade buildroot and kernel
2025-08-12 13:04:26 +02:00
Joachim Wiberg b0a6e167bc .github: drop doc build on PR, only main and doc branch triggers
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 13:02:50 +02:00
Joachim Wiberg 54bb3a01e2 test: fix dependabot moderate CVE warning in Infamy container
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 12:55:59 +02:00
Mattias Walström fcce71fe23 Upgrade linux kernel to 6.12.41 (LTS) 2025-08-12 11:39:53 +02:00
Mattias Walström de4db3e6bc Upgrade buildroot to 2025.02.5 (LTS) 2025-08-12 11:39:50 +02:00
Joachim WibergandGitHub 7803f6bc10 Merge pull request #1092 from kernelkit/github-wokflow-impovments
GitHub wokflow impovments
2025-08-12 11:38:24 +02:00
Joachim WibergandGitHub 5c1bcbaf44 Merge pull request #1093 from kernelkit/images
Add workflow for building bootloaders
2025-08-12 11:37:28 +02:00
Joachim Wiberg eefe84fd4b configs: update dependencies for fireant and disable CONFIG_MMC_PCI
The board/common/uboot/extras.config was updated with CONFIG_MMC_PCI
*after* we last built the SparX5i bootloader, and this was really only
needed for the Qemu build, so let's move the requirement there.

Also, we now (Buildroot 2025.02) need to update the dependencies for the
Fireant bootloader with libbsd (for some reason) and dtc, of course.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 10:46:35 +02:00
Joachim Wiberg a3c26c4ef3 configs: drop signing step for bootloaders
There's nothing to sign and only causes build errors.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 10:46:35 +02:00
Joachim Wiberg a845c3e9f3 configs: drop disk image (qcow2) from all bootloader builds
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 10:46:34 +02:00
Joachim Wiberg d151b5ef7c board/common: skip qemu.sh et al for bootloader builds
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 10:46:34 +02:00
Joachim Wiberg 0491c1f195 patches/arm-trusted-firmware: drop local patch for cn9130-crb
Build root now (as of 2025.02 LTS) carry a version of this patch for us,
for the same reason.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 10:46:33 +02:00
Joachim Wiberg 1c04409cf3 .github: nightly build of bootloaders
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-12 10:46:33 +02:00
Joachim WibergandGitHub 14dd7cbc33 Merge pull request #1087 from kernelkit/cleanup 2025-08-11 17:33:38 +02:00
Joachim Wiberg ebf4157e2c configs: new defconfig for rpi4 bootloader
This commit migrates the bootloader build from Raspberry Pi 4 board
package to a dedicated bootloader defconfig.  The idea is to set up
dedicated wokflows for building bootloaders, which change rarely,
streamlining the Infix image builds.

A dedicated workflow, or job in an existing workflow, can then do
the composition to minimal SD-card images useful for starting up
Infix on boards where SD-card is the primary boot source.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-11 16:50:57 +02:00
Richard Alpe 8a1747db2c .github: don't run generic build in kernelkit/infix
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-11 16:11:59 +02:00
Richard Alpe ded65cf94a .github: remove test-spec target
Has to many dependencies such as asciidoctor-pdf.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-11 16:08:31 +02:00
Richard Alpe 30757c8160 test: add statd usb data captured by yanger
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-11 14:33:09 +02:00
Richard Alpe b3fe0d58d8 yager: handle usb info though the HOST api
Prior to this commit yanger looked at the running system using
os.path..., this meant that the static reply / capture data wasn't
used properly. This resulted in strange behavior during unit testing
on GitHub runners where USB ports are missing.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-11 14:33:07 +02:00
Richard Alpe 15a2221b23 .github: add generic x86 build that runs on GH hardware
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-11 08:32:50 +02:00
Richard Alpe c135230289 .github: only run main workflow on kernelkit/
Avoid trying to run on forks, which most likely will cause erros
and other ugliness.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-11 08:32:48 +02:00
Richard Alpe 99af0ba0e5 .github: fix parallel selection for workflow call
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-08-11 08:32:44 +02:00
Joachim WibergandGitHub 2f296e9857 Merge pull request #1090 from kernelkit/doc
doc: minor markdownlint cleanup and fixes to admonitions
2025-08-08 15:22:19 +02:00
Joachim Wiberg f02048e904 doc: minor markdownlint cleanup and fixes to admonitions
[skip ci]

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-08 15:21:49 +02:00
Joachim Wiberg bdc391b4ce src/bin: fix possible toctou in erase
Found by Coverity Scan

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-04 08:07:38 +02:00
Joachim Wiberg 9aacd251b8 src/bin: minor, fix warning from Coverity Scan
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-04 07:58:47 +02:00
Joachim Wiberg 867ea6e92a package/execd: drop unused local package
The execd runner has not been used since Nov, 2024, ca0e54b.  This
weekend it started triggering a warning from Coverity Scan, so let
us drop it for good this time.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-08-04 07:53:46 +02:00
Joachim WibergandGitHub ce89499518 Merge pull request #1086 from kernelkit/doc
Switch from GitHub to MkDocs Material for documentation

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Signed-off-by: Jon-Olov Vatn <jo@vatn.se>
2025-07-30 15:04:17 +02:00
Joachim Wiberg cf4a29da84 Update link to (new) documentation and fix admonition
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:59:24 +02:00
Joachim Wiberg edc1346753 doc: update developer's guide, how to build documentation
Tested successfully on one unsuspecting team member :-)

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:16 +02:00
Joachim Wiberg ed5baf5839 doc: theme & svg logo tweak, grey to slightly darker lines and font
This commits tweaks the material orange theme to use the exact color hue
of Jackys footies.  To match this and give a slightly better contrast we
also change Jacksy border and logo text color to a slightly darker tone.

The original logo.svg is retained for reference, the new logo is logo2,
which all the .png variants have now been updated to.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:15 +02:00
Joachim Wiberg 5b100fb99e doc: collapse about + introduction into a single index.md
In the spirit of my uni English teacher; "simplify, Simplify, SIMPLIFY!"
This commit collapses the About and Introduction into a single document,
doc/index.md.

Also, relocate the System Boot section to doc/boot.md, which we alrady
have and covers the initial bootloader part of it.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:14 +02:00
Joachim Wiberg dc8fc40002 doc: much improved disposition of navigation
Lot of work still remains, but this new disposition should serve as a
more representative template.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:13 +02:00
Joachim Wiberg 5a339e46cb doc: clarify sections and use "home styled" admonitions
Files in doc/cli/*.md are used in and displayed as help text in the CLI
admin-exec level.  So we cannot use standard admonitions (yet) since the
terminal markdown converter (lowdown) doesn't support the syntax.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:12 +02:00
Joachim Wiberg 90ec35c69e doc: retitle ssh+sysrepocfg -> Legacy Scripting
We want to discourage people to use sysrepocfg and instead move to use
NETCONF, or even better, RESTCONF.  When something's missing we should
add it to these two official, and standardized, interfaces.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:12 +02:00
Joachim Wiberg f98b00fcca doc: retitle -> Device Discovery
And make the ASCII image more generic to ease any branding work we may
need to do for certain customers later on.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:11 +02:00
Joachim Wiberg 83f2c27e6d doc: initial support for pdf export at doc. generation
- custom cover page for pdf
 - Center and resize logo
 - Place slogan just below logo
 - Ensure all text on cover page is in matching grey

Please note, the mkdocs-to-pdf plugin works, but it has a bug in the
enumeration of sections.  We may need to fork it to make it work the
way users expect.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:10 +02:00
Joachim Wiberg b0adf85f12 doc: minor, adjust image syntax and headings
- Consistent formatting of image formatting
 - Make container examples easier to see

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:09 +02:00
Joachim Wiberg fcbd75a0ef doc: split scripting.md into multiple files
Way too long.  By splitting it in multiple files we can also user
simpler (shorter) headings, which makes navigation easier.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:08 +02:00
Joachim Wiberg d1e71454cf doc: markdown syntax, whitespace cleanup, and admonitions
Consistency between different sections in the documentation is critical.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:07 +02:00
Joachim Wiberg fdf1aaebcc doc: add versioning using "mike"
The Python tool 'mike'[1] helps manage multiple versions of MkDocs-powered
documentation.  Only required when building the kernelkit.org site docs!

For each new tag, that steps year or month, a new version of is created of
the documentation, in a separate sub-directory on the gh-pages branch.

Strategy - Version Grouping with Early Publishing:

- Extract YEAR.MONTH from tag
  E.g., v25.06.0-beta1, v25.06.0-rc1, v25.06.0, v25.06.1 → become version 25.06
- From first pre-release onwards:
  - v25.06.0-beta1 → creates docs version 25.06
  - v25.06.0-rc1 → updates docs version 25.06
  - v25.06.0 (GA) → updates docs version 25.06
  - v25.06.1 (patch) → updates docs version 25.06
- New major/minor series:
  - v25.07.0-beta1 → creates new docs version 25.07

Benefits:
 - Users get docs as soon as beta/rc is available
 - Patches update existing docs (logical since patches rarely change docs significantly)
 - Clean version grouping by YEAR.MONTH
 - Mike handles create vs update automatically

[1]: https://github.com/jimporter/mike

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:06 +02:00
Joachim Wiberg 238ea9118b doc: refactor section 'Upgrading Packages'
Major overhaul and simplification of both language and structure to
improve accessibility and UX in new documentation framework.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:06 +02:00
Joachim Wiberg 67838fa66b doc: minor cleanup, fix markdown syntax and admonitions
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:05 +02:00
Joachim Wiberg c574f23210 doc: reformat eth-counters.md to a proper markdown table
This will be easier to typset also in the PDF generated version.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:04 +02:00
Joachim Wiberg a66e000699 doc: fix broken links, GitHub vs MkDocs autolinking
Note, this change breaks some links on GitHub due to the difference in
how MkDocs and GitHub implement "autolinking" and anchors.  Since the
idea is to make MkDocs our primary documentation framework, breaking
links on GitHub in favor of MkDocs is the best compromise.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:03 +02:00
Joachim Wiberg c692c93f94 doc: split system.md -> system.md + upgrade.md
This makes it a lot easier to find relevant information on how to
perform a system upgrade.  Further consolidation may come later.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:02 +02:00
Joachim Wiberg a491f2a88b doc: minor syntax changes/cleanup, rephrase + use admonitions
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:58:01 +02:00
Joachim Wiberg 9d912446a7 doc: initial support for MkDocs Material framework
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-30 14:57:57 +02:00
Richard AlpeandGitHub 3d3a4cac55 Merge pull request #1083 from kernelkit/trigger-github-workflow
.github: workflow dispatch fixes
2025-07-29 13:07:42 +02:00
Richard Alpe fc0a68a18a .github: add name and target parameter to dispatch build
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-29 09:26:28 +02:00
Richard Alpe ea2627d4f6 .github: remove explicit required from build dispatch
Reduce number of lines. Required = false is the default.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-29 08:36:00 +02:00
Richard Alpe 21321f0196 .github: allow upstream workflow caller to set parallel
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-29 08:03:56 +02:00
Mattias WalströmandGitHub dadb90a6d8 Merge pull request #1068 from kernelkit/raspberry-pi
Raspberry pi
2025-07-12 11:23:12 +02:00
Mattias Walström d5d3eef08b rpi4: Move to a board package and normal aarch64 build
Features availible on RPI4 so far is:

* WiFi
* USB
* (Graphics, untested)
2025-07-11 17:06:39 +02:00
Mattias Walström 14fb93f5cf developers-guide: Add new builddep (for raspberry pi)
Add mtools
2025-07-11 17:06:38 +02:00
Mattias Walström 7b3cd7d663 probe: Add USB support for RPI4
Need some special handling for RPI, since RPI does not present a phandle
for the USB in sysfs (PCI device)
2025-07-11 17:06:37 +02:00
Mattias Walström 67817a182c board: common: Add a watchdogd configuration
Also increase the timeout and kick more often (required by RPI4)
2025-07-11 17:06:36 +02:00
Joachim WibergandGitHub 692fa166d1 Merge pull request #1049 from kernelkit/document-kernel-buildroot-update
Document process about upgrade buildroot and kernel

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-11 13:40:58 +02:00
Joachim WibergandGitHub c5d9a7c8b3 Merge pull request #1078 from kernelkit/ci-workflow-redesign
Redesign CI to use workflow calls

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-07-09 11:52:54 +02:00
Richard Alpe 45c588567d .github: fix parallel typo in dispatch
Fixes: 874c0a54 Use massive parallel in workflow for PRs

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-09 10:42:40 +02:00
Richard Alpe 2a8580edcc .github: allow workflow caller to pass test dir
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-07 09:53:06 +02:00
Richard Alpe ffd0c05f41 .github: allow workflow caller to pass 9pm config 2025-07-07 09:53:05 +02:00
Richard Alpe 9271c2439f .github: add name when calling test from self trigger 2025-07-07 09:53:04 +02:00
Richard Alpe 7295077f27 .github: update test.yml to support workflow call 2025-07-07 09:53:03 +02:00
Richard Alpe b3d76de8f3 .github: quote workflow call variables in trigger 2025-07-07 09:53:02 +02:00
Richard Alpe 56f14ff520 .github: build _minimal on self-trigger
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-07 09:53:01 +02:00
Richard Alpe 9845e3b0c7 .github: make flavor selection into a env option 2025-07-07 09:53:00 +02:00
Richard Alpe 08e6833266 .github: allow repo checkout override
Needed when called by spins inside different organizations.
2025-07-07 09:52:59 +02:00
Richard Alpe df54982978 .github: simplify flavor selection 2025-07-07 09:52:58 +02:00
Richard Alpe efd6cce842 .github: pass (Infix) name as workflow_call input
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-07 09:52:57 +02:00
Richard Alpe 1dc84af095 .github: use workflow calls to build and test
Redesign how GH actions are triggered. This new design uses a
self-trigger to start jobs which are only started via workflow_calls.

The main benefit of this is to be able to start workflows from various
Infix Spins without needing to duplicate the workflow files in them.

Upcoming patches are intended to parameterize to allow Spins to pass
different architectures, brand names and such.

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-07 09:52:55 +02:00
Tobias WaldekranzandGitHub d6c0d4bea7 Merge pull request #1042 from kernelkit/ixbin
ixbin: Add util script to update image contents
2025-07-04 11:23:33 +02:00
Tobias Waldekranz 85c4b579d3 ixbin: Add util script to update image contents
[skip-ci]
2025-07-04 11:20:46 +02:00
Joachim WibergandGitHub 1f268a7b90 Merge pull request #1079 from kernelkit/gen-test-spec
Minor Test Update
2025-07-03 14:51:04 +02:00
Ahmed Karic 562fd253c4 test: Update description in speed/duplex test 2025-07-03 14:01:27 +02:00
Ahmed Karic be547ba9a8 test: Generate forgotten test-spec
- container_host_commands test is missing .adoc and .svg files
2025-07-03 13:59:55 +02:00
Richard AlpeandGitHub 40e94883c6 Merge pull request #1076 from kernelkit/update-changelog
doc: update changelog date for v25.06
2025-07-01 14:19:41 +02:00
Richard Alpe 9f268606e4 doc: update changelog date for v25.06
Signed-off-by: Richard Alpe <richard@bit42.se>
2025-07-01 11:29:04 +02:00
Jon-Olov VatnandGitHub de113503ea Merge pull request #1075 from kernelkit/update-changelog-v25.06.0
Update Changelog for Infix v25.06.0
2025-06-30 09:48:30 +02:00
Jon-Olov Vatn 6f203b1c78 Update Changelog for Infix v25.06.0
[skip ci]
2025-06-30 08:40:45 +02:00
Mattias WalströmandGitHub c31bbbefa9 Merge pull request #1074 from kernelkit/wifi-fixes 2025-06-29 22:24:23 +02:00
Mattias Walström 0d03f874ee confd: wifi: Fix several bugs in WiFi implemenation
* Did not work to reconfigure
* Was not possible to run from startup
* Othe minor things.
2025-06-29 21:07:10 +02:00
Mattias Walström 51176c7d26 feature: wifi: Allow to set regulation setting (country-code)
We was missing the firmware required for this, and for this to work
cfg80211 needs to be as module since the rootfs is not loaded when it
is loaded if compiled in kernel.

And add iw since it very useful for debugging.
2025-06-29 21:06:33 +02:00
Mattias WalströmandGitHub 88958a0b1f Merge pull request #1073 from kernelkit/upgrade-kernel
Bump kernel to 6.12.35 (LTS)
2025-06-27 15:04:49 +02:00
Mattias Walström e3f87799b6 utils/kernel-refresh.sh: Stage defconfigs
Everything else got staged, but not defconfigs
2025-06-27 13:39:31 +02:00
Mattias Walström ebcb38be37 Bump kernel to 6.12.35 (LTS) 2025-06-27 13:36:41 +02:00
Ahmed KaricandGitHub 889fb3eb79 Merge pull request #1072 from kernelkit/container-remote-exec
Verify Host Command Execution from Container
2025-06-26 14:11:28 +02:00
Ahmed Karic 2a6e7e5208 test: Verify host command execution
Add test to verify a container on Infix can execute commands on the
host by mounting a script to `/etc/rc.local` with proper permissions.
The test confirms host hostname change using `nsenter` from inside
a privileged container.

Resolves #1024
2025-06-26 13:10:43 +02:00
Joachim WibergandGitHub 9629e2eef4 Merge pull request #1071 from kernelkit/mount-mode
Add support for setting mode of a container content mount
2025-06-26 12:35:02 +02:00
Joachim Wiberg a0c48e7b5f Add support for setting mode of a container content mount
Fixes #1070

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-25 19:49:47 +02:00
Ahmed KaricandGitHub edd2e60dd5 Merge pull request #1059 from kernelkit/speed_duplex
Verify auto-negotiated speed/duplex
2025-06-25 10:00:10 +02:00
Ahmed Karic ec82d68a9f test: Verify auto-negotiated speed/duplex (copper) 2025-06-25 08:54:33 +02:00
Ahmed Karic 20d5426935 test/docker: Upgrade docker image to include ethtool
Add `ethtool` to the Docker test environment to support
interface auto-negotiation tests.
2025-06-25 08:01:13 +02:00
Mattias WalströmandGitHub 9d6d0e2388 Merge pull request #1069 from kernelkit/upgrade-buildroot 2025-06-24 19:55:41 +02:00
Joachim WibergandGitHub 6167f2a6a4 Merge pull request #1067 from kernelkit/misc
New slogan and updated containers

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-24 15:11:06 +02:00
Joachim Wiberg 4ad2664b78 doc: update changelog for v25.06
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-24 13:54:54 +02:00
Joachim Wiberg fe031f1a10 package/klish: fix by-word movement and kill buffer support
- Fix by-word movement, detect word barrier using non-alphanum chars
 - Fix delete word left/right, make sure to save word in kill buffer

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-24 13:54:54 +02:00
Joachim Wiberg 0a3277caf2 package/curious-*: bump to v25.06.0
- Buildroot updated to v25.02.3
 - Tefactor of nftables container

The nftables container now includes BusyBox, a shell with vi and some
basic filesystem tools, as well as nsenter and unshare, suitable for
testing and other more advanced tasks.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-24 13:54:53 +02:00
Joachim Wiberg cac357458c Rebranding, make slogan more inclusive, Infix is more now ...
Fixes #1052

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-24 13:54:53 +02:00
Mattias Walström 7b8bc43bca Bump buildroot to 2025.02.4 (LTS) 2025-06-24 13:36:36 +02:00
Joachim Wiberg 5c7fc3f570 package/tetris: bump to v1.5.0
ChangeLog https://github.com/troglobit/tetris/releases/tag/1.5.0

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-22 21:12:50 +02:00
Joachim WibergandGitHub bae70ec85a Merge pull request #1066 from kernelkit/upgrade-kernel
Upgrade Linux kernel to 6.12.34 (LTS)

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-06-20 09:52:54 +02:00
Mattias Walström eeb10b0f07 Upgrade Linux kernel to 6.12.34 (LTS) 2025-06-19 21:14:30 +02:00
Mattias WalströmandGitHub b92c9daedd Merge pull request #1058 from kernelkit/wifi-support 2025-06-19 18:34:35 +02:00
Mattias Walström eabaaac7c2 Document process about upgrade buildroot and kernel 2025-06-19 15:47:54 +02:00
Mattias Walström de33df14e2 test: case: ietf_syslog/remote: Fix typo of interface type
Has not been triggered before because we ignored operations on fixed
interfaces.
2025-06-19 15:23:32 +02:00
Mattias Walström 5eeed0e743 changelog: Update with Wi-Fi client
Also add kernel update to correct release.
2025-06-19 15:23:31 +02:00
Mattias Walström 24852caad0 doc: Add Wi-Fi Documention 2025-06-19 15:23:31 +02:00
Mattias Walström 08f4207277 configs: Enable Wi-Fi support 2025-06-19 15:23:30 +02:00
Mattias Walström 5fbb30fed5 Wi-Fi: Add Wi-Fi information to operational and CLI output
* show wifi scan <ifname> to see located SSIDs
* interface status
2025-06-19 15:23:30 +02:00
Mattias Walström f25f0ab050 Wi-Fi: Add template finit service for wpa_supplicant 2025-06-19 15:23:29 +02:00
Mattias Walström b53c1612f0 confd: Add basic Wi-Fi client support
Support implemented:
* WPA2/3 support
* scanning (in background, results in operational)
* Unencrypted networks

No certificate support, only PSK

*only* client so far, no AP
2025-06-19 15:23:28 +02:00
Mattias Walström 57d5bf1577 confd: Add script to wait for an interface
usage: wait-interface wlan0 30
2025-06-19 15:23:27 +02:00
Mattias Walström 0ad8fab5c7 wpa_supplicant: Add support for pidfile when not daemonize 2025-06-19 15:23:27 +02:00
Mattias Walström ecabce86c7 Add meta-package for adding Wi-Fi support
Helps adding everything that needs to be compiled to get
Wi-Fi support working.

Both modules, firmware and applications are selected here
2025-06-19 15:23:26 +02:00
Mattias Walström a7e72a46d9 confd: Simplify enabling features in YANG models
If a extra infix feature  require features to be added to an already
loaded module. Instead of have the exact module definition in multiple
places (with date), this will allow a much more flexible sytax:

MODULES=(
	"infix-interfaces -e containers"
)

This require that the infix-interfaces is loaded *before* this file
is run.
2025-06-19 15:23:25 +02:00
Mattias Walström 915bef2dd4 udev: Rename all wlan interfaces wifiN and start scanning
This since the feature is called 'wifi' in Infix, this makes the naming
consistent over the system.

Also trigger start of a wpa_supplicant, for scanning in the background.
The scanning results is available operational.
2025-06-19 15:23:24 +02:00
Mattias Walström 7f9a1df6f7 qemu: Increase memory for virtual machine
Image is too big, more memory is required
2025-06-19 15:23:24 +02:00
Mattias Walström 67a6fc18d5 confd: Always run netdag_gen_afspec_set and netdag_gen_afspec_add on all iftypes
If an iftype does not need to do anything, just return 0.
This makes the code much more easy to follow.
2025-06-19 15:23:23 +02:00
Mattias Walström 8538888069 confd: core: Allow all other flags then SR_SUBSCR_UPDATE
Other flags may be load-bearing in some modules, but SR_SUBSCR_UPDATE,
we never want to keep track on in the core hooks.
2025-06-19 10:34:46 +02:00
Mattias WalströmandGitHub 5a1cf7f9f8 Merge pull request #1063 from kernelkit/upgrade-kernel
Upgrade Linux kernel to v6.12.33 (LTS)
2025-06-18 07:56:21 +02:00
Ahmed Karic 6755011b25 Upgrade Linux kernel to 6.12.33 (LTS) 2025-06-16 10:49:02 +02:00
Mattias WalströmandGitHub e5a8514fa0 Merge pull request #1061 from kernelkit/update-changelog-v25.05.1
Update changelog for Infix v25.05.1
2025-06-12 15:03:41 +02:00
Jon-Olov Vatn 82c3eb1ee7 Update changelog for Infix v25.05.1 2025-06-12 12:31:35 +02:00
Jon-Olov VatnandGitHub 159135786a Merge pull request #1060 from kernelkit/fix-missing-cmd-regression
Restore missing CLI commands moved to show context
2025-06-11 09:14:09 +02:00
Richard Alpe 8a9415f0b4 klish-plugin-infix: restore missing CLI commands moved to show context
Some CLI commands where inadvertently moved from the global CLI
context into the show context.

For example the upgrade command.

As a result, commands like upgrade were unavailable at the top-level
prompt:admin@ix-00-00-00:/> upgrade ?
Error: Command not found, or incomplete.

However, these commands remained accessible under the "show" context
as a temporary workaround:

admin@ix-00-00-00:/> show upgrade ?
URI  [(ftp|tftp|http|https|ftp)://(dns.name | ip.address)/path/to/]upgrade-bundle.pkg

This patch restores the affected commands to the global CLI context so
that commands like upgrade function as intended at the root prompt.

Fixes: 9c0a8e39 klish-plugin-infix: fix indentation in infix.xml

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-06-10 16:06:12 +02:00
Mattias WalströmandGitHub 93cffaedde Merge pull request #1057 from kernelkit/upgrade-kernel 2025-06-04 21:22:39 +02:00
Ahmed Karic 991364b411 Upgrade linux kernel to v6.12.32 (LTS) 2025-06-04 18:21:11 +02:00
Mattias WalströmandGitHub 22cf97fdbd Merge pull request #1056 from kernelkit/upgrade-kernel 2025-05-30 12:49:48 +02:00
Ahmed Karic 16c1b50349 Upgrade Linux kernel to 6.12.31 (LTS) 2025-05-30 11:26:53 +02:00
960 changed files with 29616 additions and 34894 deletions
+7
View File
@@ -27,10 +27,17 @@ Pull Requests
Releases
--------
Recommended checkpoints, use at your own discretion:
- Make at least one -betaN release to verify the GitHub workflow well in time release day
- Stuff happens, remember kernelkit/infix#735
- Make at least one -rcN to flush out any issues in customer repos
- Easy to forget adaptations/hacks in customer repos -- may need Infix change/support
- Verify release artifacts (checksums, completeness, no corrupted files)
- Test on actual hardware for at least one architecture
- Review ChangeLog for completeness
- Check for release-blocking issues
- Verify generated GNS3 appliance, no marketplace update on -rc builds
- Ensure the markdown link for the release diff is updated
- Ensure subrepos are tagged (can be automated, see kernelkit/infix#393)
- Sync tags for all repo. sync activities
+215
View File
@@ -0,0 +1,215 @@
name: bitSign Infix Release
on:
workflow_dispatch:
inputs:
release_version:
description: 'Release version (e.g., v25.08.0)'
required: true
type: string
push:
branches: [ sign-with-bitsign ]
jobs:
sign-infix-release:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Validate release version format
id: validate
run: |
# Use default version for push events, input version for manual dispatch
if [ "${{ github.event_name }}" = "push" ]; then
VERSION="v25.08.0"
echo "Using default version for push trigger: $VERSION"
else
VERSION="${{ inputs.release_version }}"
echo "Using input version for manual trigger: $VERSION"
fi
# Check if version starts with 'v' and has proper format
if ! echo "$VERSION" | grep -qE '^v[0-9]+\.[0-9]+(\.[0-9]+)?(-alpha[0-9]*|-beta[0-9]*|-rc[0-9]*)?$'; then
echo "❌ Invalid version format. Expected format: vYY.MM(.PP)(-alphaN|-betaN|-rcN)"
echo "Examples: v25.08.0, v25.08.0-alpha1, v25.08.0-rc1"
exit 1
fi
# Extract version without 'v' prefix for filename
FILE_VERSION="${VERSION#v}"
FILENAME="infix-x86_64-${FILE_VERSION}.tar.gz"
RELEASE_URL="https://github.com/kernelkit/infix/releases/download/${VERSION}/${FILENAME}"
echo "✅ Version format valid"
echo "file_version=${FILE_VERSION}" >> $GITHUB_OUTPUT
echo "filename=${FILENAME}" >> $GITHUB_OUTPUT
echo "release_url=${RELEASE_URL}" >> $GITHUB_OUTPUT
- name: Download Infix release
run: |
RELEASE_URL="${{ steps.validate.outputs.release_url }}"
FILENAME="${{ steps.validate.outputs.filename }}"
echo "Downloading Infix release: $FILENAME"
echo "From: $RELEASE_URL"
if ! curl -L "$RELEASE_URL" -o "$FILENAME" --fail --show-error --progress-bar; then
echo "❌ Failed to download release file from: $RELEASE_URL"
echo "Please verify that the release version exists and contains the x86_64 build."
echo "You can check available releases at: https://github.com/kernelkit/infix/releases"
exit 1
fi
# Verify download
if [ -f "$FILENAME" ] && [ -s "$FILENAME" ]; then
FILE_SIZE=$(ls -lh "$FILENAME" | awk '{print $5}')
echo "✅ Successfully downloaded: $FILENAME ($FILE_SIZE)"
else
echo "❌ Failed to download release file"
exit 1
fi
- name: Create signing request
id: create_request
run: |
FILENAME="${{ steps.validate.outputs.filename }}"
FILE_VERSION="${{ steps.validate.outputs.file_version }}"
RELEASE="infix-x86_64-${FILE_VERSION}"
echo "Creating signing request for $FILENAME..."
echo "RELEASE parameter: $RELEASE"
# Create signing request using bitSign API
RESPONSE=$(curl -s -X POST "https://portal.bitsign.se/api/v1/requests" \
-H "Authorization: Bearer ${{ secrets.BITSIGN_API_KEY }}" \
-F "file=@$FILENAME" \
-F "key=bit42-Demo1" \
-F "job=Infix-x86" \
-F "parameters={\"RELEASE\": \"$RELEASE\"}")
echo "API Response: $RESPONSE"
# Check if request was successful
if echo "$RESPONSE" | jq -e '.success == true' > /dev/null; then
REQUEST_ID=$(echo "$RESPONSE" | jq -r '.requestId')
echo "✅ Request created successfully with ID: $REQUEST_ID"
echo "request_id=$REQUEST_ID" >> $GITHUB_OUTPUT
else
echo "❌ Failed to create signing request"
echo "$RESPONSE" | jq -r '.error // .message // "Unknown error"'
exit 1
fi
- name: Wait for signing completion
id: wait_completion
run: |
REQUEST_ID="${{ steps.create_request.outputs.request_id }}"
echo "Waiting for signing completion for request: $REQUEST_ID"
# Poll status for up to 10 minutes (600 seconds) - longer timeout for larger files
MAX_WAIT=600
WAITED=0
while [ $WAITED -lt $MAX_WAIT ]; do
RESPONSE=$(curl -s -X GET "https://portal.bitsign.se/api/v1/requests/$REQUEST_ID/status" \
-H "Authorization: Bearer ${{ secrets.BITSIGN_API_KEY }}")
STATUS=$(echo "$RESPONSE" | jq -r '.status')
echo "Current status: $STATUS (waited ${WAITED}s)"
if [ "$STATUS" = "completed" ]; then
echo "✅ Signing completed successfully!"
break
elif [ "$STATUS" = "failed" ]; then
echo "❌ Signing failed"
echo "$RESPONSE" | jq -r '.error // .message // "Unknown error"'
exit 1
fi
sleep 10
WAITED=$((WAITED + 10))
done
if [ $WAITED -ge $MAX_WAIT ]; then
echo "❌ Timeout: Signing did not complete within ${MAX_WAIT} seconds"
exit 1
fi
- name: Download signed file
id: download_signed
run: |
REQUEST_ID="${{ steps.create_request.outputs.request_id }}"
FILENAME="${{ steps.validate.outputs.filename }}"
FILE_VERSION="${{ steps.validate.outputs.file_version }}"
SIGNED_FILENAME="infix-x86_64-${FILE_VERSION}-signed.tar.gz"
echo "Downloading signed file for request: $REQUEST_ID"
echo "Expected signed filename: $SIGNED_FILENAME"
# Download the signed file
curl -X GET "https://portal.bitsign.se/api/v1/requests/$REQUEST_ID/download" \
-H "Authorization: Bearer ${{ secrets.BITSIGN_API_KEY }}" \
-o "$SIGNED_FILENAME" \
--fail --show-error
if [ -f "$SIGNED_FILENAME" ] && [ -s "$SIGNED_FILENAME" ]; then
FILE_SIZE=$(ls -lh "$SIGNED_FILENAME" | awk '{print $5}')
echo "Successfully downloaded signed file: $SIGNED_FILENAME ($FILE_SIZE)"
echo "signed_filename=$SIGNED_FILENAME" >> $GITHUB_OUTPUT
# Calculate SHA256 checksums for both files
ORIGINAL_SHA256=$(sha256sum "$FILENAME" | cut -d' ' -f1)
SIGNED_SHA256=$(sha256sum "$SIGNED_FILENAME" | cut -d' ' -f1)
echo "original_sha256=$ORIGINAL_SHA256" >> $GITHUB_OUTPUT
echo "signed_sha256=$SIGNED_SHA256" >> $GITHUB_OUTPUT
else
echo "Failed to download signed file"
exit 1
fi
- name: Upload signed artifacts
uses: actions/upload-artifact@v4
with:
name: signed-infix-${{ steps.validate.outputs.file_version }}
path: ${{ steps.download_signed.outputs.signed_filename }}
retention-days: 90
- name: Summary
run: |
# Determine the actual version used (could be from push or input)
if [ "${{ github.event_name }}" = "push" ]; then
ACTUAL_VERSION="v25.08.0"
else
ACTUAL_VERSION="${{ inputs.release_version }}"
fi
cat >> $GITHUB_STEP_SUMMARY << EOF
# bitSign Infix Release Signing Complete
The Infix release has been successfully signed using the bitSign API.
## Signing Details
| Property | Value |
|----------|-------|
| 📦 **Original File** | \`${{ steps.validate.outputs.filename }}\` (\`${{ steps.download_signed.outputs.original_sha256 }}\`) |
| ✍️ **Signed File** | \`${{ steps.download_signed.outputs.signed_filename }}\` (\`${{ steps.download_signed.outputs.signed_sha256 }}\`) |
| 🔑 **Signing Key** | \`bit42-Demo1\` |
| ⚙️ **Job Type** | \`Infix-x86\` |
| 🆔 **Request ID** | \`${{ steps.create_request.outputs.request_id }}\` |
| 📋 **Release Version** | \`\$ACTUAL_VERSION\` |
| 🌐 **API Endpoint** | \`portal.bitsign.se\` |
## Download Files
> **The signed release file is available as a workflow artifact:**
> **\`signed-infix-${{ steps.validate.outputs.file_version }}\`**
>
> The artifact contains the signed file: \`${{ steps.download_signed.outputs.signed_filename }}\`
---
**Next Steps:** The signed release can now be distributed with cryptographic verification of authenticity.
EOF
+144
View File
@@ -0,0 +1,144 @@
name: Build Bootloaders
on:
workflow_dispatch:
inputs:
branch:
description: 'Branch to build from'
default: 'main'
type: string
jobs:
build:
name: Build ${{ matrix.defconfig }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
defconfig:
- fireant_boot
- cn9130_crb_boot
- aarch64_qemu_boot
- rpi4_boot
- bpi_r3_boot
env:
MAKEFLAGS: -j5
steps:
- name: Cleanup Build Folder
run: |
ls -la ./
rm -rf ./* || true
rm -rf ./.??* || true
ls -la ./
- name: Checkout infix repo
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.branch || github.ref }}
clean: true
fetch-depth: 0
submodules: recursive
- name: Set Build Variables
id: vars
run: |
defconfig=${{ matrix.defconfig }}
version=$(awk -F'"' '/BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE=/ {print $2}' configs/${defconfig}_defconfig)
version=${version:-git}
filename=$(echo "${defconfig}" | tr '_' '-')
# TODO: Replace hardcoded rev with actual revision stepping
rev="latest"
archive="${filename}-${version}-${rev}.tar.gz"
dirname="${filename}-${version}-${rev}"
echo "defconfig=${defconfig}" >> $GITHUB_OUTPUT
echo "version=${version}" >> $GITHUB_OUTPUT
echo "rev=${rev}" >> $GITHUB_OUTPUT
echo "archive=${archive}" >> $GITHUB_OUTPUT
echo "dirname=${dirname}" >> $GITHUB_OUTPUT
echo "Building ${defconfig}_defconfig, version ${version}-${rev}, artifact ${archive} ..."
- name: Restore Cache of dl/
uses: actions/cache@v4
with:
path: dl/
key: dl-boot-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
restore-keys: |
dl-boot-
dl-
- name: Restore Cache of .ccache/
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-boot-${{ matrix.defconfig }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-boot-${{ matrix.defconfig }}-
ccache-boot-
ccache-
- name: Configure ${{ matrix.defconfig }}_defconfig
run: |
make ${{ matrix.defconfig }}_defconfig
- name: Build ${{ matrix.defconfig }}_defconfig
run: |
echo "Building ${{ matrix.defconfig }}_defconfig ..."
make -j$((`getconf _NPROCESSORS_ONLN` / 2 + 2))
- name: Resulting size of build
run: |
printf "Size of output/images/: "
ls -l output/images/
- name: Prepare ${{ matrix.defconfig }} Artifact
run: |
cd output/
mv images ${{ steps.vars.outputs.dirname }}
tar cfz ${{ steps.vars.outputs.archive }} ${{ steps.vars.outputs.dirname }}/
- uses: actions/upload-artifact@v4
with:
path: output/${{ steps.vars.outputs.archive }}
name: artifact-${{ matrix.defconfig }}
publish:
name: Upload Bootloader Artifacts
runs-on: ubuntu-latest
needs: build
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: "artifact-*"
merge-multiple: true
- name: Create checksums ...
run: |
for file in *.tar.gz; do
sha256sum $file > $file.sha256
done
- uses: ncipollo/release-action@v1
with:
allowUpdates: true
omitName: true
omitBody: true
omitBodyDuringUpdate: true
prerelease: true
tag: "latest-boot"
token: ${{ secrets.GITHUB_TOKEN }}
artifacts: "*.tar.gz*"
- name: Summary
run: |
cat <<EOF >> $GITHUB_STEP_SUMMARY
# Bootloader Build Complete! :rocket:
For the public download links of these bootloader artifacts, please see:
<https://github.com/kernelkit/infix/releases/tag/latest-boot>
EOF
+218
View File
@@ -0,0 +1,218 @@
name: Create SD Card Images
on:
workflow_dispatch:
inputs:
board:
description: 'Board to create image for'
type: choice
required: true
options:
- raspberrypi-rpi64
- bananapi-bpi-r3
- friendlyarm-nanopi-r2s
default: 'raspberrypi-rpi64'
use_latest_release:
description: 'Use latest release artifacts instead of workflow artifacts'
type: boolean
default: false
jobs:
create-image:
name: Create SD Card Image for ${{ inputs.board }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
clean: true
fetch-depth: 0
submodules: recursive
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
genimage \
u-boot-tools \
parted \
gdisk \
qemu-utils \
dosfstools \
e2fsprogs \
genext2fs \
mtools \
jq
- name: Prepare build environment
run: |
# Set up directory structure similar to buildroot build
mkdir -p output/images
mkdir -p build
- name: Set bootloader and target based on board
run: |
case "${{ inputs.board }}" in
raspberrypi-rpi64)
echo "BOOTLOADER=rpi4_boot" >> $GITHUB_ENV
echo "TARGET=aarch64" >> $GITHUB_ENV
;;
bananapi-bpi-r3)
echo "BOOTLOADER=bpi_r3_boot" >> $GITHUB_ENV
echo "TARGET=aarch64" >> $GITHUB_ENV
;;
friendlyarm-nanopi-r2s)
echo "BOOTLOADER=nanopi_r2s_boot" >> $GITHUB_ENV
echo "TARGET=aarch64" >> $GITHUB_ENV
;;
*)
echo "Error: Unknown board ${{ inputs.board }}"
exit 1
;;
esac
echo "Using bootloader: $BOOTLOADER and target: $TARGET for board: ${{ inputs.board }}"
- name: Download bootloader artifacts
if: ${{ !inputs.use_latest_release }}
run: |
# Download from latest bootloader build workflow on main branch
gh run list --workflow=build-boot.yml --branch=main --limit=1 --status=success --json databaseId --jq '.[0].databaseId' > latest_boot_run_id
BOOT_RUN_ID=$(cat latest_boot_run_id)
gh run download ${BOOT_RUN_ID} --name artifact-${BOOTLOADER} --dir temp_bootloader/
# Extract bootloader directly to output/images
cd temp_bootloader/
tar -xzf *.tar.gz --strip-components=1 -C ../output/images/
cd ../
rm -rf temp_bootloader/
echo "Bootloader files extracted to output/images:"
ls -la output/images/
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download Infix artifacts
if: ${{ !inputs.use_latest_release }}
run: |
# Download from latest Kernelkit Trigger workflow for main branch
gh run list --workflow=164295764 --branch=main --limit=1 --status=success --json databaseId --jq '.[0].databaseId' > latest_infix_run_id
INFIX_RUN_ID=$(cat latest_infix_run_id)
gh run download ${INFIX_RUN_ID} --name artifact-${TARGET} --dir temp_infix/
# Extract Infix directly to output/images
cd temp_infix/
tar -xzf *.tar.gz --strip-components=1 -C ../output/images/
cd ../
rm -rf temp_infix/
echo "Infix files extracted to output/images:"
ls -la output/images/
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download from latest releases
if: ${{ inputs.use_latest_release }}
run: |
# Download latest bootloader release
gh release download latest-boot --pattern "*${BOOTLOADER}*" --dir temp_bootloader/
cd temp_bootloader/
tar -xzf *.tar.gz --strip-components=1 -C ../output/images/
cd ../
rm -rf temp_bootloader/
# Download latest Infix release
gh release download latest --pattern "*${TARGET}*" --dir temp_infix/
cd temp_infix/
tar -xzf *.tar.gz --strip-components=1 -C ../output/images/
cd ../
rm -rf temp_infix/
echo "All files extracted to output/images:"
ls -la output/images/
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Verify extracted files
run: |
echo "Files available for mkimage.sh:"
ls -la output/images/
echo ""
echo "File types:"
file output/images/* || true
- name: Create SD card image
run: |
export BINARIES_DIR=$PWD/output/images
export BUILD_DIR=$PWD/build
export BR2_EXTERNAL_INFIX_PATH=$PWD
export RELEASE=""
export INFIX_ID="infix"
./utils/mkimage.sh ${{ inputs.board }}
- name: Verify created image
run: |
echo "Contents of output/images after mkimage.sh:"
ls -lh output/images/
# Look for SD card image with pattern: *-sdcard.img
if ls output/images/*-sdcard.img 1> /dev/null 2>&1; then
echo "Found SD card image(s):"
for img in output/images/*-sdcard.img; do
echo "- $(basename $img)"
file "$img"
fdisk -l "$img" 2>/dev/null || true
done
else
echo "No SD card image found matching pattern: *-sdcard.img"
echo "Available files:"
ls -la output/images/
exit 1
fi
- name: Upload SD card image
uses: actions/upload-artifact@v4
with:
name: sdcard-image-${{ inputs.board }}-${{ env.BOOTLOADER }}
path: |
output/images/*-sdcard.img*
retention-days: 30
- name: Create checksums
run: |
cd output/images/
for file in *-sdcard.img; do
if [ -f "$file" ]; then
sha256sum "$file" > "$file.sha256"
fi
done
- name: Upload to release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
omitName: true
omitBody: true
omitBodyDuringUpdate: true
prerelease: true
tag: "latest-boot"
token: ${{ secrets.GITHUB_TOKEN }}
artifacts: "output/images/*-sdcard.img*"
- name: Generate summary
run: |
cat <<EOF >> $GITHUB_STEP_SUMMARY
# SD Card Image Build Complete! 🚀
**Board:** ${{ inputs.board }}
**Target:** ${{ env.TARGET }}
**Bootloader:** ${{ env.BOOTLOADER }}
**Artifact Source:** ${{ inputs.use_latest_release && 'Latest Release' || 'Latest Workflow Run' }}
## Created Images
$(find output/images/ -name "*.img*" -o -name "*.qcow2" -o -name "*.raw" | xargs ls -lh 2>/dev/null | sed 's/^/- /' || echo "- No images found")
## Download
The SD card image is available as a workflow artifact above.
EOF
+102
View File
@@ -0,0 +1,102 @@
name: Build Release
on:
workflow_call:
inputs:
version:
required: true
type: string
use_cache:
required: false
type: boolean
default: true
jobs:
build:
name: Build Infix ${{ inputs.version }} [${{ matrix.target }}]
runs-on: [self-hosted, release]
strategy:
matrix:
target: [aarch64, x86_64]
fail-fast: false
steps:
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- uses: actions/checkout@v4
with:
clean: true
submodules: recursive
- name: Set Release Variables
id: vars
run: |
ver=${{ inputs.version }}
echo "ver=${ver}" >> $GITHUB_OUTPUT
fver=${ver#v}
target=${{ matrix.target }}-${fver}
echo "dir=infix-$target" >> $GITHUB_OUTPUT
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
- name: Restore Cache of dl/
if: ${{ inputs.use_cache }}
uses: actions/cache@v4
with:
path: dl/
key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
restore-keys: |
dl-
- name: Restore Cache of .ccache/
if: ${{ inputs.use_cache }}
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-${{ matrix.target }}-
ccache-
- name: Configure & Build
env:
INFIX_RELEASE: ${{ steps.vars.outputs.ver }}
run: |
target=${{ matrix.target }}_defconfig
echo "Building $target ..."
make $target
make
- name: Generate SBOM from Build
run: |
make legal-info
- name: Build test specification
run: |
make test-spec
- name: Prepare Artifacts
run: |
cd output/
mv images ${{ steps.vars.outputs.dir }}
ln -s ${{ steps.vars.outputs.dir }} images
tar cfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
mv legal-info legal-info-${{ matrix.target }}-${{ steps.vars.outputs.ver }}
tar cfz legal-info-${{ matrix.target }}-${{ steps.vars.outputs.ver }}.tar.gz legal-info-${{ matrix.target }}-${{ steps.vars.outputs.ver }}
- uses: actions/upload-artifact@v4
with:
name: artifact-${{ matrix.target }}
path: output/*.tar.gz
- uses: actions/upload-artifact@v4
with:
name: artifact-disk-image-${{ matrix.target }}
path: output/images/*.qcow2
+74 -154
View File
@@ -1,30 +1,54 @@
name: Bob the Builder
name: Build
on:
pull_request:
types: [opened, synchronize, reopened, labeled]
push:
branches:
- main
workflow_dispatch:
inputs:
minimal:
description: 'Build minimal defconfigs'
required: false
default: true
type: boolean
parallell:
target:
description: "Build target (e.g. aarch64 or aarch64_minimal)"
default: "x86_64"
type: string
parallel:
description: 'Massive parallel build of each image'
required: false
default: true
type: boolean
name:
description: "Name (for spin overrides)"
default: "infix"
type: string
infix_repo:
description: 'Repo to checkout (for spin overrides)'
default: kernelkit/infix
type: string
workflow_call:
inputs:
target:
required: true
type: string
name:
required: true
type: string
infix_repo:
required: false
type: string
default: kernelkit/infix
parallel:
required: false
type: boolean
default: true
env:
NAME: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }}
TARGET: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
INFIX_REPO: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_repo || inputs.infix_repo }}
jobs:
build:
name: Build Infix ${{ matrix.target }}
name: Build ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
runs-on: [ self-hosted, latest ]
env:
PARALLEL: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.parallel == 'true' || github.event_name != 'workflow_dispatch' && inputs.parallel == true }}
strategy:
matrix:
target: [aarch64, x86_64]
fail-fast: false
outputs:
build_id: ${{ steps.vars.outputs.INFIX_BUILD_ID }}
@@ -35,9 +59,21 @@ jobs:
rm -rf ./* || true
rm -rf ./.??* || true
ls -la ./
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- uses: actions/checkout@v4
- name: Checkout infix repo
uses: actions/checkout@v4
with:
repository: ${{ env.INFIX_REPO }}
ref: ${{ github.ref }}
clean: true
fetch-depth: 0
submodules: recursive
@@ -55,26 +91,12 @@ jobs:
"${{ github.event.number }}" "${{ github.event.pull_request.head.sha }}" \
| tee -a $GITHUB_OUTPUT $GITHUB_ENV
fi
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
if [ "${{ github.event.inputs.minimal }}" == "true" ]; then
flavor="_minimal"
fi
else
# Ensure 'release' job get the proper image when building main
if [ "$GITHUB_REF_NAME" != "main" ]; then
flavor="_minimal"
else
flavor=""
fi
if ${{ contains(github.event.pull_request.labels.*.name, 'ci:main') }}; then
flavor=""
fi
fi
target=${{ matrix.target }}
echo "dir=infix-$target" >> $GITHUB_OUTPUT
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
echo "flv=$flavor" >> $GITHUB_OUTPUT
echo "Building target ${target}${flavor}_defconfig"
target=${{ env.TARGET }}
name=${{ env.NAME }}
echo "dir=${name}-${target}" >> $GITHUB_OUTPUT
echo "tgz=${name}-${target}.tar.gz" >> $GITHUB_OUTPUT
echo "Building target ${target}_defconfig"
- name: Restore Cache of dl/
uses: actions/cache@v4
@@ -88,16 +110,21 @@ jobs:
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
key: ccache-${{ env.TARGET }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-${{ matrix.target }}-
ccache-${{ env.TARGET }}-
ccache-
- name: Configure ${{ matrix.target }}${{ steps.vars.outputs.flv }}
- name: Configure ${{ env.TARGET }}
run: |
make ${{ matrix.target }}${{ steps.vars.outputs.flv }}_defconfig
make ${{ env.TARGET }}_defconfig
- name: Unit Test ${{ matrix.target }}
- name: Cleanup stale containers and ports
run: |
podman rm -af || true
pkill -9 -f rootlessport || true
- name: Unit Test ${{ env.TARGET }}
run: |
make test-unit
@@ -105,7 +132,7 @@ jobs:
id: parallel
run: |
if [ "${{ ((github.event.inputs.parallel == 'true' && github.event_name == 'workflow_dispatch') || (github.ref_name != 'main' && github.event_name != 'workflow_dispatch')) }}" == "true" ]; then
if [ "$PARALLEL" == "true" ]; then
echo "BR2_PER_PACKAGE_DIRECTORIES=y" >> output/.config
MAKE="make -j$((`getconf _NPROCESSORS_ONLN` / 2 + 2))"
echo "Building in parallel with -j$((`getconf _NPROCESSORS_ONLN` / 2 + 2))"
@@ -115,9 +142,9 @@ jobs:
fi
echo "MAKE=$MAKE" >> $GITHUB_OUTPUT
- name: Build ${{ matrix.target }}${{ steps.vars.outputs.flv }}
- name: Build ${{ env.TARGET }}
run: |
echo "Building ${{ matrix.target }}${{ steps.vars.outputs.flv }}_defconfig ..."
echo "Building ${{ env.TARGET }}_defconfig ..."
eval "${{ steps.parallel.outputs.MAKE }}"
- name: Check SBOM from Build
@@ -139,7 +166,7 @@ jobs:
printf "Size of output/images/: "
ls -l output/images/
- name: Prepare ${{ matrix.target }} Artifact
- name: Prepare ${{ env.TARGET }} Artifact
run: |
cd output/
mv images ${{ steps.vars.outputs.dir }}
@@ -149,111 +176,4 @@ jobs:
- uses: actions/upload-artifact@v4
with:
path: output/${{ steps.vars.outputs.tgz }}
name: artifact-${{ matrix.target }}
test:
name: Regression Test of Infix x86_64
needs: build
runs-on: [ self-hosted, regression ]
steps:
- uses: actions/checkout@v4
with:
clean: true
submodules: recursive
- name: Set Build Variables
id: vars
run: |
if [ -n "${{ needs.build.outputs.build_id }}" ]; then
echo "INFIX_BUILD_ID=${{ needs.build.outputs.build_id }}" \
>>$GITHUB_ENV
fi
if [ "$GITHUB_REF_NAME" != "main" ]; then
flavor="_minimal"
else
flavor=""
fi
echo "flv=$flavor" >> $GITHUB_OUTPUT
- name: Configure x86_64${{ steps.vars.outputs.flv }}
run: |
make x86_64${{ steps.vars.outputs.flv }}_defconfig
- uses: actions/download-artifact@v4
with:
pattern: "artifact-*"
merge-multiple: true
- name: Restore x86-64${{ steps.vars.outputs.flv }} output/
run: |
ls -l
mkdir -p output
mv infix-x86_64.tar.gz output/
cd output/
tar xf infix-x86_64.tar.gz
ln -s infix-x86_64 images
- name: Regression Test x86_64${{ steps.vars.outputs.flv }}
run: |
make test
- name: Publish Test Result for x86_64${{ steps.vars.outputs.flv }}
# Ensure this runs even if Regression Test fails
if: always()
run: cat test/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY
- name: Generate Test Report for x86_64${{ steps.vars.outputs.flv }}
# Ensure this runs even if Regression Test fails
if: always()
run: |
asciidoctor-pdf \
--theme test/9pm/report/theme.yml \
-a pdf-fontsdir=test/9pm/report/fonts \
test/.log/last/report.adoc \
-o test/.log/last/report.pdf
- name: Upload Test Report as Artifact
uses: actions/upload-artifact@v4
with:
name: test-report
path: test/.log/last/report.pdf
release:
if: ${{github.repository_owner == 'kernelkit' && github.ref_name == 'main'}}
name: Upload Latest Build
needs: test
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: "artifact-*"
merge-multiple: true
- name: Create checksums ...
run: |
for file in *.tar.gz; do
sha256sum $file > $file.sha256
done
- uses: ncipollo/release-action@v1
with:
allowUpdates: true
omitName: true
omitBody: true
omitBodyDuringUpdate: true
prerelease: true
tag: "latest"
token: ${{ secrets.GITHUB_TOKEN }}
artifacts: "*.tar.gz*"
- name: Summary
run: |
cat <<EOF >> $GITHUB_STEP_SUMMARY
# Latest Build Complete! :rocket:
For the public download links of these build artifacts, please see:
<https://github.com/kernelkit/infix/releases/tag/latest>
EOF
name: artifact-${{ env.TARGET }}
+112
View File
@@ -0,0 +1,112 @@
name: Check Kernel 6.12 Release
on:
workflow_dispatch: # Allow manual triggering
jobs:
check-kernel:
runs-on: ubuntu-latest
steps:
- name: Check out infix repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
- name: Check out linux repository
uses: actions/checkout@v4
with:
repository: kernelkit/linux
path: linux
fetch-depth: 0
token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
- name: Fetch kernel.org and check for 6.12 release
id: check
run: |
# Fetch the kernel.org frontpage and extract 6.12 version
CURRENT_VERSION=$(curl -s https://www.kernel.org/ | grep -oP '6\.12\.\d+' | head -n1)
if [ -z "$CURRENT_VERSION" ]; then
echo "Failed to fetch kernel version"
exit 1
fi
echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
echo "Current 6.12 kernel version: $CURRENT_VERSION"
# Get the latest tag from our linux tree
cd linux
git fetch origin
LATEST_TAG=$(git tag -l "v6.12.*" | sort -V | tail -n1 | sed 's/^v//')
cd ..
echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT
echo "Latest tag in our tree: $LATEST_TAG"
if [ "$CURRENT_VERSION" != "$LATEST_TAG" ]; then
echo "new_release=true" >> $GITHUB_OUTPUT
echo "🎉 New 6.12 kernel released: $CURRENT_VERSION (our version: $LATEST_TAG)"
else
echo "new_release=false" >> $GITHUB_OUTPUT
echo "No change - still at $CURRENT_VERSION"
fi
- name: Set up git credentials
if: steps.check.outputs.new_release == 'true'
run: |
git config --global user.email "ael-bot@users.noreply.github.com"
git config --global user.name "ael-bot"
# Configure git to use the token for HTTPS operations
git config --global url."https://ael-bot:${{ secrets.KERNEL_UPDATE_TOKEN }}@github.com/".insteadOf "git@github.com:"
git config --global url."https://ael-bot:${{ secrets.KERNEL_UPDATE_TOKEN }}@github.com/".insteadOf "https://github.com/"
- name: Run kernel upgrade script
if: steps.check.outputs.new_release == 'true'
env:
GIT_TERMINAL_PROMPT: 0
run: |
./utils/kernel-upgrade.sh linux
- name: Create pull request
if: steps.check.outputs.new_release == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
script: |
// Check if PR already exists
const { data: pulls } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
head: `${context.repo.owner}:kernel-upgrade`,
state: 'open'
});
if (pulls.length === 0) {
const { data: pr } = await github.rest.pulls.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `Upgrade to kernel ${{ steps.check.outputs.current_version }}`,
head: 'kernel-upgrade',
base: 'main',
body: `Automated kernel upgrade to version ${{ steps.check.outputs.current_version }}.\n\n**Previous version:** ${{ steps.check.outputs.latest_tag }}\n**New version:** ${{ steps.check.outputs.current_version }}\n**Source:** https://www.kernel.org/\n\nThis PR was automatically created by the kernel release monitoring workflow.`
});
// Add label
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
labels: ['ci:main']
});
// Request reviews
await github.rest.pulls.requestReviewers({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number,
reviewers: ['troglobit', 'wkz', 'mattiaswal']
});
}
+68
View File
@@ -0,0 +1,68 @@
name: User Guide Generator
on:
push:
branches:
- doc
- main
tags:
- 'v*'
paths:
- 'doc/**'
- 'mkdocs.yml'
- '.github/workflows/docs.yml'
permissions:
contents: write
concurrency:
group: "docs-${{ github.ref }}"
cancel-in-progress: false
jobs:
docs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
pipx install mkdocs
pipx inject mkdocs mkdocs-material
pipx inject mkdocs pymdown-extensions
pipx inject mkdocs mkdocs-callouts
pipx inject mkdocs mike
pipx inject mkdocs mkdocs-to-pdf
pipx inject mkdocs mkdocs-glightbox
# Workaround, if pipx inject fails to install symlink
ln -s "$(pipx environment -V PIPX_LOCAL_VENVS)/mkdocs/bin/mike" \
"$(pipx environment -V PIPX_BIN_DIR)/mike" || true
- name: Configure Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Deploy dev version
if: github.event_name == 'push' && (github.ref == 'refs/heads/doc' || github.ref == 'refs/heads/main')
run: |
mike deploy --push --update-aliases dev latest
mike set-default --push latest
- name: Deploy tagged version
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
run: |
TAG=${GITHUB_REF#refs/tags/v}
# Extract YEAR.MONTH from tag (e.g., v25.06.0-beta1 -> 25.06)
VERSION=$(echo $TAG | sed -E 's/^([0-9]+\.[0-9]+)(\.[0-9]+)?(-.*)?$/\1/')
echo "Deploying tag $TAG as docs version $VERSION"
mike deploy --push --update-aliases $VERSION latest
mike set-default --push latest
+84
View File
@@ -0,0 +1,84 @@
name: Generic X86 GitHub Build
on:
push:
jobs:
build:
if: github.repository != 'kernelkit/infix'
name: Infix x86_64
runs-on: ubuntu-latest
steps:
- name: Free Disk Space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: true
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: false
- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
bc binutils build-essential bzip2 cpio \
diffutils file findutils git gzip \
libncurses-dev libssl-dev perl patch \
python3 rsync sed tar unzip wget \
autopoint bison flex autoconf automake \
mtools
- name: Checkout infix repo
uses: actions/checkout@v4
with:
repository: ${{ github.repository }}
ref: ${{ github.ref }}
fetch-depth: 0
submodules: recursive
- name: Set Build Variables
id: vars
run: |
echo "INFIX_BUILD_ID=${{ github.run_id }}" >> $GITHUB_OUTPUT
echo "dir=Infix-x86_64" >> $GITHUB_OUTPUT
echo "tgz=Infix-x86_64.tar.gz" >> $GITHUB_OUTPUT
- name: Configure x86_64_minimal
run: |
make x86_64_minimal_defconfig
- name: Unit Test x86_64
run: |
make test-unit
- name: Build x86_64_minimal
run: |
make
- name: Check SBOM
run: |
make legal-info
- name: Report Build Size
run: |
du -sh .
du -sh output
du -sh dl || true
ls -l output/images/
- name: Prepare Artifact
run: |
cd output/
mv images Infix-x86_64
ln -s Infix-x86_64 images
tar cfz Infix-x86_64.tar.gz Infix-x86_64
- uses: actions/upload-artifact@v4
with:
path: output/Infix-x86_64.tar.gz
name: artifact-x86_64
+44
View File
@@ -0,0 +1,44 @@
name: Publish latest Infix
on:
workflow_dispatch:
workflow_call:
jobs:
publish:
name: Upload Latest Build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: "artifact-*"
merge-multiple: true
- name: Create checksums ...
run: |
for file in *.tar.gz; do
sha256sum $file > $file.sha256
done
- uses: ncipollo/release-action@v1
with:
allowUpdates: true
replacesArtifacts: true
omitName: true
omitBody: true
omitBodyDuringUpdate: true
prerelease: true
tag: "latest"
token: ${{ secrets.GITHUB_TOKEN }}
artifacts: "*.tar.gz*"
- name: Summary
run: |
cat <<EOF >> $GITHUB_STEP_SUMMARY
# Latest Build Complete! :rocket:
For the public download links of these build artifacts, please see:
<https://github.com/kernelkit/infix/releases/tag/latest>
EOF
+26 -73
View File
@@ -18,96 +18,46 @@ on:
type: string
jobs:
build:
set-version:
if: github.repository == 'kernelkit/infix' && startsWith(github.ref, 'refs/tags/')
name: Build Infix ${{ github.ref_name }} [${{ matrix.target }}]
runs-on: [ self-hosted, release ]
strategy:
matrix:
target: [aarch64, x86_64]
fail-fast: false
runs-on: ubuntu-latest
outputs:
version: ${{ steps.set-ver.outputs.version }}
steps:
- uses: actions/checkout@v4
with:
clean: true
submodules: recursive
- name: Set Release Variables
id: vars
- id: set-ver
run: |
if [ -n "${{ inputs.version }}" ]; then
ver=${{ inputs.version }}
else
ver=${GITHUB_REF#refs/tags/}
fi
echo "ver=${ver}" >> $GITHUB_OUTPUT
fver=${ver#v}
target=${{ matrix.target }}-${fver}
echo "dir=infix-$target" >> $GITHUB_OUTPUT
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
echo "version=${ver}" >> $GITHUB_OUTPUT
- name: Restore Cache of dl/
uses: actions/cache@v4
with:
path: dl/
key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
restore-keys: |
dl-
- name: Restore Cache of .ccache/
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-${{ matrix.target }}-
ccache-
- name: Configure & Build
env:
INFIX_RELEASE: ${{ steps.vars.outputs.ver }}
run: |
target=${{ matrix.target }}_defconfig
echo "Building $target ..."
make $target
make
- name: Generate SBOM from Build
run: |
make legal-info
- name: Build test specification
run: |
make test-spec
- name: Prepare Artifacts
run: |
cd output/
mv images ${{ steps.vars.outputs.dir }}
ln -s ${{ steps.vars.outputs.dir }} images
tar cfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
mv legal-info legal-info-${{ matrix.target }}-${{ steps.vars.outputs.ver }}
tar cfz legal-info-${{ matrix.target }}-${{ steps.vars.outputs.ver }}.tar.gz legal-info-${{ matrix.target }}-${{ steps.vars.outputs.ver }}
- uses: actions/upload-artifact@v4
with:
name: artifact-${{ matrix.target }}
path: output/*.tar.gz
- uses: actions/upload-artifact@v4
with:
name: artifact-disk-image-${{ matrix.target }}
path: output/images/*.qcow2
build:
needs: set-version
uses: ./.github/workflows/build-release.yml
with:
version: ${{ needs.set-version.outputs.version }}
use_cache: true
release:
name: Release Infix ${{ github.ref_name }}
needs: build
runs-on: [ self-hosted, release ]
runs-on: [self-hosted, release]
permissions:
contents: write
discussions: write
steps:
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- uses: actions/checkout@v4
with:
submodules: 'true'
@@ -156,6 +106,9 @@ jobs:
run: |
awk '/^-----*$/{if (x == 1) exit; x=1;next}x' doc/ChangeLog.md \
|head -n -1 > release.md
echo "" >> release.md
echo "> [!TIP]" >> release.md
echo "> **Try Infix in GNS3!** Download the appliance from the [GNS3 Marketplace](https://gns3.com/marketplace/appliances/infix) to test Infix in a virtual network environment without hardware." >> release.md
cat release.md
- uses: ncipollo/release-action@v1
+116
View File
@@ -0,0 +1,116 @@
name: Test Infix
on:
workflow_dispatch:
inputs:
infix_repo:
description: 'Repo to checkout (for spin overrides)'
required: false
default: kernelkit/infix
type: string
workflow_call:
inputs:
target:
required: true
type: string
name:
required: true
type: string
infix_repo:
required: false
type: string
default: kernelkit/infix
ninepm-conf:
required: false
type: string
default: ''
test-path:
required: false
type: string
default: 'test'
env:
TARGET: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
INFIX_REPO: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_repo || inputs.infix_repo }}
NINEPM_CONF: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.ninepm-conf || inputs.ninepm-conf }}
TEST_PATH: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.test-path || inputs.test-path }}
jobs:
test:
name: Regression Test ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
runs-on: [self-hosted, regression]
steps:
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- name: Checkout infix repo
uses: actions/checkout@v4
with:
repository: ${{ env.INFIX_REPO }}
ref: ${{ github.ref }}
clean: true
fetch-depth: 0
submodules: recursive
- name: Set Build Variables
id: vars
run: |
if [ -n "${{ needs.build.outputs.build_id }}" ]; then
echo "INFIX_BUILD_ID=${{ needs.build.outputs.build_id }}" \
>>$GITHUB_ENV
fi
- name: Configure ${{ env.TARGET }}
run: |
make ${{ env.TARGET }}_defconfig
- uses: actions/download-artifact@v4
with:
pattern: "artifact-*"
merge-multiple: true
- name: Restore ${{ env.TARGET }} output/
run: |
target=${{ env.TARGET }}
name=${{ inputs.name }}
ls -l
mkdir -p output
mv ${name}-${target}.tar.gz output/
cd output/
tar xf ${name}-${target}.tar.gz
ln -s ${name}-${target} images
- name: Regression Test ${{ env.TARGET }}
run: |
if [ -n "$NINEPM_CONF" ]; then
export NINEPM_PROJ_CONFIG="${GITHUB_WORKSPACE}/$NINEPM_CONF"
echo "DEBUG: NINEPM_PROJ_CONFIG is '$NINEPM_PROJ_CONFIG'"
fi
make test
- name: Publish Test Result for ${{ env.TARGET }}
# Ensure this runs even if Regression Test fails
if: always()
run: |
cat $TEST_PATH/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY
- name: Generate Test Report for ${{ env.TARGET }}
# Ensure this runs even if Regression Test fails
if: always()
run: |
make test-dir="$(pwd)/$TEST_PATH" test-report
- name: Upload Test Report as Artifact
uses: actions/upload-artifact@v4
with:
name: test-report
path: output/images/test-report.pdf
+75
View File
@@ -0,0 +1,75 @@
name: Kernelkit Trigger
on:
pull_request:
types: [opened, synchronize, reopened, labeled]
push:
branches:
- main
- ci-work
workflow_dispatch:
concurrency:
group: ci-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
# Gate all builds through this check to prevent wasted runs. Only run on
# 'labeled' events when the label is actually 'ci:main'. Concurrency control
# above handles canceling the 'opened' event when 'labeled' arrives quickly
# after (e.g., when creating a PR with ci:main already attached). See #1154.
check-trigger:
if: |
startsWith(github.repository, 'kernelkit/') &&
(github.event_name != 'pull_request' ||
github.event.action != 'labeled' ||
github.event.label.name == 'ci:main')
runs-on: ubuntu-latest
outputs:
x86_64_target: ${{ steps.set-targets.outputs.x86_64_target }}
aarch64_target: ${{ steps.set-targets.outputs.aarch64_target }}
steps:
- run: |
echo "Triggering build, logging meta data ..."
echo "Event : ${{ github.event_name }}"
echo "Action : ${{ github.event.action }}"
echo "Ref : ${{ github.ref }}"
echo "PR : ${{ github.event.pull_request.number }}"
echo "Label : ${{ github.event.label.name }}"
- id: set-targets
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]] && \
! echo '${{ toJSON(github.event.pull_request.labels.*.name) }}' \
| grep -q "ci:main"; then
echo "x86_64_target=x86_64_minimal" >> $GITHUB_OUTPUT
echo "aarch64_target=aarch64_minimal" >> $GITHUB_OUTPUT
else
echo "x86_64_target=x86_64" >> $GITHUB_OUTPUT
echo "aarch64_target=aarch64" >> $GITHUB_OUTPUT
fi
build-x86_64:
needs: check-trigger
uses: ./.github/workflows/build.yml
with:
name: "infix"
target: ${{ needs.check-trigger.outputs.x86_64_target }}
build-aarch64:
needs: check-trigger
uses: ./.github/workflows/build.yml
with:
name: "infix"
target: ${{ needs.check-trigger.outputs.aarch64_target }}
test-run-x86_64:
needs: [check-trigger, build-x86_64]
uses: ./.github/workflows/test.yml
with:
target: ${{ needs.check-trigger.outputs.x86_64_target }}
name: "infix"
test-publish-x86_64:
if: ${{ github.repository_owner == 'kernelkit' && github.ref_name == 'main' }}
needs: test-run-x86_64
uses: ./.github/workflows/publish.yml
+68
View File
@@ -0,0 +1,68 @@
# Weekly release build to catch flaky tests and verify clean builds.
# Runs without caches (ccache) to ensure reproducibility. See issue #1003.
name: Weekly Build
on:
schedule:
- cron: '5 0 * * 6' # Saturday at 00:05 UTC, same as Coverity
workflow_dispatch:
jobs:
build:
if: github.repository == 'kernelkit/infix'
uses: ./.github/workflows/build-release.yml
with:
version: "latest"
use_cache: false
publish:
name: Publish Weekly Build
needs: build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: "artifact-*"
merge-multiple: true
- name: Create checksums
run: |
for file in *.tar.gz; do
sha256sum $file > $file.sha256
done
if ls *.qcow2 &>/dev/null; then
for file in *.qcow2; do
sha256sum "$file" > "$file.sha256"
done
fi
- uses: ncipollo/release-action@v1
with:
tag: latest
name: "Latest Weekly Build"
prerelease: true
makeLatest: false
allowUpdates: true
removeArtifacts: true
body: |
Automated weekly build from `${{ github.sha }}`.
This build runs without caches to catch potential flaky tests and build issues.
Not intended for production use - use official releases instead.
**Commit:** ${{ github.sha }}
**Built:** ${{ github.run_id }}
artifacts: "*.tar.gz*,*.qcow2*"
- name: Summary
run: |
cat <<EOF >> $GITHUB_STEP_SUMMARY
# Weekly Build Published! :package:
Latest artifacts uploaded to:
<https://github.com/kernelkit/infix/releases/tag/latest>
Built from commit: \`${{ github.sha }}\`
EOF
+3 -1
View File
@@ -1,3 +1,5 @@
source "$BR2_EXTERNAL_INFIX_PATH/board/Config.in"
menu "Branding"
config INFIX_VENDOR
@@ -65,7 +67,7 @@ config INFIX_COMPATIBLE
config INFIX_TAGLINE
string "Operating system tagline"
default "Infix -- a Network Operating System"
default "Infix OS — Immutable.Friendly.Secure"
help
Mandatory. Used for identifying the OS, e.g. as PRETTY_NAME in
/etc/os-release and description in the GNS3 appliance.
+121 -76
View File
@@ -1,56 +1,70 @@
[![License Badge][]][License] [![GitHub Status][]][GitHub] [![Coverity Status][]][Coverity Scan] [![Discord][discord-badge]][discord-url]
[![License Badge][]][License] [![Release Badge][]][Release] [![GitHub Status][]][GitHub] [![Coverity Status][]][Coverity Scan] [![Discord][discord-badge]][discord-url]
<img align="right" src="doc/logo.png" alt="Infix - Linux <3 NETCONF" width=480 border=10>
<img align="right" src="doc/logo.png" alt="Infix — Immutable.Friendly.Secure" width=480 padding=10>
Infix is a free, Linux based, immutable Network Operating System (NOS)
built on [Buildroot][1], and [sysrepo][2]. A powerful mix that ease
porting to different platforms, simplify long-term maintenance, and
provide made-easy management using NETCONF, RESTCONF[^2], or the
built-in command line interface (CLI) from a console or SSH login.
Turn any ARM or x86 device into a powerful, manageable network appliance
in minutes. From $35 Raspberry Pi boards to enterprise switches — deploy
routers, IoT gateways, edge devices, or custom network solutions that
just work.
> Click the **▶ Example CLI Session** foldout below for an example, or
> head on over to the [Infix Documentation](doc/README.md) for more
> information on how to set up the system.
## Our Values
Although primarily focused on switches and routers, the core values
may be appealing for other use-cases as well:
**🔒 Immutable**
Your system never breaks. Read-only filesystem with atomic upgrades
means no configuration drift, no corrupted updates, and instant rollback
if something goes wrong. Deploy once, trust forever.
- Runs from a squashfs image on a read-only partition
- Single configuration file on a separate partition
- Built around YANG with standard IETF models
- Linux switchdev provides open switch APIs
- Atomic upgrades to secondary partition
- Highly security focused
**🤝 Friendly**
Actually easy to use. Auto-generated CLI from standard YANG models comes
with built-in help for every command — just hit `?` or TAB for
context-aware assistance. Familiar NETCONF/RESTCONF APIs and
[comprehensive documentation][4] mean you're never stuck. Whether
you're learning networking or managing enterprise infrastructure.
An immutable[^1] operating system enhances security and inherently makes
it maintenance-free. Configuration and data, e.g, containers, is stored
on separate partitions to ensure complete separation from system files
and allow for seamless backup, restore, and provisioning.
**🛡️ Secure**
Built with security as a foundation, not an afterthought. Minimal
attack surface, separation between system and data, and container
isolation. Sleep better knowing your infrastructure is protected.
In itself, Infix is perfectly suited for dedicated networking tasks, and
with native support for Docker containers, the operating system provides
a versatile platform that can easily be adapted to any customer need.
Be it legacy applications, network protocols, process monitoring, or
edge data analysis, it can run close to end equipment. Either directly
connected on dedicated Ethernet ports or indirectly using virtual
network cables to exist on the same LAN as other connected equipment.
## Why Choose Infix
The simple design of Infix provides complete control over both system
and data, minimal cognitive burden, and makes it incredibly easy to get
started.
**Hardware Flexibility**: Start with a $35 Raspberry Pi, scale to
enterprise switching hardware. Same OS, same tools, same reliability.
<details><summary><b>Example CLI Session</b></summary>
**Standards-Based**: Built around YANG models and IETF standards. Learn
once, use everywhere - no vendor lock-in.
The CLI configure context is automatically generated from the loaded
YANG models and their corresponding [sysrepo][2] plugins. The following
is brief example of how to set the IP address of an interface:
**Container Ready**: Run your applications alongside networking
functions. GPIO access, dedicated Ethernet ports, custom protocols —
your device, your rules.
```
## Use Cases
1. **Home Labs & Hobbyists**:
Transform a Raspberry Pi into a full-featured router with WiFi
1. **IoT & Edge Computing**:
Bridge devices to the cloud with reliable, updatable gateways
1. **Small Business Networks**:
Enterprise-grade features without the complexity or cost
1. **Developers & Makers**:
Test networking concepts, prototype IoT solutions, or build custom
appliances
1. **Network Professionals**:
Consistent tooling from development to production deployment.
How about a digital twin using raw Qemu or [GNS3](https://gns3.com/infix)!
## See It In Action
Configure an interface in seconds - the CLI guides you with built-in help:
<details><summary><b>Click Here for an example CLI Session</b></summary>
```bash
admin@infix-12-34-56:/> configure
admin@infix-12-34-56:/config/> edit interface eth0
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 <TAB>
address autoconf bind-ni-name enabled
forwarding mtu neighbor
forwarding mtu neighbor
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
admin@infix-12-34-56:/config/interface/eth0/> show
type ethernet;
@@ -59,7 +73,6 @@ ipv4 {
prefix-length 24;
}
}
ipv6
admin@infix-12-34-56:/config/interface/eth0/> diff
interfaces {
interface eth0 {
@@ -82,57 +95,89 @@ lo ethernet UP 00:00:00:00:00:00
admin@infix-12-34-56:/> copy running-config startup-config
```
[Click here][3] for more details.
Notice how TAB completion shows available options, `show` displays
current config, and `diff` shows exactly what changed before you
commit your changes with the `leave` command.
</details>
Infix can run on many different types of architectures and boards, much
thanks to Linux and Buildroot. Currently the focus is on 64-bit ARM
devices, optionally with switching fabric supported by Linux switchdev.
The [following boards](board/aarch64/README.md) are fully supported:
> [Full CLI documentation →][3]
- Marvell CN9130 CRB
- Marvell EspressoBIN
- Microchip SparX-5i PCB135 (eMMC)
- Raspberry Pi 4B
- NanoPi R2S
## Get Started
Additionally, StarFive VisionFive2, a RISC-V based two-port router, and
an x86_64 build is also available. The latter is primarily intended for
development and testing, but can also be used for evaluation and demo
purposes. For more information, see: [Infix in Virtual
Environments](doc/virtual.md).
Get [pre-built images][5] for your hardware. Use the CLI, web
interface, or standard NETCONF/RESTCONF tools, e.g., `curl`. Add
containers for any custom functionality you need.
> See the [GitHub Releases](https://github.com/kernelkit/infix/releases)
> page for our pre-built images. The *[Latest Build][]* has bleeding
> edge images, if possible we recommend using a versioned release.
>
> For *customer specific builds* of Infix, see your product repository.
### Supported Platforms
- **Raspberry Pi 4B** - Perfect for home labs, learning, and prototyping
- **Banana Pi-R3** - Your next home router and gateway
- **NanoPi R2S** - Compact dual-port router in a tiny package
- **x86_64** - Run in VMs or on mini PCs for development and testing
- **Marvell CN9130 CRB, EspressoBIN** - High-performance ARM64 platforms
- **Microchip SparX-5i** - Enterprise switching capabilities
- **NXP i.MX8MP EVK** - Highly capable ARM64 SoC
- **StarFive VisionFive2** - RISC-V architecture support
----
*Why start with Raspberry Pi?* It's affordable, widely available, has
built-in WiFi + Ethernet, and runs the exact same Infix OS you'd deploy
in production. Perfect for learning, prototyping, or even small-scale
deployments.
> 📖 **[Complete documentation][4]** • 💬 **[Join our Discord][discord-url]**
## Technical Details
<a href="https://bitsign.se">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://bitsign.se/assets/badges/bitsign-badge-dark-mode.png">
<source media="(prefers-color-scheme: light)" srcset="https://bitsign.se/assets/badges/bitsign-badge-light-mode.png">
<img alt="bitSign - Code Signing" src="https://bitsign.se/assets/badges/bitsign-badge-light-mode.png" align="right" width=150 padding=10>
</picture>
</a>
Built on proven open-source foundations: [Linux][0], [Buildroot][1], and
[sysrepo][2] — for reliability you can trust:
- **Immutable OS**: Read-only filesystem, atomic updates, instant rollback
- **YANG Configuration**: Industry-standard models with auto-generated tooling
- **Hardware Acceleration**: Linux switchdev support for wire-speed packet processing
- **Container Integration**: Docker support with flexible network and hardware access
- **Memory Efficient**: Runs comfortably on devices with as little as 256 MB RAM
- **Code Signing**: Releases are cryptographically signed for integrity verification
Perfect for everything from resource-constrained edge devices to
high-throughput network appliances.
With the entire system modeled in YANG, scalability is no longer an
issue, be it in development, testing, or end users deploying and
monitoring their devices. All knobs and dials are accessible from the
CLI (console/SSH), or remotely using the native NETCONF or RESTCONF
APIs.
> Check the *[Latest Build][]* for bleeding-edge features.
---
<div align="center">
<a href="https://github.com/wires-se"><img src="https://raw.githubusercontent.com/wires-se/.github/main/profile/logo.png" width=300></a>
<br />Infix development is sponsored by <a href="https://wires.se">Wires<a>
<a href="https://github.com/wires-se"><img src="https://raw.githubusercontent.com/wires-se/.github/main/profile/play.svg" width=300></a>
<br />Infix development is sponsored by <a href="https://wires.se">Wires</a>
</div>
----
![Alt](https://repobeats.axiom.co/api/embed/5ce7a2a67edc923823afa0f60c327a6e8575b6e9.svg "Repobeats analytics image")
[^1]: An immutable operating system is one with read-only file systems,
atomic updates, rollbacks, declarative configuration, and workload
isolation. All to improve reliability, scalability, and security.
For more information, see <https://ceur-ws.org/Vol-3386/paper9.pdf>
and <https://www.zdnet.com/article/what-is-immutable-linux-heres-why-youd-run-an-immutable-linux-distro/>.
[^2]: Partial RESTCONF support, features like HTTP PATCH, OPTIONS, HEAD,
and copying between datastores are still missing.
[1]: https://buildroot.org/
[2]: https://www.sysrepo.org/
[3]: doc/cli/introduction.md
[Latest Build]: https://github.com/kernelkit/infix/releases/tag/latest
[0]: https://www.kernel.org
[1]: https://buildroot.org/ "Buildroot Homepage"
[2]: https://www.sysrepo.org/ "Sysrepo Homepage"
[3]: https://kernelkit.org/infix/latest/cli/introduction/
[4]: https://kernelkit.org/infix/
[5]: https://github.com/kernelkit/infix/releases
[Latest Build]: https://github.com/kernelkit/infix/releases/tag/latest "Latest build"
[License]: https://en.wikipedia.org/wiki/GPL_license
[License Badge]: https://img.shields.io/badge/License-GPL%20v2-blue.svg
[Release]: https://github.com/kernelkit/infix/releases
[Release Badge]: https://img.shields.io/github/v/release/kernelkit/infix
[GitHub]: https://github.com/kernelkit/infix/actions/workflows/build.yml/
[GitHub Status]: https://github.com/kernelkit/infix/actions/workflows/build.yml/badge.svg
[Coverity Scan]: https://scan.coverity.com/projects/29393
+7
View File
@@ -0,0 +1,7 @@
menu "Board Support"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/riscv64/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/x86_64/Config.in"
endmenu
+13
View File
@@ -0,0 +1,13 @@
if BR2_aarch64
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/alder-alder/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/bananapi-bpi-r3/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/freescale-imx8mp-evk/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/friendlyarm-nanopi-r2s/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/marvell-cn9130-crb/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/marvell-espressobin/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/microchip-sparx5-pcb135/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/raspberrypi-rpi64/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/styx-dcp-sc-28p/Config.in"
endif
+2
View File
@@ -4,6 +4,8 @@ aarch64
Board Specific Documentation
----------------------------
- [Banana Pi R3](banana-pi-r3/)
- [Marvell CN9130-CRB](cn9130-crb/)
- [Microchip SparX-5i PCB135 (eMMC)](sparx5-pcb135/)
- [NanoPi R2S](r2s/)
- [Raspberry Pi 64-bit](raspberry-pi64/)
+10
View File
@@ -0,0 +1,10 @@
config BR2_PACKAGE_BANANAPI_BPI_R3
bool "Banana Pi R3"
depends on BR2_aarch64
select BR2_PACKAGE_FEATURE_WIFI
select BR2_PACKAGE_LINUX_FIRMWARE
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7986
select SDCARD_AUX
help
Build Banana PI R3 support
+13
View File
@@ -0,0 +1,13 @@
Copyright (c) 2025 The KernelKit Authors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+27
View File
@@ -0,0 +1,27 @@
# Banana Pi R3
## Support level
Full support for all Infix enabled features including switched ethernet ports, WiFi,
and SFP interfaces. The board includes comprehensive hardware support for
MediaTek MT7986 SoC features.
### Hardware features
The Banana Pi R3 is a high-performance networking board featuring:
- MediaTek MT7986 ARM Cortex-A53 quad-core processor
- 4x Gigabit LAN ports (lan1-lan4)
- 1x Gigabit WAN port
- 2x SFP ports (sfp1, sfp2) for fiber connectivity
- Dual WiFi interfaces (wifi0 for 2.4GHz, wifi1 for 5GHz)
- USB support
- SD card boot support
### Network configuration
The board comes preconfigured with:
- 4 switched LAN ports for internal networking
- Dedicated WAN port with DHCP client enabled
- SFP ports for high-speed fiber connections
- Dual WiFi interfaces for wireless connectivity
### Pre-built images
SD card image: [infix-bpi-r3-sdcard.img](https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r3-sdcard.img)
@@ -0,0 +1,36 @@
define BANANAPI_BPI_R3_LINUX_CONFIG_FIXUPS
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_MEDIATEK)
$(call KCONFIG_ENABLE_OPT,CONFIG_MACH_MT7986)
$(call KCONFIG_ENABLE_OPT,CONFIG_PINCTRL_MT7986)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_MT6577)
$(call KCONFIG_SET_OPT,CONFIG_I2C_GPIO,y)
$(call KCONFIG_SET_OPT,CONFIG_MTK_THERMAL,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_UART)
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_WATCHDOG)
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_GE_PHY)
$(call KCONFIG_ENABLE_OPT,CONFIG_REALTEK_PHY)
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_MEDIATEK)
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_MEDIATEK_SOC)
$(call KCONFIG_SET_OPT,CONFIG_NET_DSA_MT7530,m)
$(call KCONFIG_SET_OPT,CONFIG_MT7915E,m)
$(call KCONFIG_SET_OPT,CONFIG_PCIE_MEDIATEK_GEN3,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_SCPSYS)
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_MTK)
$(call KCONFIG_ENABLE_OPT,CONFIG_MTK_HSDMA)
$(call KCONFIG_SET_OPT,CONFIG_MT7915E,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_MT798X_WMAC)
$(call KCONFIG_SET_OPT,CONFIG_MTK_SOC_THERMAL,m)
$(call KCONFIG_SET_OPT,CONFIG_I2C_MT65XX,m)
$(call KCONFIG_SET_OPT,CONFIG_USB_XHCI_MTK,m)
$(call KCONFIG_SET_OPT,CONFIG_PHY_MTK_TPHY,m)
$(call KCONFIG_SET_OPT,CONFIG_PHY_MTK_XSPHY,m)
$(call KCONFIG_SET_OPT,CONFIG_REGULATOR_GPIO,y)
$(call KCONFIG_SET_OPT,CONFIG_REGULATOR_MT6380,m)
$(call KCONFIG_SET_OPT,CONFIG_PWM_MEDIATEK,m)
$(call KCONFIG_SET_OPT,CONFIG_SENSORS_PWM_FAN,m)
$(call KCONFIG_SET_OPT,CONFIG_NVMEM_MTK_EFUSE,m)
$(call KCONFIG_SET_OPT,CONFIG_CRYPTO_DEV_SAFEXCEL,m)
endef
$(eval $(ix-board))
$(eval $(generic-package))
@@ -0,0 +1 @@
dtb-y += mediatek/mt7986a-bananapi-bpi-r3-sd.dtb
@@ -0,0 +1,2 @@
#include "mt7986a-bananapi-bpi-r3.dtsi"
#include "mt7986a-bananapi-bpi-r3-sd.dtsi"
@@ -0,0 +1,16 @@
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/*
* Copyright (C) 2021 MediaTek Inc.
* Author: Sam.Shih <sam.shih@mediatek.com>
*/
/*
This is copied from linux where it is an overlay, unfortunatly it is not
possible to use dtbo in sysboot unless present in syslinux.conf
*/
&{/soc/mmc@11230000} {
bus-width = <4>;
max-frequency = <52000000>;
cap-sd-highspeed;
status = "okay";
};
@@ -0,0 +1,59 @@
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3.dts>
/ {
chosen {
infix {
/* Default admin user password: 'admin' */
factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A";
usb-ports = <&ssusb>;
usb-port-names = "USB";
};
};
};
&cpu_thermal {
/delete-node/ trips;
/delete-node/ cooling-maps;
trips {
cpu_trip_active_cool: cpu-trip-active-cool {
temperature = <40000>; // 40°C
hysteresis = <2000>; // 2°C hysteresis
type = "active";
};
cpu_trip_active_low: cpu-trip-active-low {
temperature = <45000>; // 40°C
hysteresis = <2000>; // 2°C hysteresis
type = "active";
};
cpu_trip_active_med: cpu-trip-active-med {
temperature = <60000>; // 60°C
hysteresis = <2000>; // 2°C hysteresis
type = "active";
};
cpu_trip_hot: cpu-trip-hot {
temperature = <80000>; // 80°C
hysteresis = <2000>; // 2°C hysteresis
type = "hot";
};
cpu_trip_critical: cpu-trip-critical {
temperature = <90000>; // 90°C
hysteresis = <2000>; // 2°C hysteresis
type = "critical";
};
};
cooling-maps {
map-cpu-40deg {
cooling-device = <&fan 0 0>;
trip = <&cpu_trip_active_cool>;
};
map-cpu-45deg {
cooling-device = <&fan 1 1>;
trip = <&cpu_trip_active_low>;
};
map-cpu-60deg {
cooling-device = <&fan 2 2>;
trip = <&cpu_trip_active_med>;
};
};
};
@@ -0,0 +1,75 @@
image cfg.ext4 {
empty = true
temporary = true
size = 128M
ext4 {
label = "cfg"
}
}
image var.ext4 {
empty = true
temporary = true
size = 1G
ext4 {
label = "var"
use-mke2fs = true
}
}
image #INFIX_ID##VERSION#-bpi-r3-sdcard.img {
hdimage {
partition-table-type = "gpt"
}
# BL2 bootloader partition (MediaTek official location)
partition bl2 {
image = "bl2.img"
offset = 1024s # 0x80000 = sector 1024
size = 4M # 0x400000
bootable = true
}
# Factory/calibration data (sectors 9216-13311)
partition factory {
offset = 4608K # 0x480000
size = 2M # 0x200000
}
# FIP partition - BL31 + U-Boot (sectors 13312-17407)
partition fip {
# partition-type = 0x83 # Linux filesystem
image = "fip.bin"
offset = 13312s
size = 4096s
}
partition aux {
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
image = "aux.ext4"
}
partition primary {
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
bootable = true
size = 250M
image = "rootfs.squashfs"
}
partition secondary {
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
bootable = true
size = 250M
image = "rootfs.squashfs"
}
partition cfg {
partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105
image = "cfg.ext4"
}
partition var {
partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F
image = "var.ext4"
}
}
@@ -0,0 +1,350 @@
{
"ieee802-dot1ab-lldp:lldp": {
"infix-lldp:enabled": true
},
"ietf-hardware:hardware": {
"component": [
{
"name": "USB",
"class": "infix-hardware:usb",
"state": {
"admin-state": "unlocked"
}
},
{
"class": "infix-hardware:usb",
"name": "USB2",
"state": {
"admin-state": "unlocked"
}
}
]
},
"ietf-interfaces:interfaces": {
"interface": [
{
"name": "br0",
"type": "infix-if-type:bridge",
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.0.1",
"prefix-length": 24
}
]
}
},
{
"name": "lan1",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
},
{
"name": "lan2",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
},
{
"name": "lan3",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
},
{
"name": "lan4",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
},
{
"name": "lo",
"type": "infix-if-type:loopback",
"ietf-ip:ipv4": {
"address": [
{
"ip": "127.0.0.1",
"prefix-length": 8
}
]
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "::1",
"prefix-length": 128
}
]
}
},
{
"name": "sfp1",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {}
},
{
"name": "sfp2",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {}
},
{
"name": "wan",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {}
},
{
"name": "wifi0",
"type": "infix-if-type:wifi"
},
{
"name": "wifi1",
"type": "infix-if-type:wifi"
}
]
},
"ietf-keystore:keystore": {
"asymmetric-keys": {
"asymmetric-key": [
{
"name": "genkey",
"public-key-format": "infix-crypto-types:ssh-public-key-format",
"public-key": "",
"private-key-format": "infix-crypto-types:rsa-private-key-format",
"cleartext-private-key": "",
"certificates": {}
}
]
}
},
"ietf-netconf-acm:nacm": {
"enable-nacm": true,
"groups": {
"group": [
{
"name": "admin",
"user-name": [
"admin"
]
}
]
},
"rule-list": [
{
"name": "admin-acl",
"group": [
"admin"
],
"rule": [
{
"name": "permit-all",
"module-name": "*",
"access-operations": "*",
"action": "permit",
"comment": "Allow 'admin' group complete access to all operations and data."
}
]
},
{
"name": "default-deny-all",
"group": [
"*"
],
"rule": [
{
"name": "deny-password-read",
"module-name": "ietf-system",
"path": "/ietf-system:system/authentication/user/password",
"access-operations": "*",
"action": "deny"
}
]
}
]
},
"ietf-netconf-server:netconf-server": {
"listen": {
"endpoints": {
"endpoint": [
{
"name": "default-ssh",
"ssh": {
"tcp-server-parameters": {
"local-address": "::"
},
"ssh-server-parameters": {
"server-identity": {
"host-key": [
{
"name": "default-key",
"public-key": {
"central-keystore-reference": "genkey"
}
}
]
}
}
}
}
]
}
}
},
"ietf-system:system": {
"hostname": "bpi-%m",
"ntp": {
"server": [
{
"name": "default",
"udp": {
"address": "pool.ntp.org"
}
}
]
},
"authentication": {
"user": [
{
"name": "admin",
"password": "$factory$",
"infix-system:shell": "bash"
}
]
},
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
},
"infix-dhcp-client:dhcp-client": {
"client-if": [
{
"if-name": "wan",
"option": [
{
"id": "ntp-server"
},
{
"id": "broadcast"
},
{
"id": "domain"
},
{
"id": "hostname"
},
{
"id": "dns-server"
},
{
"id": "router"
},
{
"id": "netmask"
}
]
}
]
},
"infix-dhcp-server:dhcp-server": {
"option": [
{
"id": "ntp-server",
"address": "auto"
},
{
"id": "dns-server",
"address": "auto"
},
{
"id": "router",
"address": "auto"
}
],
"subnet": [
{
"subnet": "192.168.0.0/24",
"pool": {
"start-address": "192.168.0.100",
"end-address": "192.168.0.250"
}
}
]
},
"infix-firewall:firewall": {
"default": "wan",
"zone": [
{
"name": "lan",
"action": "accept",
"interface": [
"br0"
]
},
{
"name": "wan",
"action": "drop",
"interface": [
"wan"
],
"service": [
"dhcpv6-client"
]
}
],
"policy": [
{
"name": "lan-to-wan",
"ingress": [
"lan"
],
"egress": [
"wan"
],
"masquerade": true
}
]
},
"infix-meta:meta": {
"version": "1.5"
},
"infix-services:mdns": {
"enabled": true
},
"infix-services:ssh": {
"enabled": true,
"hostkey": [
"genkey"
],
"listen": [
{
"name": "ipv4",
"address": "0.0.0.0",
"port": 22
},
{
"name": "ipv6",
"address": "::",
"port": 22
}
]
},
"infix-services:web": {
"enabled": true,
"console": {
"enabled": true
},
"netbrowse": {
"enabled": true
},
"restconf": {
"enabled": true
}
}
}
@@ -0,0 +1,3 @@
#!/bin/sh
udevadm control --reload-rules
udevadm trigger --subsystem-match=net --action=add
@@ -0,0 +1 @@
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth1", NAME="sfp1"
@@ -0,0 +1,12 @@
CONFIG_AUTOBOOT=y
CONFIG_BOOTDELAY=2
# CONFIG_MMC_PCI is not set
CONFIG_ENV_IS_NOWHERE=y
# CONFIG_ENV_IS_IN_MMC is not set
CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_MTK=y
CONFIG_USB_MTU3=y
CONFIG_CMD_USB=y
CONFIG_PHY=y
CONFIG_PHY_MTK_TPHY=y
@@ -0,0 +1,25 @@
/ {
config {
env: environment {
/* After the MMC driver has enabled bus power,
* the controller seems to sometimes detect a
* card removal state , which causes it to
* disable power again. This hack re-enables the
* bus power in those cases.
*/
bootcmd = "run ixboot";
boot_targets = "mmc0";
ethprime = "eth0";
fdt_addr_r = "0x43f00000";
kernel_addr_r = "0x44000000";
scriptaddr = "0x48000000";
ramdisk_addr_r = "0x4A000000";
/* This is a development platform, keep
* developer mode statically enabled.
*/
ixbtn-devmode = "setenv dev_mode yes; echo Enabled";
ixbtn-factory = "echo \"No button available, use bootmenu\"";
};
};
};
@@ -0,0 +1,5 @@
#include <mt7986-env.dtsi>
&env {
fdtfile = "mediatek/mt7986a-bananapi-bpi-r3-sd.dtb";
};
@@ -0,0 +1 @@
CONFIG_DEVICE_TREE_INCLUDES="infix-env.dtsi infix-key.dtsi mt7986-sd-env.dtsi"
@@ -0,0 +1,9 @@
config BR2_PACKAGE_FRIENDLYARM_NANOPI_R2S
bool "FriendlyElec NanoPi R2S"
depends on BR2_aarch64
select SDCARD_AUX
select BR2_PACKAGE_INPUT_EVENT_DAEMON
select BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X
help
FriendlyElec NanoPi R2S is a compact router board based on
the Rockchip RK3328 SoC with dual Gigabit Ethernet ports.
@@ -0,0 +1,13 @@
Copyright (c) 2025 The KernelKit Authors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1 @@
dtb-y += rockchip/rk3328-nanopi-r2s.dtb
@@ -0,0 +1,13 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Common Infix OS defaults
*/
/ {
chosen {
infix {
/* Default admin user password: 'admin' */
factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A";
};
};
};
@@ -0,0 +1,23 @@
#include <arm64/rockchip/rk3328-nanopi-r2s.dts>
#include "infix.dtsi"
&rtl8153 {
/*
* Fix port number: device is on port 1, not port 2
*
* The kernel's usb_of_get_connect_type() function checks for child
* nodes with a 'reg' property matching the physical port number to
* determine if a USB port is "hard-wired" (internal) vs external.
* With authorized_default=2, only hard-wired ports are automatically
* authorized. The RTL8153 shows up as device 3-1 (hub 3, port 1), so
* reg must be <1> for the kernel to mark it as USB_PORT_CONNECT_TYPE_HARD_WIRED
* and authorize it automatically at boot.
*/
reg = <1>;
};
&{/chosen/infix} {
/* Expose only the external USB 2.0 port for user management */
usb-ports = <&usb_host0_ehci>;
usb-port-names = "USB";
};
@@ -0,0 +1,78 @@
define FRIENDLYARM_NANOPI_R2S_LINUX_CONFIG_FIXUPS
# Rockchip RK3328 SoC
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_ROCKCHIP)
$(call KCONFIG_ENABLE_OPT,CONFIG_ROCKCHIP_IOMMU)
$(call KCONFIG_ENABLE_OPT,CONFIG_ROCKCHIP_PM_DOMAINS)
$(call KCONFIG_ENABLE_OPT,CONFIG_ROCKCHIP_IODOMAIN)
# PHY drivers
$(call KCONFIG_ENABLE_OPT,CONFIG_PHY_ROCKCHIP_EMMC)
$(call KCONFIG_ENABLE_OPT,CONFIG_PHY_ROCKCHIP_INNO_USB2)
$(call KCONFIG_ENABLE_OPT,CONFIG_PHY_ROCKCHIP_TYPEC)
$(call KCONFIG_SET_OPT,CONFIG_PHY_ROCKCHIP_USB,m)
$(call KCONFIG_SET_OPT,CONFIG_PHY_ROCKCHIP_PCIE,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_ROCKCHIP_PHY)
# Clocks and Power Management
$(call KCONFIG_ENABLE_OPT,CONFIG_COMMON_CLK_ROCKCHIP)
$(call KCONFIG_ENABLE_OPT,CONFIG_CLK_RK3328)
$(call KCONFIG_ENABLE_OPT,CONFIG_COMMON_CLK_PWM)
$(call KCONFIG_ENABLE_OPT,CONFIG_PWM_ROCKCHIP)
$(call KCONFIG_ENABLE_OPT,CONFIG_REGULATOR_GPIO)
$(call KCONFIG_ENABLE_OPT,CONFIG_REGULATOR_RK808)
$(call KCONFIG_ENABLE_OPT,CONFIG_CHARGER_RK817)
$(call KCONFIG_ENABLE_OPT,CONFIG_PINCTRL_RK805)
# I2C Controller
$(call KCONFIG_ENABLE_OPT,CONFIG_I2C_RK3X)
# I2C/SPI/MFD
$(call KCONFIG_ENABLE_OPT,CONFIG_MFD_RK8XX_I2C)
$(call KCONFIG_ENABLE_OPT,CONFIG_MFD_RK8XX_SPI)
$(call KCONFIG_ENABLE_OPT,CONFIG_SPI_ROCKCHIP)
$(call KCONFIG_ENABLE_OPT,CONFIG_INPUT_RK805_PWRKEY)
$(call KCONFIG_ENABLE_OPT,CONFIG_RTC_DRV_RK808)
# MMC/Storage
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_DW_ROCKCHIP)
# PCIe
$(call KCONFIG_SET_OPT,CONFIG_PCIE_ROCKCHIP_HOST,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_PCIE_ROCKCHIP_DW_HOST)
# Thermal and ADC
$(call KCONFIG_SET_OPT,CONFIG_ROCKCHIP_THERMAL,m)
$(call KCONFIG_SET_OPT,CONFIG_ROCKCHIP_SARADC,m)
# Crypto
$(call KCONFIG_ENABLE_OPT,CONFIG_CRYPTO_DEV_ROCKCHIP)
# NVMEM
$(call KCONFIG_SET_OPT,CONFIG_NVMEM_ROCKCHIP_EFUSE,m)
$(call KCONFIG_SET_OPT,CONFIG_NVMEM_ROCKCHIP_OTP,m)
# Network: STMMAC Ethernet (WAN port - RK3328 GMAC with RTL8211E PHY)
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_STMICRO)
$(call KCONFIG_ENABLE_OPT,CONFIG_STMMAC_ETH)
$(call KCONFIG_ENABLE_OPT,CONFIG_STMMAC_PLATFORM)
$(call KCONFIG_ENABLE_OPT,CONFIG_DWMAC_ROCKCHIP)
$(call KCONFIG_ENABLE_OPT,CONFIG_REALTEK_PHY)
# Network: USB Ethernet (LAN port - RTL8153 via USB 3.0)
$(call KCONFIG_SET_OPT,CONFIG_USB_NET_DRIVERS,m)
$(call KCONFIG_SET_OPT,CONFIG_USB_RTL8152,m)
# USB 3.0 xHCI Controller (required for RTL8153 LAN port)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_XHCI_HCD)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_XHCI_PLATFORM)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_DWC3)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_DWC3_HOST)
# USB 2.0 Host
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_EHCI_HCD)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_EHCI_HCD_PLATFORM)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_EHCI_ROOT_HUB_TT)
endef
$(eval $(ix-board))
$(eval $(generic-package))
@@ -19,7 +19,7 @@ image var.ext4 {
}
}
image sdcard.img {
image #INFIX_ID##VERSION#-nanopi-r2s-sdcard.img {
hdimage {
partition-table-type = "gpt"
}
@@ -2,8 +2,39 @@
"ieee802-dot1ab-lldp:lldp": {
"infix-lldp:enabled": true
},
"ietf-hardware:hardware": {
"component": [
{
"class": "infix-hardware:usb",
"name": "USB",
"state": {
"admin-state": "unlocked"
}
}
]
},
"ietf-interfaces:interfaces": {
"interface": [
{
"name": "br0",
"type": "infix-if-type:bridge",
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.0.1",
"prefix-length": 24
}
]
}
},
{
"name": "lan",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
},
{
"name": "lo",
"type": "infix-if-type:loopback",
@@ -24,38 +55,26 @@
]
}
},
{
"name": "lan",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.2.1",
"prefix-length": 24
}
]
},
"ietf-ip:ipv6": {}
},
{
"name": "wan",
"type": "infix-if-type:ethernet"
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {}
}
]
},
"ietf-keystore:keystore": {
"asymmetric-keys": {
"asymmetric-key": [
{
"name": "genkey",
"public-key-format": "ietf-crypto-types:ssh-public-key-format",
"public-key": "",
"private-key-format": "ietf-crypto-types:rsa-private-key-format",
"cleartext-private-key": "",
"certificates": {}
"asymmetric-keys": {
"asymmetric-key": [
{
"name": "genkey",
"public-key-format": "infix-crypto-types:ssh-public-key-format",
"public-key": "",
"private-key-format": "infix-crypto-types:rsa-private-key-format",
"cleartext-private-key": "",
"certificates": {}
}
]
}
]
}
},
"ietf-netconf-acm:nacm": {
"enable-nacm": true,
@@ -92,7 +111,7 @@
],
"rule": [
{
"name": "deny-password-read",
"name": "deny-password-read",
"module-name": "ietf-system",
"path": "/ietf-system:system/authentication/user/password",
"access-operations": "*",
@@ -131,16 +150,14 @@
}
},
"ietf-system:system": {
"hostname": "r2s",
"hostname": "r2s-%m",
"ntp": {
"enabled": true,
"server": [
{
"name": "ntp.org",
"name": "default",
"udp": {
"address": "pool.ntp.org"
},
"iburst": true
}
}
]
},
@@ -153,7 +170,7 @@
}
]
},
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCAtLSBhIE5ldHdvcmsgT3BlcmF0aW5nIFN5c3RlbQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQuZ2l0aHViLmlvCictJy0tLSctJwo="
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
},
"infix-dhcp-client:dhcp-client": {
"client-if": [
@@ -161,36 +178,113 @@
"if-name": "wan",
"option": [
{
"name": "broadcast"
"id": "ntp-server"
},
{
"name": "dns"
"id": "broadcast"
},
{
"name": "domain"
"id": "domain"
},
{
"name": "hostname"
"id": "hostname"
},
{
"name": "ntpsrv"
"id": "dns-server"
},
{
"name": "router"
"id": "router"
},
{
"name": "subnet"
"id": "netmask"
}
]
}
]
},
"infix-dhcp-server:dhcp-server": {
"option": [
{
"id": "ntp-server",
"address": "auto"
},
{
"id": "dns-server",
"address": "auto"
},
{
"id": "router",
"address": "auto"
}
],
"subnet": [
{
"subnet": "192.168.0.0/24",
"pool": {
"start-address": "192.168.0.100",
"end-address": "192.168.0.250"
}
}
]
},
"infix-firewall:firewall": {
"default": "wan",
"zone": [
{
"name": "lan",
"action": "accept",
"interface": [
"br0"
]
},
{
"name": "wan",
"action": "drop",
"interface": [
"wan"
],
"service": [
"dhcpv6-client"
]
}
],
"policy": [
{
"name": "lan-to-wan",
"ingress": [
"lan"
],
"egress": [
"wan"
],
"masquerade": true
}
]
},
"infix-meta:meta": {
"infix-meta:version": "1.2"
"version": "1.5"
},
"infix-services:mdns": {
"enabled": true
},
"infix-services:ssh": {
"enabled": true,
"hostkey": [
"genkey"
],
"listen": [
{
"name": "ipv4",
"address": "0.0.0.0",
"port": 22
},
{
"name": "ipv6",
"address": "::",
"port": 22
}
]
},
"infix-services:web": {
"enabled": true,
"console": {
@@ -0,0 +1,3 @@
#!/bin/sh
udevadm control --reload-rules
udevadm trigger --subsystem-match=net --action=add
@@ -1,2 +1,2 @@
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/ff540000.ethernet/net/eth0", NAME="wan"
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/ff600000.usb/xhci-hcd.0.auto/usb3/3-1/3-1:1.0/net/*", NAME="lan"
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/ff600000.usb/xhci-hcd.0.auto/usb5/5-1/5-1:1.0/net/*", NAME="lan"
+13 -5
View File
@@ -56,6 +56,7 @@ CONFIG_JUMP_LABEL=y
# CONFIG_GCC_PLUGINS is not set
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_PARTITION_ADVANCED=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
# CONFIG_COMPAT_BRK is not set
CONFIG_KSM=y
@@ -243,9 +244,6 @@ CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
CONFIG_NETDEVICES=y
CONFIG_BONDING=m
CONFIG_DUMMY=m
CONFIG_NET_TEAM=m
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_MACVLAN=m
CONFIG_MACVTAP=m
CONFIG_IPVLAN=m
@@ -334,12 +332,20 @@ CONFIG_MDIO_BITBANG=y
CONFIG_MDIO_MVUSB=m
CONFIG_MDIO_MSCC_MIIM=y
CONFIG_MDIO_BUS_MUX_MMIOREG=y
CONFIG_USB_RTL8150=m
CONFIG_USB_RTL8152=m
CONFIG_USB_LAN78XX=m
CONFIG_USB_USBNET=m
CONFIG_USB_NET_CDC_EEM=m
# CONFIG_USB_NET_CDC_NCM is not set
CONFIG_USB_NET_DM9601=m
CONFIG_USB_NET_SMSC75XX=m
CONFIG_USB_NET_SMSC95XX=m
# CONFIG_USB_NET_NET1080 is not set
# CONFIG_USB_NET_CDC_SUBSET is not set
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_EPSON2888=y
CONFIG_USB_KC2190=y
# CONFIG_USB_NET_ZAURUS is not set
# CONFIG_WLAN is not set
CONFIG_INPUT_EVDEV=y
@@ -427,7 +433,7 @@ CONFIG_REGULATOR_S2MPS11=y
# CONFIG_HID_MICROSOFT is not set
# CONFIG_HID_MONTEREY is not set
CONFIG_USB_ULPI_BUS=y
CONFIG_USB=m
CONFIG_USB=y
CONFIG_USB_OTG=y
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_XHCI_MVEBU=m
@@ -438,6 +444,8 @@ CONFIG_USB_OHCI_HCD_PLATFORM=m
CONFIG_USB_STORAGE=m
CONFIG_USB_DWC3=y
CONFIG_USB_DWC2=y
CONFIG_USB_DWC2_HOST=y
CONFIG_USB_DWC2_PCI=y
CONFIG_USB_CHIPIDEA=m
CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y
+3
View File
@@ -0,0 +1,3 @@
# QEMU-specific U-Boot config
# Enable PCI MMC for QEMU virtualized environment
CONFIG_MMC_PCI=y
-743
View File
@@ -1,743 +0,0 @@
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_AUDIT=y
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_PREEMPT=y
CONFIG_IRQ_TIME_ACCOUNTING=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_PSI=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=18
CONFIG_MEMCG=y
CONFIG_BLK_CGROUP=y
CONFIG_CFS_BANDWIDTH=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CPUSETS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
CONFIG_NAMESPACES=y
CONFIG_USER_NS=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_EXPERT=y
CONFIG_KALLSYMS_ALL=y
CONFIG_PROFILING=y
CONFIG_KEXEC_FILE=y
CONFIG_ARCH_ROCKCHIP=y
CONFIG_ARM64_VA_BITS_48=y
CONFIG_SCHED_MC=y
CONFIG_SCHED_SMT=y
CONFIG_NR_CPUS=8
CONFIG_COMPAT=y
CONFIG_RANDOMIZE_BASE=y
# CONFIG_SUSPEND is not set
CONFIG_ARM_PSCI_CPUIDLE=y
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
CONFIG_CPUFREQ_DT=y
CONFIG_ARM_SCMI_CPUFREQ=y
CONFIG_ACPI_CPPC_CPUFREQ=m
CONFIG_ACPI=y
CONFIG_ACPI_APEI=y
CONFIG_ACPI_APEI_GHES=y
CONFIG_ACPI_APEI_MEMORY_FAILURE=y
CONFIG_ACPI_APEI_EINJ=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_KPROBES=y
CONFIG_JUMP_LABEL=y
# CONFIG_GCC_PLUGINS is not set
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
# CONFIG_COMPAT_BRK is not set
CONFIG_KSM=y
CONFIG_MEMORY_FAILURE=y
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_CMA=y
CONFIG_CMA_AREAS=20
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_XDP_SOCKETS=y
CONFIG_XDP_SOCKETS_DIAG=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE_DEMUX=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_SYN_COOKIES=y
CONFIG_IPV6_SIT=m
CONFIG_IPV6_GRE=m
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_SUBTREES=y
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
CONFIG_IPV6_PIMSM_V2=y
CONFIG_NETWORK_PHY_TIMESTAMPING=y
CONFIG_NETFILTER=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER_NETLINK_QUEUE=y
CONFIG_NETFILTER_NETLINK_LOG=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_FTP=y
CONFIG_NF_TABLES=y
CONFIG_NF_TABLES_INET=y
CONFIG_NF_TABLES_NETDEV=y
CONFIG_NFT_CT=m
CONFIG_NFT_CONNLIMIT=m
CONFIG_NFT_LOG=m
CONFIG_NFT_LIMIT=m
CONFIG_NFT_MASQ=m
CONFIG_NFT_REDIR=m
CONFIG_NFT_NAT=m
CONFIG_NFT_TUNNEL=m
CONFIG_NFT_QUEUE=m
CONFIG_NFT_REJECT=m
CONFIG_NFT_COMPAT=m
CONFIG_NFT_HASH=m
CONFIG_NFT_SOCKET=m
CONFIG_NFT_OSF=m
CONFIG_NFT_DUP_NETDEV=m
CONFIG_NFT_FWD_NETDEV=m
CONFIG_NFT_REJECT_NETDEV=m
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_RAW=m
CONFIG_IP6_NF_NAT=m
CONFIG_IP6_NF_TARGET_MASQUERADE=m
CONFIG_IP6_NF_TARGET_NPT=m
CONFIG_NF_TABLES_BRIDGE=m
CONFIG_NFT_BRIDGE_META=m
CONFIG_NFT_BRIDGE_REJECT=m
CONFIG_NF_CONNTRACK_BRIDGE=y
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_BROUTE=m
CONFIG_BRIDGE_EBT_T_FILTER=m
CONFIG_BRIDGE_EBT_T_NAT=m
CONFIG_BRIDGE_EBT_802_3=m
CONFIG_BRIDGE_EBT_AMONG=m
CONFIG_BRIDGE_EBT_ARP=m
CONFIG_BRIDGE_EBT_IP=m
CONFIG_BRIDGE_EBT_IP6=m
CONFIG_BRIDGE_EBT_LIMIT=m
CONFIG_BRIDGE_EBT_MARK=m
CONFIG_BRIDGE_EBT_PKTTYPE=m
CONFIG_BRIDGE_EBT_STP=m
CONFIG_BRIDGE_EBT_VLAN=m
CONFIG_BRIDGE_EBT_ARPREPLY=m
CONFIG_BRIDGE_EBT_DNAT=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_REDIRECT=m
CONFIG_BRIDGE_EBT_SNAT=m
CONFIG_BRIDGE_EBT_LOG=m
CONFIG_BRIDGE_EBT_NFLOG=m
CONFIG_BRIDGE=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_BRIDGE_MRP=y
CONFIG_BRIDGE_CFM=y
CONFIG_VLAN_8021Q=y
CONFIG_VLAN_8021Q_GVRP=y
CONFIG_VLAN_8021Q_MVRP=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBS=m
CONFIG_NET_SCH_ETF=m
CONFIG_NET_SCH_TAPRIO=m
CONFIG_NET_SCH_MQPRIO=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_CLS_FLOWER=m
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_GACT=y
CONFIG_NET_ACT_MIRRED=y
CONFIG_NET_ACT_NAT=y
CONFIG_NET_ACT_SKBEDIT=y
CONFIG_NET_ACT_VLAN=y
CONFIG_NET_ACT_BPF=y
CONFIG_DCB=y
CONFIG_NETLINK_DIAG=y
CONFIG_MPLS=y
CONFIG_NET_MPLS_GSO=y
CONFIG_MPLS_ROUTING=m
CONFIG_NET_PKTGEN=y
CONFIG_BT=m
# CONFIG_BT_LE is not set
CONFIG_BT_LEDS=y
# CONFIG_BT_DEBUGFS is not set
CONFIG_BT_HCIBTUSB=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_LL=y
CONFIG_BT_HCIUART_BCM=y
CONFIG_BT_HCIUART_QCA=y
CONFIG_CFG80211=y
CONFIG_MAC80211=y
CONFIG_MAC80211_LEDS=y
CONFIG_RFKILL=y
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_PCI=y
CONFIG_PCIEPORTBUS=y
CONFIG_PCI_IOV=y
CONFIG_PCI_PASID=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_ACPI=y
CONFIG_PCI_HOST_GENERIC=y
CONFIG_PCIE_ROCKCHIP_HOST=m
CONFIG_PCIE_ROCKCHIP_DW_HOST=y
CONFIG_PCI_ENDPOINT=y
CONFIG_PCI_ENDPOINT_CONFIGFS=y
CONFIG_PCI_EPF_TEST=m
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_FW_LOADER_USER_HELPER=y
CONFIG_VEXPRESS_CONFIG=y
CONFIG_ARM_SCMI_PROTOCOL=y
CONFIG_ARM_SCPI_PROTOCOL=y
CONFIG_EFI_CAPSULE_LOADER=y
CONFIG_MTD=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_CFI=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
CONFIG_MTD_CFI_INTELEXT=y
CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_CFI_STAA=y
CONFIG_MTD_PHYSMAP=y
CONFIG_MTD_PHYSMAP_OF=y
CONFIG_MTD_DATAFLASH=y
CONFIG_MTD_SST25L=y
CONFIG_MTD_BLOCK2MTD=y
CONFIG_MTD_RAW_NAND=y
CONFIG_MTD_NAND_DENALI_DT=y
CONFIG_MTD_SPI_NOR=y
CONFIG_OF_OVERLAY=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_NBD=m
CONFIG_VIRTIO_BLK=y
CONFIG_BLK_DEV_NVME=m
CONFIG_SRAM=y
CONFIG_PCI_ENDPOINT_TEST=m
CONFIG_EEPROM_AT24=m
CONFIG_EEPROM_AT25=m
CONFIG_UACCE=m
# CONFIG_SCSI_PROC_FS is not set
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_SAS_ATA=y
CONFIG_SCSI_HISI_SAS=y
CONFIG_SCSI_HISI_SAS_PCI=y
CONFIG_MEGARAID_SAS=y
CONFIG_SCSI_MPT3SAS=m
CONFIG_SCSI_VIRTIO=y
CONFIG_ATA=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
CONFIG_AHCI_CEVA=y
CONFIG_SATA_SIL24=y
CONFIG_PATA_OF_PLATFORM=y
CONFIG_MD=y
# CONFIG_MD_BITMAP_FILE is not set
CONFIG_BLK_DEV_DM=y
CONFIG_DM_INIT=y
CONFIG_DM_VERITY=y
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
CONFIG_NETDEVICES=y
CONFIG_BONDING=m
CONFIG_DUMMY=m
CONFIG_WIREGUARD=m
CONFIG_MACVLAN=m
CONFIG_MACVTAP=m
CONFIG_IPVLAN=m
CONFIG_IPVTAP=m
CONFIG_VXLAN=m
CONFIG_GENEVE=m
CONFIG_BAREUDP=m
CONFIG_MACSEC=m
CONFIG_TUN=m
CONFIG_VETH=m
CONFIG_VIRTIO_NET=y
CONFIG_NLMON=y
CONFIG_NET_VRF=y
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_VENDOR_ADAPTEC is not set
# CONFIG_NET_VENDOR_AGERE is not set
# CONFIG_NET_VENDOR_ALACRITECH is not set
# CONFIG_NET_VENDOR_ALTEON is not set
# CONFIG_NET_VENDOR_AMAZON is not set
# CONFIG_NET_VENDOR_AMD is not set
# CONFIG_NET_VENDOR_AQUANTIA is not set
# CONFIG_NET_VENDOR_ARC is not set
# CONFIG_NET_VENDOR_ASIX is not set
CONFIG_ATL2=m
CONFIG_ALX=m
# CONFIG_NET_VENDOR_BROADCOM is not set
# CONFIG_NET_VENDOR_CADENCE is not set
# CONFIG_NET_VENDOR_CAVIUM is not set
# CONFIG_NET_VENDOR_CHELSIO is not set
# CONFIG_NET_VENDOR_CISCO is not set
# CONFIG_NET_VENDOR_CORTINA is not set
# CONFIG_NET_VENDOR_DEC is not set
# CONFIG_NET_VENDOR_DLINK is not set
# CONFIG_NET_VENDOR_EMULEX is not set
# CONFIG_NET_VENDOR_EZCHIP is not set
# CONFIG_NET_VENDOR_GOOGLE is not set
# CONFIG_NET_VENDOR_HISILICON is not set
# CONFIG_NET_VENDOR_HUAWEI is not set
# CONFIG_NET_VENDOR_INTEL is not set
# CONFIG_NET_VENDOR_LITEX is not set
# CONFIG_NET_VENDOR_MARVELL is not set
# CONFIG_NET_VENDOR_MELLANOX is not set
# CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_MICROSEMI is not set
# CONFIG_NET_VENDOR_MICROSOFT is not set
# CONFIG_NET_VENDOR_MYRI is not set
# CONFIG_NET_VENDOR_NI is not set
# CONFIG_NET_VENDOR_NATSEMI is not set
# CONFIG_NET_VENDOR_NETERION is not set
# CONFIG_NET_VENDOR_NETRONOME is not set
# CONFIG_NET_VENDOR_NVIDIA is not set
# CONFIG_NET_VENDOR_OKI is not set
# CONFIG_NET_VENDOR_PACKET_ENGINES is not set
# CONFIG_NET_VENDOR_PENSANDO is not set
# CONFIG_NET_VENDOR_QLOGIC is not set
# CONFIG_NET_VENDOR_BROCADE is not set
# CONFIG_NET_VENDOR_QUALCOMM is not set
# CONFIG_NET_VENDOR_RDC is not set
CONFIG_8139CP=m
CONFIG_8139TOO=m
# CONFIG_8139TOO_PIO is not set
CONFIG_R8169=m
# CONFIG_NET_VENDOR_RENESAS is not set
# CONFIG_NET_VENDOR_ROCKER is not set
# CONFIG_NET_VENDOR_SAMSUNG is not set
# CONFIG_NET_VENDOR_SEEQ is not set
# CONFIG_NET_VENDOR_SILAN is not set
# CONFIG_NET_VENDOR_SIS is not set
# CONFIG_NET_VENDOR_SOLARFLARE is not set
# CONFIG_NET_VENDOR_SMSC is not set
# CONFIG_NET_VENDOR_SOCIONEXT is not set
CONFIG_STMMAC_ETH=y
# CONFIG_DWMAC_GENERIC is not set
# CONFIG_NET_VENDOR_SUN is not set
# CONFIG_NET_VENDOR_SYNOPSYS is not set
# CONFIG_NET_VENDOR_TEHUTI is not set
# CONFIG_NET_VENDOR_TI is not set
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not set
# CONFIG_NET_VENDOR_XILINX is not set
CONFIG_LED_TRIGGER_PHY=y
CONFIG_AX88796B_PHY=y
CONFIG_DAVICOM_PHY=m
CONFIG_REALTEK_PHY=y
CONFIG_ROCKCHIP_PHY=y
CONFIG_MDIO_BITBANG=y
CONFIG_MDIO_BUS_MUX_MULTIPLEXER=y
CONFIG_MDIO_BUS_MUX_MMIOREG=y
CONFIG_USB_RTL8150=m
CONFIG_USB_RTL8152=m
CONFIG_USB_USBNET=y
CONFIG_USB_NET_AX8817X=m
CONFIG_USB_NET_AX88179_178A=m
CONFIG_USB_NET_CDC_NCM=m
CONFIG_USB_NET_DM9601=m
CONFIG_USB_NET_SMSC75XX=m
CONFIG_USB_NET_SMSC95XX=m
CONFIG_USB_NET_NET1080=m
CONFIG_USB_NET_PLUSB=m
CONFIG_USB_NET_MCS7830=m
CONFIG_USB_NET_CDC_SUBSET=m
# CONFIG_USB_NET_ZAURUS is not set
CONFIG_ATH10K=m
CONFIG_ATH10K_PCI=m
CONFIG_WCN36XX=m
# CONFIG_WLAN_VENDOR_ATMEL is not set
# CONFIG_WLAN_VENDOR_BROADCOM is not set
# CONFIG_WLAN_VENDOR_INTEL is not set
# CONFIG_WLAN_VENDOR_INTERSIL is not set
# CONFIG_WLAN_VENDOR_MARVELL is not set
# CONFIG_WLAN_VENDOR_MEDIATEK is not set
CONFIG_RTL8180=m
CONFIG_RTL8187=m
CONFIG_RTL_CARDS=m
CONFIG_RTL8192CE=m
CONFIG_RTL8192SE=m
CONFIG_RTL8192DE=m
CONFIG_RTL8723AE=m
CONFIG_RTL8723BE=m
CONFIG_RTL8188EE=m
CONFIG_RTL8192EE=m
CONFIG_RTL8821AE=m
CONFIG_RTL8192CU=m
CONFIG_RTL8XXXU=m
CONFIG_RTL8XXXU_UNTESTED=y
CONFIG_RTW88=m
CONFIG_RTW88_8822BE=m
CONFIG_RTW88_8822BS=m
CONFIG_RTW88_8822BU=m
CONFIG_RTW88_8822CE=m
CONFIG_RTW88_8822CS=m
CONFIG_RTW88_8822CU=m
CONFIG_RTW88_8723DE=m
CONFIG_RTW88_8723DS=m
CONFIG_RTW88_8723DU=m
CONFIG_RTW88_8821CE=m
CONFIG_RTW88_8821CS=m
CONFIG_RTW88_8821CU=m
CONFIG_RTW88_DEBUG=y
CONFIG_RTW89=m
CONFIG_RTW89_8851BE=m
CONFIG_RTW89_8852AE=m
CONFIG_RTW89_8852BE=m
CONFIG_RTW89_8852CE=m
CONFIG_RTW89_DEBUGMSG=y
# CONFIG_WLAN_VENDOR_RSI is not set
# CONFIG_WLAN_VENDOR_TI is not set
# CONFIG_WLAN_VENDOR_ZYDAS is not set
# CONFIG_WLAN_VENDOR_QUANTENNA is not set
CONFIG_INPUT_FF_MEMLESS=y
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_EVBUG=y
CONFIG_KEYBOARD_GPIO=y
CONFIG_KEYBOARD_GPIO_POLLED=y
# CONFIG_INPUT_MOUSE is not set
CONFIG_INPUT_MISC=y
CONFIG_INPUT_RK805_PWRKEY=y
# CONFIG_SERIO_SERPORT is not set
CONFIG_SERIO_AMBAKMI=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_LEGACY_PTY_COUNT=16
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_8250_RT288X=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_SERIAL_AMBA_PL010=y
CONFIG_SERIAL_AMBA_PL010_CONSOLE=y
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_SERIAL_DEV_BUS=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_TCG_TPM=y
CONFIG_TCG_TIS_I2C_INFINEON=y
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MUX=y
CONFIG_I2C_MUX_PCA954x=y
CONFIG_I2C_GPIO=m
CONFIG_I2C_RK3X=y
CONFIG_I2C_SLAVE=y
CONFIG_SPI=y
CONFIG_SPI_BITBANG=m
CONFIG_SPI_CADENCE_QUADSPI=y
CONFIG_SPI_DESIGNWARE=m
CONFIG_SPI_DW_DMA=y
CONFIG_SPI_DW_MMIO=m
CONFIG_SPI_PL022=y
CONFIG_SPI_ROCKCHIP=y
CONFIG_SPI_SPIDEV=m
CONFIG_SPMI=y
CONFIG_PPS=y
# CONFIG_PTP_1588_CLOCK is not set
CONFIG_DEBUG_PINCTRL=y
CONFIG_PINCTRL_RK805=y
CONFIG_PINCTRL_SINGLE=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_GENERIC_PLATFORM=y
CONFIG_GPIO_MAX732X=y
CONFIG_GPIO_PCA953X=y
CONFIG_GPIO_PCA953X_IRQ=y
CONFIG_POWER_RESET_GPIO_RESTART=y
CONFIG_POWER_RESET_SYSCON=y
CONFIG_SYSCON_REBOOT_MODE=y
CONFIG_CHARGER_RK817=y
CONFIG_SENSORS_ARM_SCMI=y
CONFIG_SENSORS_ARM_SCPI=y
CONFIG_SENSORS_PWM_FAN=m
CONFIG_CPU_THERMAL=y
CONFIG_THERMAL_EMULATION=y
CONFIG_ROCKCHIP_THERMAL=m
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_SYSFS=y
CONFIG_SOFT_WATCHDOG=y
CONFIG_MFD_RK8XX_I2C=y
CONFIG_MFD_RK8XX_SPI=y
# CONFIG_MFD_VEXPRESS_SYSREG is not set
CONFIG_REGULATOR=y
CONFIG_REGULATOR_DEBUG=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_USERSPACE_CONSUMER=y
CONFIG_REGULATOR_NETLINK_EVENTS=y
CONFIG_REGULATOR_GPIO=y
CONFIG_REGULATOR_PWM=y
CONFIG_REGULATOR_RK808=y
CONFIG_REGULATOR_VCTRL=y
# CONFIG_HID_SUPPORT is not set
CONFIG_USB_ULPI_BUS=y
CONFIG_USB_CONN_GPIO=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DYNAMIC_MINORS=y
CONFIG_USB_OTG=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_ACM=m
CONFIG_USB_STORAGE=y
CONFIG_USB_MUSB_HDRC=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC2=y
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_SIMPLE=m
CONFIG_USB_SERIAL_CP210X=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_PL2303=m
CONFIG_USB_SERIAL_OPTION=m
CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_ULPI=y
CONFIG_USB_GADGET=y
CONFIG_USB_SNP_UDC_PLAT=y
CONFIG_USB_BDC_UDC=y
CONFIG_USB_CONFIGFS=m
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_OBEX=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_EEM=y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_MMC=y
CONFIG_MMC_BLOCK_MINORS=32
CONFIG_MMC_ARMMMCI=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_ACPI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_OF_ARASAN=y
CONFIG_MMC_SDHCI_CADENCE=y
CONFIG_MMC_SDHCI_F_SDH30=y
CONFIG_MMC_SPI=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_HI3798CV200=y
CONFIG_MMC_DW_K3=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_SCSI_UFSHCD=y
CONFIG_SCSI_UFSHCD_PLATFORM=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_CLASS_FLASH=y
CONFIG_LEDS_CLASS_MULTICOLOR=y
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_PWM=y
CONFIG_LEDS_SYSCON=y
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_DISK=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_CPU=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_LEDS_TRIGGER_PANIC=y
CONFIG_LEDS_TRIGGER_NETDEV=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_RK808=y
CONFIG_RTC_DRV_EFI=y
CONFIG_RTC_DRV_PL030=y
CONFIG_RTC_DRV_PL031=y
CONFIG_DMADEVICES=y
CONFIG_PL330_DMA=y
CONFIG_SYNC_FILE=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BALLOON=y
CONFIG_VIRTIO_INPUT=y
CONFIG_VIRTIO_MMIO=y
# CONFIG_VHOST_MENU is not set
CONFIG_STAGING=y
CONFIG_RTLLIB=m
CONFIG_RTL8192E=m
CONFIG_RTL8723BS=m
CONFIG_R8712U=m
CONFIG_RTS5208=m
# CONFIG_SURFACE_PLATFORMS is not set
CONFIG_COMMON_CLK_SCMI=y
CONFIG_COMMON_CLK_SCPI=y
CONFIG_COMMON_CLK_PWM=y
CONFIG_HWSPINLOCK=y
# CONFIG_FSL_ERRATUM_A008585 is not set
# CONFIG_HISILICON_ERRATUM_161010101 is not set
# CONFIG_ARM64_ERRATUM_858921 is not set
CONFIG_ARM_MHU=y
CONFIG_PLATFORM_MHU=y
CONFIG_IOMMU_IO_PGTABLE_ARMV7S=y
CONFIG_ROCKCHIP_IOMMU=y
CONFIG_ARM_SMMU=y
CONFIG_ARM_SMMU_V3=y
CONFIG_ROCKCHIP_IODOMAIN=y
CONFIG_ROCKCHIP_DTPM=m
CONFIG_ROCKCHIP_PM_DOMAINS=y
CONFIG_DEVFREQ_GOV_USERSPACE=m
CONFIG_EXTCON_USB_GPIO=y
CONFIG_MEMORY=y
CONFIG_IIO=y
CONFIG_MAX9611=m
CONFIG_ROCKCHIP_SARADC=m
CONFIG_IIO_ST_LSM6DSX=m
CONFIG_SENSORS_ISL29018=m
CONFIG_VCNL4000=m
CONFIG_IIO_ST_MAGN_3AXIS=m
CONFIG_MPL3115=m
CONFIG_PWM=y
CONFIG_PWM_ROCKCHIP=y
CONFIG_RESET_GPIO=y
CONFIG_PHY_ROCKCHIP_DPHY_RX0=m
CONFIG_PHY_ROCKCHIP_EMMC=y
CONFIG_PHY_ROCKCHIP_INNO_HDMI=m
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=m
CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=m
CONFIG_PHY_ROCKCHIP_PCIE=m
CONFIG_PHY_ROCKCHIP_TYPEC=y
CONFIG_PHY_ROCKCHIP_USB=m
CONFIG_POWERCAP=y
CONFIG_ARM_SCMI_POWERCAP=y
CONFIG_DTPM=y
CONFIG_ARM_SMMU_V3_PMU=m
CONFIG_NVMEM_RMEM=m
CONFIG_NVMEM_ROCKCHIP_EFUSE=m
CONFIG_NVMEM_ROCKCHIP_OTP=m
CONFIG_TEE=y
CONFIG_OPTEE=y
CONFIG_MUX_MMIO=y
CONFIG_INTERCONNECT=y
CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_BTRFS_FS=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
CONFIG_QUOTA=y
CONFIG_AUTOFS_FS=y
CONFIG_FUSE_FS=y
CONFIG_VIRTIO_FS=y
CONFIG_OVERLAY_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_UTF8=y
CONFIG_EXFAT_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_CHILDREN=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_HUGETLBFS=y
CONFIG_EFIVAR_FS=y
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_XATTR=y
CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
CONFIG_NFS_FS=y
CONFIG_NFS_V4=y
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_ROOT_NFS=y
CONFIG_9P_FS=y
CONFIG_NLS_DEFAULT="iso8859-15"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_UTF8=y
CONFIG_SECURITY=y
CONFIG_CRYPTO_DH=m
CONFIG_CRYPTO_CURVE25519=m
CONFIG_CRYPTO_ECHAINIV=y
CONFIG_CRYPTO_LZO=y
CONFIG_CRYPTO_ZSTD=y
CONFIG_CRYPTO_ANSI_CPRNG=y
CONFIG_CRYPTO_USER_API_RNG=m
CONFIG_CRYPTO_GHASH_ARM64_CE=y
CONFIG_CRYPTO_SHA1_ARM64_CE=y
CONFIG_CRYPTO_SHA2_ARM64_CE=y
CONFIG_CRYPTO_SHA512_ARM64_CE=m
CONFIG_CRYPTO_SHA3_ARM64=m
CONFIG_CRYPTO_SM3_ARM64_CE=m
CONFIG_CRYPTO_AES_ARM64_BS=m
CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=m
CONFIG_CRYPTO_DEV_ROCKCHIP=y
CONFIG_CRYPTO_DEV_CCREE=m
CONFIG_PACKING=y
CONFIG_INDIRECT_PIO=y
CONFIG_CRC_CCITT=m
CONFIG_CRC8=y
CONFIG_DMA_CMA=y
CONFIG_CMA_SIZE_MBYTES=32
CONFIG_PRINTK_TIME=y
CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_DETECT_HUNG_TASK=y
# CONFIG_SCHED_DEBUG is not set
CONFIG_FUNCTION_TRACER=y
CONFIG_MEMTEST=y
-5
View File
@@ -1,5 +0,0 @@
#!/bin/sh
BOARD_DIR="$(dirname $0)"
install -m 0644 -D $BOARD_DIR/extlinux.conf $TARGET_DIR/boot/extlinux/extlinux.conf
+12
View File
@@ -0,0 +1,12 @@
config BR2_PACKAGE_RASPBERRYPI_RPI64
bool "Raspberry Pi 64-bit (RPi3 and later)"
depends on BR2_aarch64
select SDCARD_AUX
select BR2_PACKAGE_FEATURE_WIFI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI
help
Raspberry Pi 64-bit adds support for the Raspberry Pi family of
of single-board computers (SBC), RPi 3B and later, including the
Raspberry Pi 2W, which shares the same CPU core as RPi 3B.
+13
View File
@@ -0,0 +1,13 @@
Copyright (c) 2025 The KernelKit Authors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+59
View File
@@ -0,0 +1,59 @@
# Raspberry Pi 3B/4B
## Support level
Full support for base board but not any extension board on the GPIOs.
Other RPi boards of the same generation may work as well, but may need
some additional testing/work. A few CM4 variants have been tested and
seem to work as expected, but YMMV as always.
### Touch screen
The [Raspberry Pi touch display v1][0] is supported on the 4B, including
touch functionality. There are multiple touchscreens on the market for
Raspberry Pi, but currently only the official first version with 800x480
resolution is supported. Infix supplies all drivers required to utilize
the hardware, but you need to add the actual graphical application in a
container.
There are some important considerations you need to know about when
using Infix for graphical applications. The container needs access to
`/dev/dri/` to be able to access the graphics card, it also need access
to `/run/udev` to be able to find the input devices.
Example of running Doom in Infix:
```
admin@example:/> configure
admin@example:/config/> edit container doom
admin@example:/config/container/doom/> set image docker://mattiaswal/alpine-doom:latest
admin@example:/config/container/doom/> set privileged
admin@example:/config/container/doom/> edit mount udev
admin@example:/config/container/doom/mount/udev/> set type bind
admin@example:/config/container/doom/mount/udev/> set target /run/udev/
admin@example:/config/container/doom/mount/udev/> set source /run/udev/
admin@example:/config/container/doom/mount/udev/> end
admin@example:/config/container/doom/mount/xorg.conf/> set content U2VjdGlvbiAiT3V0cHV0Q2xhc3MiCiAgSWRlbnRpZmllciAidmM0IgogIE1hdGNoRHJpdmVyICJ2YzQiCiAgRHJpdmVyICJtb2Rlc2V0dGluZyIKICBPcHRpb24gIlByaW1hcnlHUFUiICJ0cnVlIgpFbmRTZWN0aW9uCg==
admin@example:/config/container/doom/mount/xorg.conf/> set target /etc/X11/xorg.conf
admin@example:/config/container/doom/mount/xorg.conf/> end
admin@example:/config/container/doom/> edit volume var
admin@example:/config/container/doom/volume/var/> set target /var
admin@example:/config/container/doom/volume/var/> leave
admin@example:/>
```
> [!NOTE]
> The `xorg.conf` [content mount][2] is a nifty detail of Infix that
> allows you to keep all the relevant configuration in a single file.
> The deta is "simply" `base64` encoded, so you do not really need the
> features of the Infix CLI, everything can be set up remotely [using
> `curl`][3] if you like.
### Pre-built images
Pre-built SD card images are available here: [infix-rpi4-sdcard.img][sdcard]
[0]: https://www.raspberrypi.com/products/raspberry-pi-touch-display/
[1]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-rpi4-sdcard.img
[2]: https://kernelkit.org/infix/latest/container/#content-mounts
[3]: https://kernelkit.org/infix/latest/scripting-restconf/

Some files were not shown because too many files have changed in this diff Show More