mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-23 01:23:00 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
009b31d465 | ||
|
|
36ef190c3d | ||
|
|
600483c35b | ||
|
|
7b7baa0730 | ||
|
|
f41898d325 | ||
|
|
1168c6c8e2 | ||
|
|
f78f161dbe | ||
|
|
f0dfc6a8de | ||
|
|
ffe5ed1e32 | ||
|
|
314b0b425f | ||
|
|
985b694e51 | ||
|
|
060e0ea284 | ||
|
|
43bf6358a0 | ||
|
|
f4fd538a58 | ||
|
|
5cdabe555f | ||
|
|
60afb15488 | ||
|
|
ba010c0117 | ||
|
|
61b5c8954d | ||
|
|
40147a5265 | ||
|
|
be6cf4dcd5 | ||
|
|
bbea2bceae | ||
|
|
69fbf9e854 | ||
|
|
61d4325d2c | ||
|
|
44ade8b761 | ||
|
|
4e50c96567 | ||
|
|
c0225b7096 | ||
|
|
c31c80c154 | ||
|
|
91fc7466c2 | ||
|
|
5286c16480 | ||
|
|
fc7083dd86 | ||
|
|
8e5d49665b | ||
|
|
46fb3a061c | ||
|
|
74dcd5889f | ||
|
|
9a2f143d31 | ||
|
|
76cc1e8061 | ||
|
|
762915b703 | ||
|
|
5fd5d1254a | ||
|
|
1012759a41 | ||
|
|
925a43dead | ||
|
|
6958c9bb1a | ||
|
|
65eb4c072a | ||
|
|
c3d17586fd | ||
|
|
4c17a79de6 | ||
|
|
7fa141178f | ||
|
|
f7236fd59c | ||
|
|
aecb4546f8 | ||
|
|
9b0837100c | ||
|
|
b650d91895 | ||
|
|
68e4dc3e9b | ||
|
|
e8f14e1a06 | ||
|
|
230bd77623 | ||
|
|
0bc998c24a | ||
|
|
6618bcdf1e | ||
|
|
cf4de78d29 | ||
|
|
555de63fd6 | ||
|
|
9d4d521fa2 | ||
|
|
e994d976ff | ||
|
|
3fdbe15585 | ||
|
|
eb2135bd15 | ||
|
|
5cf180b4d7 | ||
|
|
bcc2df7e20 | ||
|
|
02a5079c6a | ||
|
|
f39e62fdb1 | ||
|
|
87c2d3fc77 | ||
|
|
ab3594e124 | ||
|
|
01cb60d125 | ||
|
|
0c35a90841 | ||
|
|
bfbf08943b | ||
|
|
21fd80a71d | ||
|
|
64819075d5 | ||
|
|
2885112da8 | ||
|
|
48a1df4c67 | ||
|
|
ed6171f920 | ||
|
|
689bd64b4d | ||
|
|
dbdf5d9b78 | ||
|
|
f13ee49f3c | ||
|
|
1b34874d3d | ||
|
|
081491a380 | ||
|
|
a19684c15c | ||
|
|
f3183cd911 | ||
|
|
e4203b0c9e | ||
|
|
3be640409a | ||
|
|
d393a10994 | ||
|
|
5e6183eb4f | ||
|
|
562435fac9 | ||
|
|
21c070b928 | ||
|
|
23da086976 | ||
|
|
3c0c456bba |
@@ -10,7 +10,7 @@ jobs:
|
||||
name: Add issue to project Infix&co
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/add-to-project@v1.0.2
|
||||
- uses: actions/add-to-project@v2
|
||||
with:
|
||||
project-url: https://github.com/orgs/kernelkit/projects/3
|
||||
github-token: ${{ secrets.ADD_TO_PROJECT }}
|
||||
|
||||
@@ -108,7 +108,7 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/download-artifact@v7
|
||||
- uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
+121
-193
@@ -1,4 +1,4 @@
|
||||
name: Create SD Card & eMMC Images
|
||||
name: Create Images
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
@@ -15,11 +15,12 @@ on:
|
||||
- bananapi-bpi-r64
|
||||
- friendlyarm-nanopi-r2s
|
||||
- microchip-sama7g54-ek
|
||||
- acer-connect-vero-w
|
||||
default: 'raspberrypi-rpi64'
|
||||
|
||||
jobs:
|
||||
create-image:
|
||||
name: Create SD Card Image for ${{ inputs.board }}
|
||||
name: Create images for ${{ inputs.board }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -50,231 +51,168 @@ jobs:
|
||||
mkdir -p output/images
|
||||
mkdir -p build
|
||||
|
||||
- name: Set bootloader and target based on board
|
||||
- name: Set bootloaders and targets based on board
|
||||
run: |
|
||||
arch=
|
||||
targets=
|
||||
bootloader_sdcard=
|
||||
bootloader_emmc=
|
||||
|
||||
case "${{ inputs.board }}" in
|
||||
raspberrypi-rpi2)
|
||||
echo "BOOTLOADER=rpi2-boot" >> $GITHUB_ENV
|
||||
echo "ARCH=arm" >> $GITHUB_ENV
|
||||
echo "BUILD_EMMC=false" >> $GITHUB_ENV
|
||||
arch=arm
|
||||
targets="sdcard"
|
||||
bootloader_sdcard=rpi2-boot
|
||||
;;
|
||||
raspberrypi-rpi64)
|
||||
echo "BOOTLOADER=rpi64-boot" >> $GITHUB_ENV
|
||||
echo "ARCH=aarch64" >> $GITHUB_ENV
|
||||
echo "BUILD_EMMC=false" >> $GITHUB_ENV
|
||||
arch=aarch64
|
||||
targets="sdcard"
|
||||
bootloader_sdcard=rpi64-boot
|
||||
;;
|
||||
bananapi-bpi-r3)
|
||||
echo "BOOTLOADER_SD=bpi-r3-sd-boot" >> $GITHUB_ENV
|
||||
echo "BOOTLOADER_EMMC=bpi-r3-emmc-boot" >> $GITHUB_ENV
|
||||
echo "ARCH=aarch64" >> $GITHUB_ENV
|
||||
echo "BUILD_EMMC=true" >> $GITHUB_ENV
|
||||
arch=aarch64
|
||||
targets="sdcard emmc"
|
||||
bootloader_sdcard=bpi-r3-sd-boot
|
||||
bootloader_emmc=bpi-r3-emmc-boot
|
||||
;;
|
||||
bananapi-bpi-r4)
|
||||
echo "BOOTLOADER_SD=bpi-r4-sd-boot" >> $GITHUB_ENV
|
||||
echo "BOOTLOADER_EMMC=bpi-r4-emmc-boot" >> $GITHUB_ENV
|
||||
echo "ARCH=aarch64" >> $GITHUB_ENV
|
||||
echo "BUILD_EMMC=true" >> $GITHUB_ENV
|
||||
arch=aarch64
|
||||
targets="sdcard emmc"
|
||||
bootloader_sdcard=bpi-r4-sd-boot
|
||||
bootloader_emmc=bpi-r4-emmc-boot
|
||||
;;
|
||||
bananapi-bpi-r64)
|
||||
echo "BOOTLOADER_SD=bpi-r64-sd-boot" >> $GITHUB_ENV
|
||||
echo "BOOTLOADER_EMMC=bpi-r64-emmc-boot" >> $GITHUB_ENV
|
||||
echo "ARCH=aarch64" >> $GITHUB_ENV
|
||||
echo "BUILD_EMMC=true" >> $GITHUB_ENV
|
||||
arch=aarch64
|
||||
targets="sdcard emmc"
|
||||
bootloader_sdcard=bpi-r64-sd-boot
|
||||
bootloader_emmc=bpi-r64-emmc-boot
|
||||
;;
|
||||
acer-connect-vero-w)
|
||||
arch=aarch64
|
||||
targets="emmc"
|
||||
bootloader_emmc=bpi-r3-emmc-boot
|
||||
;;
|
||||
friendlyarm-nanopi-r2s)
|
||||
echo "BOOTLOADER=nanopi-r2s-boot" >> $GITHUB_ENV
|
||||
echo "ARCH=aarch64" >> $GITHUB_ENV
|
||||
echo "BUILD_EMMC=false" >> $GITHUB_ENV
|
||||
arch=aarch64
|
||||
targets="sdcard"
|
||||
bootloader_sdcard=nanopi-r2s-boot
|
||||
;;
|
||||
microchip-sama7g54-ek)
|
||||
echo "BOOTLOADER_SD=sama7g54-ek-sd-boot" >> $GITHUB_ENV
|
||||
echo "BOOTLOADER_EMMC=sama7g54-ek-emmc-boot" >> $GITHUB_ENV
|
||||
echo "ARCH=arm" >> $GITHUB_ENV
|
||||
echo "BUILD_EMMC=true" >> $GITHUB_ENV
|
||||
arch=arm
|
||||
targets="sdcard emmc"
|
||||
bootloader_sdcard=sama7g54-ek-sd-boot
|
||||
bootloader_emmc=sama7g54-ek-emmc-boot
|
||||
;;
|
||||
*)
|
||||
echo "Error: Unknown board ${{ inputs.board }}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
echo "Arch: $ARCH for board: ${{ inputs.board }}"
|
||||
if [ "$BUILD_EMMC" = "true" ]; then
|
||||
echo "Building both SD and eMMC images"
|
||||
echo "SD Bootloader: $BOOTLOADER_SD"
|
||||
echo "eMMC Bootloader: $BOOTLOADER_EMMC"
|
||||
else
|
||||
echo "Building SD image only"
|
||||
echo "Bootloader: $BOOTLOADER"
|
||||
fi
|
||||
|
||||
echo "ARCH=$arch" >> $GITHUB_ENV
|
||||
echo "TARGETS=$targets" >> $GITHUB_ENV
|
||||
[ -n "$bootloader_sdcard" ] && echo "BOOTLOADER_SDCARD=$bootloader_sdcard" >> $GITHUB_ENV
|
||||
[ -n "$bootloader_emmc" ] && echo "BOOTLOADER_EMMC=$bootloader_emmc" >> $GITHUB_ENV
|
||||
|
||||
echo "Arch: $arch for board: ${{ inputs.board }}"
|
||||
echo "Targets: $targets"
|
||||
[ -n "$bootloader_sdcard" ] && echo "SD bootloader: $bootloader_sdcard"
|
||||
[ -n "$bootloader_emmc" ] && echo "eMMC bootloader: $bootloader_emmc"
|
||||
|
||||
- name: Download bootloader artifacts
|
||||
run: |
|
||||
# Download bootloader from latest-boot release tag
|
||||
if [ "$BUILD_EMMC" = "true" ]; then
|
||||
# Download both SD and eMMC bootloaders for boards that support both
|
||||
echo "Downloading SD bootloader: ${BOOTLOADER_SD}"
|
||||
gh release download latest-boot --pattern "*${BOOTLOADER_SD}*" --dir temp_bootloader_sd/
|
||||
mkdir -p output_sd/images
|
||||
cd temp_bootloader_sd/
|
||||
tar -xzf *.tar.gz --strip-components=1 -C ../output_sd/images/
|
||||
cd ../
|
||||
rm -rf temp_bootloader_sd/
|
||||
for target in $TARGETS; do
|
||||
upper=$(printf '%s' "$target" | tr '[:lower:]' '[:upper:]')
|
||||
bootloader_var="BOOTLOADER_${upper}"
|
||||
bootloader="${!bootloader_var}"
|
||||
temp_dir="temp_bootloader_${target}"
|
||||
out_dir="output_${target}/images"
|
||||
|
||||
echo "Downloading eMMC bootloader: ${BOOTLOADER_EMMC}"
|
||||
gh release download latest-boot --pattern "*${BOOTLOADER_EMMC}*" --dir temp_bootloader_emmc/
|
||||
mkdir -p output_emmc/images
|
||||
cd temp_bootloader_emmc/
|
||||
tar -xzf *.tar.gz --strip-components=1 -C ../output_emmc/images/
|
||||
cd ../
|
||||
rm -rf temp_bootloader_emmc/
|
||||
echo "Downloading ${target} bootloader: ${bootloader}"
|
||||
mkdir -p "$out_dir"
|
||||
gh release download latest-boot --pattern "*${bootloader}*" --dir "$temp_dir/"
|
||||
tar -xzf "$temp_dir"/*.tar.gz --strip-components=1 -C "$out_dir/"
|
||||
rm -rf "$temp_dir"
|
||||
|
||||
echo "SD bootloader files:"
|
||||
ls -la output_sd/images/
|
||||
echo "eMMC bootloader files:"
|
||||
ls -la output_emmc/images/
|
||||
else
|
||||
# Single bootloader for boards that only support SD
|
||||
gh release download latest-boot --pattern "*${BOOTLOADER}*" --dir temp_bootloader/
|
||||
|
||||
# Extract bootloader directly to output/images
|
||||
cd temp_bootloader/
|
||||
tar -xzf *.tar.gz --strip-components=1 -C ../output/images/
|
||||
cd ../
|
||||
rm -rf temp_bootloader/
|
||||
|
||||
echo "Bootloader files extracted to output/images:"
|
||||
ls -la output/images/
|
||||
fi
|
||||
echo "${target} bootloader files:"
|
||||
ls -la "$out_dir/"
|
||||
done
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Download Infix artifacts
|
||||
run: |
|
||||
# Download from latest Kernelkit Trigger workflow for main branch
|
||||
gh run list --workflow=164295764 --branch=main --limit=1 --status=success --json databaseId --jq '.[0].databaseId' > latest_infix_run_id
|
||||
INFIX_RUN_ID=$(cat latest_infix_run_id)
|
||||
|
||||
if [ "$BUILD_EMMC" = "true" ]; then
|
||||
# Copy Infix artifacts to both SD and eMMC output directories
|
||||
gh run download ${INFIX_RUN_ID} --name artifact-${ARCH} --dir temp_infix/
|
||||
gh run download ${INFIX_RUN_ID} --name artifact-${ARCH} --dir temp_infix/
|
||||
|
||||
cd temp_infix/
|
||||
tar -xzf *.tar.gz --strip-components=1 -C ../output_sd/images/
|
||||
tar -xzf *.tar.gz --strip-components=1 -C ../output_emmc/images/
|
||||
cd ../
|
||||
rm -rf temp_infix/
|
||||
for target in $TARGETS; do
|
||||
out_dir="output_${target}/images"
|
||||
mkdir -p "$out_dir"
|
||||
tar -xzf temp_infix/*.tar.gz --strip-components=1 -C "$out_dir/"
|
||||
|
||||
echo "Infix files extracted to output_sd/images:"
|
||||
ls -la output_sd/images/
|
||||
echo "Infix files extracted to output_emmc/images:"
|
||||
ls -la output_emmc/images/
|
||||
else
|
||||
# Single output directory for SD-only boards
|
||||
gh run download ${INFIX_RUN_ID} --name artifact-${ARCH} --dir temp_infix/
|
||||
echo "Infix files extracted to ${out_dir}:"
|
||||
ls -la "$out_dir/"
|
||||
done
|
||||
|
||||
# Extract Infix directly to output/images
|
||||
cd temp_infix/
|
||||
tar -xzf *.tar.gz --strip-components=1 -C ../output/images/
|
||||
cd ../
|
||||
rm -rf temp_infix/
|
||||
|
||||
echo "Infix files extracted to output/images:"
|
||||
ls -la output/images/
|
||||
fi
|
||||
rm -rf temp_infix/
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Verify extracted files
|
||||
run: |
|
||||
if [ "$BUILD_EMMC" = "true" ]; then
|
||||
echo "Files available for SD image:"
|
||||
ls -la output_sd/images/
|
||||
for target in $TARGETS; do
|
||||
echo "Files available for ${target} image:"
|
||||
ls -la "output_${target}/images/"
|
||||
echo ""
|
||||
echo "Files available for eMMC image:"
|
||||
ls -la output_emmc/images/
|
||||
else
|
||||
echo "Files available for mkimage.sh:"
|
||||
ls -la output/images/
|
||||
echo ""
|
||||
echo "File types:"
|
||||
file output/images/* || true
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Create SD card image
|
||||
- name: Create images
|
||||
run: |
|
||||
if [ "$BUILD_EMMC" = "true" ]; then
|
||||
export BINARIES_DIR=$PWD/output_sd/images
|
||||
export BUILD_DIR=$PWD/build
|
||||
export BR2_EXTERNAL_INFIX_PATH=$PWD
|
||||
export RELEASE=""
|
||||
export INFIX_ID="infix"
|
||||
./utils/mkimage.sh -t sdcard ${{ inputs.board }}
|
||||
else
|
||||
export BINARIES_DIR=$PWD/output/images
|
||||
export BUILD_DIR=$PWD/build
|
||||
export BR2_EXTERNAL_INFIX_PATH=$PWD
|
||||
export RELEASE=""
|
||||
export INFIX_ID="infix"
|
||||
./utils/mkimage.sh -t sdcard ${{ inputs.board }}
|
||||
fi
|
||||
|
||||
- name: Create eMMC image
|
||||
if: ${{ env.BUILD_EMMC == 'true' }}
|
||||
run: |
|
||||
export BINARIES_DIR=$PWD/output_emmc/images
|
||||
export BUILD_DIR=$PWD/build
|
||||
export BR2_EXTERNAL_INFIX_PATH=$PWD
|
||||
export RELEASE=""
|
||||
export INFIX_ID="infix"
|
||||
./utils/mkimage.sh -t emmc ${{ inputs.board }}
|
||||
|
||||
for target in $TARGETS; do
|
||||
export BINARIES_DIR=$PWD/output_${target}/images
|
||||
./utils/mkimage.sh -t "$target" ${{ inputs.board }}
|
||||
done
|
||||
|
||||
- name: Verify created images
|
||||
run: |
|
||||
if [ "$BUILD_EMMC" = "true" ]; then
|
||||
echo "SD card image:"
|
||||
ls -lh output_sd/images/*-sdcard.img* 2>/dev/null || true
|
||||
if ls output_sd/images/*-sdcard.img 1> /dev/null 2>&1; then
|
||||
for img in output_sd/images/*-sdcard.img; do
|
||||
echo "- $(basename $img)"
|
||||
file "$img"
|
||||
fdisk -l "$img" 2>/dev/null | head -20
|
||||
done
|
||||
fi
|
||||
mkdir -p output/images
|
||||
|
||||
echo ""
|
||||
echo "eMMC image:"
|
||||
ls -lh output_emmc/images/*-emmc.img* 2>/dev/null || true
|
||||
if ls output_emmc/images/*-emmc.img 1> /dev/null 2>&1; then
|
||||
for img in output_emmc/images/*-emmc.img; do
|
||||
echo "- $(basename $img)"
|
||||
file "$img"
|
||||
fdisk -l "$img" 2>/dev/null | head -20
|
||||
done
|
||||
fi
|
||||
for target in $TARGETS; do
|
||||
src_dir="output_${target}/images"
|
||||
found=false
|
||||
|
||||
# Copy both images to output/images for artifact upload
|
||||
mkdir -p output/images
|
||||
cp output_sd/images/*-sdcard.img* output/images/ 2>/dev/null || true
|
||||
cp output_emmc/images/*-emmc.img* output/images/ 2>/dev/null || true
|
||||
else
|
||||
echo "Contents of output/images after mkimage.sh:"
|
||||
ls -lh output/images/
|
||||
echo "${target} image:"
|
||||
ls -lh "$src_dir"/*-"$target".img* 2>/dev/null || true
|
||||
|
||||
# Look for SD card image with pattern: *-sdcard.img
|
||||
if ls output/images/*-sdcard.img 1> /dev/null 2>&1; then
|
||||
echo "Found SD card image(s):"
|
||||
for img in output/images/*-sdcard.img; do
|
||||
echo "- $(basename $img)"
|
||||
file "$img"
|
||||
fdisk -l "$img" 2>/dev/null || true
|
||||
done
|
||||
else
|
||||
echo "No SD card image found matching pattern: *-sdcard.img"
|
||||
echo "Available files:"
|
||||
ls -la output/images/
|
||||
for img in "$src_dir"/*-"$target".img; do
|
||||
[ -e "$img" ] || continue
|
||||
found=true
|
||||
echo "- $(basename "$img")"
|
||||
file "$img"
|
||||
fdisk -l "$img" 2>/dev/null || true
|
||||
done
|
||||
|
||||
if [ "$found" = false ]; then
|
||||
echo "No ${target} image found matching pattern: *-${target}.img"
|
||||
echo "Available files in ${src_dir}:"
|
||||
ls -la "$src_dir/"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
for artifact in "$src_dir"/*-"$target".img*; do
|
||||
[ -e "$artifact" ] || continue
|
||||
cp "$artifact" output/images/
|
||||
done
|
||||
|
||||
echo ""
|
||||
done
|
||||
|
||||
- name: Upload images as artifacts
|
||||
uses: actions/upload-artifact@v7
|
||||
@@ -308,37 +246,27 @@ jobs:
|
||||
|
||||
- name: Generate summary
|
||||
run: |
|
||||
if [ "$BUILD_EMMC" = "true" ]; then
|
||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
||||
# SD Card & eMMC Image Build Complete! 🚀
|
||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
||||
# Image Build Complete! 🚀
|
||||
|
||||
**Board:** ${{ inputs.board }}
|
||||
**Arch:** ${{ env.ARCH }}
|
||||
**SD Bootloader:** ${{ env.BOOTLOADER_SD }}
|
||||
**eMMC Bootloader:** ${{ env.BOOTLOADER_EMMC }}
|
||||
**Targets:** ${{ env.TARGETS }}
|
||||
**Bootloader Source:** latest-boot release
|
||||
**Infix Source:** Latest workflow run on main
|
||||
|
||||
## Bootloaders
|
||||
$(for target in $TARGETS; do
|
||||
case "$target" in
|
||||
sdcard) bootloader="$BOOTLOADER_SDCARD" ;;
|
||||
emmc) bootloader="$BOOTLOADER_EMMC" ;;
|
||||
esac
|
||||
printf -- '- %s: %s\n' "$target" "$bootloader"
|
||||
done)
|
||||
|
||||
## Created Images
|
||||
$(find output/images/ -name "*.img" -o -name "*.img.bmap" | xargs ls -lh 2>/dev/null | awk '{print "- " $9 " (" $5 ")"}' || echo "- No images found")
|
||||
|
||||
## Download
|
||||
Both SD card and eMMC images are available as workflow artifacts above and in the latest-boot release.
|
||||
The generated images are available as workflow artifacts above and in the latest-boot release.
|
||||
EOF
|
||||
else
|
||||
cat <<EOF >> $GITHUB_STEP_SUMMARY
|
||||
# SD Card Image Build Complete! 🚀
|
||||
|
||||
**Board:** ${{ inputs.board }}
|
||||
**Arch:** ${{ env.ARCH }}
|
||||
**Bootloader:** ${{ env.BOOTLOADER }}
|
||||
**Bootloader Source:** latest-boot release
|
||||
**Infix Source:** Latest workflow run on main
|
||||
|
||||
## Created Images
|
||||
$(find output/images/ -name "*.img" -o -name "*.img.bmap" | xargs ls -lh 2>/dev/null | awk '{print "- " $9 " (" $5 ")"}' || echo "- No images found")
|
||||
|
||||
## Download
|
||||
The SD card image is available as a workflow artifact above.
|
||||
EOF
|
||||
fi
|
||||
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Create pull request
|
||||
if: steps.check.outputs.new_release == 'true'
|
||||
uses: actions/github-script@v8
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
github-token: ${{ secrets.KERNEL_UPDATE_TOKEN }}
|
||||
script: |
|
||||
|
||||
@@ -11,7 +11,7 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/download-artifact@v4
|
||||
- uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
@@ -78,7 +78,7 @@ jobs:
|
||||
echo "pre=${{ steps.rel.outputs.pre }}"
|
||||
echo "latest=${{ steps.rel.outputs.latest }}"
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
- uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
@@ -98,7 +98,7 @@ jobs:
|
||||
run: |
|
||||
make ${{ env.TARGET }}_defconfig
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
- uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/download-artifact@v6
|
||||
- uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: "artifact-*"
|
||||
merge-multiple: true
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
if BR2_aarch64
|
||||
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/alder-alder/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/acer-connect-vero-w6m/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/bananapi-bpi-r3/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/bananapi-bpi-r4/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/bananapi-bpi-r64/Config.in"
|
||||
|
||||
@@ -4,6 +4,7 @@ aarch64
|
||||
Board Specific Documentation
|
||||
----------------------------
|
||||
|
||||
- [Acer Connect Vero W6m](acer-connect-vero-w6m/)
|
||||
- [Banana Pi BPi-R3](bananapi-bpi-r3/)
|
||||
- [Banana Pi BPi-R4](bananapi-bpi-r4/)
|
||||
- [Banana Pi BPi-R64](bananapi-bpi-r64/)
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
config BR2_PACKAGE_ACER_CONNECT_VERO_W6M
|
||||
bool "Acer Connect Vero W6m"
|
||||
depends on BR2_aarch64
|
||||
select BR2_PACKAGE_BANANAPI_BPI_R3
|
||||
help
|
||||
Build Acer Connect Vero W6m
|
||||
@@ -0,0 +1,13 @@
|
||||
Copyright (c) 2026 The KernelKit Authors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
@@ -0,0 +1,131 @@
|
||||
# Acer Connect Vero W6m
|
||||
|
||||
<img src="connect_vero_w6m_case.jpg" alt="Acer Connect Vero W6m" width=400 padding=10>
|
||||
|
||||
## Overview
|
||||
|
||||
The Acer Connect Vero W6m is a compact WiFi 6/6E router platform based
|
||||
on the MediaTek MT7986A SoC. In Infix it is supported as an eMMC-based
|
||||
target that reuses the factory secure boot chain while replacing the
|
||||
system partitions with an Infix installation.
|
||||
|
||||
The Acer Connect Vero W6m is based on the same MT7986a SoC as the
|
||||
BPI-R3, with tri-band WiFi (2.4 GHz + 5 GHz + 6 GHz) using a PCIe
|
||||
MT7916 module and the SoC's built-in MT7976 DBDC radio.
|
||||
|
||||
## Default WiFi Layout
|
||||
|
||||
The factory configuration on this branch enables all three radios in AP
|
||||
mode and bridges them into the default LAN bridge `br0`:
|
||||
|
||||
- `radio0` / `wifi0-ap`: 2.4 GHz, SSID `Infix`
|
||||
- `radio1` / `wifi1-ap`: 6 GHz, SSID `Infix6G`
|
||||
- `radio2` / `wifi2-ap`: 5 GHz, SSID `Infix5G`
|
||||
|
||||
6 GHz operation is enabled in the MT7915e driver configuration, and all
|
||||
three APs use the same default passphrase `infixinfix` from the factory
|
||||
configuration.
|
||||
|
||||
Secure boot is enabled on this device, so the factory bootloader
|
||||
(partitions 1-4: bl2, u-boot-env, factory, fip) must not be modified.
|
||||
Infix is installed by replacing partitions 5+ while keeping the
|
||||
factory bootloader intact. The stock U-Boot chainloads the Infix
|
||||
U-Boot from the first partition after fip.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Serial console access (115200 8N1) — required to interrupt U-Boot.
|
||||
Disassembly is needed to reach the UART header. See the [OpenWrt
|
||||
Vero W6m page][vero-openwrt] for details.
|
||||
- TFTP server on the local network with `u-boot.bin` for the initial
|
||||
RAM boot.
|
||||
- SSH access from the running Infix system to a host that stores
|
||||
`infix-vero-w-emmc.img`.
|
||||
- Ethernet cable connected between the PC and the Vero Internet/WAN
|
||||
port.
|
||||
- DHCP server running on the PC, serving addresses on that link during
|
||||
installation.
|
||||
- **Save the MAC addresses** from the stock U-Boot environment before
|
||||
installing. Interrupt autoboot and run `printenv` to note down:
|
||||
`2gMAC`, `5gMAC`, `6gMAC`, `LANMAC`, and `WANMAC`.
|
||||
|
||||
## Required Files
|
||||
|
||||
Prepare these files on a host reachable from the Vero:
|
||||
|
||||
1. **Infix Vero image:**
|
||||
- [infix-vero-w-emmc.img][1] (Complete system image)
|
||||
2. **eMMC bootloader** (extracted from):
|
||||
- [bpi-r3-emmc-boot-2025.01-latest.tar.gz][2]
|
||||
- Extract `u-boot.bin` from the tarball to your TFTP server
|
||||
|
||||
## Installing Infix
|
||||
|
||||
Connect the PC directly to the Vero Internet/WAN port before starting
|
||||
the installation. The PC should provide DHCP service on that link so
|
||||
the stock U-Boot and the temporary Infix system can reach the TFTP/SSH
|
||||
host.
|
||||
|
||||
1. **RAM-load Infix U-Boot** from the stock U-Boot serial console
|
||||
(hit any key to stop autoboot):
|
||||
|
||||
```
|
||||
setenv serverip <TFTP_SERVER_IP>
|
||||
setenv ipaddr <VERO_IP>
|
||||
setenv bootmenu_default 7
|
||||
tftpboot 0x46000000 u-boot.bin
|
||||
go 0x46000000
|
||||
```
|
||||
|
||||
`serverip` must point to your TFTP server and `ipaddr` must be a free
|
||||
address for the Vero on the same subnet. `bootmenu_default 7`
|
||||
bypasses secure boot verification. The Infix U-Boot will
|
||||
automatically netboot the Infix system.
|
||||
|
||||
2. **From running Infix**, stream the image directly to eMMC:
|
||||
|
||||
```bash
|
||||
ssh <USER>@<HOST> "dd if=/path/to/infix-vero-w-emmc.img bs=512 skip=17408 status=none" | \
|
||||
dd of=/dev/mmcblk0 bs=512 seek=17408 conv=fsync
|
||||
sync
|
||||
```
|
||||
|
||||
This writes only the Infix partitions (starting after fip at sector
|
||||
17408), leaving the factory bootloader and calibration data intact.
|
||||
Do not interrupt the transfer; if it fails, rerun the command from
|
||||
the beginning.
|
||||
|
||||
3. **Update the GPT** to replace stock partitions 5+ with the Infix
|
||||
layout:
|
||||
|
||||
```bash
|
||||
sudo sgdisk --zap-all /dev/mmcblk0
|
||||
sudo sgdisk -a 1 \
|
||||
-n2:8192:9215 -c2:u-boot-env \
|
||||
-n3:9216:13311 -c3:factory \
|
||||
-n4:13312:17407 -c4:fip \
|
||||
-n5:17408:+32M -c5:infix-uboot \
|
||||
-n6:0:+8M -c6:aux \
|
||||
-n7:0:+250M -c7:primary \
|
||||
-n8:0:+250M -c8:secondary \
|
||||
-n9:0:+128M -c9:cfg \
|
||||
-n10:0:+128M -c10:var \
|
||||
-p /dev/mmcblk0
|
||||
```
|
||||
|
||||
4. **Configure U-Boot to chainload Infix permanently** — reboot and
|
||||
interrupt stock U-Boot again:
|
||||
|
||||
```
|
||||
setenv bootmenu_default 7
|
||||
setenv bootcmd 'mmc read 0x46000000 0x4400 0x10000; go 0x46000000'
|
||||
saveenv
|
||||
reset
|
||||
```
|
||||
|
||||
The `bootcmd` reads the Infix U-Boot (at sector 0x4400/17408)
|
||||
into RAM and jumps to it. After `reset`, Infix boots from eMMC.
|
||||
|
||||
[vero-openwrt]: https://openwrt.org/toh/acer/predator_vero_w6m
|
||||
[1]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-vero-w-emmc.img
|
||||
[2]: https://github.com/kernelkit/infix/releases/download/latest-boot/bpi-r3-emmc-boot-2025.01-latest.tar.gz
|
||||
@@ -0,0 +1,2 @@
|
||||
# Locally calculated
|
||||
sha256 d48246c717b505cc11df95171f2fd548b389e1a463f1af4c68d0b69fe0d1009b LICENSE
|
||||
@@ -0,0 +1,2 @@
|
||||
$(eval $(ix-board))
|
||||
$(eval $(generic-package))
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1 @@
|
||||
dtb-y += mediatek/mt7986a-acer-connect-vero-w6m.dtb
|
||||
+425
@@ -0,0 +1,425 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
#include <dt-bindings/pinctrl/mt65xx.h>
|
||||
|
||||
#include <arm64/mediatek/mt7986a.dtsi>
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
infix {
|
||||
/* Default admin user password: 'admin' */
|
||||
factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A";
|
||||
};
|
||||
};
|
||||
|
||||
memory@40000000 {
|
||||
reg = <0 0x40000000 0 0x20000000>;
|
||||
device_type = "memory";
|
||||
};
|
||||
|
||||
reg_1p8v: regulator-1p8v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-1.8V";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
reg_3p3v: regulator-3p3v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-3.3V";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
reg_5v: regulator-5v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "fixed-5V";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
factory {
|
||||
label = "factory";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&pio 9 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wps {
|
||||
label = "wps";
|
||||
linux,code = <KEY_WPS_BUTTON>;
|
||||
gpios = <&pio 10 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pio {
|
||||
wifi_rst_hog: wifi-reset-hog {
|
||||
gpio-hog;
|
||||
gpios = <6 GPIO_ACTIVE_LOW>;
|
||||
output-low;
|
||||
line-name = "wifi-reset";
|
||||
};
|
||||
|
||||
mmc0_pins_default: mmc0-pins {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc_51";
|
||||
};
|
||||
|
||||
conf-cmd-dat {
|
||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||
input-enable;
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
||||
};
|
||||
|
||||
conf-ds {
|
||||
pins = "EMMC_DSL";
|
||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
||||
};
|
||||
|
||||
conf-rst {
|
||||
pins = "EMMC_RSTB";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_pins_uhs: mmc0-uhs-pins {
|
||||
mux {
|
||||
function = "emmc";
|
||||
groups = "emmc_51";
|
||||
};
|
||||
|
||||
conf-cmd-dat {
|
||||
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
|
||||
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
|
||||
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
|
||||
input-enable;
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
||||
};
|
||||
|
||||
conf-clk {
|
||||
pins = "EMMC_CK";
|
||||
drive-strength = <MTK_DRIVE_6mA>;
|
||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
||||
};
|
||||
|
||||
conf-ds {
|
||||
pins = "EMMC_DSL";
|
||||
bias-pull-down = <MTK_PUPD_SET_R1R0_10>; /* pull-down 50K */
|
||||
};
|
||||
|
||||
conf-rst {
|
||||
pins = "EMMC_RSTB";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
bias-pull-up = <MTK_PUPD_SET_R1R0_01>; /* pull-up 10K */
|
||||
};
|
||||
};
|
||||
|
||||
pcie_pins: pcie-pins {
|
||||
mux {
|
||||
function = "pcie";
|
||||
groups = "pcie_pereset";
|
||||
};
|
||||
};
|
||||
|
||||
wf_2g_5g_pins: wf_2g_5g-pins {
|
||||
mux {
|
||||
function = "wifi";
|
||||
groups = "wf_2g", "wf_5g";
|
||||
};
|
||||
conf {
|
||||
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
||||
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
||||
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
||||
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
||||
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
||||
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
||||
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
};
|
||||
};
|
||||
|
||||
wf_dbdc_pins: wf-dbdc-pins {
|
||||
mux {
|
||||
function = "wifi";
|
||||
groups = "wf_dbdc";
|
||||
};
|
||||
conf {
|
||||
pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
|
||||
"WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
|
||||
"WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
|
||||
"WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
|
||||
"WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
|
||||
"WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
|
||||
"WF1_TOP_CLK", "WF1_TOP_DATA";
|
||||
drive-strength = <MTK_DRIVE_4mA>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c_pins: i2c-pins {
|
||||
mux {
|
||||
function = "i2c";
|
||||
groups = "i2c";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&trng {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&crypto {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mmc0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&mmc0_pins_default>;
|
||||
pinctrl-1 = <&mmc0_pins_uhs>;
|
||||
bus-width = <0x08>;
|
||||
max-frequency = <200000000>;
|
||||
cap-mmc-highspeed;
|
||||
mmc-hs200-1_8v;
|
||||
mmc-hs400-1_8v;
|
||||
hs400-ds-delay = <0x14014>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
vqmmc-supply = <®_1p8v>;
|
||||
non-removable;
|
||||
no-sd;
|
||||
no-sdio;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
card@0 {
|
||||
compatible = "mmc-card";
|
||||
reg = <0>;
|
||||
|
||||
block {
|
||||
compatible = "block-device";
|
||||
|
||||
partitions {
|
||||
block-partition-factory {
|
||||
partname = "factory";
|
||||
|
||||
nvmem: nvmem-layout {
|
||||
compatible = "fixed-layout";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
eeprom_factory_0: eeprom@0 {
|
||||
reg = <0x0 0x1000>;
|
||||
};
|
||||
|
||||
precal_factory_1010: precal@1010 {
|
||||
reg = <0x1010 0x62810>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_pins>;
|
||||
num-lanes = <1>;
|
||||
status = "okay";
|
||||
|
||||
slot0: pcie@0,0 {
|
||||
reg = <0x0000 0 0 0 0>;
|
||||
#address-cells = <0x03>;
|
||||
#size-cells = <0x02>;
|
||||
|
||||
pcie_wifi: wifi@0,0 {
|
||||
compatible = "mediatek,mt76";
|
||||
reg = <0x0000 0 0 0 0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie_port {
|
||||
clocks = <&clk40m>, <&topckgen CLK_TOP_PCIE_PHY_SEL>;
|
||||
clock-names = "ref", "da_ref";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio-bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
switch: switch@1f {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 5 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
swport0: port@0 {
|
||||
reg = <0>;
|
||||
phy-handle = <&swphy0>;
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan1";
|
||||
phy-handle = <&swphy1>;
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan2";
|
||||
phy-handle = <&swphy2>;
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan3";
|
||||
phy-handle = <&swphy3>;
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
swphy0: phy@0 {
|
||||
reg = <0>;
|
||||
|
||||
mediatek,led-config = <
|
||||
0x21 0x8008 /* BASIC_CTRL */
|
||||
0x22 0x0c00 /* ON_DURATION */
|
||||
0x23 0x1400 /* BLINK_DURATION */
|
||||
0x24 0xc001 /* LED0_ON_CTRL */
|
||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
||||
0x26 0xc006 /* LED1_ON_CTRL */
|
||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
||||
>;
|
||||
};
|
||||
|
||||
swphy1: phy@1 {
|
||||
reg = <1>;
|
||||
|
||||
mediatek,led-config = <
|
||||
0x21 0x8008 /* BASIC_CTRL */
|
||||
0x22 0x0c00 /* ON_DURATION */
|
||||
0x23 0x1400 /* BLINK_DURATION */
|
||||
0x24 0xc001 /* LED0_ON_CTRL */
|
||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
||||
0x26 0xc006 /* LED1_ON_CTRL */
|
||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
||||
>;
|
||||
};
|
||||
|
||||
swphy2: phy@2 {
|
||||
reg = <2>;
|
||||
|
||||
mediatek,led-config = <
|
||||
0x21 0x8008 /* BASIC_CTRL */
|
||||
0x22 0x0c00 /* ON_DURATION */
|
||||
0x23 0x1400 /* BLINK_DURATION */
|
||||
0x24 0xc001 /* LED0_ON_CTRL */
|
||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
||||
0x26 0xc006 /* LED1_ON_CTRL */
|
||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
||||
>;
|
||||
};
|
||||
|
||||
swphy3: phy@3 {
|
||||
reg = <3>;
|
||||
|
||||
mediatek,led-config = <
|
||||
0x21 0x8008 /* BASIC_CTRL */
|
||||
0x22 0x0c00 /* ON_DURATION */
|
||||
0x23 0x1400 /* BLINK_DURATION */
|
||||
0x24 0xc001 /* LED0_ON_CTRL */
|
||||
0x25 0x0003 /* LED0_BLINK_CTRL */
|
||||
0x26 0xc006 /* LED1_ON_CTRL */
|
||||
0x27 0x003c /* LED1_BLINK_CTRL */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&wifi {
|
||||
nvmem-cells = <&eeprom_factory_0>, <&precal_factory_1010>;
|
||||
nvmem-cell-names = "eeprom", "precal";
|
||||
pinctrl-names = "default", "dbdc";
|
||||
pinctrl-0 = <&wf_2g_5g_pins>;
|
||||
pinctrl-1 = <&wf_dbdc_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
+263
@@ -0,0 +1,263 @@
|
||||
/* Factory EEPROM for MT7976 WMAC (DBDC) - Acer Connect Vero W */
|
||||
/* Band 1 patched from 5GHz-only to 5GHz+6GHz selectable */
|
||||
|
||||
&wifi {
|
||||
mediatek,eeprom-data = <
|
||||
0x86790100 0x000c4326 0x60100000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x01000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000800 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x12525353 0x003c003f 0x3a100700 0x15030000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x0000be00 0x00000000
|
||||
0x0000c100 0x00000000 0x00000000 0xc3000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000009 0x00000000 0x00000000
|
||||
0x00000000 0x00000303 0x03030303 0x03030303
|
||||
0x03030303 0x03030303 0x03040303 0x03040303
|
||||
0x03040303 0x03040000 0x00161b18 0x1b1a1a1a
|
||||
0x1a0d0008 0x0f0d0209 0x0e0d0209 0x0e0d0209
|
||||
0x0e0c020a 0x0e0c020a 0x0e0c020a 0x0e0b020b
|
||||
0x0e2b2b2b 0x2b222222 0x22222222 0x22222222
|
||||
0x22222222 0x22222222 0x22000000 0x00000000
|
||||
0x00000000 0x002a2a2a 0x2a282828 0x282a2a2a
|
||||
0x2a282828 0x282a2a2a 0x2a282828 0x282a2a2a
|
||||
0x2a282828 0x28000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x007f7f20 0x2530363c 0x41014847 0x4c52575c
|
||||
0x7f7f7f7f 0x1b222a33 0x3a40014d 0x464c525a
|
||||
0x5e7f7f7f 0x7f252834 0x3c424a01 0x4a4f555d
|
||||
0x636e7f7f 0x7f7f202a 0x303b444a 0x014a5158
|
||||
0x5f666e7f 0x7f7f7f7f 0x8080c5c5 0xd1d1dddd
|
||||
0xe5e5f3f3 0x40408080 0xcfcfdbdb 0xe3e3efef
|
||||
0xf7f74040 0x8080bfbf 0xcbcbd9d9 0xe5e5eded
|
||||
0x40408080 0xb9b9c5c5 0xd3d3dfdf 0xe7e74040
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0xc0a0c0e0 0xfcfcafe0 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x02200220 0x02200220 0x02300230 0x02300230
|
||||
0x02300230 0x02300230 0x02300230 0x02300230
|
||||
0x02240224 0x02240224 0x02240224 0x02240224
|
||||
0x02240224 0x02240224 0x02240224 0x02240224
|
||||
0x000000c4 0xc4c4c4c4 0x0000c4c4 0xc4c4c1c1
|
||||
0x008282c3 0xc3000000 0x00838300 0xc4c4c4c1
|
||||
0xc1008282 0x8383c3c3 0xc2c10000 0x83838484
|
||||
0xc4c4c4c1 0xc1008282 0x8383c4c4 0xc4c1c100
|
||||
0x82828383 0xc4c4c4c1 0xc1008282 0x8383c4c4
|
||||
0xc3c100c4 0x81c4c3c2 0x00818181 0xc4c4c3c2
|
||||
0x00818282 0x00c4c4c2 0xc2008182 0x8200c4c4
|
||||
0xc3c20081 0x82828484 0xc4c4c3c2 0x00818282
|
||||
0x8484c4c4 0xc2c20081 0x82828484 0xc4c4c2c1
|
||||
0x81828383 0x8585c4c4 0xc3c20081 0x82828484
|
||||
0xc4c4c3c2 0x00818282 0x8484c4c4 0xc3c20081
|
||||
0x82828484 0xc6c5c3c1 0x00c5c5c3 0xc2008182
|
||||
0x828484c5 0xc5c3c200 0x81828284 0x84c4c4c3
|
||||
0xc2008182 0x828484c4 0xc4c2c181 0x82838385
|
||||
0x85c5c5c3 0xc2008182 0x828484c5 0xc5c3c200
|
||||
0x81828284 0x84c5c5c3 0xc2008182 0x82848400
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x378a6e05 0x0ae64a6c 0x00000000 0x50050000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00b40000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x86828786 0x87c8cb8a 0x8380c982 0x00c8ca86
|
||||
0x8383c583 0x83c1c58c 0x8883c78b 0x8780c28c
|
||||
0x8485c682 0xc3c4c4c4 0xc5c6c7c8 0xcfcecdcc
|
||||
0xcccdcec1 0xc1c1c1c2 0xc4c6c7ce 0xcecfcfcf
|
||||
0xcecec6c7 0xc8c9caca 0xcbcbd2d2 0xd2d2d0ce
|
||||
0xcc8100c1 0xc3c5c6c7 0xc8d0d0d1 0xd1d1d0cf
|
||||
0xdeee6be7 0x5fede2eb 0xce08ce09 0xce0ace0a
|
||||
0x4e0b4f0b 0x4f0c4f0c 0x4f0d4f0d 0x540a540b
|
||||
0x540c540b 0x540c510a 0x510b510c 0xd10c510d
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0xde0fde10 0xde115e12
|
||||
0xde12de12 0xde135e14 0x5e0cde0d 0xde0e5e10
|
||||
0x5e105e10 0x5e11de11 0xde0ede0f 0xde10de11
|
||||
0x5e12de12 0x5e135e13 0xde0f5e11 0x5e12de13
|
||||
0x5e13de13 0xde14de14 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00848484 0x84848484 0x84000000 0x00e4d5d4
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
>;
|
||||
};
|
||||
+263
@@ -0,0 +1,263 @@
|
||||
/* Factory EEPROM for PCIe MT7916 radio - Acer Connect Vero W */
|
||||
/* Offset 0xa0000 in the "factory" GPT partition on eMMC */
|
||||
|
||||
&pcie_wifi {
|
||||
mediatek,eeprom-data = <
|
||||
0x16790000 0x000c4326 0x60000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x50750000 0x07670700 0x00000400 0x50710000
|
||||
0x00000000 0x00000400 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0xb101e748 0xf57f5e99
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000800 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x12924848 0x003e003f 0x3a100000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x81a3a380
|
||||
0xa4910091 0x00910091 0x00910000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x000a0000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x0000c500 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000013 0x12120000 0x00000000
|
||||
0x00000000 0x00000303 0x03030303 0x03030303
|
||||
0x03030303 0x03030505 0x05050505 0x05050505
|
||||
0x05050505 0x05050000 0x001b1919 0x19181818
|
||||
0x180f0006 0x1c0e080a 0x170e080a 0x170d0809
|
||||
0x170d020a 0x0e0d020a 0x0e0d020a 0x0e0b020a
|
||||
0x0e22222c 0x2c2b2b2b 0x2b2b2b2b 0x2b2b2b2b
|
||||
0x2b2b2b2b 0x2b2b2b2b 0x2b000000 0x00000000
|
||||
0x00000000 0x001e201e 0x201e2020 0x201e201e
|
||||
0x20201e20 0x20272929 0x29272727 0x27272929
|
||||
0x29272727 0x27000000 0x00000000 0x00000000
|
||||
0x00000000 0x00cdcfcf 0xcfcfcf00 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x007f7f20 0x2530363c 0x41014347 0x4c52575c
|
||||
0x7f7f0000 0x00000000 0x00000000 0x00000000
|
||||
0x0000007f 0x7f252834 0x3c424a01 0x4d4f555f
|
||||
0x636e7f7f 0x7f7f202a 0x303b444a 0x014d5158
|
||||
0x5f666e7f 0x7f7f7f7f 0x8080c5c5 0xcbcbd9d9
|
||||
0xe1e1ebeb 0x40408080 0xcfcfdbdb 0xe3e3efef
|
||||
0xf7f74040 0x8080c1c1 0xcdcdd5d5 0xe1e1eded
|
||||
0x40408080 0xbbbbc7c7 0xcfcfdbdb 0xe7e74040
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0xb0900000 0x0000c0f0 0xf8000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x02000200 0x02000200 0x02000200 0x02000200
|
||||
0x02000200 0x02000200 0x02000200 0x02000200
|
||||
0x02000200 0x02000200 0x02000200 0x02000200
|
||||
0x02000200 0x02000200 0x02000200 0x02000200
|
||||
0x000000c6 0xc6c6c6c4 0x0000c5c5 0xc5c4c1c1
|
||||
0x818383c3 0xc3c2c100 0x81848400 0xc5c5c4c1
|
||||
0xc1818383 0x8585c3c3 0xc2c10081 0x84848686
|
||||
0xc5c5c4c1 0xc1818383 0x8585c5c5 0xc4c1c181
|
||||
0x83838585 0xc5c5c4c1 0xc1818383 0x8585c6c6
|
||||
0xc4c300c6 0x00c6c4c3 0xc1008181 0xc6c6c4c3
|
||||
0xc1008181 0x00c5c5c3 0xc2008182 0x8200c6c6
|
||||
0xc4c3c100 0x81818686 0xc6c6c4c3 0xc1008181
|
||||
0x8686c5c5 0xc3c20081 0x82828787 0xc5c5c3c2
|
||||
0x00818282 0x8787c6c6 0xc4c3c100 0x81818686
|
||||
0xc6c6c4c3 0xc1008181 0x8686c6c6 0xc4c3c100
|
||||
0x81818686 0xc6c6c4c3 0x00c6c6c4 0xc3c10081
|
||||
0x818686c6 0xc6c4c3c1 0x00818186 0x86c5c5c3
|
||||
0xc2008182 0x828787c5 0xc5c3c281 0x82838388
|
||||
0x88c6c6c4 0xc3c10081 0x818686c6 0xc6c4c3c1
|
||||
0x00818186 0x86c6c6c4 0xc3c10081 0x81868600
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00b70000 0x00b70000 0x00000000 0x00000000
|
||||
0x01000000 0x0000c400 0xb8008700 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0xc7c60000 0x89898987 0x87858381 0x898a8b8b
|
||||
0x8a898785 0x88898988 0x87868584 0x00000000
|
||||
0x00000000 0xcccfcecd 0xcdcacecd 0xcbcfcece
|
||||
0xcfcfcfc7 0xcececdce 0xc7cfcec7 0xcfcfcfcf
|
||||
0xcfcf0000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x7fe2f0e4 0x00000000 0xa4de24df 0xa4e0a4e1
|
||||
0xa4e1a4de 0x24dfa4e0 0xa4e1a4e1 0xa4dea4df
|
||||
0xa4e0a4e1 0xa4e1a4de 0xa4df24e0 0xa4e1a4e1
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0xde0fde0f 0xde0fde10
|
||||
0xde11de11 0x5e12de12 0xde10de10 0xde10de11
|
||||
0xde12de12 0xde13de13 0x5a085a09 0x5a0a5a0a
|
||||
0x5a0a5a0a 0x5a0a5a0a 0x5a055a06 0x5a075a08
|
||||
0x5a085a09 0x5a095a09 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00ded453
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
0x00000000 0x00000000 0x00000000 0x00000000
|
||||
>;
|
||||
};
|
||||
@@ -0,0 +1,63 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
/dts-v1/;
|
||||
#include "mt7986a-acer-connect-vero-w6m-common.dtsi"
|
||||
#include "mt7986a-acer-connect-vero-w6m-pcie-eeprom.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Acer Connect Vero W6m";
|
||||
compatible = "acer,connect-vero-w", "mediatek,mt7986a";
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
led-boot = &led_status;
|
||||
led-failsafe = &led_status;
|
||||
led-running = &led_status;
|
||||
led-upgrade = &led_status;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
led-controller@30 {
|
||||
compatible = "kinetic,ktd2026";
|
||||
reg = <0x30>;
|
||||
vin-supply = <®_5v>;
|
||||
vio-supply = <®_3p3v>;
|
||||
|
||||
led_status: multi-led {
|
||||
color = <LED_COLOR_ID_RGB>;
|
||||
function = LED_FUNCTION_STATUS;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
led@0 {
|
||||
reg = <0>;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
};
|
||||
|
||||
led@1 {
|
||||
reg = <1>;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
};
|
||||
|
||||
led@2 {
|
||||
reg = <2>;
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&nvmem {
|
||||
eeprom_factory_a0000: eeprom@a0000 {
|
||||
reg = <0xa0000 0x1000>;
|
||||
};
|
||||
|
||||
precal_factory_a1010: precal@a1010 {
|
||||
reg = <0xa1010 0x62810>;
|
||||
};
|
||||
};
|
||||
|
||||
&swport0 {
|
||||
label = "internet";
|
||||
};
|
||||
@@ -0,0 +1,86 @@
|
||||
image cfg.ext4 {
|
||||
empty = true
|
||||
temporary = true
|
||||
size = 128M
|
||||
ext4 {
|
||||
label = "cfg"
|
||||
use-mke2fs = true
|
||||
features = "uninit_bg"
|
||||
extraargs = "-m 0 -i 4096"
|
||||
}
|
||||
}
|
||||
|
||||
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#-vero-w-#TARGET#.img {
|
||||
hdimage {
|
||||
partition-table-type = "gpt"
|
||||
gpt-no-backup = true
|
||||
}
|
||||
|
||||
/*
|
||||
* Factory partitions (1-4) -- secure boot, do not overwrite.
|
||||
* Offsets and sizes match the stock Acer GPT exactly.
|
||||
* No image data is written, preserving factory content.
|
||||
*/
|
||||
partition u-boot-env {
|
||||
offset = 8192s
|
||||
size = 1024s
|
||||
}
|
||||
|
||||
partition factory {
|
||||
offset = 9216s
|
||||
size = 4096s
|
||||
}
|
||||
|
||||
partition fip {
|
||||
offset = 13312s
|
||||
size = 4096s
|
||||
}
|
||||
|
||||
/* Infix U-Boot, chainloaded by stock bootloader */
|
||||
partition infix-uboot {
|
||||
offset = 17408s
|
||||
image = "u-boot.bin"
|
||||
size = 32M
|
||||
}
|
||||
|
||||
partition aux {
|
||||
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
|
||||
image = "aux.ext4"
|
||||
}
|
||||
|
||||
partition primary {
|
||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
||||
bootable = true
|
||||
size = 250M
|
||||
image = "rootfs.squashfs"
|
||||
}
|
||||
|
||||
partition secondary {
|
||||
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
|
||||
bootable = true
|
||||
size = 250M
|
||||
image = "rootfs.squashfs"
|
||||
}
|
||||
|
||||
partition cfg {
|
||||
partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105
|
||||
image = "cfg.ext4"
|
||||
}
|
||||
|
||||
partition var {
|
||||
partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F
|
||||
image = "var.ext4"
|
||||
}
|
||||
}
|
||||
+488
@@ -0,0 +1,488 @@
|
||||
{
|
||||
"ieee802-dot1ab-lldp:lldp": {
|
||||
"infix-lldp:enabled": true
|
||||
},
|
||||
"ietf-hardware:hardware": {
|
||||
"component": [
|
||||
{
|
||||
"name": "USB",
|
||||
"class": "infix-hardware:usb",
|
||||
"state": {
|
||||
"admin-state": "unlocked"
|
||||
}
|
||||
},
|
||||
{
|
||||
"class": "infix-hardware:usb",
|
||||
"name": "USB2",
|
||||
"state": {
|
||||
"admin-state": "unlocked"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "radio0",
|
||||
"class": "infix-hardware:wifi",
|
||||
"infix-hardware:wifi-radio": {
|
||||
"country-code": "DE",
|
||||
"band": "2.4GHz",
|
||||
"channel": "auto"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "radio1",
|
||||
"class": "infix-hardware:wifi",
|
||||
"infix-hardware:wifi-radio": {
|
||||
"country-code": "DE",
|
||||
"band": "6GHz",
|
||||
"channel": "auto"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "radio2",
|
||||
"class": "infix-hardware:wifi",
|
||||
"infix-hardware:wifi-radio": {
|
||||
"country-code": "DE",
|
||||
"band": "5GHz",
|
||||
"channel": "auto"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ietf-interfaces:interfaces": {
|
||||
"interface": [
|
||||
{
|
||||
"name": "br0",
|
||||
"type": "infix-if-type:bridge",
|
||||
"ietf-ip:ipv4": {
|
||||
"address": [
|
||||
{
|
||||
"ip": "192.168.0.1",
|
||||
"prefix-length": 24
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lan1",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"ietf-ip:ipv6": {},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lan2",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"ietf-ip:ipv6": {},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lan3",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"ietf-ip:ipv6": {},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lo",
|
||||
"type": "infix-if-type:loopback",
|
||||
"ietf-ip:ipv4": {
|
||||
"address": [
|
||||
{
|
||||
"ip": "127.0.0.1",
|
||||
"prefix-length": 8
|
||||
}
|
||||
]
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"address": [
|
||||
{
|
||||
"ip": "::1",
|
||||
"prefix-length": 128
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "internet",
|
||||
"type": "infix-if-type:ethernet",
|
||||
"ietf-ip:ipv4": {
|
||||
"infix-dhcp-client:dhcp": {
|
||||
"option": [
|
||||
{
|
||||
"id": "ntp-server"
|
||||
},
|
||||
{
|
||||
"id": "broadcast"
|
||||
},
|
||||
{
|
||||
"id": "domain"
|
||||
},
|
||||
{
|
||||
"id": "hostname",
|
||||
"value": "auto"
|
||||
},
|
||||
{
|
||||
"id": "dns-server"
|
||||
},
|
||||
{
|
||||
"id": "router"
|
||||
},
|
||||
{
|
||||
"id": "netmask"
|
||||
},
|
||||
{
|
||||
"id": "vendor-class",
|
||||
"value": "Acer Connect Vero W"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ietf-ip:ipv6": {
|
||||
"infix-dhcpv6-client:dhcp": {
|
||||
"option": [
|
||||
{
|
||||
"id": "ntp-server"
|
||||
},
|
||||
{
|
||||
"id": "client-fqdn"
|
||||
},
|
||||
{
|
||||
"id": "domain-search"
|
||||
},
|
||||
{
|
||||
"id": "dns-server"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "wifi0-ap",
|
||||
"type": "infix-if-type:wifi",
|
||||
"infix-interfaces:wifi": {
|
||||
"radio": "radio0",
|
||||
"access-point": {
|
||||
"ssid": "Infix",
|
||||
"security": {
|
||||
"secret": "wifi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "wifi1-ap",
|
||||
"type": "infix-if-type:wifi",
|
||||
"infix-interfaces:wifi": {
|
||||
"radio": "radio1",
|
||||
"access-point": {
|
||||
"ssid": "Infix6G",
|
||||
"security": {
|
||||
"secret": "wifi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "wifi2-ap",
|
||||
"type": "infix-if-type:wifi",
|
||||
"infix-interfaces:wifi": {
|
||||
"radio": "radio2",
|
||||
"access-point": {
|
||||
"ssid": "Infix5G",
|
||||
"security": {
|
||||
"secret": "wifi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"infix-interfaces:bridge-port": {
|
||||
"bridge": "br0"
|
||||
}
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
"ietf-keystore:keystore": {
|
||||
"asymmetric-keys": {
|
||||
"asymmetric-key": [
|
||||
{
|
||||
"name": "genkey",
|
||||
"public-key-format": "infix-crypto-types:ssh-public-key-format",
|
||||
"public-key": "",
|
||||
"private-key-format": "infix-crypto-types:rsa-private-key-format",
|
||||
"cleartext-private-key": "",
|
||||
"certificates": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
"symmetric-keys": {
|
||||
"symmetric-key": [
|
||||
{
|
||||
"name": "wifi",
|
||||
"cleartext-symmetric-key": "aW5maXhpbmZpeA==",
|
||||
"key-format": "infix-crypto-types:passphrase-key-format"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ietf-netconf-acm:nacm": {
|
||||
"enable-nacm": true,
|
||||
"read-default": "permit",
|
||||
"write-default": "permit",
|
||||
"exec-default": "permit",
|
||||
"groups": {
|
||||
"group": [
|
||||
{
|
||||
"name": "admin",
|
||||
"user-name": [
|
||||
"admin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "operator",
|
||||
"user-name": []
|
||||
},
|
||||
{
|
||||
"name": "guest",
|
||||
"user-name": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"rule-list": [
|
||||
{
|
||||
"name": "admin-acl",
|
||||
"group": [
|
||||
"admin"
|
||||
],
|
||||
"rule": [
|
||||
{
|
||||
"name": "permit-all",
|
||||
"module-name": "*",
|
||||
"access-operations": "*",
|
||||
"action": "permit",
|
||||
"comment": "Allow 'admin' group complete access to all operations and data."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "operator-acl",
|
||||
"group": [
|
||||
"operator"
|
||||
],
|
||||
"rule": [
|
||||
{
|
||||
"name": "permit-system-rpcs",
|
||||
"module-name": "ietf-system",
|
||||
"rpc-name": "*",
|
||||
"access-operations": "exec",
|
||||
"action": "permit",
|
||||
"comment": "Operators can reboot, shutdown, and set system time."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "guest-acl",
|
||||
"group": [
|
||||
"guest"
|
||||
],
|
||||
"rule": [
|
||||
{
|
||||
"name": "deny-all-write+exec",
|
||||
"module-name": "*",
|
||||
"access-operations": "create update delete exec",
|
||||
"action": "deny",
|
||||
"comment": "Guests cannot change anything or exec rpcs."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "default-deny-all",
|
||||
"group": [
|
||||
"*"
|
||||
],
|
||||
"rule": [
|
||||
{
|
||||
"name": "deny-password-access",
|
||||
"path": "/ietf-system:system/authentication/user/password",
|
||||
"access-operations": "*",
|
||||
"action": "deny",
|
||||
"comment": "No user except admins can access password hashes."
|
||||
},
|
||||
{
|
||||
"name": "deny-keystore-access",
|
||||
"module-name": "ietf-keystore",
|
||||
"access-operations": "*",
|
||||
"action": "deny",
|
||||
"comment": "No user except admins can access cryptographic keys."
|
||||
},
|
||||
{
|
||||
"name": "deny-truststore-access",
|
||||
"module-name": "ietf-truststore",
|
||||
"access-operations": "*",
|
||||
"action": "deny",
|
||||
"comment": "No user except admins can access trust store."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"ietf-netconf-server:netconf-server": {
|
||||
"listen": {
|
||||
"endpoints": {
|
||||
"endpoint": [
|
||||
{
|
||||
"name": "default-ssh",
|
||||
"ssh": {
|
||||
"tcp-server-parameters": {
|
||||
"local-bind": [
|
||||
{
|
||||
"local-address": "::"
|
||||
}
|
||||
]
|
||||
},
|
||||
"ssh-server-parameters": {
|
||||
"server-identity": {
|
||||
"host-key": [
|
||||
{
|
||||
"name": "default-key",
|
||||
"public-key": {
|
||||
"central-keystore-reference": "genkey"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"ietf-system:system": {
|
||||
"hostname": "acer-connect-%m",
|
||||
"ntp": {
|
||||
"server": [
|
||||
{
|
||||
"name": "default",
|
||||
"udp": {
|
||||
"address": "pool.ntp.org"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"authentication": {
|
||||
"user": [
|
||||
{
|
||||
"name": "admin",
|
||||
"password": "$factory$",
|
||||
"infix-system:shell": "bash"
|
||||
}
|
||||
]
|
||||
},
|
||||
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
|
||||
},
|
||||
"infix-dhcp-server:dhcp-server": {
|
||||
"option": [
|
||||
{
|
||||
"id": "ntp-server",
|
||||
"address": "auto"
|
||||
},
|
||||
{
|
||||
"id": "dns-server",
|
||||
"address": "auto"
|
||||
},
|
||||
{
|
||||
"id": "router",
|
||||
"address": "auto"
|
||||
}
|
||||
],
|
||||
"subnet": [
|
||||
{
|
||||
"subnet": "192.168.0.0/24",
|
||||
"pool": {
|
||||
"start-address": "192.168.0.100",
|
||||
"end-address": "192.168.0.250"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"infix-firewall:firewall": {
|
||||
"default": "wan",
|
||||
"zone": [
|
||||
{
|
||||
"name": "lan",
|
||||
"action": "accept",
|
||||
"interface": [
|
||||
"br0"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "wan",
|
||||
"action": "drop",
|
||||
"interface": [
|
||||
"internet"
|
||||
],
|
||||
"service": [
|
||||
"dhcpv6-client"
|
||||
]
|
||||
}
|
||||
],
|
||||
"policy": [
|
||||
{
|
||||
"name": "lan-to-wan",
|
||||
"action": "accept",
|
||||
"ingress": [
|
||||
"lan"
|
||||
],
|
||||
"egress": [
|
||||
"wan"
|
||||
],
|
||||
"masquerade": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"infix-meta:meta": {
|
||||
"version": "1.7"
|
||||
},
|
||||
"infix-services:mdns": {
|
||||
"enabled": true
|
||||
},
|
||||
"infix-services:ssh": {
|
||||
"enabled": true,
|
||||
"hostkey": [
|
||||
"genkey"
|
||||
],
|
||||
"listen": [
|
||||
{
|
||||
"name": "ipv4",
|
||||
"address": "0.0.0.0",
|
||||
"port": 22
|
||||
},
|
||||
{
|
||||
"name": "ipv6",
|
||||
"address": "::",
|
||||
"port": 22
|
||||
}
|
||||
]
|
||||
},
|
||||
"infix-services:web": {
|
||||
"enabled": true,
|
||||
"console": {
|
||||
"enabled": true
|
||||
},
|
||||
"netbrowse": {
|
||||
"enabled": true
|
||||
},
|
||||
"restconf": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ config BR2_PACKAGE_BANANAPI_BPI_R3
|
||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK
|
||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7986
|
||||
select BR2_PACKAGE_LINUX_FIRMWARE_AIROHA_EN8811H
|
||||
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7916
|
||||
select SDCARD_AUX
|
||||
help
|
||||
Build Banana PI R3 support
|
||||
|
||||
@@ -212,6 +212,7 @@ sync
|
||||
2. Set boot switches to eMMC mode (see image above)
|
||||
3. Power on
|
||||
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Board won't boot
|
||||
|
||||
@@ -19,4 +19,34 @@ possible to use dtbo in sysboot unless present in syslinux.conf
|
||||
no-sd;
|
||||
no-sdio;
|
||||
status = "okay";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
card@0 {
|
||||
compatible = "mmc-card";
|
||||
reg = <0>;
|
||||
|
||||
partitions {
|
||||
compatible = "gpt-partitions";
|
||||
|
||||
partition-factory {
|
||||
partname = "factory";
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "fixed-layout";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
eeprom_factory_wmac: eeprom@0 {
|
||||
reg = <0x0 0x1000>;
|
||||
};
|
||||
|
||||
eeprom_factory_pcie: eeprom@a0000 {
|
||||
reg = <0xa0000 0x1000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -4,7 +4,7 @@ CONFIG_BOOTDELAY=2
|
||||
CONFIG_ENV_IS_NOWHERE=y
|
||||
# CONFIG_ENV_IS_IN_MMC is not set
|
||||
CONFIG_MULTI_DTB_FIT=y
|
||||
CONFIG_OF_LIST="mt7986a-bpi-r3-sd mt7986a-bpi-r3-emmc mt7986a-bpi-r3-mini"
|
||||
CONFIG_OF_LIST="mt7986a-bpi-r3-sd mt7986a-bpi-r3-emmc mt7986a-bpi-r3-mini mt7986a-acer-connect-vero-w6m"
|
||||
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
|
||||
@@ -87,6 +87,45 @@ Infix ships with the following factory defaults.
|
||||
> are bridged into the LAN as access points. WiFi is not included with the board
|
||||
> and is not part of the factory default configuration.
|
||||
|
||||
## SIM Card Installation
|
||||
|
||||
The BPI-R4 has three SIM holders, one per PCIe slot:
|
||||
|
||||
| Slot | PCIe socket | Typical use |
|
||||
|----------|-------------|--------------------------|
|
||||
| **SIM1** | M.2 Key-B | 4G/5G WWAN modem |
|
||||
| **SIM2** | mPCIe #1 | Cellular or other modem |
|
||||
| **SIM3** | mPCIe #2 | Cellular or other modem |
|
||||
|
||||
All three take **nano-SIM (4FF)** cards.
|
||||
|
||||
> [!NOTE]
|
||||
> The official Banana Pi pages show an older board revision with a sliding
|
||||
> "sled" holder. Newer boards ship with a fixed friction-fit holder instead:
|
||||
> there is no lid to lift and no spring eject. The [closest matching photo on
|
||||
> bananapi.org][15] shows the current mechanism.
|
||||
|
||||
### Inserting a SIM
|
||||
|
||||
1. Orient the card with the gold contacts facing the PCB (printed
|
||||
side up) and the cut corner pointing toward the M.2/mPCIe socket,
|
||||
which on this board is also toward the outer edge. The silkscreen
|
||||
next to each holder shows the same outline.
|
||||
2. Push the SIM straight in until it is fully seated. There is no
|
||||
click and the holder is not spring-loaded, so press firmly until
|
||||
the contacts engage and the rear edge of the card sits flush with
|
||||
the holder.
|
||||
3. A SIM that still protrudes is not fully inserted; push again.
|
||||
|
||||
### Removing a SIM
|
||||
|
||||
The friction grip on these holders is tight. Gently pry the card out
|
||||
with a fingernail or a thin plastic spudger. Avoid metal tweezers
|
||||
near the contacts. Removing the front panel of the metal case is
|
||||
absolutely necessary to access the SIM holder.
|
||||
|
||||
For software configuration once the modem is recognised, see the
|
||||
[Cellular Modem User's Guide][16].
|
||||
|
||||
## Getting Started
|
||||
|
||||
@@ -358,3 +397,6 @@ make aarch64
|
||||
[12]: https://github.com/frank-w/u-boot/releases
|
||||
[13]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2026-01-bpi-2026.01-2026-01-15_2013/bpi-r4_spim-nand_bl2.img
|
||||
[14]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2026-01-bpi-2026.01-2026-01-15_2013/bpi-r4_spim-nand_fip.bin
|
||||
[15]: https://docs.banana-pi.org/bpi-r4/bpi-r4_4g5g_2.jpg
|
||||
[16]: https://www.kernelkit.org/infix/latest/modem/
|
||||
|
||||
|
||||
+8
-1
@@ -10,6 +10,13 @@
|
||||
"state": {
|
||||
"admin-state": "unlocked"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "USB2",
|
||||
"class": "infix-hardware:usb",
|
||||
"state": {
|
||||
"admin-state": "unlocked"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -366,7 +373,7 @@
|
||||
]
|
||||
},
|
||||
"infix-meta:meta": {
|
||||
"version": "1.7"
|
||||
"version": "1.8"
|
||||
},
|
||||
"infix-services:mdns": {
|
||||
"enabled": true
|
||||
|
||||
+8
-1
@@ -10,6 +10,13 @@
|
||||
"state": {
|
||||
"admin-state": "unlocked"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "USB2",
|
||||
"class": "infix-hardware:usb",
|
||||
"state": {
|
||||
"admin-state": "unlocked"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -358,7 +365,7 @@
|
||||
]
|
||||
},
|
||||
"infix-meta:meta": {
|
||||
"version": "1.7"
|
||||
"version": "1.8"
|
||||
},
|
||||
"infix-services:mdns": {
|
||||
"enabled": true
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
CONFD_TIMEOUT=60
|
||||
#DEBUG=1
|
||||
|
||||
# -v debug
|
||||
CONFD_ARGS=""
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
service <!> name:hostapd :%i \
|
||||
[2345] hostapd -P/var/run/hostapd-%i.pid /etc/hostapd-%i.conf \
|
||||
-- Wi-Fi Access Point @%i
|
||||
@@ -0,0 +1,3 @@
|
||||
service name:wpa_supplicant :%i \
|
||||
[2345] wpa_supplicant -s -i %i -c /etc/wpa_supplicant-%i.conf -P/var/run/wpa_supplicant-%i.pid \
|
||||
-- Wi-Fi Mesh @%i
|
||||
@@ -5,3 +5,4 @@
|
||||
4 static
|
||||
5 dhcp
|
||||
6 random
|
||||
7 wwan
|
||||
|
||||
@@ -620,6 +620,73 @@ def probe_ptp_capabilities(out):
|
||||
out.setdefault("interfaces", {}).update(ifaces)
|
||||
|
||||
|
||||
def _usb_root_from_sysfs(dev_path):
|
||||
p = dev_path
|
||||
while p not in ("/", "/sys"):
|
||||
parent = os.path.realpath(os.path.join(p, ".."))
|
||||
basename = os.path.basename(parent)
|
||||
if basename.startswith("usb") and basename[3:].isdigit():
|
||||
return parent
|
||||
p = parent
|
||||
return None
|
||||
|
||||
|
||||
def _read_usb_vid_pid(dev_path):
|
||||
p = dev_path
|
||||
while p not in ("/", "/sys"):
|
||||
try:
|
||||
vid = open(os.path.join(p, "idVendor")).read().strip()
|
||||
pid = open(os.path.join(p, "idProduct")).read().strip()
|
||||
return vid, pid
|
||||
except OSError:
|
||||
pass
|
||||
p = os.path.dirname(p)
|
||||
return "", ""
|
||||
|
||||
|
||||
def probe_modems(out):
|
||||
"""devpath is the USB bus root; ModemManager matches by path prefix.
|
||||
seen_roots deduplicates cdc-wdm and ttyUSB ports of the same physical modem."""
|
||||
seen_roots = set()
|
||||
modems = []
|
||||
idx = 0
|
||||
|
||||
def add_modem(dev_path):
|
||||
nonlocal idx
|
||||
usb_root = _usb_root_from_sysfs(dev_path)
|
||||
if usb_root is None or usb_root in seen_roots:
|
||||
return
|
||||
seen_roots.add(usb_root)
|
||||
vid, pid = _read_usb_vid_pid(dev_path)
|
||||
modems.append({
|
||||
"index": idx,
|
||||
"name": "modem%d" % idx,
|
||||
"devpath": usb_root,
|
||||
"vid": vid,
|
||||
"pid": pid,
|
||||
})
|
||||
idx += 1
|
||||
|
||||
for cls_dir, prefix in (("/sys/class/usbmisc", "cdc-wdm"),
|
||||
("/sys/class/tty", "ttyUSB")):
|
||||
try:
|
||||
entries = os.listdir(cls_dir)
|
||||
except OSError:
|
||||
continue
|
||||
for entry in entries:
|
||||
if not entry.startswith(prefix):
|
||||
continue
|
||||
try:
|
||||
dev_path = os.path.realpath(
|
||||
os.path.join(cls_dir, entry, "device"))
|
||||
add_modem(dev_path)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
if modems:
|
||||
out["modem"] = modems
|
||||
|
||||
|
||||
def main():
|
||||
out = {
|
||||
"vendor": None,
|
||||
@@ -647,6 +714,7 @@ def main():
|
||||
|
||||
probe_wifi_radios(out)
|
||||
probe_ptp_capabilities(out)
|
||||
probe_modems(out)
|
||||
|
||||
if not out["factory-password-hash"]:
|
||||
sys.stdout.write("\n\n\033[31mCRITICAL BOOTSTRAP ERROR\n" +
|
||||
|
||||
@@ -257,15 +257,15 @@ def parse_interface_info(ifname):
|
||||
for line in output.splitlines():
|
||||
stripped = line.strip()
|
||||
|
||||
# Interface type
|
||||
# Interface type (can be multi-word, e.g. "mesh point")
|
||||
if stripped.startswith('type '):
|
||||
result['iftype'] = stripped.split()[1]
|
||||
result['iftype'] = ' '.join(stripped.split()[1:])
|
||||
|
||||
# MAC address
|
||||
elif stripped.startswith('addr '):
|
||||
result['mac'] = stripped.split()[1]
|
||||
|
||||
# SSID
|
||||
# SSID (AP mode) or mesh-id (mesh point mode) — kernel uses same attr
|
||||
elif stripped.startswith('ssid '):
|
||||
result['ssid'] = decode_iw_ssid(' '.join(stripped.split()[1:]))
|
||||
|
||||
@@ -538,6 +538,43 @@ def parse_link(ifname):
|
||||
return result
|
||||
|
||||
|
||||
def parse_phy_caps(phy_name):
|
||||
"""
|
||||
Parse 'iw phy <name> info' for HT and VHT capability bitmasks.
|
||||
Returns: {ht_cap: int, vht_cap: int}
|
||||
|
||||
iw phy info output format:
|
||||
Capabilities: 0x1ef
|
||||
...
|
||||
VHT Capabilities (0x339071b2):
|
||||
...
|
||||
"""
|
||||
actual_phy = normalize_phy_name(phy_name)
|
||||
output = run_iw('phy', actual_phy, 'info')
|
||||
if not output:
|
||||
output = run_iw(actual_phy, 'info')
|
||||
if not output:
|
||||
return {'ht_cap': 0, 'vht_cap': 0}
|
||||
|
||||
ht_cap = 0
|
||||
vht_cap = 0
|
||||
|
||||
for line in output.splitlines():
|
||||
stripped = line.strip()
|
||||
|
||||
# HT Capabilities: "Capabilities: 0x1ef"
|
||||
ht_match = re.match(r'Capabilities:\s+(0x[0-9a-fA-F]+)', stripped)
|
||||
if ht_match:
|
||||
ht_cap = int(ht_match.group(1), 16)
|
||||
|
||||
# VHT Capabilities: "VHT Capabilities (0x339071b2):"
|
||||
vht_match = re.match(r'VHT Capabilities\s+\((0x[0-9a-fA-F]+)\)', stripped)
|
||||
if vht_match:
|
||||
vht_cap = int(vht_match.group(1), 16)
|
||||
|
||||
return {'ht_cap': ht_cap, 'vht_cap': vht_cap}
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print(json.dumps({
|
||||
@@ -548,7 +585,8 @@ def main():
|
||||
'info': 'Get PHY or interface information (requires device)',
|
||||
'survey': 'Get channel survey data (requires interface)',
|
||||
'station': 'Get connected stations in AP mode (requires interface)',
|
||||
'link': 'Get link info in station mode (requires interface)'
|
||||
'link': 'Get link info in station mode (requires interface)',
|
||||
'caps': 'Get HT/VHT capability bitmasks (requires PHY/radio)'
|
||||
},
|
||||
'examples': [
|
||||
'iw.py list',
|
||||
@@ -557,7 +595,8 @@ def main():
|
||||
'iw.py info wlan0',
|
||||
'iw.py station wifi0',
|
||||
'iw.py link wlan0',
|
||||
'iw.py survey wlan0'
|
||||
'iw.py survey wlan0',
|
||||
'iw.py caps radio0'
|
||||
]
|
||||
}, indent=2))
|
||||
sys.exit(1)
|
||||
@@ -594,6 +633,11 @@ def main():
|
||||
data = {'error': 'survey command requires interface argument'}
|
||||
else:
|
||||
data = parse_survey(sys.argv[2])
|
||||
elif command == 'caps':
|
||||
if len(sys.argv) < 3:
|
||||
data = {'error': 'caps command requires PHY/radio argument'}
|
||||
else:
|
||||
data = parse_phy_caps(sys.argv[2])
|
||||
else:
|
||||
data = {'error': f'Unknown command: {command}'}
|
||||
|
||||
|
||||
@@ -652,7 +652,9 @@ wrap()
|
||||
|
||||
if [ "$cmd" = "stop" ]; then
|
||||
# The setup phase may run forever in the background trying to fetch
|
||||
# the image. It saves its PID in /run/containers/${name}.pid
|
||||
# the image. It saves its PID in /run/containers/${name}.pid. Kill
|
||||
# any in-flight setup, then fall through to podman stop -- a stale
|
||||
# pidfile is not proof the container isn't running.
|
||||
if [ -f "$pidfile" ]; then
|
||||
pid=$(cat "$pidfile")
|
||||
|
||||
@@ -663,10 +665,9 @@ wrap()
|
||||
fi
|
||||
|
||||
rm -f "$pidfile"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Only the 'podman stop' command takes -i and --timeout
|
||||
# Only the 'podman stop' command takes -i (ignore missing) and --timeout
|
||||
args="-i --timeout $timeout"
|
||||
fi
|
||||
|
||||
|
||||
+1
-1
Submodule buildroot updated: 168601af48...d758952b3e
@@ -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.25"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.34"
|
||||
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
|
||||
@@ -134,6 +134,7 @@ BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
|
||||
BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y
|
||||
BR2_PACKAGE_ALDER_ALDER=y
|
||||
BR2_PACKAGE_ACER_CONNECT_VERO_W6M=y
|
||||
BR2_PACKAGE_BANANAPI_BPI_R3=y
|
||||
BR2_PACKAGE_BANANAPI_BPI_R4=y
|
||||
BR2_PACKAGE_BANANAPI_BPI_R64=y
|
||||
@@ -148,6 +149,7 @@ INFIX_HOME="https://github.com/kernelkit/infix/"
|
||||
INFIX_DOC="https://www.kernelkit.org/infix/"
|
||||
INFIX_SUPPORT="mailto:kernelkit@googlegroups.com"
|
||||
BR2_PACKAGE_FEATURE_GPS=y
|
||||
BR2_PACKAGE_FEATURE_MODEM=y
|
||||
BR2_PACKAGE_FEATURE_WIFI=y
|
||||
BR2_PACKAGE_FEATURE_WIFI_MEDIATEK=y
|
||||
BR2_PACKAGE_FEATURE_WIFI_QUALCOMM=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.25"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.34"
|
||||
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
|
||||
|
||||
@@ -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.25"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.34"
|
||||
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
|
||||
|
||||
@@ -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.25"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.34"
|
||||
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
|
||||
|
||||
@@ -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.25"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.34"
|
||||
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
|
||||
|
||||
@@ -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.25"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.34"
|
||||
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
|
||||
|
||||
+93
-3
@@ -3,6 +3,95 @@ Change Log
|
||||
|
||||
All notable changes to the project are documented in this file.
|
||||
|
||||
[v26.06.0][UNRELEASED]
|
||||
--------------
|
||||
|
||||
### Changes
|
||||
|
||||
- Add Wi-Fi roaming for fast, seamless handoff between access points that
|
||||
share an SSID: 802.11k, 802.11v and 802.11r (over-the-air FT). See the
|
||||
[Wi-Fi User's Guide][wifi] for details
|
||||
- Add Wi-Fi 802.11s mesh support, letting access points form a wireless
|
||||
backhaul between each other without cabling
|
||||
- Add band steering for dual-band access points, nudging dual-band
|
||||
clients onto the faster 5/6 GHz band
|
||||
- Add `legacy-rates` option to re-enable 802.11b rates on 2.4 GHz for
|
||||
old IoT devices (disabled by default)
|
||||
- Add cellular modem (WWAN) support for USB-attached MBIM/QMI modems,
|
||||
including USB dongles, mPCIe cards, and M.2 Key-B modules. Multiple
|
||||
APNs per modem, SIM PIN configuration, and NMEA routing from modem
|
||||
GPS to gpsd. See the [Modem User's Guide][modem] for details
|
||||
|
||||
### Fixes
|
||||
|
||||
- Firewall masquerade no longer enables the global IPv4/IPv6 forwarding
|
||||
sysctls. You must now enable IP forwarding explicitly on the interfaces
|
||||
that should route traffic; enabling NAT alone is no longer enough
|
||||
|
||||
[wifi]: https://www.kernelkit.org/infix/latest/wifi/
|
||||
[modem]: https://www.kernelkit.org/infix/latest/modem/
|
||||
|
||||
[v26.05.0][] - 2026-05-29
|
||||
-------------------------
|
||||
|
||||
### Changes
|
||||
|
||||
- Upgrade Linux kernel to 6.18.33 (LTS)
|
||||
- Upgrade Buildroot to 2025.02.14 (LTS)
|
||||
- Upgrade FRR to 10.5.4
|
||||
- Add support for [Acer Connect Vero W6m][AcerConnectVero], a low-cost COTS
|
||||
home router, based on the same hardware as [Banana Pi BPI-R3][BPI-R3], but
|
||||
with a Wi-Fi 6E (6 GHz band) chip.
|
||||
- Add configurable channel-width in Wi-Fi configuration.
|
||||
- Upgrade `ieee802-ethernet-interface` YANG model to revision 2025-09-10 (IEEE
|
||||
Std 802.3.2-2025), adding the standard `phy-type` and `pmd-type` operational
|
||||
leaves. Speed is now exposed via `ietf-interfaces:speed` (bps, RFC 8343);
|
||||
the now obsolete `eth:speed` is no longer returned
|
||||
- Rework `show interface` summary output as layered protocol rows. When a
|
||||
port has link, a physical-medium row (e.g. `1000baseT`, `10GbaseLR`) appears
|
||||
above the `ethernet` row. VLAN, GRE, VXLAN and WiFi interfaces likewise get
|
||||
one row per protocol layer, with type-specific data on each (`vid:`,
|
||||
`remote:`, `vni:`, `station ssid:`, etc.), issue #530
|
||||
- Add support for configurable auto-negotiation for Ethernet ports. A new
|
||||
`advertised-pmd-types` leaf-list replaces the fixed speed idiom for pinned
|
||||
link modes, issue #805. See the [Ethernet Interfaces][ethernet] section in
|
||||
the User Guide for details. Existing configurations using fixed speed are
|
||||
migrated automatically on upgrade
|
||||
- Add support for configurable MDI/MDI-X pinout on Ethernet ports. Needed on
|
||||
some PHYs where Auto-MDIX stops working once auto-negotiation is disabled
|
||||
- New operational `supported-pmd-types` leaf-list on each Ethernet interface,
|
||||
exposing the set of PMD types currently supported
|
||||
- New CLI command `show operational`, and optional XPath filtering for this
|
||||
and any of the other datastores, using `[path /path/to/subtree]`
|
||||
- CLI `show` commands now surface human-friendly error messages instead of a
|
||||
raw Python exceptions, e.g., `Interface "w" not found`
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix #1493: container with a physical interface not properly removed when
|
||||
switching to a configuration without containers
|
||||
- Fix #1506: add documentation on how to configure VLAN interfaces, including
|
||||
stacked (Q-in-Q) VLAN interfaces, in a dedicated `vlan.md`
|
||||
- Handle unclean daemon exits better, e.g., `dbus-daemon` crashing and leaving
|
||||
a stale pidfile behind, causing it to refuse to be restarted
|
||||
- Fix occasional blank or garbled `[ OK ]` lines at startup
|
||||
- Disallow multicast MAC addresses in custom MAC address configuration
|
||||
- Fix broken Wi-Fi 6 GHz band configuration.
|
||||
- Fix operational read of `/containers` failing and thereby aborting all
|
||||
operational get-data, including RESTCONF/NETCONF reads — for containers
|
||||
whose command contains shell metacharacters, e.g. `sh -c "... && ..."`
|
||||
- WireGuard interfaces are now regenerated when a referenced keystore key
|
||||
changes: the asymmetric `private-key`, and the symmetric `preshared-key` at
|
||||
both peer-group and per-peer level
|
||||
- Fix crash in operational data when a bridge has VLAN ranges configured: the
|
||||
kernel may report ranges (e.g. `vlan 1 vlanEnd 3`) from `bridge vlan global
|
||||
show`, which were not expanded, so `show interface` and other operational
|
||||
reads failed. Ranges are now expanded and listed correctly
|
||||
|
||||
[ethernet]: https://www.kernelkit.org/infix/latest/ethernet/#restricting-advertised-link-modes
|
||||
[BPI-R3]: https://docs.banana-pi.org/en/BPI-R3/BananaPi_BPI-R3
|
||||
[AcerConnectVero]: https://github.com/kernelkit/infix/tree/main/board/aarch64/acer-connect-vero-w6m/
|
||||
|
||||
[v26.04.0][] - 2026-04-30
|
||||
-------------------------
|
||||
|
||||
@@ -48,7 +137,6 @@ All notable changes to the project are documented in this file.
|
||||
- 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
|
||||
@@ -152,7 +240,7 @@ All notable changes to the project are documented in this file.
|
||||
|
||||
- Fix CLI `copy` command problem to copy to scp/sftp destinations
|
||||
|
||||
[BPI-R3-MINI]: https://wiki.banana-pi.org/Banana_Pi_BPI-R3_Mini
|
||||
[BPI-R3-MINI]: https://docs.banana-pi.org/en/BPI-R3_Mini/BananaPi_BPI-R3_Mini
|
||||
[SAMA7G54-EK]: https://www.microchip.com/en-us/development-tool/ev21h18a
|
||||
|
||||
[v26.01.0][] - 2026-02-03
|
||||
@@ -2075,7 +2163,9 @@ Supported YANG models in addition to those used by sysrepo and netopeer:
|
||||
- N/A
|
||||
|
||||
[buildroot]: https://buildroot.org/
|
||||
[UNRELEASED]: https://github.com/kernelkit/infix/compare/v26.03.0...HEAD
|
||||
[UNRELEASED]: https://github.com/kernelkit/infix/compare/v26.05.0...HEAD
|
||||
[v26.05.0]: https://github.com/kernelkit/infix/compare/v26.04.0...v26.05.0
|
||||
[v26.04.0]: https://github.com/kernelkit/infix/compare/v26.03.0...v26.04.0
|
||||
[v26.03.0]: https://github.com/kernelkit/infix/compare/v26.02.0...v26.03.0
|
||||
[v26.02.0]: https://github.com/kernelkit/infix/compare/v26.01.0...v26.02.0
|
||||
[v26.01.0]: https://github.com/kernelkit/infix/compare/v25.11.0...v26.01.0
|
||||
|
||||
@@ -21,7 +21,9 @@ regression test system solely relies on NETCONF and RESTCONF.
|
||||
- [Introduction](introduction.md)
|
||||
- [System Configuration](system.md)
|
||||
- [Network Configuration](networking.md)
|
||||
- [Wi-Fi](wifi.md)
|
||||
- [DHCP Server](dhcp.md)
|
||||
- [Cellular Modem (WWAN)](modem.md)
|
||||
- [Syslog Support](syslog.md)
|
||||
- **Infix In-Depth**
|
||||
- [Boot Procedure](boot.md)
|
||||
|
||||
+2
-2
@@ -73,8 +73,8 @@ admin@example:/config/interface/br0/> <b>set bridge vlans vlan 20 tagged br0</b>
|
||||
</code></pre>
|
||||
|
||||
To route or to manage via a VLAN, a VLAN interface needs to be created
|
||||
on top of the bridge, see section [VLAN Interfaces](ethernet.md#vlan-interfaces)
|
||||
for more on this topic.
|
||||
on top of the bridge, see section [VLAN Interfaces](vlan.md) for more
|
||||
on this topic.
|
||||
|
||||
> [!NOTE]
|
||||
> In some use-cases only a single management VLAN on the bridge is used.
|
||||
|
||||
@@ -164,7 +164,7 @@ interfaces {
|
||||
}
|
||||
}
|
||||
admin@host-12-34-56:/config/interface/eth0/> leave
|
||||
admin@host-12-34-56:/> show interfaces
|
||||
admin@host-12-34-56:/> show interface
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
lo loopback UNKNOWN 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
|
||||
+4
-4
@@ -109,11 +109,11 @@ When configuring, e.g., `dns-server`, or `router` options with the value
|
||||
`auto`, the system uses the IP address from the interface matching the
|
||||
subnet. For example:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 192.168.1.1/24 (static)
|
||||
eth1 ethernet UP 02:00:00:00:00:01
|
||||
eth1 ethernet UP 02:00:00:00:00:01
|
||||
ipv4 192.168.2.1/24 (static)
|
||||
|
||||
admin@example:/config/dhcp-server/subnet/192.168.1.0/24/> <b>edit option dns-server</b>
|
||||
|
||||
+184
-120
@@ -1,52 +1,8 @@
|
||||
# Ethernet Interfaces
|
||||
|
||||
This document covers VLAN interfaces, physical Ethernet interfaces,
|
||||
and virtual Ethernet (VETH) pairs.
|
||||
|
||||
|
||||
## VLAN Interfaces
|
||||
|
||||
Creating a VLAN can be done in many ways. This section assumes VLAN
|
||||
interfaces created atop another Linux interface. E.g., the VLAN
|
||||
interfaces created on top of the Ethernet interface or bridge in the
|
||||
picture below.
|
||||
|
||||

|
||||
|
||||
A VLAN interface is basically a filtering abstraction. When you run
|
||||
`tcpdump` on a VLAN interface you will only see the frames matching the
|
||||
VLAN ID of the interface, compared to *all* the VLAN IDs if you run
|
||||
`tcpdump` on the lower-layer interface.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface eth0.20</b>
|
||||
admin@example:/config/interface/eth0.20/> <b>show</b>
|
||||
type vlan;
|
||||
vlan {
|
||||
tag-type c-vlan;
|
||||
id 20;
|
||||
lower-layer-if eth0;
|
||||
}
|
||||
admin@example:/config/interface/eth0.20/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
The example below assumes bridge br0 is already created, see [VLAN
|
||||
Filtering Bridge](bridging.md#vlan-filtering-bridge).
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface vlan10</b>
|
||||
admin@example:/config/interface/vlan10/> <b>set vlan id 10</b>
|
||||
admin@example:/config/interface/vlan10/> <b>set vlan lower-layer-if br0</b>
|
||||
admin@example:/config/interface/vlan10/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
As conventions, a VLAN interface for VID 20 on top of an Ethernet
|
||||
interface *eth0* is named *eth0.20*, and a VLAN interface for VID 10 on
|
||||
top of a bridge interface *br0* is named *vlan10*.
|
||||
|
||||
> [!NOTE]
|
||||
> If you name your VLAN interface `foo0.N` or `vlanN`, where `N` is a
|
||||
> number, the CLI infers the interface type automatically.
|
||||
This document covers physical Ethernet interfaces and virtual Ethernet
|
||||
(VETH) pairs. For VLAN interfaces stacked on top of an Ethernet port
|
||||
or bridge, see [VLAN Interfaces](vlan.md).
|
||||
|
||||
|
||||
## Physical Ethernet Interfaces
|
||||
@@ -56,111 +12,219 @@ top of a bridge interface *br0* is named *vlan10*.
|
||||
Physical Ethernet interfaces provide low-level settings for speed/duplex as
|
||||
well as packet status and [statistics](#ethernet-statistics).
|
||||
|
||||
By default, Ethernet interfaces defaults to auto-negotiating
|
||||
speed/duplex modes, advertising all speed and duplex modes available.
|
||||
In the example below, the switch would by default auto-negotiate speed
|
||||
1 Gbit/s on port eth1 and 100 Mbit/s on port eth4, as those are the
|
||||
highest speeds supported by H1 and H2 respectively.
|
||||
By default, Ethernet interfaces defaults to auto-negotiating speed/duplex
|
||||
modes, advertising all speed and duplex modes available. In the example
|
||||
below, the switch would by default auto-negotiate speed 1 Gbps on port eth1
|
||||
and 100 Mbps on port eth4, as those are the highest speeds supported by H1 and
|
||||
H2 respectively.
|
||||
|
||||

|
||||
|
||||
The speed and duplex status for the links can be listed as shown
|
||||
below, assuming the link operational status is 'up'.
|
||||
A quick at-a-glance view of the physical link is available in the summary
|
||||
listing. When a port is up, a physical-layer row appears above the ethernet
|
||||
row, naming the IEEE PMD type (e.g. `1000baseT`, `10GbaseLR`) in the PROTOCOL
|
||||
column and the negotiated duplex in DATA. When the link is down the row is
|
||||
omitted and the interface name falls onto the ethernet row.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth1 1000baseT UP duplex: full
|
||||
ethernet 00:53:00:06:11:01
|
||||
eth2 1000baseT UP duplex: full
|
||||
ethernet 00:53:00:06:11:02
|
||||
eth3 ethernet DOWN 00:53:00:06:11:03
|
||||
eth4 100baseTX UP duplex: full
|
||||
ethernet 00:53:00:06:11:04
|
||||
...
|
||||
</code></pre>
|
||||
|
||||
The detail view spells everything out, including auto-negotiation
|
||||
state and the speed in Mbit/s.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface eth1</b>
|
||||
name : eth1
|
||||
index : 2
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
auto-negotiation : on
|
||||
duplex : full
|
||||
speed : 1000
|
||||
physical address : 00:53:00:06:11:01
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 75581
|
||||
out-octets : 43130
|
||||
name : eth1
|
||||
index : 2
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
link mode : 1000baseT
|
||||
auto-negotiation : on
|
||||
duplex : full
|
||||
speed : 1000
|
||||
physical address : 00:53:00:06:11:01
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 75581
|
||||
out-octets : 43130
|
||||
...
|
||||
admin@example:/> <b>show interface eth4</b>
|
||||
name : eth4
|
||||
index : 5
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
auto-negotiation : on
|
||||
duplex : full
|
||||
speed : 100
|
||||
physical address : 00:53:00:06:11:04
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 75439
|
||||
out-octets : 550704
|
||||
name : eth4
|
||||
index : 5
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
link mode : 100baseTX
|
||||
auto-negotiation : on
|
||||
duplex : full
|
||||
speed : 100
|
||||
physical address : 00:53:00:06:11:04
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 75439
|
||||
out-octets : 550704
|
||||
...
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
### Configuring fixed speed and duplex
|
||||
### Restricting advertised link modes
|
||||
|
||||
Auto-negotiation of speed/duplex mode is desired in almost all
|
||||
use-cases, but it is possible to disable auto-negotiation and specify
|
||||
a fixed speed and duplex mode.
|
||||
Auto-negotiation is the right default for almost all links, but sometimes a
|
||||
port has to come up at a fixed speed, usually when talking to old hardware
|
||||
that won't auto-negotiate or does it badly. IEEE Std 802.3.2-2025 dropped
|
||||
the old "turn off auto-negotiation, then set a fixed speed and duplex"
|
||||
approach. Instead you restrict the set of PMD types the port may advertise:
|
||||
list a single PMD and the link pins to that mode against any peer that
|
||||
supports it.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> When setting a fixed speed and duplex mode, ensure both sides of the
|
||||
> link have matching configuration. If speed does not match, the link
|
||||
> will not come up. If duplex mode does not match, the result is
|
||||
> reported collisions and/or bad throughput.
|
||||
> [!NOTE]
|
||||
> Earlier Infix releases needed `enable false` plus explicit `speed` and
|
||||
> `duplex` leaves. IEEE Std 802.3.2-2025 retired the `eth:speed` leaf, so
|
||||
> the speed now comes from the `advertised-pmd-types` entry instead.
|
||||
> Existing `startup-config.cfg` files are migrated automatically on upgrade.
|
||||
|
||||
The example below configures port eth3 to fixed speed 100 Mbit/s
|
||||
half-duplex mode.
|
||||
Each entry in `auto-negotiation/advertised-pmd-types` is an IEEE PMD-type
|
||||
identity (`ieee802-ethernet-phy-type:pmd-type-*`). The separate `duplex`
|
||||
leaf controls half vs full duplex.
|
||||
|
||||
The example below pins port `eth3` to 100 Mbit/s half-duplex.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface eth3 ethernet</b>
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>set speed 0.1</b>
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>set auto-negotiation advertised-pmd-types pmd-type-100BASE-TX</b>
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>set duplex half</b>
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>set auto-negotiation enable false</b>
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>show</b>
|
||||
auto-negotiation {
|
||||
enable false;
|
||||
advertised-pmd-types [ ieee802-ethernet-phy-type:pmd-type-100BASE-TX ];
|
||||
}
|
||||
duplex half;
|
||||
speed 0.1;
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>leave</b>
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
Speed metric is in Gbit/s. Auto-negotiation needs to be disabled in
|
||||
order for fixed speed/duplex to apply. Only speeds `0.1`(100 Mbit/s)
|
||||
and `0.01` (10 Mbit/s) can be specified. 1 Gbit/s and higher speeds
|
||||
require auto-negotiation to be enabled.
|
||||
List several PMDs to advertise all of them; auto-negotiation then settles
|
||||
on the highest mode both ends support.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> When pinning a link mode, make sure both ends share at least one common
|
||||
> (PMD, duplex) combination, otherwise the link will not come up.
|
||||
|
||||
#### Duplex and advertised modes
|
||||
|
||||
A PMD type like `10BASE-T` or `100BASE-TX` says nothing about duplex on its
|
||||
own, but the kernel tracks half and full duplex as separate link modes.
|
||||
Infix advertises both variants of every PMD you list, then narrows to one
|
||||
duplex when the `duplex` leaf is set:
|
||||
|
||||
| `advertised-pmd-types` | `duplex` | Resulting advertised modes |
|
||||
|----------------------------|----------|------------------------------------------|
|
||||
| `[10BASE-T]` | _unset_ | `10baseT/Half` + `10baseT/Full` |
|
||||
| `[10BASE-T]` | `full` | `10baseT/Full` |
|
||||
| `[10BASE-T]` | `half` | `10baseT/Half` |
|
||||
| `[10BASE-T, 100BASE-TX]` | _unset_ | all four half/full combinations |
|
||||
| `[10BASE-T, 100BASE-TX]` | `full` | `10baseT/Full` + `100baseT/Full` |
|
||||
| _unset_ | _unset_ | every mode the PHY supports (default) |
|
||||
|
||||
So `duplex` filters the PMDs you listed. PMDs with no half-duplex variant
|
||||
(everything above 1 Gbps) only ever advertise full.
|
||||
|
||||
#### Disabling auto-negotiation
|
||||
|
||||
The method above keeps auto-negotiation on and only limits what it
|
||||
advertises, so the peer still negotiates as usual. That doesn't help with
|
||||
gear that won't negotiate at all, like some old switches or a back-to-back
|
||||
copper link. For those, set `auto-negotiation/enable false` together with a
|
||||
single `advertised-pmd-types` entry to force a fixed speed and duplex with
|
||||
negotiation off:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/interface/eth3/ethernet/> <b>set auto-negotiation enable false</b>
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>set auto-negotiation advertised-pmd-types pmd-type-100BASE-TX</b>
|
||||
admin@example:/config/interface/eth3/ethernet/> <b>set duplex full</b>
|
||||
</code></pre>
|
||||
|
||||
With `enable false` you must list exactly one PMD: it sets the speed, and
|
||||
the `duplex` leaf sets half or full. Leave `duplex` out and Infix uses
|
||||
whatever the PMD supports, normally full.
|
||||
|
||||
Auto-MDIX usually rides along with auto-negotiation, so turning negotiation
|
||||
off can leave both ends picking the same MDI/MDI-X pinout. The link then
|
||||
comes up electrically but carries no traffic. When that happens, force
|
||||
opposite pinouts with the `mdi-x` leaf — set one end true (MDI-X) and the
|
||||
other false (MDI):
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/interface/eth3/ethernet/> <b>set mdi-x false</b>
|
||||
</code></pre>
|
||||
|
||||
Leaving `mdi-x` unset keeps Auto-MDIX in charge, which is correct whenever
|
||||
auto-negotiation is on.
|
||||
|
||||
> [!NOTE]
|
||||
> Whether `enable false` reaches the external PHY depends on the driver.
|
||||
> Direct-attach NICs handle it directly. Switch user ports go through the
|
||||
> switch driver, and some accept the request at the MAC but leave the PHY
|
||||
> auto-negotiating: the kernel reports the configured speed while the wire
|
||||
> runs at whatever was negotiated, and traffic stalls. If that happens,
|
||||
> read the PHY's BMCR register (e.g. with `mdio` from `mdiotools`) to see
|
||||
> what the PHY is actually doing.
|
||||
|
||||
The detail view exposes a `supported` block (operational state,
|
||||
backed by the `supported-pmd-types` leaf-list) listing the PMD types
|
||||
the kernel currently believes the interface can operate at. For
|
||||
SFP/SFP+ cages this set reflects the inserted module: plug in a 10G
|
||||
LR optic and `supported` will narrow to `10GbaseLR` only. Combined
|
||||
with the operational `link mode` row above it, this makes it trivial
|
||||
to confirm what an unknown transceiver actually is — no `ethtool -m`
|
||||
round-trip needed.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface eth13</b>
|
||||
name : eth13
|
||||
type : ethernet
|
||||
operational status : up
|
||||
link mode : 10GbaseLR
|
||||
auto-negotiation : off
|
||||
supported : 10GbaseLR
|
||||
duplex : full
|
||||
speed : 10000
|
||||
...
|
||||
</code></pre>
|
||||
|
||||
### Ethernet statistics
|
||||
|
||||
Ethernet packet statistics[^1] can be listed as shown below.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface eth1</b>
|
||||
name : eth1
|
||||
index : 2
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
auto-negotiation : on
|
||||
duplex : full
|
||||
speed : 1000
|
||||
physical address : 00:53:00:06:11:0a
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 75581
|
||||
out-octets : 43130
|
||||
|
||||
eth-in-frames : 434
|
||||
eth-in-multicast-frames : 296
|
||||
eth-in-broadcast-frames : 138
|
||||
eth-in-error-fcs-frames : 0
|
||||
eth-in-error-oversize-frames : 0
|
||||
eth-out-frames : 310
|
||||
eth-out-multicast-frames : 310
|
||||
eth-out-broadcast-frames : 0
|
||||
eth-out-good-octets : 76821
|
||||
eth-in-good-octets : 60598
|
||||
name : eth1
|
||||
index : 2
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
link mode : 1000baseT
|
||||
auto-negotiation : on
|
||||
duplex : full
|
||||
speed : 1000
|
||||
physical address : 00:53:00:06:11:0a
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 75581
|
||||
out-octets : 43130
|
||||
───────────────────
|
||||
<b>Ethernet Statistics</b>
|
||||
in-frames : 434
|
||||
in-multicast-frames : 296
|
||||
in-broadcast-frames : 138
|
||||
in-error-fcs-frames : 0
|
||||
in-error-oversize-frames : 0
|
||||
out-frames : 310
|
||||
out-multicast-frames : 310
|
||||
out-broadcast-frames : 0
|
||||
out-good-octets : 76821
|
||||
in-good-octets : 60598
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
|
||||
@@ -1,3 +1,90 @@
|
||||
/* Chirpy-style typography (must precede all other rules).
|
||||
* Source Sans Pro was renamed "Source Sans 3" on Google Fonts; it is the
|
||||
* same typeface. Lato is used for headings, matching www.kernelkit.org. */
|
||||
@import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700;900&family=Source+Sans+3:ital,wght@0,400;0,600;0,700;1,400&display=swap');
|
||||
|
||||
/* ---- Fonts ---------------------------------------------------------------
|
||||
* theme.font is disabled in mkdocs.yml, so we set Material's font vars here.
|
||||
* Body: Source Sans 3, code: system monospace (same stack Chirpy uses). */
|
||||
:root {
|
||||
--md-text-font: "Source Sans 3";
|
||||
--md-code-font: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New";
|
||||
}
|
||||
|
||||
body {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
/* Lato for all headings and the masthead site title. */
|
||||
.md-typeset h1,
|
||||
.md-typeset h2,
|
||||
.md-typeset h3,
|
||||
.md-typeset h4,
|
||||
.md-typeset h5,
|
||||
.md-typeset h6,
|
||||
.md-header__title,
|
||||
.md-nav__title {
|
||||
font-family: "Lato", "Microsoft Yahei", sans-serif;
|
||||
}
|
||||
|
||||
/* ---- Light mode (Chirpy "default" palette) ------------------------------- */
|
||||
[data-md-color-scheme="default"] {
|
||||
--md-typeset-color: #34343c;
|
||||
--md-typeset-a-color: #0056b2; /* Chirpy blue links */
|
||||
--md-accent-fg-color: #0056b2; /* link hover / active TOC */
|
||||
--md-code-bg-color: #f6f8fa;
|
||||
--md-code-fg-color: #3a3a3a;
|
||||
}
|
||||
|
||||
[data-md-color-scheme="default"] .md-typeset h1,
|
||||
[data-md-color-scheme="default"] .md-typeset h2,
|
||||
[data-md-color-scheme="default"] .md-typeset h3,
|
||||
[data-md-color-scheme="default"] .md-typeset h4,
|
||||
[data-md-color-scheme="default"] .md-typeset h5,
|
||||
[data-md-color-scheme="default"] .md-typeset h6 {
|
||||
color: #2a2a2a;
|
||||
}
|
||||
|
||||
/* Subtle tinted sidebars (left nav + right TOC), as on the blog. */
|
||||
[data-md-color-scheme="default"] .md-sidebar {
|
||||
background-color: #f6f8fa;
|
||||
}
|
||||
|
||||
/* ---- Dark mode (Chirpy "dark" palette over Material's slate) ------------- */
|
||||
[data-md-color-scheme="slate"] {
|
||||
--md-default-bg-color: rgb(27 27 30); /* neutral near-black */
|
||||
--md-default-fg-color: rgb(207 208 209); /* UI text */
|
||||
--md-default-fg-color--light: rgb(175 176 177);
|
||||
--md-default-fg-color--lighter: rgb(175 176 177 / 45%);
|
||||
--md-default-fg-color--lightest: rgb(175 176 177 / 18%);
|
||||
--md-typeset-color: rgb(175 176 177); /* body text */
|
||||
--md-code-bg-color: #151515;
|
||||
--md-code-fg-color: #b0b0b0;
|
||||
--md-typeset-a-color: rgb(138 180 248); /* Chirpy blue links */
|
||||
--md-accent-fg-color: rgb(168 199 250); /* brighter blue on hover */
|
||||
}
|
||||
|
||||
[data-md-color-scheme="slate"] .md-typeset h1,
|
||||
[data-md-color-scheme="slate"] .md-typeset h2,
|
||||
[data-md-color-scheme="slate"] .md-typeset h3,
|
||||
[data-md-color-scheme="slate"] .md-typeset h4,
|
||||
[data-md-color-scheme="slate"] .md-typeset h5,
|
||||
[data-md-color-scheme="slate"] .md-typeset h6 {
|
||||
color: #cccccc;
|
||||
}
|
||||
|
||||
/* Sidebars slightly lighter than the main background, as on the blog. */
|
||||
[data-md-color-scheme="slate"] .md-sidebar {
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
/* Inline code reads as a faint highlight rather than a dark block. */
|
||||
[data-md-color-scheme="slate"] .md-typeset :not(pre) > code {
|
||||
background-color: rgb(255 255 255 / 6%);
|
||||
}
|
||||
|
||||
/* ---- Existing project styling -------------------------------------------- */
|
||||
.md-header__title {
|
||||
font-size: 1.1rem;
|
||||
line-height: 2.6rem;
|
||||
|
||||
+13
-7
@@ -61,13 +61,19 @@ admin@example:/config/interface/eth0/> <b>leave</b>
|
||||
The operational status can be inspected to see both administrative and
|
||||
actual link state:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
eth0 ethernet <b>DISABLED</b> 02:00:00:00:00:00
|
||||
eth1 ethernet UP 02:00:00:00:00:01
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet <b>DISABLED</b> 02:00:00:00:00:00
|
||||
eth1 1000baseT UP duplex: full
|
||||
ethernet 02:00:00:00:00:01
|
||||
...
|
||||
</code></pre>
|
||||
|
||||
The rows are layered bottom-up by protocol: a physical-medium row (only
|
||||
emitted when the link is up) on top, then the ethernet row carrying the
|
||||
bare MAC, then any ipv4/ipv6 sub-rows. See [Ethernet](ethernet.md) for the
|
||||
full set of summary fields.
|
||||
|
||||
|
||||
## Description
|
||||
|
||||
@@ -84,9 +90,9 @@ The description is visible in the operational datastore and in `show`
|
||||
commands:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface eth0</b>
|
||||
name : eth0
|
||||
description : Uplink to core switch
|
||||
index : 2
|
||||
name : eth0
|
||||
description : Uplink to core switch
|
||||
index : 2
|
||||
...
|
||||
</code></pre>
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 15 KiB |
@@ -117,11 +117,11 @@ will be ignored. For details on how to enable the NTP client, see the
|
||||
|
||||

|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -153,13 +153,13 @@ admin@example:/config/interface/eth0/ipv4/> <b>diff</b>
|
||||
+ }
|
||||
+}
|
||||
admin@example:/config/interface/eth0/ipv4/> <b>leave</b>
|
||||
admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 169.254.1.3/16 (random)
|
||||
ipv4 10.0.1.1/24 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -188,12 +188,12 @@ admin@example:/config/interface/eth0/ipv4/autoconf/> <b>leave</b>
|
||||
admin@example:/config/> <b>edit interface eth0 ipv4</b>
|
||||
admin@example:/config/interface/eth0/ipv4/> <b>set dhcp</b>
|
||||
admin@example:/config/interface/eth0/ipv4/> <b>leave</b>
|
||||
admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv4 10.1.2.100/24 (dhcp)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -235,11 +235,11 @@ admin@example:/config/> <b>edit interface eth0 ipv6</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>set dhcp</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>leave</b>
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8::42/128 (dhcp)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -291,10 +291,10 @@ on the interface.
|
||||
admin@example:/config/> <b>edit interface eth0 ipv6</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>set enabled false</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>leave</b>
|
||||
admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -308,12 +308,12 @@ admin@example:/>
|
||||
admin@example:/config/> <b>edit interface eth0 ipv6</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>set address 2001:db8::1 prefix-length 64</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>leave</b>
|
||||
admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8::1/64 (static)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -330,12 +330,12 @@ advertised by the router (here 2001:db8:0:1::0/64) and the interface
|
||||
identifier. The resulting address is of type *link-layer*, as it is
|
||||
formed based on the interface identifier ([ietf-ip.yang][2]).
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -348,11 +348,11 @@ below.
|
||||
admin@example:/config/> <b>edit interface eth0 ipv6</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>set autoconf create-global-addresses false</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>leave</b>
|
||||
admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -366,12 +366,12 @@ admin@example:/>
|
||||
By default, the auto-configured link-local and global IPv6 addresses
|
||||
are formed from a link-identifier based on the MAC address.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:0:ff:fe00:0/64 (link-layer)
|
||||
ipv6 fe80::ff:fe00:0/64 (link-layer)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -385,12 +385,12 @@ possible to specify use of a random identifier ([ietf-ip.yang][2] and
|
||||
admin@example:/config/> <b>edit interface eth0 ipv6</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>set autoconf create-temporary-addresses true</b>
|
||||
admin@example:/config/interface/eth0/ipv6/> <b>leave</b>
|
||||
admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0 ethernet UP 02:00:00:00:00:00
|
||||
ipv6 2001:db8:0:1:b705:8374:638e:74a8/64 (random)
|
||||
ipv6 fe80::ad3d:b274:885a:9ffb/64 (random)
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
|
||||
+66
-66
@@ -87,34 +87,34 @@ Like other interfaces, link aggregates are also available in the general
|
||||
interfaces overview in the CLI admin-exec context. Here is the above
|
||||
static mode aggregate:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
.
|
||||
.
|
||||
.
|
||||
lag0 lag UP static: balance-xor, hash: layer2
|
||||
│ ethernet UP 00:a0:85:00:02:00
|
||||
├ eth7 lag ACTIVE
|
||||
└ eth8 lag ACTIVE
|
||||
lag0 lag UP static: balance-xor, hash: layer2
|
||||
│ ethernet UP 00:a0:85:00:02:00
|
||||
├ eth7 lag ACTIVE
|
||||
└ eth8 lag ACTIVE
|
||||
</code></pre>
|
||||
|
||||
Same aggregate, but in LACP mode:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
.
|
||||
.
|
||||
.
|
||||
lag0 lag UP lacp: active, rate: fast (1s), hash: layer2
|
||||
│ ethernet UP 00:a0:85:00:02:00
|
||||
├ eth7 lag ACTIVE active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
└ eth8 lag ACTIVE active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
lag0 lag UP lacp: active, rate: fast (1s), hash: layer2
|
||||
│ ethernet UP 00:a0:85:00:02:00
|
||||
├ eth7 lag ACTIVE active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
└ eth8 lag ACTIVE active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
</code></pre>
|
||||
|
||||
|
||||
@@ -124,45 +124,45 @@ In addition to basic status shown in the interface overview, detailed
|
||||
LAG status can be inspected:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface lag0</b>
|
||||
name : lag0
|
||||
index : 25
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
physical address : 00:a0:85:00:02:00
|
||||
lag mode : static
|
||||
lag type : balance-xor
|
||||
lag hash : layer2
|
||||
link debounce up : 0 msec
|
||||
link debounce down : 0 msec
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 0
|
||||
out-octets : 2142
|
||||
name : lag0
|
||||
index : 25
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
physical address : 00:a0:85:00:02:00
|
||||
lag mode : static
|
||||
lag type : balance-xor
|
||||
lag hash : layer2
|
||||
link debounce up : 0 msec
|
||||
link debounce down : 0 msec
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 0
|
||||
out-octets : 2142
|
||||
</code></pre>
|
||||
|
||||
Same aggregate, but in LACP mode:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface lag0</b>
|
||||
name : lag0
|
||||
index : 24
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
physical address : 00:a0:85:00:02:00
|
||||
lag mode : lacp
|
||||
lag hash : layer2
|
||||
lacp mode : active
|
||||
lacp rate : fast (1s)
|
||||
lacp aggregate id : 1
|
||||
name : lag0
|
||||
index : 24
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
physical address : 00:a0:85:00:02:00
|
||||
lag mode : lacp
|
||||
lag hash : layer2
|
||||
lacp mode : active
|
||||
lacp rate : fast (1s)
|
||||
lacp aggregate id : 1
|
||||
lacp system priority: 65535
|
||||
lacp actor key : 9
|
||||
lacp partner key : 9
|
||||
lacp partner mac : 00:a0:85:00:03:00
|
||||
link debounce up : 0 msec
|
||||
link debounce down : 0 msec
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 100892
|
||||
out-octets : 111776
|
||||
lacp actor key : 9
|
||||
lacp partner key : 9
|
||||
lacp partner mac : 00:a0:85:00:03:00
|
||||
link debounce up : 0 msec
|
||||
link debounce down : 0 msec
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 100892
|
||||
out-octets : 111776
|
||||
</code></pre>
|
||||
|
||||
Member ports provide additional status information:
|
||||
@@ -184,21 +184,21 @@ Member ports provide additional status information:
|
||||
Example member port status:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface eth7</b>
|
||||
name : eth7
|
||||
index : 8
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
physical address : 00:a0:85:00:02:00
|
||||
lag member : lag0
|
||||
lag member state : active
|
||||
lacp aggregate id : 1
|
||||
lacp actor state : active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
lacp partner state : active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
link failure count : 0
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 473244
|
||||
out-octets : 499037
|
||||
name : eth7
|
||||
index : 8
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
physical address : 00:a0:85:00:02:00
|
||||
lag member : lag0
|
||||
lag member state : active
|
||||
lacp aggregate id : 1
|
||||
lacp actor state : active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
lacp partner state : active, short_timeout, aggregating, in_sync, collecting, distributing
|
||||
link failure count : 0
|
||||
ipv4 addresses :
|
||||
ipv6 addresses :
|
||||
in-octets : 473244
|
||||
out-octets : 499037
|
||||
</code></pre>
|
||||
|
||||
|
||||
|
||||
+5
-5
@@ -109,13 +109,13 @@ CLI can be entered from shell in the same way as for SSH.
|
||||
|
||||
See the 'help' command for an introduction to the system
|
||||
|
||||
admin@example:/> <b>show interfaces</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
e1 ethernet LOWER-DOWN 00:53:00:06:03:01
|
||||
e2 ethernet LOWER-DOWN 00:53:00:06:03:02
|
||||
e1 ethernet LOWER-DOWN 00:53:00:06:03:01
|
||||
e2 ethernet LOWER-DOWN 00:53:00:06:03:02
|
||||
...
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
+438
@@ -0,0 +1,438 @@
|
||||
# Cellular Modem (WWAN)
|
||||
|
||||
Infix supports cellular modem connectivity via modems that expose a
|
||||
QMI or MBIM control interface over USB. Form factor does not matter:
|
||||
USB dongles, mPCIe cards, and M.2 Key-B modules all work as long as
|
||||
the modem chipset uses USB on the connector (the typical case for
|
||||
4G/LTE modems). See *Supported Modems* below for the exceptions.
|
||||
|
||||
Setup involves three configuration items:
|
||||
|
||||
- A `modem0` hardware component for the physical modem
|
||||
- A `sim0` hardware component for the SIM card slot
|
||||
- A `wwan0` network interface that references both and carries the
|
||||
bearer (APN) configuration
|
||||
|
||||
## Architecture
|
||||
|
||||
Infix uses a three-layer architecture for cellular modem support:
|
||||
|
||||
1. **Modem hardware component (modem0)**: the physical modem
|
||||
- Configured via `ietf-hardware` with class `infix-hardware:modem`
|
||||
- `admin-state` controls whether ModemManager and modemd are active
|
||||
- Holds physical-layer config: allowed bands, preferred mode, location
|
||||
- Auto-discovered into factory-default config when the modem is
|
||||
present at first boot
|
||||
|
||||
2. **SIM hardware component (sim0)**: the SIM card slot
|
||||
- Configured via `ietf-hardware` with class `infix-hardware:sim`
|
||||
- Holds PIN/PUK credentials and carrier profile
|
||||
- Auto-discovered into factory-default config alongside the modem
|
||||
|
||||
3. **Network interface (wwan0)**: data bearer to the cellular network
|
||||
- Configured via `ietf-interfaces` with type `infix-if-type:modem`
|
||||
- References a modem component and a SIM component
|
||||
- Holds bearer config: APN, IP type, roaming, route preference,
|
||||
authentication
|
||||
- Always added by the user, never auto-created
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
| **Name Pattern** | **Type** | **Description** |
|
||||
|------------------|----------------------|-------------------------------------------------|
|
||||
| `modemN` | Modem hardware | Hardware component for the physical modem |
|
||||
| `simN` | SIM hardware | Hardware component for the SIM card slot |
|
||||
| `wwanN` | Modem interface | Network interface for cellular data |
|
||||
|
||||
Where `N` is a number (0, 1, 2, ...).
|
||||
|
||||
> [!TIP]
|
||||
> Using these naming conventions simplifies configuration since type and
|
||||
> class are automatically inferred. Creating a hardware component named
|
||||
> `modem0` automatically sets its class to `infix-hardware:modem`, and
|
||||
> creating an interface named `wwan0` automatically sets its type to
|
||||
> `infix-if-type:modem`.
|
||||
>
|
||||
> **Note:** This inference only works via the CLI. When configuring
|
||||
> over NETCONF or RESTCONF the class and type must be set explicitly.
|
||||
|
||||
## Multi-Bearer (Multiple APNs)
|
||||
|
||||
Multiple wwan interfaces can reference the same modem component, each
|
||||
with a different APN. Same idea as multi-SSID on a WiFi radio: one
|
||||
hardware modem, several independent data connections.
|
||||
|
||||
Configure `wwan0` and `wwan1` both pointing to `modem0`:
|
||||
|
||||
```
|
||||
edit interface wwan0 wwan
|
||||
set modem modem0
|
||||
set bearer apn internet
|
||||
|
||||
edit interface wwan1 wwan
|
||||
set modem modem0
|
||||
set bearer apn corporate.vpn.apn
|
||||
```
|
||||
|
||||
## Current Limitations
|
||||
|
||||
- The modem must be present at boot. Hot-plug is not supported.
|
||||
- If the modem is absent at boot, and no `probe-timeout` is set, a
|
||||
dummy `wwan0` placeholder is created immediately so IP configuration
|
||||
can proceed. A reboot is required once the hardware is inserted.
|
||||
|
||||
## Supported Modems
|
||||
|
||||
Modems exposing a CDC-WDM control interface over USB are supported,
|
||||
regardless of physical form factor. Two protocols are handled by
|
||||
ModemManager:
|
||||
|
||||
- **MBIM**: Mobile Broadband Interface Model (e.g. Sierra Wireless,
|
||||
Quectel EM06/EM12)
|
||||
- **QMI**: Qualcomm MSM Interface (e.g. Sierra Wireless EM7xxx,
|
||||
Quectel EM/RMxxx)
|
||||
|
||||
Most 4G/LTE modules (USB dongles, mPCIe cards, M.2 Key-B) use USB on
|
||||
the connector even when the slot also carries PCIe lanes. From Infix's
|
||||
view they are all USB modems. PCIe-only modems (some 5G NR modules)
|
||||
are not supported, since the modemd / ModemManager pipeline assumes a
|
||||
USB-attached control interface.
|
||||
|
||||
## Step-by-step Setup
|
||||
|
||||
### 1. Hardware Detection
|
||||
|
||||
At first boot, USB modems detected by the kernel are written to
|
||||
`/run/system.json` and added as hardware components in the
|
||||
factory-default configuration. Verify the modem appears:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show modem</b>
|
||||
──────────────────────────────────────────────────────────────
|
||||
<span class="title">Cellular Modems</span>
|
||||
NAME MANUFACTURER MODEL STATE NETWORK SIGNAL
|
||||
modem0 Quectel EM06-E registered lte good
|
||||
──────────────────────────────────────────────────────────────
|
||||
<span class="title">SIM Cards</span>
|
||||
NAME SLOT STATE OPERATOR
|
||||
sim0 1 unlocked Tele2
|
||||
</code></pre>
|
||||
|
||||
The `STATE`, `SIM STATE`, and `SIGNAL` columns are color-coded so the
|
||||
healthy / attention / problem cases are visible at a glance: green for
|
||||
`registered`, `connected`, `unlocked`, `excellent`, `good`; yellow for
|
||||
transient or attention states like `enabling`, `pin-required`, `poor`;
|
||||
red for `failed`, `not-inserted`, `bad`.
|
||||
|
||||
If `modem0` does not appear:
|
||||
|
||||
- Verify the kernel sees the modem (`dmesg | grep -i mbim` or
|
||||
`dmesg | grep -i qmi`). Without a kernel driver no further setup
|
||||
is possible.
|
||||
- On boards with a custom factory configuration, or after replacing
|
||||
hardware on a running system, the components may need to be added
|
||||
manually. See Step 2.
|
||||
|
||||
### 2. Hardware Components
|
||||
|
||||
If `show modem` already lists `modem0` and `sim0`, the components were
|
||||
auto-discovered into the factory-default configuration and you can skip
|
||||
ahead to Step 3.
|
||||
|
||||
Otherwise, add them manually. The class is inferred from the component
|
||||
name (`modemN` → `infix-hardware:modem`, `simN` → `infix-hardware:sim`).
|
||||
The `admin-state` must be set explicitly. There is no implicit default,
|
||||
and without `unlocked` confd will not start ModemManager or modemd:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit hardware component modem0</b>
|
||||
admin@example:/config/hardware/component/modem0/> <b>set state admin-state unlocked</b>
|
||||
admin@example:/config/hardware/component/modem0/> <b>end</b>
|
||||
admin@example:/config/hardware/> <b>edit component sim0</b>
|
||||
admin@example:/config/hardware/component/sim0/> <b>set state admin-state unlocked</b>
|
||||
admin@example:/config/hardware/component/sim0/> <b>leave</b>
|
||||
admin@example:/>
|
||||
</code></pre>
|
||||
|
||||
To take the modem offline cleanly without removing the configuration,
|
||||
set `admin-state locked`. All related services are stopped and the
|
||||
bearer is torn down before the modem goes offline:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit hardware component modem0</b>
|
||||
admin@example:/config/hardware/component/modem0/> <b>set state admin-state locked</b>
|
||||
admin@example:/config/hardware/component/modem0/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
#### Slow USB Modems
|
||||
|
||||
USB modems can be slow to enumerate at boot. The kernel wwan interface
|
||||
may not appear until several seconds after confd starts applying
|
||||
configuration. The `probe-timeout` leaf inside the `modem` hardware
|
||||
configuration container controls how long confd waits. It defaults to
|
||||
30 seconds when the container is present.
|
||||
|
||||
To enable the timeout, create the modem configuration container (this
|
||||
also lets you configure bands, preferred mode, etc.):
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit hardware component modem0 modem</b>
|
||||
admin@example:/config/hardware/component/modem0/modem/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
With `probe-timeout` at its default of 30, confd waits up to 30 seconds
|
||||
for the wwan interface to appear before proceeding. For most modems it
|
||||
is ready in 2-5 seconds. If the modem has not appeared within the
|
||||
timeout, a dummy placeholder interface is created and a reboot is
|
||||
required for the real interface to take over. Set `probe-timeout 0`
|
||||
to disable waiting entirely.
|
||||
|
||||
> [!NOTE]
|
||||
> Some Quectel modules (e.g. EM05) re-enumerate the USB device several
|
||||
> times during a cold-boot firmware-init sequence that takes around 50
|
||||
> to 60 seconds. Bump `probe-timeout` to 90 for those, otherwise the
|
||||
> dummy placeholder fires before the modem settles and the real
|
||||
> interface ends up with a different name (`wwan1` instead of `wwan0`).
|
||||
|
||||
### 3. Configure the Bearer (APN)
|
||||
|
||||
Bearer configuration lives on the `wwan0` interface. Reference the
|
||||
modem hardware component and set the APN:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface wwan0</b>
|
||||
admin@example:/config/interface/wwan0/> <b>set wwan modem modem0</b>
|
||||
admin@example:/config/interface/wwan0/> <b>set wwan sim sim0</b>
|
||||
admin@example:/config/interface/wwan0/> <b>set wwan bearer apn internet</b>
|
||||
admin@example:/config/interface/wwan0/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
The modem will connect automatically once the bearer is configured and
|
||||
the hardware is unlocked.
|
||||
|
||||
**Key bearer parameters:**
|
||||
|
||||
- `apn`: Access Point Name, required, provided by your operator
|
||||
(e.g. `internet`, `data.vodafone.com`, `web.tele2.se`)
|
||||
- `route-preference`: Administrative distance for the default route
|
||||
(default: `200`). Higher value = lower priority. The default of 200
|
||||
places cellular behind wired Ethernet (distance 5) and WiFi, so
|
||||
cellular acts as a failover when the wired link is up
|
||||
- `roaming`: Allow data when roaming on a foreign network
|
||||
(default: `false`)
|
||||
- `ip-type`: `ipv4`, `ipv6`, or `ipv4v6` dual-stack
|
||||
(default: `ipv4v6`)
|
||||
|
||||
### 4. Configure Authentication
|
||||
|
||||
Most consumer APNs connect without credentials. If your operator
|
||||
requires authentication, first store the password in the keystore, then
|
||||
reference it from the bearer.
|
||||
|
||||
Create the keystore entry for the APN password:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit keystore symmetric-key apn-pass</b>
|
||||
admin@example:/config/keystore/…/apn-pass/> <b>set key-format passphrase-key-format</b>
|
||||
admin@example:/config/keystore/…/apn-pass/> <b>change cleartext-symmetric-key</b>
|
||||
Passphrase: ************
|
||||
Retype passphrase: ************
|
||||
admin@example:/config/keystore/…/apn-pass/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
Then point the bearer's authentication at it:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface wwan0 wwan bearer</b>
|
||||
admin@example:/config/interface/wwan0/wwan/bearer/> <b>set authentication username myuser</b>
|
||||
admin@example:/config/interface/wwan0/wwan/bearer/> <b>set authentication password apn-pass</b>
|
||||
admin@example:/config/interface/wwan0/wwan/bearer/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
Setting any leaf inside `authentication` creates the container, which
|
||||
enables authentication. The `password` leaf is a reference to a
|
||||
symmetric key in the keystore, not the plaintext password itself.
|
||||
|
||||
The authentication protocol defaults to `chap`. To use PAP instead:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/interface/wwan0/wwan/bearer/> <b>set authentication type pap</b>
|
||||
</code></pre>
|
||||
|
||||
### 5. Configure SIM PIN
|
||||
|
||||
If the SIM requires a PIN to unlock, configure it on the SIM hardware
|
||||
component:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit hardware component sim0</b>
|
||||
admin@example:/config/hardware/component/sim0/> <b>set sim pin 1234</b>
|
||||
admin@example:/config/hardware/component/sim0/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
### 6. Verify Connectivity
|
||||
|
||||
Once connected, the `wwan0` interface receives an IP address from the
|
||||
carrier and modemd installs the default route:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface wwan0</b>
|
||||
name : wwan0
|
||||
type : modem
|
||||
index : 5
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
ip forwarding : enabled
|
||||
physical address : 12:34:56:78:9a:bc
|
||||
ipv4 addresses : 10.142.87.33/30 (wwan)
|
||||
ipv6 addresses : 2001:db8:1:2::1/64 (wwan)
|
||||
in-octets : 84213
|
||||
out-octets : 31456
|
||||
</code></pre>
|
||||
|
||||
Check the full modem state including signal quality and registration:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show modem modem0</b>
|
||||
<span class="header">MODEM: modem0 </span>
|
||||
──────────────────────────────────────────────────────────────
|
||||
<span class="title">Hardware Information</span>
|
||||
Manufacturer : Quectel
|
||||
Model : EM06-E
|
||||
Firmware Version : EM06ELAR04A07M4G
|
||||
Serial Number : 352753090141905
|
||||
IMSI : 240021234567890
|
||||
ICCID : 8946020000001234567
|
||||
──────────────────────────────────────────────────────────────
|
||||
<span class="title">Status</span>
|
||||
State : connected
|
||||
Power State : on
|
||||
Signal : Quality: 72% good RSSI: -59 dBm RSRP: -95 dBm RSRQ: -11.0 dB
|
||||
──────────────────────────────────────────────────────────────
|
||||
<span class="title">Cellular</span>
|
||||
Registration : home
|
||||
Service State : attached
|
||||
Operator : Tele2
|
||||
Operator ID : 23002
|
||||
Network Type : lte
|
||||
──────────────────────────────────────────────────────────────
|
||||
<span class="title">SIM Card</span>
|
||||
Name : sim0
|
||||
Slot : 1
|
||||
Lock State : unlocked
|
||||
Operator : Tele2
|
||||
</code></pre>
|
||||
|
||||
When the modem is in trouble, the same view shows why. A
|
||||
`State: failed` line is followed by `Failed Reason` (e.g.
|
||||
`sim-missing`), and the `SIM Card` section's `Lock State` reads
|
||||
`not-inserted` or `pin-required` to match.
|
||||
|
||||
## Cellular Failover
|
||||
|
||||
The default `route-preference` (200) is deliberately higher than the
|
||||
distances used by wired Ethernet (udhcpc default: 5) and WiFi. When a
|
||||
wired link is up it takes precedence automatically; cellular becomes
|
||||
the active path only if higher-priority routes are withdrawn.
|
||||
|
||||
A default route via the bearer is always installed when the bearer
|
||||
connects. To adjust the failover priority between two cellular modems,
|
||||
or to prefer cellular over WiFi, set `route-preference` explicitly:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit interface wwan0 wwan bearer</b>
|
||||
admin@example:/config/interface/wwan0/wwan/bearer/> <b>set route-preference 100</b>
|
||||
admin@example:/config/interface/wwan0/wwan/bearer/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
Lower `route-preference` = higher priority.
|
||||
|
||||
## Roaming
|
||||
|
||||
Data roaming is disabled by default. To allow the modem to connect
|
||||
when on a foreign (roaming) network:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit interface wwan0 wwan bearer</b>
|
||||
admin@example:/config/interface/wwan0/wwan/bearer/> <b>set roaming true</b>
|
||||
admin@example:/config/interface/wwan0/wwan/bearer/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Enabling roaming may incur significant charges depending on your
|
||||
> mobile subscription. Check with your operator before enabling.
|
||||
|
||||
## Management Commands
|
||||
|
||||
### Restart Bearer
|
||||
|
||||
Disconnect and reconnect all bearers without resetting the modem
|
||||
hardware. Use this after changing APN or authentication settings:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>modem restart modem0</b>
|
||||
</code></pre>
|
||||
|
||||
### Reset Modem
|
||||
|
||||
Factory-reset the modem firmware. This clears all modem-internal
|
||||
settings and takes longer than a restart. Only use it if the modem is
|
||||
in a bad state that a bearer restart cannot fix:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>modem reset modem0</b>
|
||||
</code></pre>
|
||||
|
||||
> [!NOTE]
|
||||
> Not all modules accept `--reset` from ModemManager. Quectel EM05,
|
||||
> for example, rejects both `--reset` and `--factory-reset`. The only
|
||||
> way to recover from a hung firmware on these is a physical power
|
||||
> cycle. When the modem reports the rejection, modemd logs it once and
|
||||
> stops retrying.
|
||||
|
||||
### Send SMS
|
||||
|
||||
Send an SMS message via the signalling plane. No active data bearer
|
||||
is required; the modem only needs to be registered on the network:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>modem sms modem0 +46701234567 "Hello from Infix"</b>
|
||||
</code></pre>
|
||||
|
||||
> [!NOTE]
|
||||
> Some SIM cards have Fixed Dialing Number (FDN) enabled, which
|
||||
> restricts outgoing SMS and calls to a pre-configured whitelist. If
|
||||
> `modem sms` fails, check whether FDN is active with `mmcli -m 0` and
|
||||
> look for `enabled locks: fixed-dialing` in the output.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Modem not detected (`show modem` shows no modem entry)**
|
||||
|
||||
- Verify the modem is connected and recognized by the kernel: check
|
||||
`dmesg` for `cdc_mbim` or `qmi_wwan` driver messages
|
||||
- Confirm `/sys/class/usbmisc/` contains a `cdc-wdm*` entry
|
||||
- The modem must be present at boot; hotplug after boot is not
|
||||
supported
|
||||
|
||||
**`wwan0` shows as `down` or has no IP address**
|
||||
|
||||
- Check `show modem modem0`. The State should show `registered` or
|
||||
`connected`, not `failed`
|
||||
- If the State is `failed`, look at the `Failed Reason` line that
|
||||
immediately follows:
|
||||
- `sim-missing`: the SIM Card section will also show
|
||||
`Lock State: not-inserted`. Power off the device, insert the
|
||||
SIM, power back on. A warm reboot is not enough; on most M.2
|
||||
slots the SIM tray stays powered through reboot, so the modem
|
||||
keeps the original not-inserted reading
|
||||
- `unlock-required`: the SIM Card section will show
|
||||
`Lock State: pin-required`. Configure the PIN with
|
||||
`set hardware component sim0 sim pin <code>`
|
||||
- `sim-wrong` / `sim-error`: the SIM is not compatible or is
|
||||
damaged. Try a different SIM
|
||||
- Verify the APN is correct for your operator
|
||||
- Check system logs with `show log` for modemd or ModemManager
|
||||
messages
|
||||
|
||||
**`wwan0` interface is a dummy (no data flows, no carrier address)**
|
||||
|
||||
- The modem was not enumerated by the kernel before confd applied
|
||||
config
|
||||
- Create the modem hardware configuration container (see Step 2),
|
||||
which enables the default 30-second probe-timeout so confd waits for
|
||||
the wwan interface before falling back to a dummy placeholder
|
||||
|
||||
**High latency or poor signal**
|
||||
|
||||
- Use `show modem modem0` to check signal quality and RSRP
|
||||
- Signal below -110 dBm RSRP typically indicates poor coverage
|
||||
- Consider repositioning the antenna or the device
|
||||
+1
-1
@@ -47,7 +47,7 @@ other traffic would be bridged as usual.
|
||||
|----------|----------------------------|--------------------------------------------------------------|
|
||||
| [bridge](bridging.md) | infix-if-bridge | SW implementation of an IEEE 802.1Q bridge |
|
||||
| [ip](ip.md) | ietf-ip, infix-ip | IP address to the subordinate interface |
|
||||
| [vlan](ethernet.md#vlan-interfaces) | infix-if-vlan | Capture all traffic belonging to a specific 802.1Q VID |
|
||||
| [vlan](vlan.md) | infix-if-vlan | Capture all traffic belonging to a specific 802.1Q VID |
|
||||
| [lag](lag.md) | infix-if-lag | Link aggregation, static and IEEE 802.3ad (LACP) |
|
||||
| lo | ietf-interfaces | Software loopback interface |
|
||||
| [eth](ethernet.md#physical-ethernet-interfaces) | ieee802-ethernet-interface | Physical Ethernet device/port |
|
||||
|
||||
+61
-61
@@ -39,20 +39,20 @@ Starting out, we assume a configuration where all ports are network
|
||||
interfaces (possibly with IPv6 enabled).
|
||||
|
||||
```
|
||||
admin@example:/> show interfaces
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
admin@example:/> show interface
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
e1 ethernet LOWER-DOWN 00:53:00:06:11:01
|
||||
e2 ethernet LOWER-DOWN 00:53:00:06:11:02
|
||||
e3 ethernet LOWER-DOWN 00:53:00:06:11:03
|
||||
e4 ethernet LOWER-DOWN 00:53:00:06:11:04
|
||||
e5 ethernet LOWER-DOWN 00:53:00:06:11:05
|
||||
e6 ethernet LOWER-DOWN 00:53:00:06:11:06
|
||||
e7 ethernet LOWER-DOWN 00:53:00:06:11:07
|
||||
e8 ethernet LOWER-DOWN 00:53:00:06:11:08
|
||||
e9 ethernet LOWER-DOWN 00:53:00:06:11:09
|
||||
e10 ethernet UP 00:53:00:06:11:0a
|
||||
e1 ethernet LOWER-DOWN 00:53:00:06:11:01
|
||||
e2 ethernet LOWER-DOWN 00:53:00:06:11:02
|
||||
e3 ethernet LOWER-DOWN 00:53:00:06:11:03
|
||||
e4 ethernet LOWER-DOWN 00:53:00:06:11:04
|
||||
e5 ethernet LOWER-DOWN 00:53:00:06:11:05
|
||||
e6 ethernet LOWER-DOWN 00:53:00:06:11:06
|
||||
e7 ethernet LOWER-DOWN 00:53:00:06:11:07
|
||||
e8 ethernet LOWER-DOWN 00:53:00:06:11:08
|
||||
e9 ethernet LOWER-DOWN 00:53:00:06:11:09
|
||||
e10 ethernet UP 00:53:00:06:11:0a
|
||||
ipv6 fe80::0053:00ff:fe06:110a/64 (link-layer)
|
||||
admin@example:/>
|
||||
```
|
||||
@@ -80,7 +80,7 @@ admin@example:/config/> set interface e10 bridge-port bridge br0
|
||||
admin@example:/config/>
|
||||
```
|
||||
|
||||
The interface status can be viewed using `show interfaces` after leaving
|
||||
The interface status can be viewed using `show interface` after leaving
|
||||
configuration context. When configuring via SSH, first assign an IP
|
||||
address to `br0` *before leaving* configuration context, e.g.
|
||||
|
||||
@@ -95,10 +95,10 @@ setup, including [setting IP address](#set-ip-address).
|
||||
```
|
||||
admin@example:/config/> leave
|
||||
admin@example:/>
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
admin@example:/> show interface
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
br0 bridge
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
├ e1 bridge LOWER-DOWN
|
||||
├ e2 bridge LOWER-DOWN
|
||||
├ e3 bridge LOWER-DOWN
|
||||
@@ -109,7 +109,7 @@ br0 bridge
|
||||
├ e8 bridge LOWER-DOWN
|
||||
├ e9 bridge LOWER-DOWN
|
||||
└ e10 bridge FORWARDING
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -154,21 +154,21 @@ admin@example:/>
|
||||
Interface status would now should something like the following
|
||||
|
||||
```
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
admin@example:/> show interface
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
br0 bridge
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
├ e1 bridge LOWER-DOWN vlan:10u pvid:10
|
||||
├ e2 bridge LOWER-DOWN vlan:10u pvid:10
|
||||
├ e3 bridge LOWER-DOWN vlan:20u pvid:20
|
||||
├ e4 bridge LOWER-DOWN vlan:20u pvid:20
|
||||
├ e5 bridge LOWER-DOWN vlan:30u pvid:30
|
||||
├ e6 bridge LOWER-DOWN vlan:30u pvid:30
|
||||
├ e7 bridge LOWER-DOWN vlan:40u pvid:40
|
||||
├ e8 bridge LOWER-DOWN vlan:40u pvid:40
|
||||
├ e9 bridge LOWER-DOWN vlan:50u pvid:50
|
||||
└ e10 bridge FORWARDING vlan:50u pvid:50
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
├ e1 bridge LOWER-DOWN vlan:10u pvid: 10
|
||||
├ e2 bridge LOWER-DOWN vlan:10u pvid: 10
|
||||
├ e3 bridge LOWER-DOWN vlan:20u pvid: 20
|
||||
├ e4 bridge LOWER-DOWN vlan:20u pvid: 20
|
||||
├ e5 bridge LOWER-DOWN vlan:30u pvid: 30
|
||||
├ e6 bridge LOWER-DOWN vlan:30u pvid: 30
|
||||
├ e7 bridge LOWER-DOWN vlan:40u pvid: 40
|
||||
├ e8 bridge LOWER-DOWN vlan:40u pvid: 40
|
||||
├ e9 bridge LOWER-DOWN vlan:50u pvid: 50
|
||||
└ e10 bridge FORWARDING vlan:50u pvid: 50
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -181,21 +181,21 @@ patched according to [above](#vlan-snake). We should see link up and
|
||||
*FORWARDING* on all ports in the bridge.
|
||||
|
||||
```
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
admin@example:/> show interface
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
br0 bridge
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
├ e1 bridge FORWARDING vlan:10u pvid:10
|
||||
├ e2 bridge FORWARDING vlan:10u pvid:10
|
||||
├ e3 bridge FORWARDING vlan:20u pvid:20
|
||||
├ e4 bridge FORWARDING vlan:20u pvid:20
|
||||
├ e5 bridge FORWARDING vlan:30u pvid:30
|
||||
├ e6 bridge FORWARDING vlan:30u pvid:30
|
||||
├ e7 bridge FORWARDING vlan:40u pvid:40
|
||||
├ e8 bridge FORWARDING vlan:40u pvid:40
|
||||
├ e9 bridge FORWARDING vlan:50u pvid:50
|
||||
└ e10 bridge FORWARDING vlan:50u pvid:50
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
├ e1 bridge FORWARDING vlan:10u pvid: 10
|
||||
├ e2 bridge FORWARDING vlan:10u pvid: 10
|
||||
├ e3 bridge FORWARDING vlan:20u pvid: 20
|
||||
├ e4 bridge FORWARDING vlan:20u pvid: 20
|
||||
├ e5 bridge FORWARDING vlan:30u pvid: 30
|
||||
├ e6 bridge FORWARDING vlan:30u pvid: 30
|
||||
├ e7 bridge FORWARDING vlan:40u pvid: 40
|
||||
├ e8 bridge FORWARDING vlan:40u pvid: 40
|
||||
├ e9 bridge FORWARDING vlan:50u pvid: 50
|
||||
└ e10 bridge FORWARDING vlan:50u pvid: 50
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
admin@example:/>
|
||||
@@ -284,26 +284,26 @@ admin@example:/>
|
||||
Interface *vlan10* with an auto-configured IPv6 address should appear.
|
||||
|
||||
```
|
||||
admin@example:/> show interfaces
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
admin@example:/> show interface
|
||||
INTERFACE PROTOCOL STATE DATA
|
||||
br0 bridge vlan:10t
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
├ e1 bridge FORWARDING vlan:10u pvid:10
|
||||
├ e2 bridge FORWARDING vlan:10u pvid:10
|
||||
├ e3 bridge FORWARDING vlan:20u pvid:20
|
||||
├ e4 bridge FORWARDING vlan:20u pvid:20
|
||||
├ e5 bridge FORWARDING vlan:30u pvid:30
|
||||
├ e6 bridge FORWARDING vlan:30u pvid:30
|
||||
├ e7 bridge FORWARDING vlan:40u pvid:40
|
||||
├ e8 bridge FORWARDING vlan:40u pvid:40
|
||||
├ e9 bridge FORWARDING vlan:50u pvid:50
|
||||
└ e10 bridge FORWARDING vlan:50u pvid:50
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
│ ethernet UP 00:53:00:06:11:01
|
||||
├ e1 bridge FORWARDING vlan:10u pvid: 10
|
||||
├ e2 bridge FORWARDING vlan:10u pvid: 10
|
||||
├ e3 bridge FORWARDING vlan:20u pvid: 20
|
||||
├ e4 bridge FORWARDING vlan:20u pvid: 20
|
||||
├ e5 bridge FORWARDING vlan:30u pvid: 30
|
||||
├ e6 bridge FORWARDING vlan:30u pvid: 30
|
||||
├ e7 bridge FORWARDING vlan:40u pvid: 40
|
||||
├ e8 bridge FORWARDING vlan:40u pvid: 40
|
||||
├ e9 bridge FORWARDING vlan:50u pvid: 50
|
||||
└ e10 bridge FORWARDING vlan:50u pvid: 50
|
||||
lo ethernet UP 00:00:00:00:00:00
|
||||
ipv4 127.0.0.1/8 (static)
|
||||
ipv6 ::1/128 (static)
|
||||
vlan10 ethernet UP 00:53:00:06:11:01
|
||||
vlan10 ethernet UP 00:53:00:06:11:01
|
||||
│ ipv6 fe80::0053:00ff:fe06:1101/64 (link-layer)
|
||||
└ br0 ethernet UP 00:53:00:06:11:01
|
||||
└ br0 ethernet UP 00:53:00:06:11:01
|
||||
admin@example:/>
|
||||
```
|
||||
|
||||
|
||||
+2
-2
@@ -108,7 +108,7 @@ DHCP server, and the other two as DHCP clients - with all three having
|
||||
a management connection to the host PC running the test. In other
|
||||
words, the test requires a _logical_ topology like the one below.
|
||||
|
||||
<img align="right" src="img/testing-log.dot.svg" alt="Example Logical Topology">
|
||||
{ align=right width="360" }
|
||||
|
||||
```dot
|
||||
graph "dhcp-client-server" {
|
||||
@@ -155,7 +155,7 @@ degrees), we can deploy well-known algorithms to find such subgraphs.
|
||||
Continuing our example, let's say we want to run our DHCP test on the
|
||||
_physical_ topology below.
|
||||
|
||||
<img align="right" src="img/testing-phy.dot.svg" alt="Example Physical Topology">
|
||||
{ align=right width="360" }
|
||||
|
||||
```dot
|
||||
graph "quad-ring" {
|
||||
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
# VLAN Interfaces
|
||||
|
||||
A VLAN interface is an interface stacked on top of another Linux interface
|
||||
that filters traffic for a single 802.1Q VID. `tcpdump` on a VLAN interface
|
||||
shows only frames matching that VID, compared to *all* VIDs when listening
|
||||
on the lower-layer interface.
|
||||
|
||||

|
||||
|
||||
This page covers VLAN interfaces stacked on Ethernet, on a VLAN-filtering
|
||||
bridge, and on other VLAN interfaces. For VLAN handling *inside* a bridge
|
||||
(port VIDs, tagged/untagged membership, pvid), see [VLAN Filtering
|
||||
Bridge](bridging.md#vlan-filtering-bridge).
|
||||
|
||||
## On Top of an Ethernet Interface
|
||||
|
||||
A VLAN interface for VID 20 on top of an Ethernet interface `eth0` is by
|
||||
convention named `eth0.20`.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface eth0.20</b>
|
||||
admin@example:/config/interface/eth0.20/> <b>show</b>
|
||||
type vlan;
|
||||
vlan {
|
||||
tag-type c-vlan;
|
||||
id 20;
|
||||
lower-layer-if eth0;
|
||||
}
|
||||
admin@example:/config/interface/eth0.20/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
The `tag-type` defaults to `c-vlan` (802.1Q customer VLAN, EtherType 0x8100).
|
||||
Set to `s-vlan` (802.1ad service VLAN, EtherType 0x88A8) to terminate an outer
|
||||
S-Tag.
|
||||
|
||||
> [!TIP]
|
||||
> If you name your VLAN interface `foo0.N` or `vlanN`, where `N` is a
|
||||
> number, the CLI infers the interface type automatically. Otherwise
|
||||
> the type must be set explicitly.
|
||||
|
||||
## On Top of a Bridge
|
||||
|
||||
When the lower-layer interface is a VLAN-filtering bridge, the VLAN interface
|
||||
gives the CPU an IP-addressable endpoint inside the bridged broadcast domain
|
||||
for that VID. This pattern is named `vlanN` by convention.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface vlan10</b>
|
||||
admin@example:/config/interface/vlan10/> <b>set vlan id 10</b>
|
||||
admin@example:/config/interface/vlan10/> <b>set vlan lower-layer-if br0</b>
|
||||
admin@example:/config/interface/vlan10/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
The bridge `br0` must have VLAN 10 configured with the bridge itself as a
|
||||
tagged member. See [VLAN Filtering Bridge](bridging.md#vlan-filtering-bridge)
|
||||
for the bridge-side configuration.
|
||||
|
||||
## Stacked (Q-in-Q)
|
||||
|
||||
VLAN interfaces can be stacked. A VLAN interface whose lower-layer is itself
|
||||
a VLAN interface terminates the inner tag, leaving the outer tag for the
|
||||
parent to handle.
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface eth0.10</b>
|
||||
admin@example:/config/interface/eth0.10/> <b>set vlan tag-type s-vlan</b>
|
||||
admin@example:/config/interface/eth0.10/> <b>leave</b>
|
||||
admin@example:/config/> <b>edit interface eth0.10.20</b>
|
||||
admin@example:/config/interface/eth0.10.20/> <b>show</b>
|
||||
type vlan;
|
||||
vlan {
|
||||
tag-type c-vlan;
|
||||
id 20;
|
||||
lower-layer-if eth0.10;
|
||||
}
|
||||
admin@example:/config/interface/eth0.10.20/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
The summary view shows each VLAN row pointing at its immediate parent:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
<span class="header">INTERFACE PROTOCOL STATE DATA </span>
|
||||
eth0.10 vlan UP vid: 10
|
||||
│ ipv4 10.0.10.1/24 (static)
|
||||
└ eth0
|
||||
eth0.10.20 vlan UP vid: 20
|
||||
│ ipv4 10.0.10.20/28 (static)
|
||||
└ eth0.10
|
||||
</code></pre>
|
||||
@@ -345,17 +345,17 @@ tunnel endpoints use IPv4 or IPv6.
|
||||
|
||||
Check WireGuard interface status and peer connections:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interfaces</b>
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface</b>
|
||||
wg0 wireguard UP 2 peers (1 up)
|
||||
ipv4 10.0.0.1/24 (static)
|
||||
ipv6 fd00::1/64 (static)
|
||||
|
||||
admin@example:/> <b>show interfaces wg0</b>
|
||||
name : wg0
|
||||
type : wireguard
|
||||
index : 12
|
||||
operational status : up
|
||||
peers : 2
|
||||
admin@example:/> <b>show interface wg0</b>
|
||||
name : wg0
|
||||
type : wireguard
|
||||
index : 12
|
||||
operational status : up
|
||||
peers : 2
|
||||
|
||||
Peer 1:
|
||||
status : UP
|
||||
|
||||
+349
-38
@@ -137,6 +137,7 @@ admin@example:/config/> <b>edit hardware component radio0 wifi-radio</b>
|
||||
admin@example:/config/hardware/component/radio0/wifi-radio/> <b>set country-code DE</b>
|
||||
admin@example:/config/hardware/component/radio0/wifi-radio/> <b>set band 5GHz</b>
|
||||
admin@example:/config/hardware/component/radio0/wifi-radio/> <b>set channel 36</b>
|
||||
admin@example:/config/hardware/component/radio0/wifi-radio/> <b>set channel-width 80MHz</b>
|
||||
admin@example:/config/hardware/component/radio0/wifi-radio/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
@@ -150,22 +151,94 @@ admin@example:/config/hardware/component/radio0/wifi-radio/> <b>leave</b>
|
||||
- 2.4GHz: 802.11n/ax
|
||||
- 5GHz: 802.11n/ac/ax
|
||||
- 6GHz: 802.11ax
|
||||
- `channel`: Channel number (1-196) or "auto". When set to "auto", defaults to
|
||||
channel 6 for 2.4GHz, channel 36 for 5GHz, or channel 109 for 6GHz
|
||||
- `channel`: Channel number (1-233) or "auto". When set to "auto", defaults to
|
||||
channel 6 for 2.4GHz, channel 36 for 5GHz, or channel 37 for 6GHz
|
||||
- `channel-width`: AP channel bandwidth. Supported values are `auto`, `20MHz`,
|
||||
`40MHz`, `80MHz`, and `160MHz`. Wider channels require matching hardware,
|
||||
regulatory approval, and are only available on 5GHz/6GHz where supported.
|
||||
- `legacy-rates`: Allow legacy 802.11b rates (1, 2, 5.5, 11 Mbps) on 2.4GHz
|
||||
(default: disabled). Slow 802.11b clients consume excessive airtime and
|
||||
degrade throughput for all stations, so the rates are normally suppressed.
|
||||
Enable only when old 2.4GHz-only IoT devices need them to associate. No
|
||||
effect on 5GHz/6GHz.
|
||||
- `probe-timeout`: Seconds to wait for PHY detection at boot (default: 0). Set
|
||||
to a non-zero value (e.g., 30) for USB WiFi dongles that are slow to
|
||||
initialize due to firmware loading
|
||||
|
||||
> [!NOTE]
|
||||
> TX power and channel width are automatically determined by the driver
|
||||
> based on regulatory constraints, PHY mode, and hardware capabilities.
|
||||
> TX power is still determined by the driver based on regulatory
|
||||
> constraints and hardware capabilities. Channel width can now be set
|
||||
> explicitly for AP mode, or left at `auto` to let the driver choose.
|
||||
|
||||
### Bands and Channels
|
||||
|
||||
Each band strikes a different balance between range and capacity. The
|
||||
`country-code` decides which channels are legal in your location; the
|
||||
lists below are the common allocations, and your regulatory domain may
|
||||
allow fewer.
|
||||
|
||||
**2.4 GHz**
|
||||
|
||||
Channels 1-13 are available in most of the world, 1-11 in the US and
|
||||
Canada, and 14 in Japan (802.11b only). At 20 MHz only three channels
|
||||
avoid overlap: 1, 6, and 11. A 40 MHz channel takes up most of the
|
||||
band, so it is seldom worth using here.
|
||||
|
||||
Drawbacks:
|
||||
|
||||
- This is the most crowded band. It is shared with Bluetooth, Zigbee,
|
||||
cordless phones, microwave ovens, and most of the neighboring Wi-Fi.
|
||||
- Narrow channels and constant contention hold real throughput well
|
||||
below 5 and 6 GHz.
|
||||
- The upside is range: 2.4 GHz reaches further and passes through walls
|
||||
better, which keeps it useful for distant clients and 2.4 GHz-only
|
||||
IoT devices.
|
||||
|
||||
**5 GHz**
|
||||
|
||||
UNII-1 (channels 36-48) and UNII-3 (149-165) need no radar checks.
|
||||
UNII-2 (channels 52-64 and 100-144) shares spectrum with radar and
|
||||
requires DFS. ETSI regions such as the EU do not include UNII-3, so the
|
||||
only non-DFS 5 GHz channels there are 36-48. This band supports 20, 40,
|
||||
80, and 160 MHz, so it is the one to use for wide, fast channels.
|
||||
|
||||
Drawbacks:
|
||||
|
||||
- Shorter range than 2.4 GHz, and a weaker signal through walls and
|
||||
floors.
|
||||
- A DFS channel must be monitored for radar for 60 seconds (up to 10
|
||||
minutes near some weather radars) before the AP may transmit, which
|
||||
delays start-up. If radar appears later, the AP has to leave the
|
||||
channel within 10 seconds and avoid it for 30 minutes, dropping
|
||||
clients during the move.
|
||||
- The widest 80 and 160 MHz channels almost always sit on DFS spectrum,
|
||||
so the same radar rules apply to them.
|
||||
|
||||
**6 GHz**
|
||||
|
||||
The FCC regions open 59 channels (1, 5, 9 ... 233) across 5925-7125 MHz.
|
||||
ETSI regions, including the EU, currently open only the lower part,
|
||||
5945-6425 MHz (channels 1-93), for indoor use. Clients find networks on
|
||||
the 15 Preferred Scanning Channels (5, 21, 37 ... 229) spaced every
|
||||
80 MHz, and `auto` selects channel 37. There is no DFS in 6 GHz, so
|
||||
there is no radar start-up delay.
|
||||
|
||||
Drawbacks:
|
||||
|
||||
- The shortest range and the weakest wall penetration of the three
|
||||
bands.
|
||||
- Only Wi-Fi 6E and newer clients can use it; older phones and IoT
|
||||
devices cannot see the band at all.
|
||||
- AP operation requires WPA3-Personal (SAE) with management frame
|
||||
protection, so WPA2-only and open networks are rejected.
|
||||
- Indoor power limits cap coverage further.
|
||||
|
||||
### WiFi 6 Support
|
||||
|
||||
WiFi 6 (802.11ax) is always enabled in AP mode on all bands, providing improved
|
||||
performance through features like OFDMA, BSS Coloring, and beamforming.
|
||||
|
||||
**WiFi 6 Features (always enabled):**
|
||||
**WiFi 6 Features (always enabled in AP mode on supported radios):**
|
||||
|
||||
- **OFDMA**: Better multi-user efficiency in dense environments
|
||||
- **BSS Coloring**: Reduced interference from neighboring networks
|
||||
@@ -177,6 +250,11 @@ performance through features like OFDMA, BSS Coloring, and beamforming.
|
||||
- Client devices must support WiFi 6 for full benefits
|
||||
- Older WiFi 5/4 clients can still connect but won't use WiFi 6 features
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 6 GHz AP operation requires WPA3-Personal (SAE) with mandatory
|
||||
> management frame protection. Open networks and WPA2-only AP
|
||||
> configurations are not valid on 6 GHz.
|
||||
|
||||
## Discovering Available Networks
|
||||
|
||||
Before connecting to a WiFi network, you need to discover which networks
|
||||
@@ -213,22 +291,22 @@ access-point).
|
||||
Use `show interface` to see discovered networks and their signal strength:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface wifi0</b>
|
||||
name : wifi0
|
||||
type : wifi
|
||||
index : 3
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
ip forwarding : enabled
|
||||
physical address : f0:09:0d:36:5f:86
|
||||
ipv4 addresses : 192.168.1.100/24 (dhcp)
|
||||
ipv6 addresses :
|
||||
in-octets : 148388
|
||||
out-octets : 24555
|
||||
mode : station
|
||||
ssid : MyNetwork
|
||||
signal : -45 dBm (good)
|
||||
rx bitrate : 72.2 Mbps
|
||||
tx bitrate : 86.6 Mbps
|
||||
name : wifi0
|
||||
type : wifi
|
||||
index : 3
|
||||
mtu : 1500
|
||||
operational status : up
|
||||
ip forwarding : enabled
|
||||
physical address : f0:09:0d:36:5f:86
|
||||
ipv4 addresses : 192.168.1.100/24 (dhcp)
|
||||
ipv6 addresses :
|
||||
in-octets : 148388
|
||||
out-octets : 24555
|
||||
mode : station
|
||||
ssid : MyNetwork
|
||||
signal : -45 dBm (good)
|
||||
rx bitrate : 72.2 Mbps
|
||||
tx bitrate : 86.6 Mbps
|
||||
──────────────────────────────────────────────────────────────────────
|
||||
<span class="title">Available Networks</span>
|
||||
<span class="header">SSID BSSID SECURITY SIGNAL CHANNEL</span>
|
||||
@@ -294,13 +372,13 @@ admin@example:/config/interface/wifi0/> <b>leave</b>
|
||||
The connection attempt will start immediately. You can verify the connection status:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>show interface wifi0</b>
|
||||
name : wifi0
|
||||
type : wifi
|
||||
operational status : up
|
||||
physical address : f0:09:0d:36:5f:86
|
||||
mode : station
|
||||
ssid : MyHomeNetwork
|
||||
signal : -52 dBm (good)
|
||||
name : wifi0
|
||||
type : wifi
|
||||
operational status : up
|
||||
physical address : f0:09:0d:36:5f:86
|
||||
mode : station
|
||||
ssid : MyHomeNetwork
|
||||
signal : -52 dBm (good)
|
||||
</code></pre>
|
||||
|
||||
**Station configuration parameters:**
|
||||
@@ -345,7 +423,6 @@ admin@example:/config/keystore/…/my-wifi-secret/> <b>end</b>
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit interface wifi0</b>
|
||||
admin@example:/config/interface/wifi0/> <b>set wifi radio radio0</b>
|
||||
admin@example:/config/interface/wifi0/> <b>set wifi access-point ssid MyNetwork</b>
|
||||
admin@example:/config/interface/wifi0/> <b>set wifi access-point security mode wpa2-personal</b>
|
||||
admin@example:/config/interface/wifi0/> <b>set wifi access-point security secret my-wifi-secret</b>
|
||||
admin@example:/config/interface/wifi0/> <b>leave</b>
|
||||
</code></pre>
|
||||
@@ -365,6 +442,7 @@ admin@example:/config/interface/wifi0/> <b>leave</b>
|
||||
**Security modes:**
|
||||
|
||||
- `open`: No encryption (not recommended)
|
||||
- `auto`: WPA2/WPA3 transitional mode on 2.4/5 GHz, WPA3-only on 6 GHz
|
||||
- `wpa2-personal`: WPA2-PSK (most compatible)
|
||||
- `wpa3-personal`: WPA3-SAE (more secure, requires WPA3-capable clients)
|
||||
- `wpa2-wpa3-personal`: Mixed mode (maximum compatibility)
|
||||
@@ -476,20 +554,253 @@ radio settings, and `show interface` to see all active AP interfaces.
|
||||
> AP and Station modes cannot be mixed on the same radio. All virtual interfaces
|
||||
> on a radio must be the same mode (all APs or all Stations).
|
||||
|
||||
### AP as Bridge Port
|
||||
## Fast Roaming Between Access Points
|
||||
|
||||
WiFi AP interfaces can be added to bridges to integrate wireless devices
|
||||
into your LAN:
|
||||
Fast roaming enables seamless client handoff between access points through
|
||||
802.11k/r/v standards. These features can be enabled individually based on
|
||||
your requirements.
|
||||
|
||||
### 802.11r - Fast BSS Transition
|
||||
|
||||
Enable 802.11r for fast handoff (<50ms) between APs with the same SSID:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r mobility-domain 4f57
|
||||
```
|
||||
|
||||
**Requirements:**
|
||||
- All APs in roaming group must have **identical** SSID
|
||||
- All APs must have **identical** passphrase (same keystore secret)
|
||||
- All APs must use the **same mobility-domain** identifier
|
||||
|
||||
**Mobility Domain Options:**
|
||||
- Explicit 4-character hex value (e.g., `4f57`) - default if not specified
|
||||
- `hash` - Automatically derive from SSID using MD5 (OpenWrt-compatible)
|
||||
|
||||
Using `hash` allows multiple APs with the same SSID to automatically share
|
||||
the same mobility domain without manual configuration:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r mobility-domain hash
|
||||
```
|
||||
|
||||
The NAS-Identifier (Network Access Server Identifier) is a string that
|
||||
uniquely identifies each AP within the 802.11r mobility domain. APs
|
||||
exchange this identifier during fast BSS transition so they can look up
|
||||
the correct PMK-R1 key for the roaming client. It must be unique per AP
|
||||
BSS and stable across reboots.
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r nas-identifier auto
|
||||
```
|
||||
|
||||
`auto` derives the identifier as:
|
||||
|
||||
`<interface-name>-<hostname>.<mobility-domain>`
|
||||
|
||||
Or set an explicit string:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r nas-identifier ap01.wifi0.4f57
|
||||
```
|
||||
|
||||
### 802.11k - Radio Resource Management
|
||||
|
||||
Enable 802.11k for client neighbor discovery and better roaming decisions:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11k
|
||||
```
|
||||
|
||||
Enables neighbor reports and beacon reports, allowing clients to discover
|
||||
nearby APs before roaming.
|
||||
|
||||
### 802.11v - BSS Transition Management
|
||||
|
||||
Enable 802.11v for network-assisted roaming:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11v
|
||||
```
|
||||
|
||||
Allows APs to suggest better APs to clients, improving roaming decisions.
|
||||
|
||||
#### Band Steering (MBO)
|
||||
|
||||
Enabling `dot11v` also turns on MBO (Multi-Band Operation), advertised in
|
||||
beacons and association responses. MBO lets a dual-band client see that
|
||||
the same SSID exists on another band and decide for itself when to move,
|
||||
while 802.11v BSS Transition Management lets the AP suggest a better
|
||||
target.
|
||||
|
||||
On top of the client-cooperative hints, the AP applies active steering:
|
||||
on a 2.4 GHz access-point it suppresses probe responses to clients that
|
||||
were recently seen on the same SSID on the 5/6 GHz band, nudging
|
||||
dual-band clients onto the higher band. MBO is **enabled by default**
|
||||
whenever `dot11v` is enabled:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11v
|
||||
```
|
||||
|
||||
To turn it off while keeping BSS Transition Management:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11v band-steering false
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Band steering only matters when the same SSID is offered on two or more
|
||||
> bands (one access-point per radio). On a single-band network there is
|
||||
> no other band to move to, so it has no effect.
|
||||
|
||||
### Opportunistic Key Caching (OKC)
|
||||
|
||||
OKC reduces re-authentication time for roaming clients that do not
|
||||
support 802.11r. The AP caches the PMK from previous associations and
|
||||
shares it with other APs in the same mobility group. It is **enabled by
|
||||
default** and only activates when both AP and client support it:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming okc false
|
||||
```
|
||||
|
||||
### Recommended Configuration
|
||||
|
||||
For optimal roaming experience, enable all three features:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11k
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11v
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r mobility-domain 4f57
|
||||
```
|
||||
|
||||
Or use `hash` for automatic mobility domain derivation from SSID:
|
||||
|
||||
```
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11k
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11v
|
||||
admin@example:/config/interface/wifi0/> set wifi access-point roaming dot11r mobility-domain hash
|
||||
```
|
||||
|
||||
Repeat for all APs that should participate in the roaming group.
|
||||
|
||||
> [!NOTE]
|
||||
> Not all client devices support all roaming features. Modern devices typically
|
||||
> support 802.11k/r/v, but older devices may only support basic roaming without
|
||||
> fast transition.
|
||||
|
||||
## 802.11s Mesh Point Mode
|
||||
|
||||
IEEE 802.11s is a wireless mesh networking standard operating at Layer 2.
|
||||
Mesh nodes form peer links directly with each other and route traffic
|
||||
using HWMP (Hybrid Wireless Mesh Protocol), which is built into the
|
||||
Linux mac80211 subsystem. There is no central controller; nodes
|
||||
discover peers and find paths on their own.
|
||||
|
||||
The standard defines two node roles:
|
||||
|
||||
- **Mesh Point (MP)** - a basic mesh node that forwards traffic within
|
||||
the mesh
|
||||
- **Mesh Portal (MPP)** - a mesh node that bridges traffic between the
|
||||
mesh and an external network (e.g., a wired LAN)
|
||||
|
||||
In practice, a node bridging the mesh interface to a LAN acts as a mesh
|
||||
portal.
|
||||
|
||||
> [!NOTE]
|
||||
> Not all WiFi hardware supports 802.11s mesh. The driver must implement
|
||||
> mesh point mode in mac80211. Check your adapter's capabilities with
|
||||
> `iw phy <phy> info` and look for "mesh point" under "Supported interface
|
||||
> modes".
|
||||
|
||||
### 802.11s vs EasyMesh
|
||||
|
||||
| | **802.11s** | **EasyMesh** |
|
||||
|-----------------------------|--------------------------|--------------------------------|
|
||||
| **Standard** | IEEE (open, ratified) | Wi-Fi Alliance (certification) |
|
||||
| **Topology** | Peer-to-peer, any-to-any | Controller-based tree |
|
||||
| **Single point of failure** | None | Controller |
|
||||
| **Multi-hop** | True N-hop | Limited (1-2 hops) |
|
||||
| **Vendor lock-in** | None | Common |
|
||||
| **Linux support** | Kernel-native (mac80211) | Requires proprietary firmware |
|
||||
|
||||
Infix uses 802.11s because it runs entirely in the kernel with no
|
||||
proprietary components.
|
||||
|
||||
### Mesh configuration
|
||||
|
||||
A mesh point requires the radio to have `band`, `channel`, and a valid
|
||||
`country-code` configured. Mesh and AP modes cannot coexist on the same
|
||||
radio.
|
||||
|
||||
**Step 1: Configure the radio**
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit interface br0</b>
|
||||
admin@example:/config/interface/br0/> <b>set type bridge</b>
|
||||
|
||||
admin@example:/config/> <b>edit interface wifi0</b>
|
||||
admin@example:/config/interface/wifi0/> <b>set bridge-port bridge br0</b>
|
||||
admin@example:/config/interface/wifi0/> <b>leave</b>
|
||||
admin@example:/config/> <b>edit hardware component radio1 wifi-radio</b>
|
||||
admin@example:/config/hardware/component/radio1/wifi-radio/> <b>set country-code DE</b>
|
||||
admin@example:/config/hardware/component/radio1/wifi-radio/> <b>set band 5GHz</b>
|
||||
admin@example:/config/hardware/component/radio1/wifi-radio/> <b>set channel 36</b>
|
||||
admin@example:/config/hardware/component/radio1/wifi-radio/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
**Step 2: Create keystore entry for mesh security**
|
||||
|
||||
All mesh links use WPA3-SAE encryption. All nodes in the same mesh
|
||||
network must share the same passphrase:
|
||||
|
||||
<pre class="cli"><code>admin@example:/> <b>configure</b>
|
||||
admin@example:/config/> <b>edit keystore symmetric-key mesh-secret</b>
|
||||
admin@example:/config/keystore/…/mesh-secret/> <b>set key-format passphrase-key-format</b>
|
||||
admin@example:/config/keystore/…/mesh-secret/> <b>change cleartext-symmetric-key</b>
|
||||
Passphrase: ************
|
||||
Retype passphrase: ************
|
||||
admin@example:/config/keystore/…/mesh-secret/> <b>end</b>
|
||||
</code></pre>
|
||||
|
||||
**Step 3: Configure the mesh interface**
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit interface wifi-mesh</b>
|
||||
admin@example:/config/interface/wifi-mesh/> <b>set type wifi</b>
|
||||
admin@example:/config/interface/wifi-mesh/> <b>set wifi radio radio1</b>
|
||||
admin@example:/config/interface/wifi-mesh/> <b>set wifi mesh-point mesh-id my-mesh</b>
|
||||
admin@example:/config/interface/wifi-mesh/> <b>set wifi mesh-point security secret mesh-secret</b>
|
||||
admin@example:/config/interface/wifi-mesh/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
**Mesh parameters:**
|
||||
|
||||
- `mesh-id`: Network identifier, 1-32 characters. All nodes in the mesh
|
||||
must use the same mesh ID
|
||||
- `forwarding`: L2 mesh forwarding (default: true). When enabled, the
|
||||
interface can be added to a bridge as a mesh portal
|
||||
- `security secret`: Keystore reference for the WPA3-SAE passphrase
|
||||
|
||||
### Mesh portal (bridge integration)
|
||||
|
||||
To connect the wireless mesh to a wired LAN, add the mesh interface to
|
||||
a bridge:
|
||||
|
||||
<pre class="cli"><code>admin@example:/config/> <b>edit interface wifi-mesh</b>
|
||||
admin@example:/config/interface/wifi-mesh/> <b>set bridge-port bridge br0</b>
|
||||
admin@example:/config/interface/wifi-mesh/> <b>leave</b>
|
||||
</code></pre>
|
||||
|
||||
### Mesh with roaming APs
|
||||
|
||||
You can combine 802.11s mesh backhaul with roaming-enabled access
|
||||
points. Each node has a mesh interface for backhaul on one radio and
|
||||
AP interfaces for clients on another:
|
||||
|
||||

|
||||
|
||||
With 802.11r/k/v roaming enabled on the APs (same SSID, same
|
||||
passphrase, same mobility domain), clients hand off between nodes while
|
||||
the mesh carries backhaul traffic.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
Use `show interface wifi0` to verify signal strength and connection status.
|
||||
|
||||
+7
-1
@@ -3,7 +3,7 @@ site_description: Infix Documentation
|
||||
site_url: https://kernelkit.github.io/infix/
|
||||
repo_url: https://github.com/kernelkit/infix/
|
||||
repo_name: kernelkit/infix
|
||||
copyright: Copyright © 2022-2025 The KernelKit Team
|
||||
copyright: Copyright © 2022-2026 The KernelKit Team
|
||||
docs_dir: doc/
|
||||
edit_uri: edit/master/doc/
|
||||
extra_css:
|
||||
@@ -33,6 +33,7 @@ nav:
|
||||
- Bridging: bridging.md
|
||||
- Link Aggregation: lag.md
|
||||
- Ethernet Interfaces: ethernet.md
|
||||
- VLAN Interfaces: vlan.md
|
||||
- IP Addressing: ip.md
|
||||
- Routing: routing.md
|
||||
- Firewall Configuration: firewall.md
|
||||
@@ -43,6 +44,7 @@ nav:
|
||||
- Overview: vpn.md
|
||||
- WireGuard: vpn-wireguard.md
|
||||
- Wireless LAN (WiFi): wifi.md
|
||||
- Cellular Modem (wwan): modem.md
|
||||
- Services:
|
||||
- Device Discovery: discovery.md
|
||||
- DHCP Server: dhcp.md
|
||||
@@ -78,6 +80,10 @@ nav:
|
||||
theme:
|
||||
logo: logo-plain.png
|
||||
name: material
|
||||
# Fonts are loaded by doc/extra.css (Lato headings + Source Sans body +
|
||||
# system monospace, matching the Chirpy blog) instead of Material's
|
||||
# auto-loaded Roboto. Keep this false so Material does not also fetch Roboto.
|
||||
font: false
|
||||
features:
|
||||
- toc.follow
|
||||
# - toc.integrate
|
||||
|
||||
@@ -2,6 +2,7 @@ menu "Packages"
|
||||
|
||||
comment "Hardware Support"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/feature-gps/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/feature-modem/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/feature-wifi/Config.in"
|
||||
|
||||
comment "Software Packages"
|
||||
@@ -30,6 +31,7 @@ source "$BR2_EXTERNAL_INFIX_PATH/package/landing/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/libsrx/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/lowdown/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/mcd/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/modemd/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/mdns-alias/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/netbrowse/Config.in"
|
||||
source "$BR2_EXTERNAL_INFIX_PATH/package/onieprom/Config.in"
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
#set DEBUG=1
|
||||
|
||||
# Single daemon handles gen-config, datastore init, config load, and plugins
|
||||
# log:prio:daemon.err
|
||||
service log:console env:/etc/default/confd \
|
||||
service log:console env:/etc/default/confd \
|
||||
[S12345] <usr/ixinit> confd -f -v warning \
|
||||
-F /etc/factory-config.cfg \
|
||||
-S /cfg/startup-config.cfg \
|
||||
-E /etc/failure-config.cfg \
|
||||
-t $CONFD_TIMEOUT \
|
||||
-F /etc/factory-config.cfg \
|
||||
-S /cfg/startup-config.cfg \
|
||||
-E /etc/failure-config.cfg \
|
||||
-t $CONFD_TIMEOUT \
|
||||
$CONFD_ARGS \
|
||||
-- Configuration daemon
|
||||
|
||||
@@ -91,6 +91,12 @@ define CONFD_INSTALL_YANG_MODULES_GPS
|
||||
$(BR2_EXTERNAL_INFIX_PATH)/utils/srload $(@D)/yang/gps.inc
|
||||
endef
|
||||
endif
|
||||
ifeq ($(BR2_PACKAGE_FEATURE_MODEM),y)
|
||||
define CONFD_INSTALL_YANG_MODULES_MODEM
|
||||
$(COMMON_SYSREPO_ENV) \
|
||||
$(BR2_EXTERNAL_INFIX_PATH)/utils/srload $(@D)/yang/modem.inc
|
||||
endef
|
||||
endif
|
||||
|
||||
# PER_PACKAGE_DIR
|
||||
# Since the last package in the dependency chain that runs sysrepoctl is confd, we need to
|
||||
@@ -121,6 +127,7 @@ CONFD_POST_INSTALL_TARGET_HOOKS += CONFD_INSTALL_YANG_MODULES
|
||||
CONFD_POST_INSTALL_TARGET_HOOKS += CONFD_INSTALL_YANG_MODULES_CONTAINERS
|
||||
CONFD_POST_INSTALL_TARGET_HOOKS += CONFD_INSTALL_YANG_MODULES_WIFI
|
||||
CONFD_POST_INSTALL_TARGET_HOOKS += CONFD_INSTALL_YANG_MODULES_GPS
|
||||
CONFD_POST_INSTALL_TARGET_HOOKS += CONFD_INSTALL_YANG_MODULES_MODEM
|
||||
CONFD_POST_INSTALL_TARGET_HOOKS += CONFD_INSTALL_IN_ROMFS
|
||||
CONFD_TARGET_FINALIZE_HOOKS += CONFD_CLEANUP
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
config BR2_PACKAGE_FEATURE_MODEM
|
||||
bool "Feature Modem"
|
||||
select BR2_PACKAGE_MODEMD
|
||||
select BR2_PACKAGE_MODEM_MANAGER
|
||||
select BR2_PACKAGE_MODEM_MANAGER_ATVIADBUS
|
||||
select BR2_PACKAGE_MODEM_MANAGER_LIBMBIM
|
||||
select BR2_PACKAGE_MODEM_MANAGER_LIBQMI
|
||||
select BR2_PACKAGE_MODEM_MANAGER_LIBQRTR
|
||||
help
|
||||
Enables cellular modem support in Infix via ModemManager and
|
||||
the modemd management daemon. Includes drivers for common
|
||||
USB option modems and QMI/MBIM-based devices.
|
||||
|
||||
ATVIADBUS allows raw AT commands over D-Bus (used by modemd to
|
||||
enable GPS NMEA output via vendor-specific AT commands such as
|
||||
AT+QGPS=1) without needing to start ModemManager in --debug
|
||||
mode.
|
||||
|
||||
config BR2_PACKAGE_FEATURE_MODEM_QUALCOMM
|
||||
bool "Qualcomm-based modems (QMI/QRTR/MHI)"
|
||||
depends on BR2_PACKAGE_FEATURE_MODEM
|
||||
help
|
||||
Adds kernel support for Qualcomm-based cellular modems that use
|
||||
the MHI bus and QRTR IPC router (e.g. Sierra Wireless EM7xxx,
|
||||
Quectel EM/RMxxx, Telit LN9xx).
|
||||
@@ -0,0 +1,26 @@
|
||||
################################################################################
|
||||
#
|
||||
# Cellular modem support
|
||||
#
|
||||
################################################################################
|
||||
|
||||
FEATURE_MODEM_PACKAGE_VERSION = 1.0
|
||||
FEATURE_MODEM_PACKAGE_LICENSE = MIT
|
||||
|
||||
define FEATURE_MODEM_LINUX_CONFIG_FIXUPS
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_SERIAL)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_SERIAL_WWAN)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_SERIAL_OPTION)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_WDM)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_NET_QMI_WWAN)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_CDC_MBIM)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_NET_CDC_MBIM)
|
||||
|
||||
$(if $(filter y,$(BR2_PACKAGE_FEATURE_MODEM_QUALCOMM)),
|
||||
$(call KCONFIG_SET_OPT,CONFIG_QRTR,m)
|
||||
$(call KCONFIG_SET_OPT,CONFIG_MHI_BUS,m)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_QRTR_MHI)
|
||||
)
|
||||
endef
|
||||
|
||||
$(eval $(generic-package))
|
||||
@@ -5,11 +5,15 @@ config BR2_PACKAGE_FEATURE_WIFI
|
||||
select BR2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG
|
||||
select BR2_PACKAGE_WPA_SUPPLICANT_AUTOSCAN
|
||||
select BR2_PACKAGE_WPA_SUPPLICANT_CLI
|
||||
select BR2_PACKAGE_WPA_SUPPLICANT_AP_SUPPORT
|
||||
select BR2_PACKAGE_WPA_SUPPLICANT_MESH_NETWORKING
|
||||
select BR2_PACKAGE_WIRELESS_REGDB
|
||||
select BR2_PACKAGE_HOSTAPD
|
||||
select BR2_PACKAGE_HOSTAPD_DRIVER_NL80211
|
||||
select BR2_PACKAGE_HOSTAPD_WPA3
|
||||
select BR2_PACKAGE_HOSTAPD_WPS
|
||||
select BR2_PACKAGE_HOSTAPD_WNM
|
||||
select BR2_PACKAGE_HOSTAPD_MBO
|
||||
select BR2_PACKAGE_IW
|
||||
help
|
||||
Enables WiFi in Infix. Enables all requried applications.
|
||||
|
||||
@@ -68,4 +68,13 @@ define FEATURE_WIFI_LINUX_CONFIG_FIXUPS
|
||||
)
|
||||
endef
|
||||
|
||||
define FEATURE_WIFI_INSTALL_IN_ROMFS
|
||||
mkdir -p $(TARGET_DIR)/etc/modprobe.d $(TARGET_DIR)/etc/udev/rules.d $(TARGET_DIR)/usr/libexec
|
||||
cp $(FEATURE_WIFI_PKGDIR)/mt7915e.conf $(TARGET_DIR)/etc/modprobe.d/mt7915e.conf
|
||||
cp $(FEATURE_WIFI_PKGDIR)/60-rename-wifi-phy.rules $(TARGET_DIR)/etc/udev/rules.d/60-rename-wifi-phy.rules
|
||||
cp $(FEATURE_WIFI_PKGDIR)/70-remove-virtual-wifi-interfaces.rules $(TARGET_DIR)/etc/udev/rules.d/70-remove-virtual-wifi-interfaces.rules
|
||||
endef
|
||||
FEATURE_WIFI_POST_INSTALL_TARGET_HOOKS += FEATURE_WIFI_INSTALL_IN_ROMFS
|
||||
|
||||
|
||||
$(eval $(generic-package))
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
options mt7915e enable_6ghz=1
|
||||
@@ -0,0 +1,86 @@
|
||||
From 4a53f610cd05c2aba3da770384460f7e66488ff5 Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Mon, 11 May 2026 13:55:11 +0200
|
||||
Subject: [PATCH 1/2] service: clean stale pidfile after unclean daemon exit
|
||||
Organization: Wires
|
||||
|
||||
With `pid:!/path` Finit does not manage the file -- the daemon
|
||||
creates it on start and removes it on graceful exit. If the daemon
|
||||
dies before cleanup (SIGKILL, OOM, segfault, exit during startup)
|
||||
the file lingers and can block the next instance from starting,
|
||||
e.g. dbus-daemon refuses with EEXIST and the restart loop fails.
|
||||
|
||||
Remove the file when it still names the just-reaped PID and that
|
||||
PID is no longer alive (the liveness check guards against reuse).
|
||||
Called from service_cleanup(), and from service_monitor()'s
|
||||
forking+starting branch where cleanup was previously skipped.
|
||||
|
||||
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
---
|
||||
src/service.c | 36 +++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 35 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/service.c b/src/service.c
|
||||
index 7ed4fceb..e930c4fd 100644
|
||||
--- a/src/service.c
|
||||
+++ b/src/service.c
|
||||
@@ -1120,6 +1120,35 @@ static void service_notify_stop(svc_t *svc)
|
||||
}
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Drop a daemon-owned (pid:!) pidfile if it still names the just-reaped
|
||||
+ * PID and that PID is gone. The liveness check guards against reuse.
|
||||
+ */
|
||||
+static void service_clean_pidfile(svc_t *svc, pid_t reaped)
|
||||
+{
|
||||
+ pid_t pid;
|
||||
+ char *fn;
|
||||
+
|
||||
+ if (reaped <= 1)
|
||||
+ return;
|
||||
+
|
||||
+ fn = pid_file(svc);
|
||||
+ if (!fn)
|
||||
+ return;
|
||||
+
|
||||
+ pid = pid_file_read(fn);
|
||||
+ if (pid != reaped || pid_alive(pid))
|
||||
+ return;
|
||||
+
|
||||
+ if (remove(fn) && errno != ENOENT) {
|
||||
+ logit(LOG_CRIT, "Failed removing stale service %s pidfile %s",
|
||||
+ svc_ident(svc, NULL, 0), fn);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ dbg("Removed stale service %s pidfile %s", svc_ident(svc, NULL, 0), fn);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Clean up any lingering state from dead/killed services
|
||||
*/
|
||||
@@ -1137,6 +1166,8 @@ static void service_cleanup(svc_t *svc)
|
||||
if (remove(fn) && errno != ENOENT)
|
||||
logit(LOG_CRIT, "Failed removing service %s pidfile %s",
|
||||
svc_ident(svc, NULL, 0), fn);
|
||||
+ } else if (svc->pidfile[0] == '!') {
|
||||
+ service_clean_pidfile(svc, svc->pid);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2405,7 +2436,10 @@ void service_monitor(pid_t lost, int status)
|
||||
if (svc_is_forking(svc)) {
|
||||
/* Likely start script exiting */
|
||||
if (svc_is_starting(svc)) {
|
||||
- svc->pid = 0; /* Expect no more activity from this one */
|
||||
+ /* Daemon died before clearing 'starting'; drop any stale pidfile. */
|
||||
+ service_clean_pidfile(svc, lost);
|
||||
+ svc->oldpid = lost; /* So service_retry() logs the real PID */
|
||||
+ svc->pid = 0; /* Expect no more activity from this one */
|
||||
goto cont;
|
||||
}
|
||||
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
From 30f2ca3b2e64bce7db1e2d9dcb37a06d53e0b6bf Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Mon, 11 May 2026 17:08:25 +0200
|
||||
Subject: [PATCH 2/2] service: log signal name and core dumps in death message
|
||||
Organization: Wires
|
||||
|
||||
Replace the bare signal number ("by signal: 9") with the symbolic
|
||||
name ("killed by SIGKILL") and annotate when the kernel wrote a
|
||||
core:("killed by SIGSEGV, core dumped"). Makes the restart line
|
||||
self-explanatory and gives operators a strong breadcrumb when a
|
||||
daemon dies unexpectedly.
|
||||
|
||||
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
---
|
||||
src/service.c | 19 ++++++++++++-------
|
||||
1 file changed, 12 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/service.c b/src/service.c
|
||||
index e930c4fd..127e0099 100644
|
||||
--- a/src/service.c
|
||||
+++ b/src/service.c
|
||||
@@ -2828,13 +2828,18 @@ static void service_retry(svc_t *svc)
|
||||
timeout = ((*restart_cnt) <= (svc->restart_max / 2)) ? 2000 : 5000;
|
||||
/* If a longer timeout was specified in the conf, use that instead. */
|
||||
svc->restart_tmo = max(svc->restart_tmo, timeout);
|
||||
- logit(LOG_CONSOLE|LOG_WARNING, "Service %s[%d] died (%s%d), restarting (retry in %d msec) (attempt: %d/%d)",
|
||||
- svc_ident(svc, NULL, 0), svc->oldpid,
|
||||
- WIFEXITED(svc->status) ? "with exit status: " : "by signal: ",
|
||||
- WIFEXITED(svc->status) ? WEXITSTATUS(svc->status) : WTERMSIG(svc->status),
|
||||
- svc->restart_tmo,
|
||||
- *restart_cnt,
|
||||
- svc->restart_max);
|
||||
+ if (WIFEXITED(svc->status))
|
||||
+ logit(LOG_CONSOLE|LOG_WARNING,
|
||||
+ "Service %s[%d] died (exit status: %d), restarting (retry in %d msec) (attempt: %d/%d)",
|
||||
+ svc_ident(svc, NULL, 0), svc->oldpid, WEXITSTATUS(svc->status),
|
||||
+ svc->restart_tmo, *restart_cnt, svc->restart_max);
|
||||
+ else
|
||||
+ logit(LOG_CONSOLE|LOG_WARNING,
|
||||
+ "Service %s[%d] died (killed by %s%s), restarting (retry in %d msec) (attempt: %d/%d)",
|
||||
+ svc_ident(svc, NULL, 0), svc->oldpid,
|
||||
+ sig_name(WTERMSIG(svc->status)),
|
||||
+ WCOREDUMP(svc->status) ? ", core dumped" : "",
|
||||
+ svc->restart_tmo, *restart_cnt, svc->restart_max);
|
||||
|
||||
svc_unblock(svc);
|
||||
service_step(svc);
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
config BR2_PACKAGE_MODEMD
|
||||
bool "modemd"
|
||||
select BR2_PACKAGE_MODEM_MANAGER
|
||||
select BR2_PACKAGE_PYTHON3
|
||||
help
|
||||
Daemon which manages modems.
|
||||
@@ -0,0 +1,2 @@
|
||||
# Locally calculated
|
||||
sha256 25b33026a661c4c550374cfcba6890a4363bf19db0c1c31a6e65b5edd113ecf0 LICENSE
|
||||
@@ -0,0 +1,56 @@
|
||||
################################################################################
|
||||
#
|
||||
# modemd
|
||||
#
|
||||
################################################################################
|
||||
|
||||
MODEMD_VERSION = 1.0
|
||||
MODEMD_SITE_METHOD = local
|
||||
MODEMD_SITE = $(BR2_EXTERNAL_INFIX_PATH)/src/modemd
|
||||
MODEMD_LICENSE = BSD-3-Clause
|
||||
MODEMD_LICENSE_FILES = LICENSE
|
||||
MODEMD_REDISTRIBUTE = NO
|
||||
MODEMD_DEPENDENCIES = modem-manager jansson python3 \
|
||||
host-python3 host-python-pypa-build host-python-installer \
|
||||
host-python-poetry-core
|
||||
|
||||
define MODEMD_BUILD_CMDS
|
||||
$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
|
||||
$(MODEMD_DIR)/modem-command.c -o $(MODEMD_DIR)/modem-command -ljansson
|
||||
endef
|
||||
|
||||
define MODEMD_BUILD_PYTHON
|
||||
cd $(MODEMD_SITE) && \
|
||||
$(PKG_PYTHON_PEP517_ENV) $(HOST_DIR)/bin/python3 $(PKG_PYTHON_PEP517_BUILD_CMD) -o $(@D)/dist
|
||||
mkdir -p $(TARGET_DIR)/usr/libexec/modemd
|
||||
rm -f $(TARGET_DIR)/usr/libexec/modemd/modemd \
|
||||
$(TARGET_DIR)/usr/libexec/modemd/modem-* \
|
||||
$(TARGET_DIR)/usr/libexec/modemd/sim-setup
|
||||
cd $(@D) && \
|
||||
$(HOST_DIR)/bin/python3 $(TOPDIR)/support/scripts/pyinstaller.py \
|
||||
dist/*.whl \
|
||||
--interpreter=/usr/bin/python3 \
|
||||
--script-kind=posix \
|
||||
--purelib=$(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/site-packages \
|
||||
--headers=$(TARGET_DIR)/usr/include/python$(PYTHON3_VERSION_MAJOR) \
|
||||
--scripts=$(TARGET_DIR)/usr/libexec/modemd \
|
||||
--data=$(TARGET_DIR)
|
||||
endef
|
||||
MODEMD_POST_INSTALL_TARGET_HOOKS += MODEMD_BUILD_PYTHON
|
||||
|
||||
define MODEMD_INSTALL_TARGET_CMDS
|
||||
mkdir -p $(TARGET_DIR)/usr/libexec/modemd
|
||||
mkdir -p $(TARGET_DIR)/lib/udev/rules.d
|
||||
mkdir -p $(FINIT_D)/available/
|
||||
mkdir -p $(TARGET_DIR)/sbin
|
||||
$(INSTALL) -D -m 0644 $(MODEMD_DIR)/finit.conf $(FINIT_D)/available/modemd.conf
|
||||
install -m 644 $(MODEMD_DIR)/modemd.rules $(TARGET_DIR)/lib/udev/rules.d/90-modemd.rules
|
||||
install -m 644 $(MODEMD_DIR)/qmi-wwan-ids.rules $(TARGET_DIR)/lib/udev/rules.d/91-qmi-wwan-ids.rules
|
||||
install -m 644 $(MODEMD_DIR)/77-mm-dell-port-types.rules $(TARGET_DIR)/etc/udev/rules.d/77-mm-dell-port-types.rules
|
||||
install -m 644 $(MODEMD_DIR)/77-mm-modem-gps.rules $(TARGET_DIR)/etc/udev/rules.d/77-mm-modem-gps.rules
|
||||
install -D -m 644 $(MODEMD_DIR)/modemd.modules-load $(TARGET_DIR)/etc/modules-load.d/modemd.conf
|
||||
install -m 755 $(MODEMD_DIR)/modem-command $(TARGET_DIR)/sbin/modem-command
|
||||
ln -sf /usr/libexec/modemd/modemd $(TARGET_DIR)/sbin/modemd
|
||||
endef
|
||||
|
||||
$(eval $(generic-package))
|
||||
@@ -0,0 +1 @@
|
||||
service [2345789] ModemManager -- ModemManager daemon
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
From 9899169d6dcb07aaecdde09c77ef59b56f66e3e5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= <lazzer@gmail.com>
|
||||
Date: Fri, 5 Jun 2026 09:10:15 +0200
|
||||
Subject: [PATCH 3/3] fix(functions): do not touch global ip_forward sysctl
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Organization: Wires
|
||||
|
||||
Infix manages IPv4/IPv6 forwarding per-interface via the sysctls
|
||||
net.ipv4.conf.<iface>.forwarding and net.ipv6.conf.<iface>.forwarding.
|
||||
firewalld's enable_ip_forwarding() instead writes the *global*
|
||||
net.ipv4.ip_forward and net.ipv6.conf.all.forwarding knobs. The kernel
|
||||
propagates those global values to every interface, which clobbers the
|
||||
per-interface forwarding configuration Infix sets.
|
||||
|
||||
Make enable_ip_forwarding() a no-op. The backends still install the
|
||||
masquerade and forward-port nftables rules; the per-packet forwarding
|
||||
decision is governed by the inbound interface's forwarding flag, so
|
||||
routing keeps working on the interfaces where Infix enabled it while
|
||||
the global knob is left untouched.
|
||||
|
||||
Signed-off-by: Mattias Walström <lazzer@gmail.com>
|
||||
---
|
||||
src/firewall/functions.py | 13 ++++++++-----
|
||||
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/firewall/functions.py b/src/firewall/functions.py
|
||||
index 1b8a32c..cd87f5d 100644
|
||||
--- a/src/firewall/functions.py
|
||||
+++ b/src/firewall/functions.py
|
||||
@@ -495,11 +495,14 @@ def writefile(filename, line):
|
||||
|
||||
|
||||
def enable_ip_forwarding(ipv):
|
||||
- if ipv == "ipv4":
|
||||
- return writefile("/proc/sys/net/ipv4/ip_forward", "1\n")
|
||||
- elif ipv == "ipv6":
|
||||
- return writefile("/proc/sys/net/ipv6/conf/all/forwarding", "1\n")
|
||||
- return False
|
||||
+ # Infix manages IP forwarding per-interface via the sysctls
|
||||
+ # net.ipv4.conf.<iface>.forwarding and net.ipv6.conf.<iface>.forwarding.
|
||||
+ # Writing the global net.ipv4.ip_forward / net.ipv6.conf.all.forwarding
|
||||
+ # knobs would clobber those per-interface settings, since the kernel
|
||||
+ # propagates the global value to every interface. Make this a no-op:
|
||||
+ # firewalld still installs the masquerade and forward-port nft rules, and
|
||||
+ # forwarding works on the interfaces where Infix has enabled it.
|
||||
+ return True
|
||||
|
||||
|
||||
def get_nf_conntrack_short_name(module):
|
||||
--
|
||||
2.43.0
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 39ebf709e91a89f59e14ac1d1179df170448d09a Mon Sep 17 00:00:00 2001
|
||||
From 72ad44e1e215cded7c8bf3209203b5d1b32e179d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= <lazzer@gmail.com>
|
||||
Date: Tue, 27 Jan 2026 22:54:59 +0100
|
||||
Subject: [PATCH 1/3] Libyang4 compat
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
From 6f7ff746c4016ea6e6d81c7abad088f5a86f8fbf Mon Sep 17 00:00:00 2001
|
||||
From 80634c421c695b191c54d94feda6fb6c32c17eb4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= <lazzer@gmail.com>
|
||||
Date: Fri, 30 Jan 2026 13:00:12 +0100
|
||||
Subject: [PATCH 2/3] Failed without c++ 23, this adds compatibility layer
|
||||
@@ -67,10 +67,10 @@ index 97c7460079..8fe8b10c05 100644
|
||||
#define zassert assert
|
||||
|
||||
diff --git a/lib/zlog.c b/lib/zlog.c
|
||||
index 157f3323cb..7e7b6f0c25 100644
|
||||
index eb9b1c236b..b1d23a08d9 100644
|
||||
--- a/lib/zlog.c
|
||||
+++ b/lib/zlog.c
|
||||
@@ -789,6 +789,51 @@ void _zlog_assert_failed(const struct xref_assert *xref, const char *extra, ...)
|
||||
@@ -792,6 +792,51 @@ void _zlog_assert_failed(const struct xref_assert *xref, const char *extra, ...)
|
||||
abort();
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
From 868d13c0982a0633e4144d03776358837d92cd8b Mon Sep 17 00:00:00 2001
|
||||
From 939a6bd1c38f8fe37236696a862c659b8fa96b07 Mon Sep 17 00:00:00 2001
|
||||
From: Joachim Wiberg <troglobit@gmail.com>
|
||||
Date: Sun, 22 Feb 2026 10:22:06 +0100
|
||||
Subject: [PATCH 3/3] zebra: don't resolve nexthop via inactive connected route
|
||||
@@ -0,0 +1,17 @@
|
||||
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
|
||||
index 72a0bf503..9bdc2b41d 100644
|
||||
--- a/src/ap/hostapd.c
|
||||
+++ b/src/ap/hostapd.c
|
||||
@@ -916,12 +916,6 @@ static int hostapd_validate_bssid_configuration(struct hostapd_iface *iface)
|
||||
if (bits < j)
|
||||
bits = j;
|
||||
|
||||
- if (bits > 40) {
|
||||
- wpa_printf(MSG_ERROR, "Too many bits in the BSSID mask (%u)",
|
||||
- bits);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
os_memset(mask, 0xff, ETH_ALEN);
|
||||
j = bits / 8;
|
||||
for (i = 5; i > 5 - j; i--)
|
||||
@@ -0,0 +1,21 @@
|
||||
diff --git a/src/qmi-firmware-update/qfu-helpers-udev.c b/src/qmi-firmware-update/qfu-helpers-udev.c
|
||||
index bda9106..40d648f 100644
|
||||
--- a/src/qmi-firmware-update/qfu-helpers-udev.c
|
||||
+++ b/src/qmi-firmware-update/qfu-helpers-udev.c
|
||||
@@ -364,8 +364,14 @@ device_matches (GUdevDevice *device,
|
||||
if (!device_sysfs_path)
|
||||
goto out;
|
||||
|
||||
- if (g_strcmp0 (device_sysfs_path, sysfs_path) != 0)
|
||||
- goto out;
|
||||
+ /*
|
||||
+ * don't compare sysfs path for download mode as it
|
||||
+ * changes from USB4 to USB3 and thus may use a different host controller
|
||||
+ */
|
||||
+ if (mode != QFU_HELPERS_DEVICE_MODE_DOWNLOAD) {
|
||||
+ if (g_strcmp0 (device_sysfs_path, sysfs_path) != 0)
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
if (device_mode != mode)
|
||||
return NULL;
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
From 1a58edf0d4db2f4b0b894e1b98009380634bc7e1 Mon Sep 17 00:00:00 2001
|
||||
From 2b86219131c6bed9658c75334e0b2748d4b68c04 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
|
||||
Subject: [PATCH 01/50] net: phy: marvell10g: Support firmware loading on
|
||||
88X3310
|
||||
|
||||
When probing, if a device is waiting for firmware to be loaded into
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
From 88958b4437b9b6c51a24dbd24692e0e0b27f1438 Mon Sep 17 00:00:00 2001
|
||||
From 9eb5c192c3c76f9141b344d3bbbc954a0e4be50e 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
|
||||
Subject: [PATCH 02/50] net: phy: marvell10g: Fix power-up when strapped to
|
||||
start powered down
|
||||
|
||||
On devices which are hardware strapped to start powered down (PDSTATE
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
From ee98438d1e702735344ce470be5b55d2e9abc398 Mon Sep 17 00:00:00 2001
|
||||
From c08724121dc4d08ac783333a2ac38178649c918c 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
|
||||
Subject: [PATCH 03/50] net: phy: marvell10g: Add LED support for 88X3310
|
||||
|
||||
Pickup the LEDs from the state in which the hardware reset or
|
||||
bootloader left them, but also support further configuration via
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
From 9bde8e2bd4dce93ad5e80f5c9f8fc0e1f9a7d1ca Mon Sep 17 00:00:00 2001
|
||||
From cd914eb2ac2b86240294108f4d4ab18b0bfbb44b 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
|
||||
Subject: [PATCH 04/50] net: phy: marvell10g: Support LEDs tied to a single
|
||||
media side
|
||||
|
||||
In a combo-port setup, i.e. where both the copper and fiber interface
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
From f2e1903dbc979b5da26d94eac73db97bde9f495a Mon Sep 17 00:00:00 2001
|
||||
From 25d84725be05967330bbeaac957fade38e338e40 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
|
||||
Subject: [PATCH 05/50] net: phy: Do not resume PHY when attaching
|
||||
|
||||
The PHY should not start negotiating with its link-partner until
|
||||
explicitly instructed to do so.
|
||||
@@ -19,7 +19,7 @@ administratively down.
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
|
||||
index 2353d6eced68..9b0983453393 100644
|
||||
index 78cf05a17f8f..ddf47a586a5a 100644
|
||||
--- a/drivers/net/phy/phy_device.c
|
||||
+++ b/drivers/net/phy/phy_device.c
|
||||
@@ -1750,7 +1750,6 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
From 4a3e8b33268460d283b48214ca158ebd93e96ead Mon Sep 17 00:00:00 2001
|
||||
From cb1dbb66184b3a07f8da93d8a52a56e77d97b98f 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
|
||||
Subject: [PATCH 06/50] net: bridge: avoid classifying unknown multicast as
|
||||
mrouters_only
|
||||
|
||||
Unknown multicast, MAC/IPv4/IPv6, should always be flooded according to
|
||||
@@ -170,7 +170,7 @@ index 2cbae0f9ae1f..0c539bf4bebe 100644
|
||||
br_multicast_flood(mdst, skb, brmctx, local_rcv, false);
|
||||
}
|
||||
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
||||
index 5855eb050208..06641afb99a8 100644
|
||||
index b77b3250afbd..f27cb9b54211 100644
|
||||
--- a/net/bridge/br_multicast.c
|
||||
+++ b/net/bridge/br_multicast.c
|
||||
@@ -3836,6 +3836,11 @@ static void br_multicast_err_count(const struct net_bridge *br,
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
From ef1f7e05f43a38dd81bbbc4bbb8f1e70ad8b4180 Mon Sep 17 00:00:00 2001
|
||||
From 66e1ca5038625bc0feb132edf07953b2e6c350da 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
|
||||
Subject: [PATCH 07/50] net: bridge: Ignore router ports when forwarding L2
|
||||
multicast
|
||||
|
||||
Multicast router ports are either statically configured or learned from
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
From 1b6e4e22f39f95684d91d43c4e4a48c997bc54a9 Mon Sep 17 00:00:00 2001
|
||||
From 31bfb62384ef4b09238f93db137547d0d6d63663 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
|
||||
Subject: [PATCH 08/50] net: bridge: drop delay for applying strict multicast
|
||||
filtering
|
||||
|
||||
This *local* patch drops the initial delay before applying strict multicast
|
||||
@@ -24,7 +24,7 @@ Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
2 files changed, 8 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
||||
index 06641afb99a8..bacff6c2e968 100644
|
||||
index f27cb9b54211..bfb38b18c1da 100644
|
||||
--- a/net/bridge/br_multicast.c
|
||||
+++ b/net/bridge/br_multicast.c
|
||||
@@ -1760,10 +1760,6 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t)
|
||||
@@ -133,7 +133,7 @@ index 06641afb99a8..bacff6c2e968 100644
|
||||
timer_delete_sync(&brmctx->ip6_own_query.timer);
|
||||
#endif
|
||||
}
|
||||
@@ -4726,8 +4710,6 @@ EXPORT_SYMBOL_GPL(br_multicast_router);
|
||||
@@ -4747,8 +4731,6 @@ EXPORT_SYMBOL_GPL(br_multicast_router);
|
||||
|
||||
int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
|
||||
{
|
||||
@@ -142,7 +142,7 @@ index 06641afb99a8..bacff6c2e968 100644
|
||||
val = !!val;
|
||||
|
||||
spin_lock_bh(&brmctx->br->multicast_lock);
|
||||
@@ -4738,19 +4720,9 @@ int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
|
||||
@@ -4759,19 +4741,9 @@ int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
|
||||
if (!val)
|
||||
goto unlock;
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
From 5aa81b3d419d971e9ed6e1d61314075414a584b8 Mon Sep 17 00:00:00 2001
|
||||
From c16b809eb7ef941870dcfb6ecceab83570fcd223 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
|
||||
Subject: [PATCH 09/50] net: bridge: Differentiate MDB additions from
|
||||
modifications
|
||||
|
||||
Before this change, the reception of an IGMPv3 report (and analogously
|
||||
@@ -62,7 +62,7 @@ index 400eb872b403..cd7a2cd0911a 100644
|
||||
if (br_multicast_should_handle_mode(brmctx, cfg->group.proto))
|
||||
br_multicast_star_g_handle_mode(pg, cfg->filter_mode);
|
||||
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
||||
index bacff6c2e968..a5f3e4935edc 100644
|
||||
index bfb38b18c1da..cc7ce7fc6580 100644
|
||||
--- a/net/bridge/br_multicast.c
|
||||
+++ b/net/bridge/br_multicast.c
|
||||
@@ -616,7 +616,7 @@ static void br_multicast_fwd_src_handle(struct net_bridge_group_src *src)
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
From 7f2bc7bff72bcdbf46a7c40ab19790ccd9a6fca2 Mon Sep 17 00:00:00 2001
|
||||
From 4ba33d783110e4559b5abfcfd8c095f0e71befc5 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
|
||||
Subject: [PATCH 10/50] nvmem: layouts: onie-tlv: Let device probe even when
|
||||
TLV is invalid
|
||||
|
||||
Before this change, probing an NVMEM device, expected to contain a
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
From 7df1f07e90e3c4846a5770bf9e5d6723d180f61f Mon Sep 17 00:00:00 2001
|
||||
From f19c6a56de0743c906cbef917bc201d0c5a74c99 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
|
||||
Subject: [PATCH 11/50] net: usb: r8152: add r8153b support for link/activity
|
||||
LEDs
|
||||
|
||||
This patch adds support for the link/activity LEDs on the NanoPi R2S
|
||||
@@ -18,7 +18,7 @@ Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
|
||||
index 357f5c733d0b..e7aa0cffadc5 100644
|
||||
index d61074178279..701cc975cf11 100644
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -41,6 +41,11 @@
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
From e716d8e693ba5e553d79f659f154e120d7799703 Mon Sep 17 00:00:00 2001
|
||||
From daed6dc750e19a316a1a3db62df42ca31f830bd9 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
|
||||
Subject: [PATCH 12/50] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to
|
||||
match case
|
||||
|
||||
For ref. see: https://wiki.banana-pi.org/File:Bpi-r3_Metal_case.jpg
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user