# R1350 QSDK + SFE A/B实验包（2026-07-20）

## 目的

验证小米R1350原厂QSDK快速转发与无线栈，相比OpenWrt 24.10/Linux 6.6 + ath10k + nft flow offload的实际吞吐差异。

## 已确认的原厂技术栈

- QSDK：`QCA9558.LN`
- Linux：`3.3.8`
- kernel ABI：`3.3.8-1-bea2ca4d700593662de9b1edba2d8727`
- 2.4GHz：QSDK direct-attach (`qca_da.ko`)
- 5GHz QCA9888：QSDK offload (`qca_ol.ko`)
- qca-wifi：`miwifi_git-unified-perf`
- QCA9888 firmware：`WLAN.BL.3.5.3-00050-S-1`
- 快速转发：`shortcut-fe.ko`、`shortcut-fe-cm.ko`、`shortcut-fe-ipv6.ko`
- 交换/HNAT：`qca-ssdk.ko` / `kmod-qca-ssdk-hnat`

## 文件

### `R1350-QSDK-SFE-EXPERIMENT-20260720-sysupgrade.bin`

从当前R1350 OpenWrt 24.10直接切换到QSDK实验版的sysupgrade镜像。它包含与raw实验镜像相同的原厂内核和QSDK SquashFS，并追加：

- `xiaomi,mi-router-4-pro-r1350`设备元数据；
- 兼容版本`1.1`，强制提示不保留OpenWrt配置；
- 当前OpenWrt构建密钥签名，当前恢复固件的受信公钥已核对匹配。

推荐通过有线SSH执行：

```sh
sysupgrade -T /tmp/R1350-QSDK-SFE-EXPERIMENT-20260720-sysupgrade.bin
sysupgrade -n /tmp/R1350-QSDK-SFE-EXPERIMENT-20260720-sysupgrade.bin
```

必须使用`-n`，不能把OpenWrt 24.10的配置备份写入小米QSDK。

### `R1350-QSDK-SFE-EXPERIMENT-20260720-firmware.bin`

QSDK实验镜像。原厂uImage内核和全部QSDK模块保持不变，仅重建SquashFS并进行三项可审计修改：

1. release channel允许启动原厂Dropbear；
2. 增加 `/etc/r1350-qsdk-experiment` 标记；
3. 增加只读诊断命令 `/usr/sbin/r1350-accel-status`。

没有植入或重置root密码；SSH仍使用设备原有认证信息。

### `R1350-STOCK-QSDK-BASELINE-firmware.bin`

该R1350真机备份中的原厂`firmware`分区，未修改。用于恢复QSDK基线。

### `R1350-OpenWrt-24.10-FLOW-OFFLOAD-RECOVERY-sysupgrade.bin`

当前OpenWrt 24.10/Linux 6.6回滚镜像，R1350首次启动默认：

```text
flow_offloading=1
flow_offloading_hw=0
```

### `R1350-OpenWrt-24.10-FLOW-OFFLOAD-RECOVERY-initramfs.bin`

OpenWrt恢复用initramfs内核，不是常规sysupgrade文件。

## 重要安全警告

- QSDK实验版基于2023年小米镜像中的Linux 3.3.8和老用户态，仅用于隔离A/B性能测试，不应作为长期暴露公网的安全系统。
- 只允许写入名为`firmware`、大小为`0xE00000`的分区。
- **严禁写入`all.bin`、Bootloader、Nvram、Bdata、ART、cfg_bak或overlay-stock。**
- 刷写前必须保留设备自己的`all.bin`、`bootloader.bin`、`art.bin`、`Bdata/Nvram`备份。
- 必须通过有线LAN刷写并连接串口以便观察和恢复；不要通过Wi-Fi刷写。
- 刷写前核对`/proc/mtd`，确认`firmware`分区大小是`00e00000`。不一致则停止。

## 从OpenWrt写入QSDK实验镜像

先把镜像复制到路由器`/tmp/`，随后通过有线SSH执行：

```sh
sha256sum /tmp/R1350-QSDK-SFE-EXPERIMENT-20260720-firmware.bin
cat /proc/mtd
```

期望SHA256见`SHA256SUMS`，并确认存在：

```text
"firmware" size 00e00000
```

然后执行：

```sh
mtd -r write /tmp/R1350-QSDK-SFE-EXPERIMENT-20260720-firmware.bin firmware
```

若`mtd`拒绝、分区名不同、尺寸不同或出现擦写错误，立即停止，不要改用`dd`强行写入。

## QSDK启动后

原厂默认LAN：

```text
192.168.31.1/24
```

这与上游`192.168.1.0/24`不冲突。不要把LAN改回与WAN相同的网段。

SSH是否可登录取决于设备原有root密码/overlay配置。本实验镜像不会植入新密码。串口仍是首选诊断方式。

登录后检查：

```sh
r1350-accel-status
lsmod | grep -E 'shortcut|qca|umac|qdf|asf'
/etc/init.d/shortcut-fe status 2>/dev/null || true
```

预期至少看到：

```text
shortcut_fe
shortcut_fe_ipv6
shortcut_fe_cm
qca_ssdk
qca_ol
qca_da
umac
qdf
asf
```

原厂逻辑在VPN启用时会主动关闭SFE，因此测速时不要启用VPN。

## A/B测速

保持相同客户端、位置、信道、80MHz频宽和服务器，分别测试：

1. 有线LAN到WAN；
2. 5GHz到有线LAN的`iperf3`；
3. 5GHz到WAN测速；
4. 同时记录CPU、无线协商速率与SFE模块状态。

至少每项测试3次。不要只用一次互联网测速做结论。

## 回滚OpenWrt

QSDK与当前OpenWrt的升级脚本/镜像格式不同。优先使用串口或已验证的恢复流程回到OpenWrt initramfs，再写入：

```text
R1350-OpenWrt-24.10-FLOW-OFFLOAD-RECOVERY-sysupgrade.bin
```

不要在未知的QSDK升级页面中直接上传OpenWrt sysupgrade镜像。

## 静态验证摘要

- 实验镜像：14,680,064 bytes (`0xE00000`)
- 内核区域：1,179,648 bytes (`0x120000`)，与原厂逐字节一致
- rootfs：SquashFS 4.0、XZ、256KiB block、无xattr
- rootfs重解包：3002 inodes
- 除以下三处外，文件内容、符号链接与权限和原厂树一致：
  - `etc/init.d/dropbear`
  - `etc/r1350-qsdk-experiment`
  - `usr/sbin/r1350-accel-status`
- QSDK无线、SFE和SSDK关键模块与原厂逐字节一致
- rootfs后剩余667,648字节，全部填充`0xFF`
