mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-25 18:23:01 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f539da7e99 | ||
|
|
3a6e70ba26 | ||
|
|
9406fd0e04 | ||
|
|
52ef3e2ded | ||
|
|
3d1d73543e | ||
|
|
4c0996b52b | ||
|
|
e49682645c | ||
|
|
a3c6ec0cd5 | ||
|
|
25fcfba0cb | ||
|
|
5defdfdeac | ||
|
|
624bfd927c | ||
|
|
4d8b2e5370 | ||
|
|
6aed1f7df4 | ||
|
|
7dd746d586 | ||
|
|
b1ad0f1656 | ||
|
|
29222e18e9 | ||
|
|
f9ea5567c4 | ||
|
|
413d8e4599 | ||
|
|
507bb38bdc | ||
|
|
5cb17d69d4 | ||
|
|
6c6dc7711e | ||
|
|
4f2683090e | ||
|
|
08ca47fdab | ||
|
|
17965bf4cc | ||
|
|
82ffb0f4bc | ||
|
|
2788eb6d1a | ||
|
|
ba05c2e56d | ||
|
|
c7cdf6b018 | ||
|
|
efa665de9c | ||
|
|
4ece445c44 | ||
|
|
e1e2ada4b4 | ||
|
|
95bd795347 | ||
|
|
3426c2527b | ||
|
|
45b06dd670 | ||
|
|
73b6e5cc91 | ||
|
|
b93795c0aa | ||
|
|
5979f4e3c9 | ||
|
|
2397e7684c | ||
|
|
43d6dbc63f | ||
|
|
8ebdf9f119 | ||
|
|
3aef9930fe | ||
|
|
3ea1161f5f | ||
|
|
091618c527 | ||
|
|
7647d2a542 | ||
|
|
f996dbd6ef | ||
|
|
ff02190df8 | ||
|
|
c6f7b61683 | ||
|
|
dbc3ba0c83 | ||
|
|
d039af7234 | ||
|
|
59028c4800 | ||
|
|
2603b0ea1b | ||
|
|
4212a38c3b | ||
|
|
bb72cfd8e3 |
@@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Validate release version format
|
||||
id: validate
|
||||
@@ -170,7 +170,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Upload signed artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: signed-infix-${{ steps.validate.outputs.file_version }}
|
||||
path: ${{ steps.download_signed.outputs.signed_filename }}
|
||||
@@ -212,4 +212,4 @@ jobs:
|
||||
---
|
||||
|
||||
**Next Steps:** The signed release can now be distributed with cryptographic verification of authenticity.
|
||||
EOF
|
||||
EOF
|
||||
|
||||
@@ -41,7 +41,7 @@ jobs:
|
||||
ls -la ./
|
||||
|
||||
- name: Checkout infix repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.branch || github.ref }}
|
||||
clean: true
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
mv images ${{ steps.vars.outputs.dirname }}
|
||||
tar cfz ${{ steps.vars.outputs.archive }} ${{ steps.vars.outputs.dirname }}/
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: output/${{ steps.vars.outputs.archive }}
|
||||
name: artifact-${{ matrix.defconfig }}
|
||||
@@ -108,7 +108,7 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/download-artifact@v4
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
clean: true
|
||||
fetch-depth: 0
|
||||
@@ -277,7 +277,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Upload images as artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: images-${{ inputs.board }}
|
||||
path: |
|
||||
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
target: [aarch64, arm, x86_64]
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
clean: true
|
||||
submodules: recursive
|
||||
@@ -86,12 +86,12 @@ jobs:
|
||||
ln -s ${{ steps.vars.outputs.dir }} images
|
||||
tar cfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: artifact-${{ matrix.target }}
|
||||
path: output/*.tar.gz
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: artifact-disk-image-${{ matrix.target }}
|
||||
path: output/images/*.qcow2
|
||||
|
||||
@@ -80,7 +80,7 @@ jobs:
|
||||
ls -la ./
|
||||
|
||||
- name: Checkout infix repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
repository: ${{ env.INFIX_REPO }}
|
||||
ref: ${{ env.INFIX_BRANCH != '' && env.INFIX_BRANCH || github.ref }}
|
||||
@@ -178,7 +178,7 @@ jobs:
|
||||
ln -s ${{ steps.vars.outputs.dir }} images
|
||||
tar cfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: output/${{ steps.vars.outputs.tgz }}
|
||||
name: artifact-${{ env.TARGET }}
|
||||
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Check out infix repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Create pull request
|
||||
if: steps.check.outputs.new_release == 'true'
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
github-token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
|
||||
script: |
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
if: ${{github.repository_owner == 'kernelkit'}}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Fetch latest Coverity Scan MD5
|
||||
id: var
|
||||
env:
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
-O coverity-latest.tar.gz.md5
|
||||
echo "md5=$(cat coverity-latest.tar.gz.md5)" | tee -a $GITHUB_OUTPUT
|
||||
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
id: cache
|
||||
with:
|
||||
path: coverity-latest.tar.gz
|
||||
@@ -98,7 +98,7 @@ jobs:
|
||||
https://scan.coverity.com/builds?project=${PROJECT_NAME}
|
||||
|
||||
- name: Upload build.log
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: coverity-build.log
|
||||
path: cov-int/build-log.txt
|
||||
|
||||
@@ -24,12 +24,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v4
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
mtools
|
||||
|
||||
- name: Checkout infix repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
repository: ${{ github.repository }}
|
||||
ref: ${{ github.ref }}
|
||||
@@ -77,7 +77,7 @@ jobs:
|
||||
ln -s Infix-x86_64 images
|
||||
tar cfz Infix-x86_64.tar.gz Infix-x86_64
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: output/Infix-x86_64.tar.gz
|
||||
name: artifact-x86_64
|
||||
|
||||
@@ -44,7 +44,7 @@ jobs:
|
||||
checkout:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- uses: kernelkit/actions/cache-restore@v1
|
||||
with:
|
||||
target: x86_64
|
||||
|
||||
@@ -48,7 +48,7 @@ jobs:
|
||||
contents: write
|
||||
discussions: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: 'true'
|
||||
|
||||
@@ -78,7 +78,7 @@ jobs:
|
||||
echo "pre=${{ steps.rel.outputs.pre }}"
|
||||
echo "latest=${{ steps.rel.outputs.latest }}"
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
@@ -43,6 +43,11 @@ on:
|
||||
type: string
|
||||
default: ''
|
||||
description: 'Optional script to run after checkout (for spin customization)'
|
||||
release:
|
||||
required: false
|
||||
type: string
|
||||
default: ''
|
||||
description: 'Release version (e.g. v26.04.0), sets INFIX_RELEASE so make test finds versioned artifacts'
|
||||
secrets:
|
||||
CHECKOUT_TOKEN:
|
||||
required: false
|
||||
@@ -61,7 +66,7 @@ jobs:
|
||||
runs-on: [self-hosted, regression]
|
||||
steps:
|
||||
- name: Checkout infix repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
repository: ${{ env.INFIX_REPO }}
|
||||
ref: ${{ env.INFIX_BRANCH != '' && env.INFIX_BRANCH || github.ref }}
|
||||
@@ -93,7 +98,7 @@ jobs:
|
||||
run: |
|
||||
make ${{ env.TARGET }}_defconfig
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
@@ -105,12 +110,15 @@ jobs:
|
||||
|
||||
ls -l
|
||||
mkdir -p output
|
||||
mv ${name}-${target}.tar.gz output/
|
||||
tarfile=$(ls ${name}-${target}*.tar.gz | head -1)
|
||||
mv "$tarfile" output/
|
||||
cd output/
|
||||
tar xf ${name}-${target}.tar.gz
|
||||
ln -s ${name}-${target} images
|
||||
tar xf "$tarfile"
|
||||
ln -s "${tarfile%.tar.gz}" images
|
||||
|
||||
- name: Regression Test ${{ env.TARGET }}
|
||||
env:
|
||||
INFIX_RELEASE: ${{ inputs.release }}
|
||||
run: |
|
||||
if [ -n "$NINEPM_CONF" ]; then
|
||||
export NINEPM_PROJ_CONFIG="${GITHUB_WORKSPACE}/$NINEPM_CONF"
|
||||
@@ -131,7 +139,7 @@ jobs:
|
||||
make test-dir="$(pwd)/$TEST_PATH" test-report
|
||||
|
||||
- name: Upload Test Report as Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: test-report
|
||||
path: output/images/test-report.pdf
|
||||
|
||||
@@ -78,7 +78,7 @@ jobs:
|
||||
ls -la ./
|
||||
|
||||
- name: Checkout infix repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
repository: ${{ env.INFIX_REPO }}
|
||||
ref: ${{ env.INFIX_BRANCH != '' && env.INFIX_BRANCH || github.ref }}
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/download-artifact@v4
|
||||
- uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
@@ -9,8 +9,10 @@ O ?= output
|
||||
# otherwise treat it as relative to ./buildroot.
|
||||
override O := $(if $(filter /%,$O),$O,$(CURDIR)/$O)
|
||||
|
||||
config := $(O)/.config
|
||||
bmake = $(MAKE) -C buildroot O=$(O) $1
|
||||
config := $(O)/.config
|
||||
bmake = $(MAKE) -C buildroot O=$(O) $1
|
||||
SNIPPETS_DIR := $(CURDIR)/configs/snippets
|
||||
MERGE_CONFIG := $(CURDIR)/buildroot/support/kconfig/merge_config.sh
|
||||
|
||||
|
||||
all: $(config) buildroot/Makefile
|
||||
@@ -26,6 +28,23 @@ $(config):
|
||||
@echo "'make <board>_defconfig' before building an image."
|
||||
@exit 1
|
||||
|
||||
apply-%: $(SNIPPETS_DIR)/%.conf | $(config)
|
||||
@KCONFIG_CONFIG=$(config) $(MERGE_CONFIG) -m $(config) $<
|
||||
@+$(call bmake,olddefconfig)
|
||||
@echo "Applied snippet: $<"
|
||||
|
||||
list-snippets:
|
||||
@echo "Available snippets (use 'make apply-<name>'):"
|
||||
@ls $(SNIPPETS_DIR)/*.conf 2>/dev/null | sed 's|.*/||; s|\.conf$$||; s|^| |'
|
||||
|
||||
dev: | $(config)
|
||||
@for s in $(SNIPPETS_DIR)/*.conf; do \
|
||||
KCONFIG_CONFIG=$(config) $(MERGE_CONFIG) -m $(config) $$s; \
|
||||
echo "Applied snippet: $$s"; \
|
||||
done
|
||||
@+$(call bmake,olddefconfig)
|
||||
@+$(call bmake,all)
|
||||
|
||||
%: | buildroot/Makefile
|
||||
@+$(call bmake,$@)
|
||||
|
||||
@@ -44,4 +63,4 @@ test:
|
||||
buildroot/Makefile:
|
||||
@git submodule update --init
|
||||
|
||||
.PHONY: all check coverity dep test cyclonedx
|
||||
.PHONY: all check coverity dep test cyclonedx list-snippets dev
|
||||
|
||||
@@ -8,6 +8,7 @@ Board Specific Documentation
|
||||
- [Banana Pi BPi-R4](bananapi-bpi-r4/)
|
||||
- [Banana Pi BPi-R64](bananapi-bpi-r64/)
|
||||
- [Marvell CN9130-CRB](marvell-cn9130-crb/)
|
||||
- [Marvell ESPRESSObin](marvell-espressobin/)
|
||||
- [Microchip SparX-5i PCB135 (eMMC)](microchip-sparx5-pcb135/)
|
||||
- [NanoPi R2S](friendlyarm-nanopi-r2s/)
|
||||
- [Raspberry Pi 64-bit](raspberrypi-rpi64/)
|
||||
|
||||
@@ -70,11 +70,11 @@ The BPI-R3 has a 4-position DIP switch that controls boot media:
|
||||
|
||||
<img align="right" src="bootstrap-switch.webp" alt="DIP switches" width=200 padding=10>
|
||||
|
||||
| Position | Mode | Description |
|
||||
|----------|-------------|---------------------------------------|
|
||||
| 0000 | SD card | Boot from microSD card |
|
||||
| 0110 | eMMC | Boot from internal eMMC (recommended) |
|
||||
| 1010 | SPI NAND | Boot from SPI NAND (advanced users) |
|
||||
| ABCD | Mode | Description |
|
||||
|------|----------|---------------------------------------|
|
||||
| 0000 | SD card | Boot from microSD card |
|
||||
| 0101 | SPI NAND | Boot from SPI NAND (advanced users) |
|
||||
| 1001 | eMMC | Boot from internal eMMC (recommended) |
|
||||
|
||||
> [!NOTE]
|
||||
> Switch position is read from left to right: "0" = OFF, "1" = ON.
|
||||
@@ -150,6 +150,7 @@ From the U-Boot prompt:
|
||||
usb start
|
||||
fatload usb 0:1 0x50000000 infix-bpi-r3-emmc.img
|
||||
setexpr blocks ${filesize} / 0x200
|
||||
mmc dev 0
|
||||
mmc write 0x50000000 0x0 ${blocks}
|
||||
```
|
||||
|
||||
|
||||
@@ -24,6 +24,18 @@ https://github.com/openwrt/openwrt/blob/main/target/linux/mediatek/patches-6.12/
|
||||
&secmon_reserved {
|
||||
reg = <0 0x43000000 0 0x40000>;
|
||||
};
|
||||
/*
|
||||
* The T-PHY's pcie-phy sub-node only claims clk40m ("ref") in the SoC
|
||||
* dtsi. CLK_TOP_PCIE_PHY_SEL ("da_ref") is left unclaimed, so the
|
||||
* kernel's clk_disable_unused late_initcall gates it — killing the
|
||||
* PCIe REFCLK output to the endpoint mid-probe. Wire it here so the
|
||||
* clock stays enabled while the PHY is active.
|
||||
*/
|
||||
&pcie_port {
|
||||
clocks = <&clk40m>, <&topckgen CLK_TOP_PCIE_PHY_SEL>;
|
||||
clock-names = "ref", "da_ref";
|
||||
};
|
||||
|
||||
&cpu_thermal {
|
||||
/delete-node/ trips;
|
||||
/delete-node/ cooling-maps;
|
||||
|
||||
@@ -14,7 +14,7 @@ The Banana Pi BPI-R64 is a networking board based on the MediaTek MT7622
|
||||
- 8 GB eMMC storage
|
||||
- microSD card slot
|
||||
- MT7531 Gigabit Ethernet switch (4x LAN + 1x WAN)
|
||||
- MT7603E built-in 2.4 GHz WiFi
|
||||
- MT7622 WMAC built-in 2.4 GHz 802.11ac WiFi
|
||||
- USB 3.0 port
|
||||
- 2x Mini PCIe slots
|
||||
|
||||
@@ -24,7 +24,7 @@ Infix comes preconfigured with:
|
||||
|
||||
- **LAN ports** (lan0-lan3): Bridged for internal networking
|
||||
- **WAN port**: DHCP client enabled for internet connectivity
|
||||
- **WiFi** (wifi0-ap): Bridged to LAN (MT7615 PCIe card if fitted, otherwise MT7603E)
|
||||
- **WiFi** (wifi0-ap): Bridged to LAN (MT7622 WMAC, 2.4 GHz; or MT7615 PCIe card if fitted)
|
||||
|
||||
## Boot Switch Reference
|
||||
|
||||
@@ -113,6 +113,19 @@ mmc partconf 0 1 1 0
|
||||
|
||||
## Platform Notes
|
||||
|
||||
### WiFi
|
||||
|
||||
The MT7622 SoC includes a built-in WMAC that provides 2.4 GHz 802.11b/g/n/ac
|
||||
(2×2) — there is no 5 GHz capability from the onboard radio.
|
||||
|
||||
For dual-band operation, a PCIe card can be fitted in one of the two Mini PCIe
|
||||
slots. The [Banana Pi BPI-MT7615][bpi-mt7615] is a purpose-built dual-band
|
||||
(2.4 + 5 GHz, 802.11ac 4×4) module designed for BPI router boards and is a
|
||||
natural fit. With it installed, Infix will use it in preference to the onboard
|
||||
WMAC for the `wifi0-ap` interface.
|
||||
|
||||
[bpi-mt7615]: https://docs.banana-pi.org/en/BPI-MT7615/BananaPi_MT7615
|
||||
|
||||
### mmc0 = eMMC, mmc1 = SD
|
||||
|
||||
On MT7622, MSDC0 (mmc0) is the 8-bit eMMC controller and MSDC1 (mmc1) is the
|
||||
|
||||
@@ -0,0 +1,232 @@
|
||||
# Marvell ESPRESSObin
|
||||
|
||||
<img src="espressobin.png" alt="The board" width=800 padding=10>
|
||||
|
||||
The [ESPRESSObin][0] is a single-board computer based on the [Marvell Armada
|
||||
3720][1] (dual Cortex-A53, AArch64) SoC and the [Marvell 88E6341][2] (Topaz)
|
||||
switch, oriented toward networking applications.
|
||||
|
||||
The board design is old but the switch offers full Linux support, including
|
||||
advanced TSN features for [IEEE 1588-2019][3] (PTP) and [IEEE 802.1AS-2020][4]
|
||||
(gPTP).
|
||||
|
||||
## Board Variants
|
||||
|
||||
The board has gone through several hardware revisions:
|
||||
|
||||
| Revision | Storage | Notes |
|
||||
|------------|---------------------|--------------------------------|
|
||||
| v1, v3, v5 | SPI NOR only | Obsolete; U-Boot always in SPI |
|
||||
| v7 | SPI NOR + 4 GB eMMC | Current; SD and eMMC usable |
|
||||
| Ultra | SPI NOR + 4 GB eMMC | High-end variant |
|
||||
|
||||
On **all revisions** the Boot ROM is hardwired to load U-Boot from SPI NOR
|
||||
flash. There is no strap or jumper to make the Boot ROM load directly from an
|
||||
SD card. The SD card (or eMMC on v7/Ultra) is used only for the operating
|
||||
system.
|
||||
|
||||
## Building
|
||||
|
||||
The ESPRESSObin uses ext4 for its rootfs partitions rather than the default
|
||||
squashfs, because the stock SPI U-Boot lacks squashfs and `blkmap` support.
|
||||
The `ext4` configuration snippet enables this. Apply it once after selecting
|
||||
the defconfig, then build and compose the SD card image:
|
||||
|
||||
```sh
|
||||
make O=x-aarch64 aarch64_defconfig
|
||||
make O=x-aarch64 apply-ext4
|
||||
make O=x-aarch64
|
||||
|
||||
utils/mkimage.sh -r x-aarch64 marvell-espressobin
|
||||
```
|
||||
|
||||
The resulting image (`x-aarch64/images/infix-espressobin-sdcard.img`) contains
|
||||
a GPT disk with the standard Infix partition layout, using ext4 instead of the
|
||||
read-only squashfs:
|
||||
|
||||
| Partition | Label | Contents |
|
||||
|-----------|-----------|------------------------------|
|
||||
| 1 | aux | RAUC upgrade state (ext4) |
|
||||
| 2 | primary | Rootfs slot primary (ext4) |
|
||||
| 3 | secondary | Rootfs slot secondary (ext4) |
|
||||
| 4 | cfg | Persistent config (ext4) |
|
||||
| 5 | var | Runtime data (ext4) |
|
||||
|
||||
## Writing to SD Card
|
||||
|
||||
```sh
|
||||
dd if=infix-espressobin-sdcard.img of=/dev/sdX bs=4M status=progress conv=fsync
|
||||
```
|
||||
|
||||
## Upgrading
|
||||
|
||||
The build produces `x-aarch64/images/infix-aarch64-ext4.pkg`, a RAUC bundle
|
||||
containing the ext4 rootfs. Once the board is running Infix, upgrade over the
|
||||
network in the usual way:
|
||||
|
||||
```
|
||||
upgrade ftp://192.168.1.1/infix-aarch64-ext4.pkg
|
||||
```
|
||||
|
||||
RAUC writes the new rootfs to the inactive slot, updates `BOOT_ORDER` in
|
||||
`/mnt/aux/uboot.env`, and the next boot picks it up automatically.
|
||||
|
||||
> [!NOTE]
|
||||
> Use `infix-aarch64-ext4.pkg`, not the standard `infix-aarch64.pkg`. The
|
||||
> standard bundle contains a squashfs rootfs which the stock U-Boot cannot
|
||||
> boot.
|
||||
|
||||
## Booting with the Stock SPI U-Boot
|
||||
|
||||
The stock Marvell U-Boot has `ext4load` and the standard variables
|
||||
(`$kernel_addr`, `$fdt_addr`, `$loadaddr`, `$console`, `$image_name`,
|
||||
`$fdt_name`) already set sensibly. Connect to the board's console port, the
|
||||
micro USB connector, at 115200 8N1, interrupt autoboot, and paste the commands
|
||||
below.
|
||||
|
||||
### Environment Variable Reference
|
||||
|
||||
These variables are pre-set in the stock U-Boot environment. Restore them
|
||||
with these values if they are ever lost or corrupted:
|
||||
|
||||
```
|
||||
setenv kernel_addr 0x5000000
|
||||
setenv fdt_addr 0x4f00000
|
||||
setenv loadaddr 0x5000000
|
||||
setenv console 'console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000'
|
||||
setenv image_name boot/Image
|
||||
setenv extra_params quiet
|
||||
```
|
||||
|
||||
`$fdt_name` selects the device tree for your specific board revision:
|
||||
|
||||
| Board revision | `fdt_name` value |
|
||||
|----------------|-----------------------------------------------------|
|
||||
| v3 / v5 | `boot/marvell/armada-3720-espressobin.dtb` |
|
||||
| v7 | `boot/marvell/armada-3720-espressobin-v7.dtb` |
|
||||
| Ultra | `boot/marvell/armada-3720-espressobin-ultra.dtb` |
|
||||
| v3/v5 eMMC | `boot/marvell/armada-3720-espressobin-emmc.dtb` |
|
||||
| v7 eMMC | `boot/marvell/armada-3720-espressobin-v7-emmc.dtb` |
|
||||
|
||||
```
|
||||
setenv fdt_name boot/marvell/armada-3720-espressobin.dtb # adjust for your board
|
||||
```
|
||||
|
||||
### Simple Boot
|
||||
|
||||
Fixed boot from the primary slot, useful for initial bring-up:
|
||||
|
||||
```
|
||||
setenv bootcmd 'mmc dev 0; \
|
||||
ext4load mmc 0:2 $kernel_addr $image_name; \
|
||||
ext4load mmc 0:2 $fdt_addr $fdt_name; \
|
||||
setenv bootargs $console root=PARTLABEL=primary rw rootwait $extra_params rauc.slot=primary; \
|
||||
booti $kernel_addr - $fdt_addr'
|
||||
saveenv
|
||||
```
|
||||
|
||||
### Automatic Slot Selection (RAUC Integration)
|
||||
|
||||
The CLI `upgrade` command writes to the inactive slot and updates `uboot.env`
|
||||
on the `aux` partition with the new boot order. On the next boot U-Boot reads
|
||||
`BOOT_ORDER` from the aux partition and selects the appropriate slot. The
|
||||
setup below also defines `bootcmd_primary`, `bootcmd_secondary`, and
|
||||
`bootcmd_net` for manual use (see [Manual Slot Selection](#manual-slot-selection)
|
||||
and [Netbooting](#netbooting)):
|
||||
|
||||
```
|
||||
setenv bootcmd_boot \
|
||||
'mmc dev 0; \
|
||||
ext4load mmc 0:$bootpart $kernel_addr $image_name; \
|
||||
ext4load mmc 0:$bootpart $fdt_addr $fdt_name; \
|
||||
setenv bootargs $console root=PARTLABEL=$bootslot rw rootwait $extra_params rauc.slot=$bootslot; \
|
||||
booti $kernel_addr - $fdt_addr'
|
||||
|
||||
setenv bootcmd_primary 'setenv bootpart 2; setenv bootslot primary; run bootcmd_boot'
|
||||
setenv bootcmd_secondary 'setenv bootpart 3; setenv bootslot secondary; run bootcmd_boot'
|
||||
|
||||
setenv bootcmd_net \
|
||||
'dhcp $kernel_addr $image_name; \
|
||||
tftpboot $fdt_addr $fdt_name; \
|
||||
setenv bootargs $console root=PARTLABEL=primary rw rootwait $extra_params rauc.slot=primary; \
|
||||
booti $kernel_addr - $fdt_addr'
|
||||
|
||||
setenv bootcmd \
|
||||
'setenv bootpart 2; setenv bootslot primary; setenv auxpart 1; \
|
||||
if ext4load mmc 0:$auxpart $loadaddr /uboot.env; then \
|
||||
env import -c $loadaddr $filesize BOOT_ORDER; \
|
||||
fi; \
|
||||
if test "$BOOT_ORDER" = "secondary primary" || \
|
||||
test "$BOOT_ORDER" = "secondary primary net"; then \
|
||||
setenv bootpart 3; setenv bootslot secondary; \
|
||||
fi; \
|
||||
if test "$BOOT_ORDER" = "net" || \
|
||||
test "$BOOT_ORDER" = "net primary" || \
|
||||
test "$BOOT_ORDER" = "net secondary primary"; then \
|
||||
run bootcmd_net; \
|
||||
fi; \
|
||||
echo ">> Booting $bootslot from mmc 0:$bootpart ..."; \
|
||||
run bootcmd_boot'
|
||||
|
||||
saveenv
|
||||
```
|
||||
|
||||
### Manual Slot Selection
|
||||
|
||||
To boot a specific slot without waiting for the autoboot countdown, interrupt
|
||||
the bootloader (press any key) and run one of the convenience commands defined
|
||||
above:
|
||||
|
||||
```
|
||||
run bootcmd_primary # boot from primary (partition 2)
|
||||
run bootcmd_secondary # boot from secondary (partition 3)
|
||||
run bootcmd_net # netboot via DHCP/TFTP
|
||||
```
|
||||
|
||||
You can also force a permanent change to which slot boots next by setting
|
||||
`BOOT_ORDER` directly from Linux (the change persists across reboots):
|
||||
|
||||
```sh
|
||||
fw_setenv BOOT_ORDER "secondary primary" # next boot: secondary
|
||||
fw_setenv BOOT_ORDER "primary secondary" # next boot: primary (default)
|
||||
```
|
||||
|
||||
### Netbooting
|
||||
|
||||
The stock U-Boot supports TFTP. This is useful for testing a new kernel or
|
||||
device tree without reflashing the SD card. Set up a TFTP server with the
|
||||
contents of the Infix `boot/` directory (from the built rootfs at
|
||||
`x-aarch64/target/boot/`) and configure the variables:
|
||||
|
||||
```
|
||||
setenv serverip 192.168.1.1 # IP of your TFTP server
|
||||
setenv ipaddr 192.168.1.100 # board IP (omit if using dhcp)
|
||||
saveenv
|
||||
```
|
||||
|
||||
Then netboot manually:
|
||||
|
||||
```
|
||||
run bootcmd_net
|
||||
```
|
||||
|
||||
`bootcmd_net` uses `dhcp` to obtain an IP address and the `$serverip` from
|
||||
the DHCP server (option 66), then downloads `$image_name` and `$fdt_name`
|
||||
via TFTP. The kernel mounts the primary SD card slot as root, so the SD
|
||||
card must still be present.
|
||||
|
||||
To make netbooting the default on next boot (e.g. for iterative kernel
|
||||
development), set `BOOT_ORDER` from Linux:
|
||||
|
||||
```sh
|
||||
fw_setenv BOOT_ORDER "net primary secondary"
|
||||
```
|
||||
|
||||
This causes `bootcmd` to attempt netboot first; on failure it falls through
|
||||
to the primary slot on the SD card.
|
||||
|
||||
[0]: https://wiki.espressobin.net/
|
||||
[1]: https://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-37xx-hardware-specifications.pdf
|
||||
[2]: https://www.marvell.com/content/dam/marvell/en/public-collateral/switching/marvell-link-street-88E6341-product-brief.pdf
|
||||
[3]: https://standards.ieee.org/ieee/1588/6825/
|
||||
[4]: https://standards.ieee.org/ieee/802.1AS/7121/
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 210 KiB |
@@ -1,25 +0,0 @@
|
||||
image cfg.ext4 {
|
||||
ext4 {
|
||||
label = "cfg"
|
||||
}
|
||||
empty = true
|
||||
size = 16M
|
||||
}
|
||||
|
||||
image sdcard.img {
|
||||
hdimage {
|
||||
}
|
||||
|
||||
partition rootfs {
|
||||
partition-type = 0x83
|
||||
image = "rootfs.ext4"
|
||||
}
|
||||
|
||||
partition cfg {
|
||||
partition-type = 0x83
|
||||
image = "cfg.ext4"
|
||||
}
|
||||
}
|
||||
|
||||
# Silence genimage warnings
|
||||
config {}
|
||||
@@ -0,0 +1,61 @@
|
||||
image cfg.ext4 {
|
||||
empty = true
|
||||
temporary = true
|
||||
size = 128M
|
||||
ext4 {
|
||||
label = "cfg"
|
||||
use-mke2fs = true
|
||||
features = "uninit_bg"
|
||||
extraargs = "-m 0 -i 4096"
|
||||
}
|
||||
}
|
||||
|
||||
# The /var partition will be expanded automatically at first boot
|
||||
# to use the full size of the SD-card.
|
||||
image var.ext4 {
|
||||
empty = true
|
||||
temporary = true
|
||||
size = 128M
|
||||
ext4 {
|
||||
label = "var"
|
||||
use-mke2fs = true
|
||||
features = "uninit_bg"
|
||||
extraargs = "-m 0 -i 4096"
|
||||
}
|
||||
}
|
||||
|
||||
image #INFIX_ID##VERSION#-espressobin-#TARGET#.img {
|
||||
hdimage {
|
||||
partition-table-type = "gpt"
|
||||
}
|
||||
|
||||
# No bootloader partition: U-Boot lives in SPI NOR flash on all
|
||||
# ESPRESSObin board revisions. The SD card carries the OS only.
|
||||
|
||||
partition aux {
|
||||
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
|
||||
image = "aux.ext4"
|
||||
}
|
||||
|
||||
partition primary {
|
||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
||||
bootable = true
|
||||
image = "rootfs.ext2"
|
||||
}
|
||||
|
||||
partition secondary {
|
||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
||||
bootable = true
|
||||
image = "rootfs.ext2"
|
||||
}
|
||||
|
||||
partition cfg {
|
||||
partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105
|
||||
image = "cfg.ext4"
|
||||
}
|
||||
|
||||
partition var {
|
||||
partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F
|
||||
image = "var.ext4"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ source "$BR2_EXTERNAL_INFIX_PATH/board/common/image/image-itb-aux/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/common/image/image-itb-qcow/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/common/image/image-itb-gns3a/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/common/image/image-itb-rauc/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/common/image/image-ext4-rauc/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/common/image/image-itb-dl-release/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/common/image/image-readme/Config.in"
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
config IMAGE_EXT4_RAUC
|
||||
bool "RAUC upgrade bundle (ext4)"
|
||||
depends on BR2_TARGET_ROOTFS_EXT2
|
||||
select BR2_PACKAGE_HOST_RAUC
|
||||
help
|
||||
Create a RAUC upgrade bundle for targets using an ext4 rootfs
|
||||
image. Intended for development boards whose bootloader does
|
||||
not support squashfs.
|
||||
|
||||
config IMAGE_EXT4_RAUC_KEY
|
||||
string "signing key"
|
||||
depends on IMAGE_EXT4_RAUC
|
||||
default "${BR2_EXTERNAL_INFIX_PATH}/board/common/signing-keys/development/infix.key"
|
||||
help
|
||||
Path to the private key, in PKCS#8 format, used to sign
|
||||
the RAUC bundle; or a PKCS#11 URI.
|
||||
|
||||
config IMAGE_EXT4_RAUC_CERT
|
||||
string "signing certificate"
|
||||
depends on IMAGE_EXT4_RAUC
|
||||
default "${BR2_EXTERNAL_INFIX_PATH}/board/common/signing-keys/development/infix.crt"
|
||||
help
|
||||
Path to the X509 certificate which will be associated with
|
||||
the bundle signature.
|
||||
|
||||
NOTE: This cert MUST be included in the trust store of the
|
||||
system on which this bundle is to be installed.
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
ext2="${BINARIES_DIR}/rootfs.ext2"
|
||||
pkg="${BINARIES_DIR}/${ARTIFACT}-ext4.pkg"
|
||||
|
||||
# RAUC internally uses the file extension to find a suitable install
|
||||
# handler, hence the name must be .img
|
||||
cp -f "${ext2}" "${WORKDIR}/rootfs.img"
|
||||
|
||||
cat >"${WORKDIR}/manifest.raucm" <<EOF
|
||||
[update]
|
||||
compatible=${COMPATIBLE}
|
||||
version=${VERSION}
|
||||
|
||||
[bundle]
|
||||
format=verity
|
||||
|
||||
[image.rootfs]
|
||||
filename=rootfs.img
|
||||
EOF
|
||||
|
||||
rauc --cert="${CERT}" --key="${KEY}" \
|
||||
bundle "${WORKDIR}" "${pkg}.next"
|
||||
|
||||
mv "${pkg}.next" "${pkg}"
|
||||
@@ -0,0 +1,10 @@
|
||||
################################################################################
|
||||
#
|
||||
# image-ext4-rauc
|
||||
#
|
||||
################################################################################
|
||||
|
||||
IMAGE_EXT4_RAUC_DEPENDENCIES := host-rauc
|
||||
IMAGE_EXT4_RAUC_CONFIG_VARS := KEY CERT
|
||||
|
||||
$(eval $(ix-image))
|
||||
@@ -0,0 +1,3 @@
|
||||
service <!> name:phc2sys :%i log:prio:daemon,tag:phc2sys-%i \
|
||||
[2345] phc2sys -a -z /var/run/ptp4l-%i \
|
||||
-- PHC synchronization for PTP instance %i
|
||||
@@ -0,0 +1,3 @@
|
||||
service <!> name:ptp4l :%i log:prio:daemon,tag:ptp4l-%i \
|
||||
[2345] ptp4l -f /etc/linuxptp/ptp4l-%i.conf \
|
||||
-- PTP instance %i
|
||||
@@ -567,6 +567,59 @@ def probe_wifi_radios(out):
|
||||
out["wifi-radios"].append(info)
|
||||
|
||||
|
||||
def probe_ptp_capabilities(out):
|
||||
"""Probe PTP timestamping capabilities per physical interface via ethtool --json -T.
|
||||
|
||||
Only physical interfaces (those with a 'device' sysfs symlink) are probed;
|
||||
virtual interfaces such as bridges, VLANs, and tun/tap devices are skipped.
|
||||
Results are stored under out["interfaces"][<ifname>]["ptp-capabilities"].
|
||||
"""
|
||||
net_base = "/sys/class/net"
|
||||
if not os.path.exists(net_base):
|
||||
return
|
||||
|
||||
ifaces = {}
|
||||
for ifname in sorted(os.listdir(net_base)):
|
||||
if ifname == "lo":
|
||||
continue
|
||||
# Physical interfaces have a 'device' symlink; virtual ones do not.
|
||||
if not os.path.exists(os.path.join(net_base, ifname, "device")):
|
||||
continue
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["ethtool", "--json", "-T", ifname],
|
||||
capture_output=True, text=True, timeout=5
|
||||
)
|
||||
if result.returncode != 0:
|
||||
continue
|
||||
data = json.loads(result.stdout)[0]
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
caps = {
|
||||
"capabilities": data.get("capabilities", []),
|
||||
"tx-types": data.get("tx-types", []),
|
||||
"rx-filters": data.get("rx-filters", []),
|
||||
}
|
||||
|
||||
# phc-index is -1 when no PHC is present; omit in that case.
|
||||
phc = data.get("phc-index", -1)
|
||||
if phc >= 0:
|
||||
caps["phc-index"] = phc
|
||||
|
||||
# hwtstamp provider fields are present only on newer kernels/hardware.
|
||||
if (idx := data.get("hwtstamp-provider-index")) is not None:
|
||||
caps["hwtstamp-provider-index"] = idx
|
||||
if (qual := data.get("hwtstamp-provider-qualifier")) is not None:
|
||||
caps["hwtstamp-provider-qualifier"] = qual
|
||||
|
||||
ifaces[ifname] = {"ptp-capabilities": caps}
|
||||
|
||||
if ifaces:
|
||||
out.setdefault("interfaces", {}).update(ifaces)
|
||||
|
||||
|
||||
def main():
|
||||
out = {
|
||||
"vendor": None,
|
||||
@@ -593,6 +646,7 @@ def main():
|
||||
return err
|
||||
|
||||
probe_wifi_radios(out)
|
||||
probe_ptp_capabilities(out)
|
||||
|
||||
if not out["factory-password-hash"]:
|
||||
sys.stdout.write("\n\n\033[31mCRITICAL BOOTSTRAP ERROR\n" +
|
||||
|
||||
@@ -33,7 +33,7 @@ for tgt in "${boot_targets}"; do
|
||||
setexpr ixmenu_n ${ixmenu_n} + 1
|
||||
|
||||
if load ${devtype} ${devnum}:${auxpart} ${loadaddr} /uboot.env; then
|
||||
env import -b ${loadaddr} ${filesize} BOOT_ORDER DEBUG ethact BOARD_VARIANT
|
||||
env import -c ${loadaddr} ${filesize} BOOT_ORDER DEBUG ethact BOARD_VARIANT
|
||||
run ixvariant
|
||||
fi
|
||||
|
||||
|
||||
+1
-1
Submodule buildroot updated: 47e9f46b85...168601af48
@@ -27,7 +27,7 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.23"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.25"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -75,6 +75,7 @@ BR2_PACKAGE_IPERF3=y
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPTABLES_NFTABLES=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_LINUXPTP=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_MSTPD=y
|
||||
BR2_PACKAGE_MTR=y
|
||||
|
||||
@@ -27,7 +27,7 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.23"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.25"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/aarch64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -68,6 +68,7 @@ BR2_PACKAGE_FRR=y
|
||||
# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_LINUXPTP=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_MSTPD=y
|
||||
BR2_PACKAGE_NETCALC=y
|
||||
|
||||
@@ -28,7 +28,7 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.23"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.25"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/arm/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -74,6 +74,7 @@ BR2_PACKAGE_FRR=y
|
||||
BR2_PACKAGE_IPERF3=y
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_LINUXPTP=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_MSTPD=y
|
||||
BR2_PACKAGE_MTR=y
|
||||
|
||||
@@ -28,7 +28,7 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.23"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.25"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/arm/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -70,6 +70,7 @@ BR2_PACKAGE_FRR=y
|
||||
# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_LINUXPTP=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_MSTPD=y
|
||||
BR2_PACKAGE_NETCALC=y
|
||||
|
||||
@@ -85,6 +85,7 @@ BR2_PACKAGE_IPERF3=y
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPTABLES_NFTABLES=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_LINUXPTP=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_MSTPD=y
|
||||
BR2_PACKAGE_MTR=y
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
BR2_TARGET_ENABLE_ROOT_LOGIN=y
|
||||
@@ -0,0 +1,4 @@
|
||||
BR2_TARGET_ROOTFS_EXT2=y
|
||||
BR2_TARGET_ROOTFS_EXT2_4=y
|
||||
BR2_TARGET_ROOTFS_EXT2_SIZE="512M"
|
||||
IMAGE_EXT4_RAUC=y
|
||||
@@ -26,7 +26,7 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.23"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.25"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -74,6 +74,7 @@ BR2_PACKAGE_IPERF3=y
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPTABLES_NFTABLES=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_LINUXPTP=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_MSTPD=y
|
||||
BR2_PACKAGE_MTR=y
|
||||
|
||||
@@ -26,7 +26,7 @@ BR2_ROOTFS_OVERLAY="${BR2_EXTERNAL_INFIX_PATH}/board/common/rootfs ${BR2_EXTERNA
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh ${BR2_EXTERNAL_INFIX_PATH}/board/common/post-build.sh"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.23"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.25"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/x86_64/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_INSTALL_TARGET=y
|
||||
@@ -67,6 +67,7 @@ BR2_PACKAGE_FRR=y
|
||||
# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_LINUXPTP=y
|
||||
BR2_PACKAGE_LLDPD=y
|
||||
BR2_PACKAGE_MSTPD=y
|
||||
BR2_PACKAGE_NETCALC=y
|
||||
|
||||
+37
-3
@@ -3,21 +3,55 @@ Change Log
|
||||
|
||||
All notable changes to the project are documented in this file.
|
||||
|
||||
[v26.04.0][UNRELEASED] -
|
||||
[v26.04.0][] - 2026-04-30
|
||||
-------------------------
|
||||
|
||||
### Changes
|
||||
|
||||
- Upgrade Linux kernel to 6.18.23 (LTS)
|
||||
- Upgrade Linux kernel to 6.18.25 (LTS)
|
||||
- Upgrade Buildroot to 2025.02.13 (LTS)
|
||||
- Add support for per-bridge multicast router port in operational, issue #395
|
||||
- Add support for static ARP (IPv4) and neighbor cache (IPv6) entries per
|
||||
interface, issue #819. Static entries are installed as permanent kernel
|
||||
neighbor table entries that are never evicted by normal ARP/NDP aging
|
||||
- Add support for PTP/gPTP (IEEE 1588-2019 / 802.1AS) clock synchronization.
|
||||
Supported clock types: Ordinary Clock, Boundary Clock, and Transparent Clock.
|
||||
See the User Guide for configuration details
|
||||
- Add support for [Banana Pi BPI-R4][BPI-R4], quad-core Cortex-A73 router with
|
||||
4x 2.5 GbE switching, dual 10 GbE SFP+. Variants BPI-R4-2g5 and BPI-R4P have
|
||||
one SFP+ replaced by a 2.5 GbE RJ45, with optional PoE on the R4P
|
||||
- Update [Marvell ESPRESSObin][ESPRESSObin] board support. Allow booting with
|
||||
stock U-Boot, which only supports ext4 rootfs partitions; to use, apply the
|
||||
`ext4` developer snippet before building (`make apply-ext4 all`)
|
||||
- Fix onboard WiFi support on the Banana Pi BPi-R64
|
||||
|
||||
### Fixes
|
||||
|
||||
- N/A
|
||||
- Fix #520: warn in syslog if multicast flooding is disabled
|
||||
- Fix #769: document dummy interfaces in user guide
|
||||
- Fix #790: document static multicast filters in user guide
|
||||
- Fix #1439: changing hostname does not regenerate DHCP client conf until restart
|
||||
- Fix #1458: `show ntp tracking` displaying a truncated Reference ID, e.g.,
|
||||
`92.2` instead of `92.246.137.39`
|
||||
- Fix #1466: `show container` showing no output for containers whose command
|
||||
line includes environment variables
|
||||
- Fix issue with IGMP queries sent with all-zeroes source MAC address
|
||||
- Fix missing IGMP query startup burst when assuming IGMP querier role, as
|
||||
defined in RFC3376 §8.6/§8.7
|
||||
- Fix Raspberry Pi 4 and Pi 400 display instability after soft reboot.
|
||||
Previously the touchscreen/DSI display required a full power cycle to
|
||||
reinitialise correctly; it now works reliably after `reboot`. Please note,
|
||||
you need a fairly up-to-date EEPROM version as well
|
||||
- Fix [BPI-R4][] board README showing inverted DIP switch values for eMMC and
|
||||
SPI NAND boot modes, which would prevent the board from booting correctly
|
||||
- Fix [SAMA7G54][] U-Boot build system selection that caused build failures
|
||||
- Fix [BPI-R3][] PCIe devices failing to initialize on boot due to a missing
|
||||
clock definition in the device tree
|
||||
|
||||
[BPI-R3]: https://wiki.banana-pi.org/Banana_Pi_BPI-R3
|
||||
[BPI-R4]: https://docs.banana-pi.org/en/BPI-R4/BananaPi_BPI-R4
|
||||
[ESPRESSObin]: https://espressobin.net/
|
||||
[SAMA7G54]: https://www.microchip.com/en-us/development-tool/ev21h18a
|
||||
|
||||
[v26.03.0][] - 2026-03-31
|
||||
-------------------------
|
||||
|
||||
@@ -183,6 +183,48 @@ In this setup we have a lot more going on. Multiple multicast router
|
||||
ports have been detected, and behind the scenes someone has also added
|
||||
an IGMP/MLD fast-leave port.
|
||||
|
||||
### Static Multicast Filters
|
||||
|
||||
When IGMP/MLD snooping is in use, traffic for an unregistered group is
|
||||
flooded to all ports until a receiver joins. For MAC multicast groups,
|
||||
or for groups where snooping cannot learn membership automatically, you
|
||||
can add static entries to the MDB that immediately restrict forwarding
|
||||
to a given set of ports.
|
||||
|
||||
> [!NOTE]
|
||||
> Snooping must be enabled on the bridge (or per VLAN) before static
|
||||
> multicast filters can be configured.
|
||||
|
||||
On a plain (non-VLAN) bridge, add a static IPv4 or MAC multicast filter
|
||||
like this:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface br0</b>
|
||||
admin@example:/config/interface/br0/> <b>set bridge multicast-filters multicast-filter 224.1.1.1 ports e2</b>
|
||||
admin@example:/config/interface/br0/> <b>set bridge multicast-filters multicast-filter 224.1.1.1 ports e3</b>
|
||||
admin@example:/config/interface/br0/> <b>set bridge multicast-filters multicast-filter 01:00:5e:01:01:01 ports e2</b>
|
||||
admin@example:/config/interface/br0/> <b>leave</b>
|
||||
admin@example:/> <b>copy running-config startup-config</b>
|
||||
</code></pre>
|
||||
|
||||
Each `ports` entry for the same group adds one port to the filter.
|
||||
Receivers on all other ports will not see traffic for that group.
|
||||
|
||||
On a VLAN-filtering bridge the filter is scoped per VLAN:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/interface/br1/> <b>set bridge vlans vlan 10 multicast-filters multicast-filter 224.2.2.2 ports e5</b>
|
||||
admin@example:/config/interface/br1/> <b>set bridge vlans vlan 10 multicast-filters multicast-filter 224.2.2.2 ports e6</b>
|
||||
</code></pre>
|
||||
|
||||
To verify the MDB — both statically configured and dynamically learned
|
||||
entries — use:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show bridge mdb</b>
|
||||
<span class="header">BRIDGE VID GROUP PORTS </span>
|
||||
br0 224.1.1.1 e2, e3
|
||||
br0 01:00:5e:01:01:01 e2
|
||||
</code></pre>
|
||||
|
||||
### Terminology & Abbreviations
|
||||
|
||||
- **IGMP**: Internet Group Membership Protocol, multicast subscription
|
||||
|
||||
+35
-5
@@ -7,12 +7,12 @@ account, which is created based on credentials found in the VPD area --
|
||||
for Qemu devices this is emulated using `qemu_fw_cfg`.
|
||||
|
||||
For developers this can be quite frustrating to be blocked from logging
|
||||
in to debug the system. So we recommend enabling the `root` account in
|
||||
the Buildroot `make menuconfig` system.
|
||||
in to debug the system. The quickest way to enable root login is to
|
||||
apply the `dev` configuration snippet:
|
||||
|
||||
make menuconfig
|
||||
-> System configuration
|
||||
-> [*]Enable root login with password
|
||||
make apply-dev
|
||||
|
||||
See [Configuration Snippets](#configuration-snippets) for more details.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Please see the [Contributing](#contributing) section, below, for
|
||||
@@ -166,6 +166,36 @@ on Buildroot to finalize the target filesystem and generate the images.
|
||||
The final `run` argument is explained below.
|
||||
|
||||
|
||||
### Configuration Snippets
|
||||
|
||||
Infix ships a set of Kconfig fragments in `configs/snippets/` that can
|
||||
be merged into your active `.config` on demand. This avoids polluting
|
||||
defconfigs with settings that are only useful during development.
|
||||
|
||||
To see what snippets are available:
|
||||
|
||||
make list-snippets
|
||||
|
||||
To apply a single snippet to the current output directory:
|
||||
|
||||
make apply-dev # enable root login
|
||||
make apply-ext4 # build an ext4 rootfs (needed for boards
|
||||
# whose bootloader lacks squashfs support,
|
||||
# e.g. Marvell ESPRESSObin)
|
||||
|
||||
The `apply-*` targets require an existing `.config` (i.e. you must have
|
||||
already run a `make <board>_defconfig`). The snippet is merged using
|
||||
Buildroot's `merge_config.sh`, so it behaves like `make menuconfig`:
|
||||
unrelated settings are preserved, conflicting ones are overridden.
|
||||
|
||||
To apply **all** snippets at once and then build:
|
||||
|
||||
make dev
|
||||
|
||||
This is the recommended one-shot command for setting up a development
|
||||
build from a freshly selected defconfig.
|
||||
|
||||
|
||||
### YANG Model
|
||||
|
||||
When making changes to the `confd` and `statd` services, you will often
|
||||
|
||||
@@ -138,6 +138,49 @@ admin@example:/config/interface/veth0a/> <b>set custom-phys-address chassis offs
|
||||
</code></pre>
|
||||
|
||||
|
||||
## Dummy Interface
|
||||
|
||||
A dummy interface is a virtual interface that is always administratively
|
||||
and operationally UP, regardless of any physical link state. It can
|
||||
hold IP addresses just like any other interface.
|
||||
|
||||
The two most common uses are:
|
||||
|
||||
- **Stable OSPF router-ID**: OSPF picks its router-ID from an interface
|
||||
address. If that interface goes down, adjacencies can flap. Binding
|
||||
the router-ID to a /32 address on a dummy avoids this.
|
||||
- **Stable management address**: A /32 on a dummy gives the device a
|
||||
permanent identity on the network, reachable as long as at least one
|
||||
uplink is up and the address is redistributed into the routing domain.
|
||||
|
||||
> [!TIP]
|
||||
> WiFi interfaces also use dummies as placeholders when the radio
|
||||
> hardware is not detected at boot (e.g., a USB dongle that was
|
||||
> unplugged). See [WiFi](wifi.md) for details.
|
||||
|
||||
### Example: Stable OSPF Router-ID
|
||||
|
||||
Create a dummy interface with a /32 address and use it as the OSPF
|
||||
router-ID so that the ID never changes when physical ports bounce:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface lo0</b>
|
||||
admin@example:/config/interface/lo0/> <b>set type dummy</b>
|
||||
admin@example:/config/interface/lo0/> <b>set ipv4 address 192.0.2.1 prefix-length 32</b>
|
||||
admin@example:/config/interface/lo0/> <b>leave</b>
|
||||
admin@example:/config/> <b>edit routing control-plane-protocol ospfv2 name default ospf</b>
|
||||
admin@example:/config/routing/…/ospf/> <b>set explicit-router-id 192.0.2.1</b>
|
||||
admin@example:/config/routing/…/ospf/> <b>leave</b>
|
||||
admin@example:/> <b>copy running-config startup-config</b>
|
||||
</code></pre>
|
||||
|
||||
To also make the address reachable by other routers, redistribute
|
||||
connected routes (or add `lo0` as an OSPF interface):
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/routing/…/ospf/> <b>set redistribute connected</b>
|
||||
</code></pre>
|
||||
|
||||
|
||||
[^1]: A YANG deviation was previously used to make it possible to set
|
||||
`phys-address`, but this has been replaced with the more flexible
|
||||
`custom-phys-address`.
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 115 KiB |
@@ -435,6 +435,66 @@ admin@example:/config/interface/eth0/> <b>leave</b>
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
## ARP and Neighbor Cache
|
||||
|
||||
Static ARP entries (IPv4) and neighbor cache entries (IPv6) can be
|
||||
configured per interface. The most common reasons to do so are:
|
||||
|
||||
- **Security** — prevent ARP/NDP spoofing by locking critical hosts
|
||||
(e.g., a default gateway) to their known MAC addresses
|
||||
- **Reliability** — ensure reachability of a host even when ARP/NDP
|
||||
traffic is suppressed or filtered (e.g., across a strict firewall)
|
||||
|
||||
Dynamic entries are learned automatically by the kernel using ARP and
|
||||
Neighbor Discovery Protocol (NDP), and are visible as read-only
|
||||
operational state alongside the static ones.
|
||||
|
||||
### Static IPv4 ARP Entry
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface eth0 ipv4</b>
|
||||
admin@example:/config/interface/eth0/ipv4/> <b>set neighbor 192.168.1.100 link-layer-address 00:11:22:33:44:55</b>
|
||||
admin@example:/config/interface/eth0/ipv4/> <b>diff</b>
|
||||
+interfaces {
|
||||
+ interface eth0 {
|
||||
+ ipv4 {
|
||||
+ neighbor 192.168.1.100 {
|
||||
+ link-layer-address 00:11:22:33:44:55;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
admin@example:/config/interface/eth0/ipv4/> <b>leave</b>
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
### Static IPv6 Neighbor Entry
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface eth0 ipv6</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>set neighbor 2001:db8::100 link-layer-address 00:11:22:33:44:55</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>diff</b>
|
||||
+interfaces {
|
||||
+ interface eth0 {
|
||||
+ ipv6 {
|
||||
+ neighbor 2001:db8::100 {
|
||||
+ link-layer-address 00:11:22:33:44:55;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>leave</b>
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
The full neighbor table — including dynamically learned entries (origin:
|
||||
*dynamic*) — is available as operational state via NETCONF or RESTCONF.
|
||||
|
||||
> [!NOTE]
|
||||
> Static neighbor entries take effect immediately on `leave` (commit).
|
||||
> They are installed as *permanent* entries in the kernel neighbor table,
|
||||
> which means they are never evicted by the normal ARP/NDP aging process.
|
||||
|
||||
[1]: https://www.rfc-editor.org/rfc/rfc3442
|
||||
[2]: https://www.rfc-editor.org/rfc/rfc8344
|
||||
[3]: https://www.rfc-editor.org/rfc/rfc8981
|
||||
|
||||
+461
@@ -0,0 +1,461 @@
|
||||
# PTP — Precision Time Protocol
|
||||
|
||||
The Precision Time Protocol (PTP), defined in IEEE 1588-2019, synchronises
|
||||
clocks across a network to sub-microsecond accuracy. Where NTP (Network Time
|
||||
Protocol) aims at millisecond accuracy over wide-area networks, PTP is
|
||||
designed for local-area networks and relies on hardware timestamping in the
|
||||
network interface to eliminate software-induced jitter.
|
||||
|
||||
PTP works by exchanging timestamped messages between devices. A *grandmaster
|
||||
clock* — elected by the **Best TimeTransmitter Clock Algorithm (BTCA)** based
|
||||
on priority, clock class, and accuracy — distributes time to the rest of the
|
||||
network. Each synchronising device measures the one-way message delay to its
|
||||
time-transmitter and continuously adjusts its local clock to compensate.
|
||||
|
||||
> [!NOTE]
|
||||
> The IEEE 1588g-2022 amendment to IEEE 1588-2019 introduced the terms
|
||||
> *timeTransmitter* and *timeReceiver* as replacements for the former
|
||||
> *master* and *slave* terminology, and *Best TimeTransmitter Clock
|
||||
> Algorithm (BTCA)* in place of *BMCA*. This document uses the updated
|
||||
> terms throughout. You may even see the short forms transmitter and
|
||||
> receiver here and in online documentation.
|
||||
|
||||
## Clock roles
|
||||
|
||||
Every device in a PTP network takes one of the following roles:
|
||||
|
||||
| Role | Description |
|
||||
|----------------------------|---------------------------------------------------------------------------------------------|
|
||||
| **Grandmaster (GM)** | Network-wide time source; elected by BTCA |
|
||||
| **Time-transmitter** | Sends Sync messages downstream on a port |
|
||||
| **Time-receiver** | Synchronises to a time-transmitter on a port |
|
||||
| **Boundary Clock (BC)** | Terminates PTP on each port; acts as time-receiver upstream and time-transmitter downstream |
|
||||
| **Transparent Clock (TC)** | Passes PTP messages while correcting the residence-time delay accumulated in the device |
|
||||
|
||||
An **Ordinary Clock (OC)** has a single PTP port and is either a
|
||||
time-transmitter (acting as a grandmaster candidate) or a time-receiver
|
||||
(a leaf node synchronising to the network).
|
||||
|
||||
## PTP profiles
|
||||
|
||||
A **PTP profile** (as defined in IEEE 1588-2019 §3.1) is a document that
|
||||
specifies a consistent set of required, permitted, and prohibited PTP
|
||||
options for a particular application domain — much like a dialect of the
|
||||
protocol. Examples from the standards world include profiles for power
|
||||
utilities (IEC/IEEE C37.238), telecom (ITU-T G.8265.1), and
|
||||
Time-Sensitive Networks.
|
||||
|
||||
Each profile sets a unique value in the `majorSdoId` field of PTP message
|
||||
headers — a 4-bit identifier that lets devices distinguish traffic belonging
|
||||
to different profiles on the same link. Profile also determines the network
|
||||
transport (UDP or Ethernet) and the delay measurement mechanism.
|
||||
|
||||
Currently, two profiles are supported via the `profile` leaf in `default-ds`:
|
||||
|
||||
| `profile` | Standard | majorSdoId | Transport | Delay |
|
||||
|----------------------|-------------------|:----------:|-----------|----------------|
|
||||
| `ieee1588` (default) | IEEE 1588-2019 | `0x0` | UDP/IPv4 | `e2e` or `p2p` |
|
||||
| `ieee802-dot1as` | IEEE 802.1AS-2020 | `0x1` | L2 | `p2p` |
|
||||
|
||||
The **gPTP** (generalized Precision Time Protocol) profile from IEEE 802.1AS-2020
|
||||
is used in **TSN** (Time-Sensitive Networking) and **AVB** (Audio/Video Bridging)
|
||||
applications. Setting `profile ieee802-dot1as` applies all protocol-mandatory
|
||||
settings automatically — Layer 2 transport, P2P delay measurement, 802.1AS
|
||||
multicast addressing, path trace, follow-up information, and neighbour propagation
|
||||
delay thresholds. The user still configures `priority1`, `priority2`,
|
||||
`domain-number`, `time-receiver-only`, and timer interval leaves.
|
||||
|
||||
The `ieee1588` profile leaves transport and delay mechanism user-configurable
|
||||
per port.
|
||||
|
||||
## Delay mechanisms
|
||||
|
||||
PTP measures the link delay between neighbours using one of two mechanisms:
|
||||
|
||||
- **End-to-End (E2E)**: Each time-receiver measures the delay to the
|
||||
grandmaster by sending a `DELAY_REQ` message upstream. Simple to
|
||||
configure; works with any network topology.
|
||||
- **Peer-to-Peer (P2P)**: Each port measures its delay to its *immediate
|
||||
neighbour* independently using `PDELAY_REQ` messages. Enables faster
|
||||
path-delay updates and is required by the gPTP profile.
|
||||
|
||||
## Data Sets
|
||||
|
||||
IEEE 1588 organises protocol state into named **Data Sets (DS)** — each a
|
||||
collection of related attributes for one aspect of a PTP instance. You
|
||||
will encounter these directly in the CLI and in the `show ptp` output:
|
||||
|
||||
| Data Set | CLI node | Contents |
|
||||
|------------------|----------------|----------------------------------------------------------|
|
||||
| Default DS | `default-ds` | Instance identity, clock class, priority, domain number |
|
||||
| Current DS | `current-ds` | Live offset-from-GM, mean path delay, steps-removed |
|
||||
| Parent DS | `parent-ds` | Grandmaster identity and quality attributes |
|
||||
| Time Properties DS | `time-properties-ds` | UTC offset, leap-second flags, time source |
|
||||
| Port DS | `port-ds` | Per-port state, delay mechanism, message intervals |
|
||||
|
||||
## Domains
|
||||
|
||||
A **PTP domain** (0–255) is a logical partition of the network. Devices
|
||||
only synchronise with others in the same domain. Running multiple
|
||||
instances on the same device — one per domain, or one per profile — is
|
||||
fully supported; each instance is independent.
|
||||
|
||||
Each PTP instance is identified on the network by its
|
||||
`(domain-number, profile)` pair, which must be unique across all instances
|
||||
on a device.
|
||||
|
||||
> [!NOTE]
|
||||
> The `show ptp` offset values reflect **PHC** (PTP Hardware Clock)
|
||||
> synchronisation only. A PHC is the hardware clock exposed by the network
|
||||
> interface; it tracks the PTP grandmaster but is independent of the Linux
|
||||
> system clock, which currently is **not** automatically adjusted.
|
||||
|
||||
## Ordinary Clock (time-receiver)
|
||||
|
||||
A typical time-receiver Ordinary Clock, synchronising on interface
|
||||
`eth0` using the default IEEE 1588 profile:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit ptp instance 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds domain-number 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds time-receiver-only true</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 1</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set underlying-interface eth0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
## Ordinary Clock (time-transmitter / grandmaster)
|
||||
|
||||
A grandmaster clock with high priority, domain 0:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit ptp instance 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds domain-number 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds priority1 1</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds priority2 1</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 1</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set underlying-interface eth0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
Lower `priority1` values win in the BTCA. A clock with `priority1 1` will
|
||||
be preferred over the default `128` in any compliant network.
|
||||
|
||||
## Boundary Clock
|
||||
|
||||
A Boundary Clock terminates PTP on each port and re-originates it. Add one
|
||||
port per interface:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit ptp instance 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds instance-type bc</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds domain-number 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 1</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set underlying-interface eth0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>end</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 2</b>
|
||||
admin@example:/config/ptp/…/0/port/2/> <b>set underlying-interface eth1</b>
|
||||
admin@example:/config/ptp/…/0/port/2/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
> [!TIP]
|
||||
> PTP port numbers are assigned sorted by `port-index`, so `port-index 1`
|
||||
> becomes PTP port 1, `port-index 2` becomes PTP port 2, and so on.
|
||||
|
||||
## Transparent Clock
|
||||
|
||||
Transparent Clocks correct timestamps end-to-end without terminating PTP.
|
||||
Use `instance-type p2p-tc` for a P2P TC (preferred in TSN networks) or
|
||||
`instance-type e2e-tc` for an E2E TC:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit ptp instance 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds instance-type p2p-tc</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds domain-number 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 1</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set underlying-interface eth0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>end</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 2</b>
|
||||
admin@example:/config/ptp/…/0/port/2/> <b>set underlying-interface eth1</b>
|
||||
admin@example:/config/ptp/…/0/port/2/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
> [!NOTE]
|
||||
> For Transparent Clocks the delay mechanism is determined globally by the
|
||||
> `instance-type` (`p2p-tc` → P2P, `e2e-tc` → E2E). Per-port
|
||||
> `delay-mechanism` settings have no effect for TC instances.
|
||||
|
||||
## gPTP / IEEE 802.1AS
|
||||
|
||||
The gPTP profile is used in TSN and AVB applications. Setting
|
||||
`profile ieee802-dot1as` applies all protocol-mandatory options from
|
||||
IEEE 802.1AS-2020 automatically — Layer 2 transport, P2P delay
|
||||
measurement, 802.1AS multicast addressing, and related protocol features.
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit ptp instance 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds profile ieee802-dot1as</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds domain-number 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds time-receiver-only true</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 1</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set underlying-interface eth0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
> [!NOTE]
|
||||
> The `ieee802-dot1as` profile enforces Layer 2 transport and P2P delay
|
||||
> measurement globally, as required by IEEE 802.1AS-2020. Per-port
|
||||
> `delay-mechanism` settings have no effect for 802.1AS instances.
|
||||
|
||||
## Multiple Instances
|
||||
|
||||
Multiple PTP instances can run simultaneously, one per domain or profile
|
||||
combination. Each instance must have a unique `(domain-number, profile)`
|
||||
pair and an independent set of ports:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit ptp instance 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds domain-number 0</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>set default-ds profile ieee1588</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>edit port 1</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set underlying-interface eth0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>end</b>
|
||||
admin@example:/config/ptp/instance/0/> <b>end</b>
|
||||
admin@example:/config/ptp/> <b>edit instance 1</b>
|
||||
admin@example:/config/ptp/instance/1/> <b>set default-ds domain-number 0</b>
|
||||
admin@example:/config/ptp/instance/1/> <b>set default-ds profile ieee802-dot1as</b>
|
||||
admin@example:/config/ptp/instance/1/> <b>edit port 1</b>
|
||||
admin@example:/config/ptp/…/1/port/1/> <b>set underlying-interface eth1</b>
|
||||
admin@example:/config/ptp/…/1/port/1/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
## Port states
|
||||
|
||||
Each PTP port progresses through a state machine. The current state is
|
||||
shown in the `show ptp` port table:
|
||||
|
||||
| State | Meaning |
|
||||
|------------------------|----------------------------------------------------------------|
|
||||
| `initializing` | Port is starting up, not yet ready to exchange messages |
|
||||
| `faulty` | A fault condition has been detected on this port |
|
||||
| `disabled` | Port is administratively disabled |
|
||||
| `listening` | Awaiting `ANNOUNCE` messages; BTCA has not yet resolved |
|
||||
| `pre-time-transmitter` | Transitioning towards time-transmitter state |
|
||||
| `time-transmitter` | Port is acting as time-transmitter on this link |
|
||||
| `passive` | Another port on this device is already time-transmitter |
|
||||
| `uncalibrated` | Receiving sync; local clock not yet locked to time-transmitter |
|
||||
| `time-receiver` | Port is locked and tracking its time-transmitter |
|
||||
|
||||
A port in `uncalibrated` will typically transition to `time-receiver`
|
||||
within a few seconds once the clock servo has converged.
|
||||
|
||||
## Monitoring
|
||||
|
||||
> [!TIP] Use the ++question++ key in the CLI
|
||||
> The `show ptp` command has sub-commands — tap ++question++ after
|
||||
> `show ptp` to see them, or use ++tab++ to complete.
|
||||
|
||||
### Show all PTP instances
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show ptp</b>
|
||||
<b>PTP Instance 0</b> Ordinary Clock · domain 0
|
||||
────────────────────────────────────────────────────────────────────
|
||||
Clock identity : AA-BB-CC-FF-FE-00-11-22
|
||||
Grandmaster : DD-EE-FF-FF-FE-33-44-55
|
||||
Priority1/Priority2 : 128 / 128
|
||||
GM Priority1/Priority2 : 1 / 1
|
||||
Clock class : cc-time-receiver-only
|
||||
GM clock class : cc-primary-sync
|
||||
Time source : gnss
|
||||
PTP timescale : yes
|
||||
UTC offset : 37 s
|
||||
Time traceable : yes
|
||||
Freq. traceable : yes
|
||||
Offset from GM : -42 ns
|
||||
Mean path delay : 1250 ns
|
||||
Steps removed : 1
|
||||
|
||||
────────────────────────────────────────────────────────────────────
|
||||
Ports
|
||||
<span class="header">PORT INTERFACE STATE DELAY LINK DELAY (ns)</span>
|
||||
1 eth0 <span class="ok">time-receiver</span> E2E 0
|
||||
|
||||
────────────────────────────────────────────────────────────────────
|
||||
Message Statistics (▼ rx ▲ tx)
|
||||
<span class="header">PORT INTERFACE SYNC ▼ SYNC ▲ ANN ▼ ANN ▲ PD ▼ PD ▲</span>
|
||||
1 eth0 42 0 15 0 0 0
|
||||
|
||||
</code></pre>
|
||||
|
||||
Port state is colour-coded: green for `time-transmitter` and `time-receiver`
|
||||
(actively synchronising), yellow for transient states (`listening`,
|
||||
`uncalibrated`, `pre-time-transmitter`), and red for fault states (`faulty`,
|
||||
`disabled`). The *Message Statistics* section is omitted when no counts are
|
||||
available.
|
||||
|
||||
### Show a specific instance
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show ptp 0</b>
|
||||
</code></pre>
|
||||
|
||||
## Tuning port intervals
|
||||
|
||||
Adjust announcement, sync, and delay-request intervals per port. Values
|
||||
are expressed as log₂ of the interval in seconds (e.g. `-3` = 125 ms,
|
||||
`0` = 1 s, `1` = 2 s):
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/ptp/…/0/port/1/> <b>set port-ds log-announce-interval 0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set port-ds log-sync-interval -3</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set port-ds log-min-delay-req-interval 0</b>
|
||||
admin@example:/config/ptp/…/0/port/1/> <b>set announce-receipt-timeout 3</b>
|
||||
</code></pre>
|
||||
|
||||
`announce-receipt-timeout` is a count of announce intervals, not a duration
|
||||
in seconds. With `log-announce-interval 0` (1 s) and
|
||||
`announce-receipt-timeout 3`, a port waits 3 s without receiving an
|
||||
`ANNOUNCE` before declaring the time-transmitter lost and returning to
|
||||
`listening`.
|
||||
|
||||
## Message exchange
|
||||
|
||||
PTP distributes time using a small set of messages, all of which carry
|
||||
hardware timestamps at the network interface:
|
||||
|
||||
| Message | Timestamped | Purpose |
|
||||
|-------------------------|:-----------:|-----------------------------------------------------|
|
||||
| `ANNOUNCE` | No | Advertises clock quality for BTCA election |
|
||||
| `SYNC` | Yes | Carries transmitter timestamp to receivers |
|
||||
| `FOLLOW_UP` | No | Carries precise `t1` in two-step mode |
|
||||
| `DELAY_REQ` | Yes | Receiver-initiated E2E delay measurement |
|
||||
| `DELAY_RESP` | No | Time-transmitter reply to `DELAY_REQ` |
|
||||
| `PDELAY_REQ` | Yes | Initiates P2P neighbour-delay measurement |
|
||||
| `PDELAY_RESP` | Yes | Neighbour reply to `PDELAY_REQ` |
|
||||
| `PDELAY_RESP_FOLLOW_UP` | No | Carries precise `PDELAY_RESP` `t3` in two-step mode |
|
||||
|
||||
In **one-step** mode the timestamp is embedded directly into each `SYNC`
|
||||
message as it leaves the wire, eliminating the need for `FOLLOW_UP`.
|
||||
In **two-step** mode the `SYNC` carries a placeholder and the precise
|
||||
transmit timestamp arrives in a subsequent `FOLLOW_UP`. Hardware
|
||||
timestamping gives high accuracy in both modes; one-step reduces message
|
||||
overhead at the cost of more demanding hardware support.
|
||||
|
||||
## Message format
|
||||
|
||||
Every PTP message begins with a common 34-octet header, regardless of type.
|
||||
The structure below follows the traditional IETF bit-field layout: each row
|
||||
is four octets wide, bit 7 (MSB) is on the left and bit 0 (LSB) on the
|
||||
right within each octet.
|
||||
|
||||
```
|
||||
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
0-3 |trSpec |msgType| rsv | ver | messageLength |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
4-7 | domainNumber | minorSdoId | flags |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
8-15 | |
|
||||
+ correctionField +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
16-19 | messageTypeSpecific |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
20-27 | |
|
||||
+ clockIdentity +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
28-31 | portNumber | sequenceId |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
32-33 | controlField | logMsgIntvl |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
```
|
||||
|
||||
- **`trSpec`** (`transportSpecific`, bits 7–4 of octet 0): 4-bit profile
|
||||
identifier. `0x0` = IEEE 1588, `0x1` = gPTP (802.1AS). Set implicitly
|
||||
by the `profile` configuration leaf.
|
||||
- **`msgType`** (`messageType`, bits 3–0 of octet 0): `0x0` SYNC ·
|
||||
`0x1` DELAY_REQ · `0x2` PDELAY_REQ · `0x3` PDELAY_RESP ·
|
||||
`0x8` FOLLOW_UP · `0x9` DELAY_RESP · `0xA` PDELAY_RESP_FOLLOW_UP ·
|
||||
`0xB` ANNOUNCE.
|
||||
- **`rsv`** (reserved, bits 7–4 of octet 1): Set to zero; ignored on
|
||||
receipt.
|
||||
- **`ver`** (`versionPTP`, bits 3–0 of octet 1): PTP version; `2` for
|
||||
IEEE 1588-2008 and IEEE 1588-2019.
|
||||
- **`messageLength`** (octets 2–3): Total message length in octets,
|
||||
including the header.
|
||||
- **`domainNumber`** (octet 4): PTP domain; receivers silently discard
|
||||
messages that do not match their configured domain.
|
||||
- **`minorSdoId`** (octet 5): Reserved in IEEE 1588-2008; carries a
|
||||
profile sub-identifier in IEEE 1588-2019.
|
||||
- **`flags`** (octets 6–7): Per-message flags — includes the two-step
|
||||
flag (set when a FOLLOW_UP will follow a SYNC), UTC offset valid, and
|
||||
leap-second indicators.
|
||||
- **`correctionField`** (octets 8–15): Accumulated path correction in
|
||||
nanoseconds × 2¹⁶. Transparent Clocks add their measured residence
|
||||
time and link delay here as they forward each message, so the final
|
||||
time-receiver can subtract the total accumulated delay.
|
||||
- **`messageTypeSpecific`** (octets 16–19): Reserved in IEEE 1588-2008;
|
||||
carries message-type-specific data in IEEE 1588-2019.
|
||||
- **`clockIdentity`** (octets 20–27): EUI-64 identity of the sending
|
||||
clock — the value shown as "Clock identity" in `show ptp`.
|
||||
- **`portNumber`** (octets 28–29): Port number of the sender within its
|
||||
clock; together with `clockIdentity` it forms the unique
|
||||
`sourcePortIdentity`.
|
||||
- **`sequenceId`** (octets 30–31): Increments with each message; used to
|
||||
match a DELAY_REQ to its DELAY_RESP.
|
||||
- **`controlField`** (octet 32): Deprecated in PTPv2; set to fixed
|
||||
values per message type for backward compatibility with PTPv1.
|
||||
- **`logMsgIntvl`** (`logMessageInterval`, octet 33): Log₂ of the
|
||||
expected interval between messages of this type; `0x7F` means not
|
||||
applicable.
|
||||
|
||||
The `transportSpecific` and `domainNumber` fields are the quickest way to
|
||||
verify on the wire that a device is using the profile and domain you
|
||||
configured.
|
||||
|
||||
### Decoding with Wireshark
|
||||
|
||||
Wireshark decodes PTP messages automatically, expanding every header field
|
||||
and message-type-specific payload in the packet tree. PTP travels over
|
||||
two UDP ports — 319 for event messages (SYNC, DELAY_REQ, PDELAY_REQ and
|
||||
their responses) and 320 for general messages (ANNOUNCE, FOLLOW_UP) — as
|
||||
well as directly over Ethernet (EtherType `0x88F7`) when layer-2 transport
|
||||
is in use.
|
||||
|
||||
Use the display filter `ptp` to isolate PTP traffic:
|
||||
|
||||
```
|
||||
ptp
|
||||
```
|
||||
|
||||
To narrow down to a specific domain or profile (exact field names can be
|
||||
verified in Wireshark via **View → Internals → Supported Protocols**,
|
||||
filtering for `ptp`):
|
||||
|
||||
```
|
||||
ptp.v2.domainnumber == 0
|
||||
ptp.v2.transportspecific == 1
|
||||
```
|
||||
|
||||
This makes it straightforward to confirm which grandmaster a port is
|
||||
tracking, verify that `correctionField` is being updated by a Transparent
|
||||
Clock, or diagnose why the BTCA is not electing the expected grandmaster.
|
||||
|
||||
## Glossary
|
||||
|
||||
| Abbreviation | Expansion | Notes |
|
||||
|--------------|--------------------------------------|-------------------------------------------------------------------|
|
||||
| AVB | Audio/Video Bridging | IEEE 802.1 precursor to TSN; real-time AV over Ethernet |
|
||||
| IETF | Internet Engineering Task Force | Standards body; defines RFC for layer-3 and up |
|
||||
| UDP | User Datagram Protocol | IP transport used by PTP; port 319 (event) and 320 (general) |
|
||||
| EUI-64 | Extended Unique Identifier (64-bit) | IEEE identifier format used as `clockIdentity` in PTP |
|
||||
| EtherType | Ethernet frame type field | `0x88F7` identifies PTP over layer-2 Ethernet |
|
||||
| BC | Boundary Clock | Terminates and re-originates PTP on each port |
|
||||
| BTCA | Best TimeTransmitter Clock Algorithm | Elects the GM; replaces BMCA from IEEE 1588-2008 |
|
||||
| CMLDS | Common Mean Link Delay Service | IEEE 1588-2019 §16.6; shared delay service for multiple instances |
|
||||
| DS | Data Set | Named attribute collection in IEEE 1588 (default-ds, port-ds, …) |
|
||||
| E2E | End-to-End | Delay mechanism: measures path from GM to time-receiver |
|
||||
| GM | Grandmaster | PTP network-wide time source, elected by BTCA |
|
||||
| gPTP | generalized Precision Time Protocol | IEEE 802.1AS profile; used in TSN and AVB |
|
||||
| NTP | Network Time Protocol | Millisecond-accuracy time protocol for wide-area use |
|
||||
| OC | Ordinary Clock | Single-port PTP clock; time-transmitter or time-receiver |
|
||||
| P2P | Peer-to-Peer | Delay mechanism: measures delay to immediate neighbour |
|
||||
| PHC | PTP Hardware Clock | Hardware clock in the NIC used for PTP timestamping |
|
||||
| PTP | Precision Time Protocol | IEEE 1588 sub-microsecond clock synchronisation protocol |
|
||||
| SDO | Standards Development Organization | Body that defines a PTP profile; encoded in `sdo-id` |
|
||||
| TC | Transparent Clock | Forwards PTP messages, correcting for residence-time delay |
|
||||
| TSN | Time-Sensitive Networking | IEEE 802.1 standard set for deterministic Ethernet |
|
||||
@@ -359,6 +359,53 @@ $ make test-spec
|
||||
...
|
||||
```
|
||||
|
||||
### Node and Link Capabilities
|
||||
|
||||
Logical topology files (`topology.dot`) declare what each node and link
|
||||
*requires*; physical topology files declare what each node and link
|
||||
*provides*. When mapping a logical topology to physical hardware, infamy
|
||||
only assigns a physical node to a logical node when the physical node's
|
||||
`provides` set is a superset of the logical node's `requires` set. Tests
|
||||
are skipped if no matching physical topology can be found.
|
||||
|
||||
#### Declaring requirements (logical topology)
|
||||
|
||||
```dot
|
||||
dut [
|
||||
requires="infix",
|
||||
];
|
||||
|
||||
host:data -- dut:data [requires="ptp-hwts"]
|
||||
```
|
||||
|
||||
#### Declaring capabilities (physical topology)
|
||||
|
||||
```dot
|
||||
switch1 [
|
||||
provides="infix",
|
||||
];
|
||||
|
||||
switch1:eth0 -- switch2:eth0 [provides="ptp-hwts"]
|
||||
```
|
||||
|
||||
#### Node capabilities
|
||||
|
||||
| Capability | Meaning |
|
||||
|-------------------|-------------------------------------------------------------------------|
|
||||
| `controller` | Reserved for the host/controller node; never assigned to a DUT |
|
||||
| `infix` | Node runs Infix OS — required by virtually all DUT nodes |
|
||||
| `gps` | Node has a GPS receiver available as a time reference |
|
||||
| `watchdog` | Node has a hardware watchdog device |
|
||||
|
||||
#### Link capabilities
|
||||
|
||||
| Capability | Meaning |
|
||||
|-------------------|-------------------------------------------------------------------------|
|
||||
| `mgmt` | Link is a management path (typically coloured grey in diagrams) |
|
||||
| `ieee-mc` | Link carries IEEE multicast traffic (required by LAG and some L2 tests) |
|
||||
| `link-ctrl copper`| Link supports copper speed/duplex control |
|
||||
| `ptp-hwts` | Both ends of this link support PTP hardware timestamping (PHC); required for sub-microsecond accuracy |
|
||||
|
||||
### Test Development
|
||||
|
||||
For adding a new test to the automated regression test suite, it's best
|
||||
|
||||
@@ -47,6 +47,7 @@ nav:
|
||||
- Device Discovery: discovery.md
|
||||
- DHCP Server: dhcp.md
|
||||
- NTP Server: ntp.md
|
||||
- PTP (IEEE 1588/802.1AS): ptp.md
|
||||
- System:
|
||||
- Boot Procedure: boot.md
|
||||
- Configuration: system.md
|
||||
|
||||
@@ -12,6 +12,7 @@ define FEATURE_WIFI_LINUX_CONFIG_FIXUPS
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_RFKILL)
|
||||
$(call KCONFIG_SET_OPT,CONFIG_MAC80211,m)
|
||||
$(call KCONFIG_SET_OPT,CONFIG_CFG80211,m)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MAC80211_MESH)
|
||||
|
||||
$(if $(filter y,$(BR2_PACKAGE_FEATURE_WIFI_MEDIATEK)),
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MT7601U)
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
From 184c079c08387d1b0f74de25b63c56304d2156d0 Mon Sep 17 00:00:00 2001
|
||||
From: bazub <github@zubko.cc>
|
||||
Date: Tue, 3 Mar 2026 20:31:33 +0000
|
||||
Subject: [PATCH 1/3] Remove redundant global path var and fix memory
|
||||
corruption
|
||||
Organization: Wires
|
||||
|
||||
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
---
|
||||
src/conf.c | 13 ++-----------
|
||||
1 file changed, 2 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/conf.c b/src/conf.c
|
||||
index d0abb61d..6e8ec834 100644
|
||||
--- a/src/conf.c
|
||||
+++ b/src/conf.c
|
||||
@@ -121,9 +121,6 @@ static uev_t etcw;
|
||||
|
||||
static TAILQ_HEAD(, conf_change) conf_change_list = TAILQ_HEAD_INITIALIZER(conf_change_list);
|
||||
|
||||
-static char *path;
|
||||
-static char *shell;
|
||||
-
|
||||
static int parse_conf(char *file, int is_rcsd);
|
||||
static void drop_changes(void);
|
||||
|
||||
@@ -377,8 +374,6 @@ void conf_parse_cmdline(int argc, char *argv[])
|
||||
fstab = strdup(ptr);
|
||||
finit_conf = strdup(FINIT_CONF);
|
||||
finit_rcsd = strdup(FINIT_RCSD);
|
||||
- path = getenv("PATH");
|
||||
- shell = getenv("SHELL");
|
||||
|
||||
for (int i = 1; i < argc; i++)
|
||||
parse_arg(argv[i]);
|
||||
@@ -404,13 +399,9 @@ void conf_reset_env(void)
|
||||
free(node);
|
||||
}
|
||||
|
||||
- if (path)
|
||||
- setenv("PATH", path, 1);
|
||||
- else
|
||||
+ if (!getenv("PATH"))
|
||||
setenv("PATH", _PATH_STDPATH, 1);
|
||||
- if (shell)
|
||||
- setenv("SHELL", shell, 1);
|
||||
- else
|
||||
+ if (!getenv("SHELL"))
|
||||
setenv("SHELL", _PATH_BSHELL, 1);
|
||||
setenv("LOGNAME", "root", 1);
|
||||
setenv("USER", "root", 1);
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@@ -1,318 +0,0 @@
|
||||
From 662293e194811213b9b387163dfe8499e3300ccf Mon Sep 17 00:00:00 2001
|
||||
From: bazub <github@zubko.cc>
|
||||
Date: Fri, 6 Mar 2026 20:36:23 +0000
|
||||
Subject: [PATCH 2/3] Use explicit plugin names to prevent subtle macro
|
||||
processing bugs
|
||||
Organization: Wires
|
||||
|
||||
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
---
|
||||
plugins/alsa-utils.c | 6 +++---
|
||||
plugins/bootmisc.c | 2 +-
|
||||
plugins/dbus.c | 4 ++--
|
||||
plugins/hook-scripts.c | 2 +-
|
||||
plugins/modprobe.c | 2 +-
|
||||
plugins/modules-load.c | 2 +-
|
||||
plugins/netlink.c | 2 +-
|
||||
plugins/pidfile.c | 2 +-
|
||||
plugins/procps.c | 4 ++--
|
||||
plugins/resolvconf.c | 2 +-
|
||||
plugins/rtc.c | 6 +++---
|
||||
plugins/sys.c | 2 +-
|
||||
plugins/tty.c | 1 +
|
||||
plugins/urandom.c | 6 +++---
|
||||
plugins/usr.c | 2 +-
|
||||
plugins/x11-common.c | 4 ++--
|
||||
16 files changed, 25 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/plugins/alsa-utils.c b/plugins/alsa-utils.c
|
||||
index 6b2c3603..a8a967b0 100644
|
||||
--- a/plugins/alsa-utils.c
|
||||
+++ b/plugins/alsa-utils.c
|
||||
@@ -38,7 +38,7 @@
|
||||
static void save(void *arg)
|
||||
{
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "alsa-utils");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ static void save(void *arg)
|
||||
static void restore(void *arg)
|
||||
{
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "alsa-utils");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ static void restore(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "alsa-utils",
|
||||
.hook[HOOK_BASEFS_UP] = { .cb = restore },
|
||||
.hook[HOOK_SHUTDOWN] = { .cb = save }
|
||||
};
|
||||
diff --git a/plugins/bootmisc.c b/plugins/bootmisc.c
|
||||
index 701f73f0..a8ba3808 100644
|
||||
--- a/plugins/bootmisc.c
|
||||
+++ b/plugins/bootmisc.c
|
||||
@@ -172,7 +172,7 @@ static void setup(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "bootmisc",
|
||||
.hook[HOOK_MOUNT_POST] = { .cb = clean },
|
||||
.hook[HOOK_BASEFS_UP] = { .cb = setup },
|
||||
.depends = { "pidfile" },
|
||||
diff --git a/plugins/dbus.c b/plugins/dbus.c
|
||||
index bbf55bc2..a8a155a1 100644
|
||||
--- a/plugins/dbus.c
|
||||
+++ b/plugins/dbus.c
|
||||
@@ -106,7 +106,7 @@ static void setup(void *arg)
|
||||
char *cmd;
|
||||
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "dbus");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -164,7 +164,7 @@ static void setup(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "dbus",
|
||||
.hook[HOOK_SVC_PLUGIN] = { .cb = setup },
|
||||
};
|
||||
|
||||
diff --git a/plugins/hook-scripts.c b/plugins/hook-scripts.c
|
||||
index 9aa78173..e75808c5 100644
|
||||
--- a/plugins/hook-scripts.c
|
||||
+++ b/plugins/hook-scripts.c
|
||||
@@ -79,7 +79,7 @@ static void hscript_shutdown(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "hook-scripts",
|
||||
.hook[HOOK_BANNER] = { .cb = hscript_banner },
|
||||
.hook[HOOK_ROOTFS_UP] = { .cb = hscript_rootfs_up },
|
||||
.hook[HOOK_MOUNT_ERROR] = { .cb = hscript_mount_error },
|
||||
diff --git a/plugins/modprobe.c b/plugins/modprobe.c
|
||||
index b6b7e7bb..e52bf228 100644
|
||||
--- a/plugins/modprobe.c
|
||||
+++ b/plugins/modprobe.c
|
||||
@@ -228,7 +228,7 @@ static void coldplug(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "modprobe",
|
||||
.hook[HOOK_BASEFS_UP] = { .cb = coldplug },
|
||||
.depends = { "bootmisc", }
|
||||
};
|
||||
diff --git a/plugins/modules-load.c b/plugins/modules-load.c
|
||||
index 53aef82f..e2e45c72 100644
|
||||
--- a/plugins/modules-load.c
|
||||
+++ b/plugins/modules-load.c
|
||||
@@ -213,7 +213,7 @@ static void load(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "modules-load",
|
||||
.hook[HOOK_SVC_PLUGIN] = { .cb = load },
|
||||
};
|
||||
|
||||
diff --git a/plugins/netlink.c b/plugins/netlink.c
|
||||
index a70b01e8..625cbd1b 100644
|
||||
--- a/plugins/netlink.c
|
||||
+++ b/plugins/netlink.c
|
||||
@@ -426,7 +426,7 @@ static void nl_enumerate(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "netlink",
|
||||
.hook[HOOK_SVC_RECONF] = { .cb = nl_reconf },
|
||||
.hook[HOOK_SVC_PLUGIN] = { .cb = nl_enumerate },
|
||||
.io = {
|
||||
diff --git a/plugins/pidfile.c b/plugins/pidfile.c
|
||||
index ae0fdeea..f1232ab6 100644
|
||||
--- a/plugins/pidfile.c
|
||||
+++ b/plugins/pidfile.c
|
||||
@@ -335,7 +335,7 @@ static void pidfile_init(void *arg)
|
||||
* SIGSTP:ed (in state PAUSED) waiting for <net/iface/lo>.
|
||||
*/
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "pidfile",
|
||||
.hook[HOOK_BASEFS_UP] = { .cb = pidfile_init },
|
||||
.hook[HOOK_SVC_RECONF] = { .cb = pidfile_reconf },
|
||||
.depends = { "netlink" }, /* bootmisc depends on us */
|
||||
diff --git a/plugins/procps.c b/plugins/procps.c
|
||||
index 826e38ad..5a178d75 100644
|
||||
--- a/plugins/procps.c
|
||||
+++ b/plugins/procps.c
|
||||
@@ -43,7 +43,7 @@ static void setup(void *arg)
|
||||
glob_t gl;
|
||||
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "procps");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ static void setup(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "procps",
|
||||
.hook[HOOK_BASEFS_UP] = {
|
||||
.cb = setup
|
||||
},
|
||||
diff --git a/plugins/resolvconf.c b/plugins/resolvconf.c
|
||||
index 1ac29dae..b98e9214 100644
|
||||
--- a/plugins/resolvconf.c
|
||||
+++ b/plugins/resolvconf.c
|
||||
@@ -51,7 +51,7 @@ static void setup(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "resolvconf",
|
||||
.hook[HOOK_BASEFS_UP] = {
|
||||
.cb = setup
|
||||
},
|
||||
diff --git a/plugins/rtc.c b/plugins/rtc.c
|
||||
index faf69415..cf734763 100644
|
||||
--- a/plugins/rtc.c
|
||||
+++ b/plugins/rtc.c
|
||||
@@ -236,7 +236,7 @@ static void rtc_save(void *arg)
|
||||
int fd, rc = 0;
|
||||
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "rtc");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -266,7 +266,7 @@ static void rtc_restore(void *arg)
|
||||
int fd, rc = 0;
|
||||
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "rtc");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -321,7 +321,7 @@ static void update(uev_t *w, void *arg, int events)
|
||||
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "rtc",
|
||||
.hook[HOOK_BASEFS_UP] = {
|
||||
.cb = rtc_restore
|
||||
},
|
||||
diff --git a/plugins/sys.c b/plugins/sys.c
|
||||
index 438fdfd5..484adc05 100644
|
||||
--- a/plugins/sys.c
|
||||
+++ b/plugins/sys.c
|
||||
@@ -180,7 +180,7 @@ static void sys_init(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "sys",
|
||||
.hook[HOOK_BASEFS_UP] = { .cb = sys_init },
|
||||
.depends = { "bootmisc", },
|
||||
};
|
||||
diff --git a/plugins/tty.c b/plugins/tty.c
|
||||
index b3255f9f..c6a750b0 100644
|
||||
--- a/plugins/tty.c
|
||||
+++ b/plugins/tty.c
|
||||
@@ -43,6 +43,7 @@
|
||||
static void tty_watcher(void *arg, int fd, int events);
|
||||
|
||||
static plugin_t plugin = {
|
||||
+ .name = "tty",
|
||||
.io = {
|
||||
.cb = tty_watcher,
|
||||
.flags = PLUGIN_IO_READ,
|
||||
diff --git a/plugins/urandom.c b/plugins/urandom.c
|
||||
index 410d0660..9bb6252b 100644
|
||||
--- a/plugins/urandom.c
|
||||
+++ b/plugins/urandom.c
|
||||
@@ -87,7 +87,7 @@ static void setup(void *arg)
|
||||
int fd, err;
|
||||
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "urandom");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -188,7 +188,7 @@ static void save(void *arg)
|
||||
mode_t prev;
|
||||
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "urandom");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ static void save(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "urandom",
|
||||
.hook[HOOK_BASEFS_UP] = { .cb = setup },
|
||||
.hook[HOOK_SHUTDOWN] = { .cb = save },
|
||||
.depends = { "bootmisc", }
|
||||
diff --git a/plugins/usr.c b/plugins/usr.c
|
||||
index d30d9440..496facc2 100644
|
||||
--- a/plugins/usr.c
|
||||
+++ b/plugins/usr.c
|
||||
@@ -104,7 +104,7 @@ static void usr_init(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "usr",
|
||||
.hook[HOOK_BASEFS_UP] = { .cb = usr_init },
|
||||
.depends = { "bootmisc", },
|
||||
};
|
||||
diff --git a/plugins/x11-common.c b/plugins/x11-common.c
|
||||
index f65331a0..75825a36 100644
|
||||
--- a/plugins/x11-common.c
|
||||
+++ b/plugins/x11-common.c
|
||||
@@ -39,7 +39,7 @@
|
||||
static void setup(void *arg)
|
||||
{
|
||||
if (rescue) {
|
||||
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
|
||||
+ dbg("Skipping %s plugin in rescue mode.", "x11-common");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ static void setup(void *arg)
|
||||
}
|
||||
|
||||
static plugin_t plugin = {
|
||||
- .name = __FILE__,
|
||||
+ .name = "x11-common",
|
||||
.hook[HOOK_SVC_PLUGIN] = { .cb = setup },
|
||||
};
|
||||
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
From c01faef99b7e4ff9c39f29ad5648db61a4742539 Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Thu, 19 Mar 2026 06:37:50 +0100
|
||||
Subject: [PATCH 3/3] service: clear condition before stopping rdeps on reload
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Organization: Wires
|
||||
|
||||
When a service without SIGHUP reload support (noreload) is touched and
|
||||
'initctl reload' is called, service_update_rdeps() correctly identifies
|
||||
its reverse dependencies but only marks them dirty. It does not clear
|
||||
the service's condition, so when service_step_all() runs:
|
||||
|
||||
- rdeps supporting SIGHUP hit the sm_in_reload() guard and break early,
|
||||
left running while their dependency is being killed.
|
||||
- rdeps without SIGHUP support may receive SIGTERM too late, after the
|
||||
dependency has already died and broken their connection, causing them
|
||||
to exit from RUNNING state and have their restart counter incremented.
|
||||
|
||||
Fix by calling cond_clear() on the service's condition immediately in
|
||||
service_update_rdeps(), before service_step_all() runs. cond_clear()
|
||||
calls cond_update() which calls service_step() inline on all affected
|
||||
services, which see COND_OFF and transition to STOPPING_STATE — all
|
||||
before SIGTERM is ever sent to the dependency itself.
|
||||
|
||||
This mirrors the pattern already used in api.c:do_reload() for direct
|
||||
'initctl reload <svc>' calls.
|
||||
|
||||
Fixes: avahi/mdns stop causing mdns-alias restart counter increment
|
||||
|
||||
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
---
|
||||
src/service.c | 16 +++++++++++++++-
|
||||
1 file changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/service.c b/src/service.c
|
||||
index b2c6c15b..016b5d2f 100644
|
||||
--- a/src/service.c
|
||||
+++ b/src/service.c
|
||||
@@ -2418,7 +2418,21 @@ void service_update_rdeps(void)
|
||||
if (!svc_is_noreload(svc))
|
||||
continue; /* Yup, no need to stop start rdeps */
|
||||
|
||||
- svc_mark_affected(mkcond(svc, cond, sizeof(cond)));
|
||||
+ /*
|
||||
+ * Clear the condition immediately, before service_step_all()
|
||||
+ * runs. cond_clear() calls cond_update() which calls
|
||||
+ * service_step() on all affected services right now. Those
|
||||
+ * services see COND_OFF and get service_stop() called,
|
||||
+ * transitioning to STOPPING_STATE before we ever send SIGTERM
|
||||
+ * to this service. Without this, the condition is only cleared
|
||||
+ * after the service dies, by which time reverse-dependencies
|
||||
+ * may have already crashed due to the lost connection.
|
||||
+ * See also: api.c do_reload() which does the same for direct
|
||||
+ * 'initctl reload <svc>' calls.
|
||||
+ */
|
||||
+ mkcond(svc, cond, sizeof(cond));
|
||||
+ cond_clear(cond);
|
||||
+ svc_mark_affected(cond);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# From https://github.com/troglobit/finit/releases/
|
||||
sha256 f0894cd8b79ce030fdc656600208ddb0b994364f86ebad066de2e005e5e18a35 finit-4.16.tar.gz
|
||||
sha256 ca8b489a0ed99c17c0288e9e65e325a8f14af3734dfecf58f516c0a6f884e903 finit-4.17.tar.gz
|
||||
|
||||
# Locally calculated
|
||||
sha256 868cb6c5414933a48db11186042cfe65c87480d326734bc6cf0e4b19b4a2e52a LICENSE
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#
|
||||
################################################################################
|
||||
|
||||
FINIT_VERSION = 4.16
|
||||
FINIT_VERSION = 4.17
|
||||
FINIT_SITE = https://github.com/troglobit/finit/releases/download/$(FINIT_VERSION)
|
||||
FINIT_LICENSE = MIT
|
||||
FINIT_LICENSE_FILES = LICENSE
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
sha256 dcd639c77689c432e84e63267202c00958fb1032e066ae355e3cbc68d9fcd063 mcd-2.3.tar.gz
|
||||
sha256 896c455c1a013a153cbf3186b5f87b7a3344b8939603c0f09e534de714a32e65 mcd-2.4.tar.gz
|
||||
sha256 99a0480db163445c5a1a5bf7f85bc37cbb5be8c40e9e441291ad78e8d4252d0b LICENSE
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
#
|
||||
################################################################################
|
||||
|
||||
MCD_VERSION = 2.3
|
||||
MCD_VERSION = 2.4
|
||||
MCD_SITE = https://github.com/kernelkit/mcd/releases/download/v$(MCD_VERSION)
|
||||
MCD_LICENSE = BSD-3-Clause
|
||||
MCD_LICENSE_FILES = LICENSE
|
||||
|
||||
@@ -0,0 +1,309 @@
|
||||
From ccd5fe71878cc3eeea2a3137c7b8d5715e3f4253 Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Thu, 9 Apr 2026 11:09:51 +0200
|
||||
Subject: [PATCH] ethtool: Add --json support for -T (show-time-stamping)
|
||||
Organization: Wires
|
||||
|
||||
Wire up JSON output for `ethtool -T`:
|
||||
|
||||
- Mark the -T command with .json = true in the command table
|
||||
- Wrap tsinfo_reply_cb output in open/close_json_object, use
|
||||
print_string for the header, and handle the PHC index/none
|
||||
case with proper JSON primitives
|
||||
- Convert tsinfo_dump_list to open a JSON array (keyed by the
|
||||
new json_key parameter) and close it on return; update callers
|
||||
in tsinfo.c and tsconfig.c with appropriate keys
|
||||
- Convert tsinfo_dump_cb to use print_string(PRINT_ANY) so
|
||||
each set bit is emitted as a JSON array element in JSON mode
|
||||
and as an indented text line in plain mode
|
||||
- Wrap the netlink request in nl_tsinfo with new_json_obj /
|
||||
delete_json_obj
|
||||
|
||||
Example output on a Marvell 88e6341 (Topaz) switch (lan0):
|
||||
|
||||
$ ethtool --json -T lan0 | jq
|
||||
[
|
||||
{
|
||||
"ifname": "lan0",
|
||||
"capabilities": [
|
||||
"hardware-transmit",
|
||||
"hardware-receive",
|
||||
"software-receive",
|
||||
"software-system-clock",
|
||||
"hardware-raw-clock"
|
||||
],
|
||||
"hwtstamp-provider-index": 0,
|
||||
"hwtstamp-provider-qualifier": "Precise (IEEE 1588 quality)",
|
||||
"tx-types": [
|
||||
"off",
|
||||
"on"
|
||||
],
|
||||
"rx-filters": [
|
||||
"none",
|
||||
"ptpv2-l4-event",
|
||||
"ptpv2-l4-sync",
|
||||
"ptpv2-l4-delay-req",
|
||||
"ptpv2-l2-event",
|
||||
"ptpv2-l2-sync",
|
||||
"ptpv2-l2-delay-req",
|
||||
"ptpv2-event",
|
||||
"ptpv2-sync",
|
||||
"ptpv2-delay-req"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
Example output on a Qemu VM with e1000 NIC (e1):
|
||||
|
||||
$ ethtool --json -T e1 | jq
|
||||
[
|
||||
{
|
||||
"ifname": "e1",
|
||||
"capabilities": [
|
||||
"software-transmit",
|
||||
"software-receive",
|
||||
"software-system-clock"
|
||||
],
|
||||
"phc-index": -1,
|
||||
"tx-types": [],
|
||||
"rx-filters": []
|
||||
}
|
||||
]
|
||||
|
||||
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
---
|
||||
ethtool.c | 1 +
|
||||
netlink/ts.h | 2 +-
|
||||
netlink/tsconfig.c | 6 +--
|
||||
netlink/tsinfo.c | 106 ++++++++++++++++++++++++++++++---------------
|
||||
4 files changed, 75 insertions(+), 40 deletions(-)
|
||||
|
||||
diff --git a/ethtool.c b/ethtool.c
|
||||
index 9c8a542..f845dae 100644
|
||||
--- a/ethtool.c
|
||||
+++ b/ethtool.c
|
||||
@@ -5985,6 +5985,7 @@ static const struct option args[] = {
|
||||
},
|
||||
{
|
||||
.opts = "-T|--show-time-stamping",
|
||||
+ .json = true,
|
||||
.func = do_tsinfo,
|
||||
.nlfunc = nl_tsinfo,
|
||||
.help = "Show time stamping capabilities",
|
||||
diff --git a/netlink/ts.h b/netlink/ts.h
|
||||
index 9442b44..07f140a 100644
|
||||
--- a/netlink/ts.h
|
||||
+++ b/netlink/ts.h
|
||||
@@ -17,6 +17,6 @@ int tsinfo_qualifier_parser(struct nl_context *nlctx,
|
||||
void *dest);
|
||||
int tsinfo_dump_list(struct nl_context *nlctx, const struct nlattr *attr,
|
||||
const char *label, const char *if_empty,
|
||||
- unsigned int stringset_id);
|
||||
+ unsigned int stringset_id, const char *json_key);
|
||||
|
||||
#endif /* ETHTOOL_NETLINK_TS_H__ */
|
||||
diff --git a/netlink/tsconfig.c b/netlink/tsconfig.c
|
||||
index d427c7b..aab9859 100644
|
||||
--- a/netlink/tsconfig.c
|
||||
+++ b/netlink/tsconfig.c
|
||||
@@ -52,19 +52,19 @@ int tsconfig_reply_cb(const struct nlmsghdr *nlhdr, void *data)
|
||||
|
||||
ret = tsinfo_dump_list(nlctx, tb[ETHTOOL_A_TSCONFIG_TX_TYPES],
|
||||
"Hardware Transmit Timestamp Mode", " none",
|
||||
- ETH_SS_TS_TX_TYPES);
|
||||
+ ETH_SS_TS_TX_TYPES, "tx-types");
|
||||
if (ret < 0)
|
||||
return err_ret;
|
||||
|
||||
ret = tsinfo_dump_list(nlctx, tb[ETHTOOL_A_TSCONFIG_RX_FILTERS],
|
||||
"Hardware Receive Filter Mode", " none",
|
||||
- ETH_SS_TS_RX_FILTERS);
|
||||
+ ETH_SS_TS_RX_FILTERS, "rx-filters");
|
||||
if (ret < 0)
|
||||
return err_ret;
|
||||
|
||||
ret = tsinfo_dump_list(nlctx, tb[ETHTOOL_A_TSCONFIG_HWTSTAMP_FLAGS],
|
||||
"Hardware Flags", " none",
|
||||
- ETH_SS_TS_FLAGS);
|
||||
+ ETH_SS_TS_FLAGS, "hwtstamp-flags");
|
||||
if (ret < 0)
|
||||
return err_ret;
|
||||
|
||||
diff --git a/netlink/tsinfo.c b/netlink/tsinfo.c
|
||||
index 187c3ad..da64b50 100644
|
||||
--- a/netlink/tsinfo.c
|
||||
+++ b/netlink/tsinfo.c
|
||||
@@ -52,6 +52,7 @@ int tsinfo_show_hwprov(const struct nlattr *nest)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+
|
||||
static int tsinfo_show_stats(const struct nlattr *nest)
|
||||
{
|
||||
const struct nlattr *tb[ETHTOOL_A_TS_STAT_MAX + 1] = {};
|
||||
@@ -109,39 +110,57 @@ err_close_stats:
|
||||
static void tsinfo_dump_cb(unsigned int idx, const char *name, bool val,
|
||||
void *data __maybe_unused)
|
||||
{
|
||||
+ char buf[16];
|
||||
+
|
||||
if (!val)
|
||||
return;
|
||||
|
||||
- if (name)
|
||||
- printf("\t%s\n", name);
|
||||
- else
|
||||
- printf("\tbit%u\n", idx);
|
||||
+ if (!name) {
|
||||
+ snprintf(buf, sizeof(buf), "bit%u", idx);
|
||||
+ name = buf;
|
||||
+ }
|
||||
+ print_string(PRINT_ANY, NULL, "\t%s\n", name);
|
||||
}
|
||||
|
||||
int tsinfo_dump_list(struct nl_context *nlctx, const struct nlattr *attr,
|
||||
const char *label, const char *if_empty,
|
||||
- unsigned int stringset_id)
|
||||
+ unsigned int stringset_id, const char *json_key)
|
||||
{
|
||||
const struct stringset *strings = NULL;
|
||||
- int ret;
|
||||
+ bool empty;
|
||||
+ int ret = 0;
|
||||
|
||||
- printf("%s:", label);
|
||||
- ret = 0;
|
||||
- if (!attr || bitset_is_empty(attr, false, &ret)) {
|
||||
- printf("%s\n", if_empty);
|
||||
- return ret;
|
||||
- }
|
||||
- putchar('\n');
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ empty = !attr || bitset_is_empty(attr, false, &ret);
|
||||
|
||||
- if (bitset_is_compact(attr)) {
|
||||
- ret = netlink_init_ethnl2_socket(nlctx);
|
||||
+ if (!is_json_context()) {
|
||||
+ printf("%s:", label);
|
||||
+ if (empty) {
|
||||
+ printf("%s\n", if_empty);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ putchar('\n');
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ } else {
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
- strings = global_stringset(stringset_id, nlctx->ethnl2_socket);
|
||||
+ open_json_array(json_key, "");
|
||||
+ }
|
||||
+
|
||||
+ if (!empty) {
|
||||
+ if (bitset_is_compact(attr)) {
|
||||
+ ret = netlink_init_ethnl2_socket(nlctx);
|
||||
+ if (ret < 0)
|
||||
+ goto out_close;
|
||||
+ strings = global_stringset(stringset_id, nlctx->ethnl2_socket);
|
||||
+ }
|
||||
+ ret = walk_bitset(attr, strings, tsinfo_dump_cb, NULL);
|
||||
}
|
||||
- return walk_bitset(attr, strings, tsinfo_dump_cb, NULL);
|
||||
+
|
||||
+out_close:
|
||||
+ if (is_json_context())
|
||||
+ close_json_array("");
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
int tsinfo_reply_cb(const struct nlmsghdr *nlhdr, void *data)
|
||||
@@ -163,47 +182,59 @@ int tsinfo_reply_cb(const struct nlmsghdr *nlhdr, void *data)
|
||||
return err_ret;
|
||||
|
||||
if (silent)
|
||||
- putchar('\n');
|
||||
- printf("Time stamping parameters for %s:\n", nlctx->devname);
|
||||
+ print_nl();
|
||||
+
|
||||
+ open_json_object(NULL);
|
||||
+ print_string(PRINT_ANY, "ifname",
|
||||
+ "Time stamping parameters for %s:\n", nlctx->devname);
|
||||
|
||||
ret = tsinfo_dump_list(nlctx, tb[ETHTOOL_A_TSINFO_TIMESTAMPING],
|
||||
- "Capabilities", "", ETH_SS_SOF_TIMESTAMPING);
|
||||
+ "Capabilities", "", ETH_SS_SOF_TIMESTAMPING,
|
||||
+ "capabilities");
|
||||
if (ret < 0)
|
||||
- return err_ret;
|
||||
+ goto err_close_dev;
|
||||
|
||||
if (tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER]) {
|
||||
ret = tsinfo_show_hwprov(tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER]);
|
||||
if (ret < 0)
|
||||
- return err_ret;
|
||||
-
|
||||
+ goto err_close_dev;
|
||||
} else if (tb[ETHTOOL_A_TSINFO_PHC_INDEX]) {
|
||||
- printf("PTP Hardware Clock: ");
|
||||
- printf("%d\n",
|
||||
- mnl_attr_get_u32(tb[ETHTOOL_A_TSINFO_PHC_INDEX]));
|
||||
+ print_uint(PRINT_ANY, "phc-index",
|
||||
+ "PTP Hardware Clock: %d\n",
|
||||
+ mnl_attr_get_u32(tb[ETHTOOL_A_TSINFO_PHC_INDEX]));
|
||||
} else {
|
||||
- printf("PTP Hardware Clock: ");
|
||||
- printf("none\n");
|
||||
+ if (is_json_context())
|
||||
+ print_int(PRINT_JSON, "phc-index", NULL, -1);
|
||||
+ else
|
||||
+ printf("PTP Hardware Clock: none\n");
|
||||
}
|
||||
|
||||
ret = tsinfo_dump_list(nlctx, tb[ETHTOOL_A_TSINFO_TX_TYPES],
|
||||
"Hardware Transmit Timestamp Modes", " none",
|
||||
- ETH_SS_TS_TX_TYPES);
|
||||
+ ETH_SS_TS_TX_TYPES, "tx-types");
|
||||
if (ret < 0)
|
||||
- return err_ret;
|
||||
+ goto err_close_dev;
|
||||
|
||||
ret = tsinfo_dump_list(nlctx, tb[ETHTOOL_A_TSINFO_RX_FILTERS],
|
||||
"Hardware Receive Filter Modes", " none",
|
||||
- ETH_SS_TS_RX_FILTERS);
|
||||
+ ETH_SS_TS_RX_FILTERS, "rx-filters");
|
||||
if (ret < 0)
|
||||
- return err_ret;
|
||||
+ goto err_close_dev;
|
||||
|
||||
if (tb[ETHTOOL_A_TSINFO_STATS]) {
|
||||
ret = tsinfo_show_stats(tb[ETHTOOL_A_TSINFO_STATS]);
|
||||
if (ret < 0)
|
||||
- return err_ret;
|
||||
+ goto err_close_dev;
|
||||
}
|
||||
|
||||
+ if (!silent)
|
||||
+ print_nl();
|
||||
+ close_json_object();
|
||||
return MNL_CB_OK;
|
||||
+
|
||||
+err_close_dev:
|
||||
+ close_json_object();
|
||||
+ return err_ret;
|
||||
}
|
||||
|
||||
int tsinfo_qualifier_parser(struct nl_context *nlctx,
|
||||
@@ -271,5 +302,8 @@ int nl_tsinfo(struct cmd_context *ctx)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
- return nlsock_send_get_request(nlsk, tsinfo_reply_cb);
|
||||
+ new_json_obj(ctx->json);
|
||||
+ ret = nlsock_send_get_request(nlsk, tsinfo_reply_cb);
|
||||
+ delete_json_obj();
|
||||
+ return ret;
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@@ -1,23 +1,8 @@
|
||||
From 9ba3bc688c45a0c9e761c6c8bd0be83d6570c9dc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= <lazzer@gmail.com>
|
||||
Date: Fri, 27 Feb 2026 16:58:12 +0100
|
||||
Subject: [PATCH] Always log to syslog
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Organization: Wires
|
||||
|
||||
Signed-off-by: Mattias Walström <lazzer@gmail.com>
|
||||
---
|
||||
gpsd/libgpsd_core.c | 13 ++-----------
|
||||
1 file changed, 2 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/gpsd/libgpsd_core.c b/gpsd/libgpsd_core.c
|
||||
index 982f822b8..c53c64838 100644
|
||||
--- a/gpsd/libgpsd_core.c
|
||||
+++ b/gpsd/libgpsd_core.c
|
||||
@@ -180,17 +180,8 @@ static void gpsd_vlog(const int errlevel,
|
||||
// this was crazy expensive, just fix the bad log calls
|
||||
diff -urN gpsd-3.25.orig/gpsd/libgpsd_core.c gpsd-3.25/gpsd/libgpsd_core.c
|
||||
--- gpsd-3.25.orig/gpsd/libgpsd_core.c 2023-01-10 23:38:26.000000000 +0100
|
||||
+++ gpsd-3.25/gpsd/libgpsd_core.c 2026-04-22 14:06:09.498017456 +0200
|
||||
@@ -180,17 +180,8 @@
|
||||
// this was carzy expensive, just fix the bad log calls
|
||||
// gps_visibilize(outbuf, outlen, buf, strlen(buf));
|
||||
|
||||
- if (getpid() == getsid(getpid())) {
|
||||
@@ -36,6 +21,3 @@ index 982f822b8..c53c64838 100644
|
||||
gpsd_release_reporting_lock();
|
||||
#endif // !SQUELCH_ENABLE
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 1468d842d2266521b56a2f41b82de6a6de973b9b Mon Sep 17 00:00:00 2001
|
||||
From 1a58edf0d4db2f4b0b894e1b98009380634bc7e1 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 19 Sep 2023 18:38:10 +0200
|
||||
Subject: [PATCH 01/48] net: phy: marvell10g: Support firmware loading on
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From ee5e5f2240b08fed5e8c3c49ffe257123c3def3f Mon Sep 17 00:00:00 2001
|
||||
From 88958b4437b9b6c51a24dbd24692e0e0b27f1438 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 21 Nov 2023 20:15:24 +0100
|
||||
Subject: [PATCH 02/48] net: phy: marvell10g: Fix power-up when strapped to
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From fcb3a86d1c629b19927184668f437ea26c0a9f46 Mon Sep 17 00:00:00 2001
|
||||
From ee98438d1e702735344ce470be5b55d2e9abc398 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Wed, 15 Nov 2023 20:58:42 +0100
|
||||
Subject: [PATCH 03/48] net: phy: marvell10g: Add LED support for 88X3310
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From b199bb9579235f870393e531ac24958fc682440b Mon Sep 17 00:00:00 2001
|
||||
From 9bde8e2bd4dce93ad5e80f5c9f8fc0e1f9a7d1ca Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 12 Dec 2023 09:51:05 +0100
|
||||
Subject: [PATCH 04/48] net: phy: marvell10g: Support LEDs tied to a single
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From a3bde794b2ad4d82bde6f23bf79568ebd4f46f40 Mon Sep 17 00:00:00 2001
|
||||
From f2e1903dbc979b5da26d94eac73db97bde9f495a Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Wed, 27 Mar 2024 10:10:19 +0100
|
||||
Subject: [PATCH 05/48] net: phy: Do not resume PHY when attaching
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 3d701444fff9a5668190b048fc89ac843a336e06 Mon Sep 17 00:00:00 2001
|
||||
From 4a3e8b33268460d283b48214ca158ebd93e96ead Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Mon, 4 Mar 2024 16:47:28 +0100
|
||||
Subject: [PATCH 06/48] net: bridge: avoid classifying unknown multicast as
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 43b52a83b40e3ca047ea6d88a72c715711d6c217 Mon Sep 17 00:00:00 2001
|
||||
From ef1f7e05f43a38dd81bbbc4bbb8f1e70ad8b4180 Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Tue, 5 Mar 2024 06:44:41 +0100
|
||||
Subject: [PATCH 07/48] net: bridge: Ignore router ports when forwarding L2
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From a1543093e940725a71b2212de4f1226fae4f4ec1 Mon Sep 17 00:00:00 2001
|
||||
From 1b6e4e22f39f95684d91d43c4e4a48c997bc54a9 Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Thu, 4 Apr 2024 16:36:30 +0200
|
||||
Subject: [PATCH 08/48] net: bridge: drop delay for applying strict multicast
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 8ae396b883a1effddefbc1e3fb1cbb610083fa53 Mon Sep 17 00:00:00 2001
|
||||
From 5aa81b3d419d971e9ed6e1d61314075414a584b8 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Thu, 16 May 2024 14:51:54 +0200
|
||||
Subject: [PATCH 09/48] net: bridge: Differentiate MDB additions from
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From c567c93a1a482a673b5aee7e3ea646d545b5fa1f Mon Sep 17 00:00:00 2001
|
||||
From 7f2bc7bff72bcdbf46a7c40ab19790ccd9a6fca2 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Fri, 24 Nov 2023 23:29:55 +0100
|
||||
Subject: [PATCH 10/48] nvmem: layouts: onie-tlv: Let device probe even when
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From b1825b77246536a3e6f7f1d6adbe958dd55e3352 Mon Sep 17 00:00:00 2001
|
||||
From 7df1f07e90e3c4846a5770bf9e5d6723d180f61f Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Sun, 11 Aug 2024 11:27:35 +0200
|
||||
Subject: [PATCH 11/48] net: usb: r8152: add r8153b support for link/activity
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 23aa14e65a1339125413a2b4d3a39203f913b90e Mon Sep 17 00:00:00 2001
|
||||
From e716d8e693ba5e553d79f659f154e120d7799703 Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Sun, 10 Aug 2025 18:52:54 +0200
|
||||
Subject: [PATCH 12/48] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 724739c9ace3065950cd0b1fc9e3c6907f410675 Mon Sep 17 00:00:00 2001
|
||||
From 907a2d33e007604e37eaacbc12a82fc930f60c4f Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Wed, 20 Aug 2025 21:38:24 +0200
|
||||
Subject: [PATCH 13/48] drm/panel-simple: Add a timing for the Raspberry Pi 7"
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From c8ecc94692e555f91e2ed04bca31e993a26db31d Mon Sep 17 00:00:00 2001
|
||||
From 02efd1af3a3688da535b7ccfb131acca099b16ed Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Thu, 21 Aug 2025 11:20:23 +0200
|
||||
Subject: [PATCH 14/48] input:touchscreen:edt-ft5x06: Add polled mode
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 08419962120d311b7fc1f4d02a247f0d3c123df7 Mon Sep 17 00:00:00 2001
|
||||
From bdd547ca4fe915df479094bd4184d0870bfb20fc Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 12 Mar 2024 10:27:24 +0100
|
||||
Subject: [PATCH 15/48] [FIX] net: dsa: mv88e6xxx: Fix timeout on waiting for
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 9987aa87b5bd9bbe09f9a362dafd401ca17b3552 Mon Sep 17 00:00:00 2001
|
||||
From bf7ea26e4ab01fd94b6e43507c9cbb47fca4fc6f Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Wed, 27 Mar 2024 15:52:43 +0100
|
||||
Subject: [PATCH 16/48] net: dsa: mv88e6xxx: Improve indirect register access
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 613b902e3748499a64ceb3e2bff93c03d016da4b Mon Sep 17 00:00:00 2001
|
||||
From cd5282da53b15d91b18b9f365ee4ecc453c69260 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Mon, 22 Apr 2024 23:18:01 +0200
|
||||
Subject: [PATCH 17/48] net: dsa: mv88e6xxx: Honor ports being managed via
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 6acf1d7f53f36d1fc464370f238eed0516424e4a Mon Sep 17 00:00:00 2001
|
||||
From 01b7489743f6d4a385e4e2e25fc1988235aa9e0b Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Wed, 24 Apr 2024 22:41:04 +0200
|
||||
Subject: [PATCH 18/48] net: dsa: mv88e6xxx: Limit rsvd2cpu policy to user
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From facac9df278bb1c01385989edbb6c825fc702c2f Mon Sep 17 00:00:00 2001
|
||||
From 1c8c377c0d8638ed2d1d43414ea9bcb7522788f0 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 28 May 2024 10:38:42 +0200
|
||||
Subject: [PATCH 19/48] net: dsa: tag_dsa: Use tag priority as initial
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From accbce91b21634dca15b08399f67e6e05d73a336 Mon Sep 17 00:00:00 2001
|
||||
From 177bb276b21b8d2ddc8f0c142155e56aa5a0d021 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 16 Jan 2024 16:00:55 +0100
|
||||
Subject: [PATCH 20/48] net: dsa: Support MDB memberships whose L2 addresses
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 185ce36a232fc3bdf15df5ee2463a0935c18a51c Mon Sep 17 00:00:00 2001
|
||||
From 894c8e45709a629c4b10d079b31f1f4800a43677 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Thu, 21 Mar 2024 19:12:15 +0100
|
||||
Subject: [PATCH 21/48] net: dsa: Support EtherType based priority overrides
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 47e291ca3a3535527965c185c62b08cc00779b5e Mon Sep 17 00:00:00 2001
|
||||
From 5004969cb16e3c23e517105ff2030a76a21df966 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Fri, 22 Mar 2024 16:15:43 +0100
|
||||
Subject: [PATCH 22/48] net: dsa: mv88e6xxx: Support EtherType based priority
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 7fd5df027059281a1f468d265c5ef2c9f75896e4 Mon Sep 17 00:00:00 2001
|
||||
From 9784e108d7e23741bfe5f2793faec26ff213ca86 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 28 May 2024 11:04:22 +0200
|
||||
Subject: [PATCH 23/48] net: dsa: mv88e6xxx: Add mqprio qdisc support
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 3e23bbdc8b8939333ea053c3d68433327db63245 Mon Sep 17 00:00:00 2001
|
||||
From 7a5d8a80b8c5df68956486da53b06548b7d3e196 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Wed, 29 May 2024 13:20:41 +0200
|
||||
Subject: [PATCH 24/48] net: dsa: mv88e6xxx: Use VLAN prio over IP when both
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From eff73803a923089e2c5d29534ba9e48aba2ccc1c Mon Sep 17 00:00:00 2001
|
||||
From 43effaa176813e0e770c224582dd99c0e139979c Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Tue, 26 Nov 2024 19:45:59 +0100
|
||||
Subject: [PATCH 25/48] [FIX] net: dsa: mv88e6xxx: Trap locally terminated
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 40fa8586ec139c0bdde517e62d4a1b9825d1b0dd Mon Sep 17 00:00:00 2001
|
||||
From c51a3e7a888b1ad8606e1b25cd7c96e65f93b15a Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Thu, 16 Jan 2025 12:35:12 +0100
|
||||
Subject: [PATCH 26/48] net: dsa: mv88e6xxx: collapse disabled state into
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From ea79ab92b86ea634122192888edafd4b310bdeae Mon Sep 17 00:00:00 2001
|
||||
From 944eb4b7e5511cfd115124fd54a79cd9d827cc1c Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Date: Wed, 12 Feb 2025 22:03:14 +0100
|
||||
Subject: [PATCH 27/48] net: dsa: mv88e6xxx: Only activate LAG offloading when
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From d1af4a6a34c2e01bac6f8dde2d9cd663fb44a25e Mon Sep 17 00:00:00 2001
|
||||
From b6e365e47484728bfc50b52ee066f8fb2763bec7 Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Wed, 14 Jan 2026 18:22:41 +0100
|
||||
Subject: [PATCH 28/48] net: dsa: mv88e6xxx: Add LED support for 6393X
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From d6ed7f5702d24ed7b226e06eff03fccd15457bd3 Mon Sep 17 00:00:00 2001
|
||||
From 756f5d27cfcb0ae6f5b22aa481c002b89f50bb66 Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Thu, 15 Jan 2026 22:47:37 +0100
|
||||
Subject: [PATCH 29/48] wifi: brcmfmac: support deletion and recreation of
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From fff7b8b2097f202e5f52e0f03e6f138e8f0ff79a Mon Sep 17 00:00:00 2001
|
||||
From a1a034f88eebe3ac427ee3eded3d701df373ee24 Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Mon, 19 Jan 2026 13:06:53 +0100
|
||||
Subject: [PATCH 30/48] wifi: brcmfmac: check connection state before querying
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 0cc7668beb989e4069770b815eab8ab74a375791 Mon Sep 17 00:00:00 2001
|
||||
From bcfe1fc5235c276c41b46bf3281a6ed1263999f8 Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Tue, 20 Jan 2026 20:12:10 +0100
|
||||
Subject: [PATCH 31/48] wifi: brcmfmac: suppress log spam for
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 1f3967b13ffbf5f7b8340e6231a91e03f96e19d6 Mon Sep 17 00:00:00 2001
|
||||
From 54eaebf53119b5f64155739e1decf9d290f2a843 Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Tue, 20 Jan 2026 20:18:45 +0100
|
||||
Subject: [PATCH 32/48] wifi: brcmfmac: reduce log noise during AP to station
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 878560ad9f12cc903c0314ebfcaa2ea3f62891c0 Mon Sep 17 00:00:00 2001
|
||||
From 97379c6ac8d1a770a648c4efa9b0e1e8149abefe Mon Sep 17 00:00:00 2001
|
||||
From: Mattias Walström <lazzer@gmail.com>
|
||||
Date: Tue, 17 Feb 2026 21:59:59 +0100
|
||||
Subject: [PATCH 33/48] net: phy: air_en8811h: add OF device table for
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 4765bba7232d1745bc7186194c1d02ed6a09922c Mon Sep 17 00:00:00 2001
|
||||
From f2048d36925ccbd8717bb0ecc813d3579d868c87 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Fri, 20 Sep 2024 12:05:18 +0100
|
||||
Subject: [PATCH 34/48] drm: vc4: dsi: enable video and then retry failed
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 7ba9ad346650acee1d32ddf67858c39f954806e2 Mon Sep 17 00:00:00 2001
|
||||
From 9216d1b629afdcff20cfcd196a8c89c07be83820 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Wed, 8 Jun 2022 17:23:47 +0100
|
||||
Subject: [PATCH 35/48] drm: vc4: dsi: Clocks should be running before reset
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From a836035db64851169412f7de3ba082373d9d2771 Mon Sep 17 00:00:00 2001
|
||||
From 3d24f34e92e4ed3da2b945b8ca7884a0a05f4cff Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Fri, 5 Apr 2024 17:51:55 +0100
|
||||
Subject: [PATCH 36/48] drm/vc4: Ensure DSI is enabled for FIFO resets
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 9698831e0ab8fa93299f7edf3e649ffa719d5c8a Mon Sep 17 00:00:00 2001
|
||||
From 62c6ef5d223b714484400aac1fbcddcacb46326d Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Thu, 26 May 2022 18:56:19 +0100
|
||||
Subject: [PATCH 37/48] drm: vc4: Reset DSI AFE on disable
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 6f603a98fc05fc062ed1d7638a16a7db63f7cce8 Mon Sep 17 00:00:00 2001
|
||||
From 403bf67e49eb5d3063346338570e5fceadc2027b Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Wed, 20 Nov 2024 13:58:08 +0000
|
||||
Subject: [PATCH 38/48] drm: vc4: dsi: Handle the different command FIFO widths
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From d3a9c9720b24aeafae9f5d8d2a13b171f8a6b6ab Mon Sep 17 00:00:00 2001
|
||||
From 1b4f1b6cce1e547900f72567cde80333cdad0f76 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Tue, 9 Jan 2024 17:37:00 +0000
|
||||
Subject: [PATCH 39/48] drm/bridge: tc358762: Program the DPI mode into the
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 5eaaddeeda3c8b203361f898cf9c49857d412c20 Mon Sep 17 00:00:00 2001
|
||||
From 76194b41b768ac593fe65e148b678518c415707c Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Tue, 9 Jan 2024 18:44:49 +0000
|
||||
Subject: [PATCH 40/48] drm/bridge: tc358762: revert move ops to enable
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user