Files
STM32F4-Base/Drivers/BSP/NETCFG/ftp_cfg.c
T
wandering1 d1e6bb4ba7 W5波+N-19收口:FTP鉴权落地、Trap25三连定案修复(N-30)、N-20/N-23/N-26
N-19 FTP 鉴权:
- lftpd_auth(USER/PASS 状态机 + 连续5次失败锁60s)+ SHA-256
  (user||pwd) 口令哈希;config.ini [ftp] 段 user/pwd_hash/write,
  出厂 admin/admin 在用有启动告警;lftpd_log.c 删除并入 lftpd_auth
- ftp_cfg 配置读写;台架 ftp_auth_bench.py 13/13

N-30 / Trap 25(CH395F_Trap_Records.md 四次定案全记录):
- 修复1 closed-with-data accept:客户端发完正常 FIN 后芯片按
  FUN_PARA(0x09) §5.52② 保留 Socket+RX 缓冲,旧代码把 CLOSED 一律
  relisten 自毁缓冲 → STOR 必挂 425;改为接受"已关但可读"连接排空
- 修复2 丢 CONNECT 中断探针 net_lost_connect_probe + last_peer_port
  幽灵甄别(拆链窗口握手完成但中断丢失,双信源去抖补 accept)
- 修复3 send_list/send_nlst 批量单发:背靠背 ~60B 小段毒化芯片 TX
  (芯片报 SEND_OK 但对端全丢),整份目录一次性写入
- 证伪存档:固定沉降/Socket 轮换冷却/listen 门控(台架 v7 矩阵)
- 台架工具 test/board/ch395f_reuse_bench.{c,h} + host 脚本存档
  (不注册编译;实验分支 n30-chip-bench 保留)

N-20:Error_Handler 死循环降级(记录+复位路径)
N-23:scripts/check_registration.py 双端注册反向校验(pre-commit)
N-26:GD5F NAND 直 DMA 调用方缓冲窗口断言

验证:BUILD_OK 0/0;ftp_regression 连跑 4 轮 11/11(修复前
LIST#4/#7 100% 挂、STOR#2 曾 100% 425);ftp_auth_bench 13/13;
@test 启动标记 PASS;ci_local L0+L0.5 全过;doc-links 通过。
登记簿 N-30 已销项。
2026-10-11 18:50:24 +08:00

117 lines
3.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:FTP 配置([ftp] 段)
* 模块功能:RAM 副本 + 工厂默认 + cfg_file 引擎注册(键表 user/pwd_hash/write)
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:王建锋
* 创建日期:2026-10-11
* 修改记录:
* v1.0 2026-10-11 王建锋 创建初始版本(N-19 FTP 鉴权)
*/
/* 头文件包含区 */
#include <stddef.h>
#include <string.h>
#include "ftp_cfg.h"
#include "cfg_file.h"
/* 私有变量定义区 */
/* 工厂默认(单一来源宏见 ftp_cfg.h;s_cfg 初值与其一致 = load 前也 fail-closed 可用) */
static const ftp_cfg_t s_defaults = {
FTP_CFG_DEF_USER,
FTP_CFG_DEF_HASH,
FTP_CFG_DEF_WRITE,
};
/* RAM 副本(引擎原地更新;注册于 net_cfg_load 内 cfg_file_load 之前) */
static ftp_cfg_t s_cfg = {
FTP_CFG_DEF_USER,
FTP_CFG_DEF_HASH,
FTP_CFG_DEF_WRITE,
};
/* [ftp] 段键表(ftp_cfg_t 布局内偏移) */
static const cfg_key_def_t s_ftp_keys[] = {
{ "user", CFG_VAL_STR, offsetof(ftp_cfg_t, user), FTP_CFG_USER_MAX },
{ "pwd_hash", CFG_VAL_STR, offsetof(ftp_cfg_t, pwd_hash), FTP_CFG_HASH_MAX },
{ "write", CFG_VAL_UINT, offsetof(ftp_cfg_t, write_en), 1u },
};
/* 函数定义区 */
/*
* 函数功能:大小写不敏感字符串相等判断
* 入口参数:p_a - 串 A p_b - 串 B(均可 NULL)
* 返回值:1 - 相等;0 - 不等或任一为 NULL int
* 限定条件:无
*/
static int s_str_ci_eq(const char *p_a, const char *p_b) {
if ((p_a == NULL) || (p_b == NULL)) {
return 0;
}
for (size_t i = 0u; ; i++) {
char a = p_a[i];
char b = p_b[i];
if ((a >= 'A') && (a <= 'Z')) {
a = (char)(a + 32);
}
if ((b >= 'A') && (b <= 'Z')) {
b = (char)(b + 32);
}
if (a != b) {
return 0;
}
if (a == '\0') {
return 1;
}
}
}
/*
* 函数功能:注册 [ftp] 段到 cfg_file 引擎(须在 cfg_file_load 之前调用)
* 入口参数:无
* 返回值:无
* 限定条件:幂等(重复调用只注册一次);由 net_cfg_load 统一触发
*/
void ftp_cfg_register(void) {
static uint8_t s_done;
cfg_section_reg_t reg;
if (s_done != 0u) {
return;
}
(void)memset(&reg, 0, sizeof(reg));
reg.name = "ftp";
reg.p_data = &s_cfg;
reg.p_defaults = &s_defaults;
reg.data_size = sizeof(ftp_cfg_t);
reg.p_keys = s_ftp_keys;
reg.key_count = 3u;
reg.p_cb = NULL; /* 无"立即应用"需求:口令在下次 PASS 时生效 */
(void)cfg_file_register(&reg);
s_done = 1u;
}
/*
* 函数功能:取 [ftp] 段 RAM 副本(load 前后均有效,load 前 = 工厂默认)
* 入口参数:无
* 返回值:配置指针(恒非 NULL,指向静态存储)
* 限定条件:调用方只读
*/
const ftp_cfg_t *ftp_cfg_get(void) {
return &s_cfg;
}
/*
* 函数功能:判断当前口令哈希是否仍为出厂默认(启动告警依据)
* 入口参数:无
* 返回值:1 - 仍是默认;0 - 已改 int
* 限定条件:大小写不敏感比较
*/
int ftp_cfg_is_default_pwd(void) {
return s_str_ci_eq(s_cfg.pwd_hash, FTP_CFG_DEF_HASH);
}