From: 孙春阳 Date: Tue, 16 Sep 2025 03:17:20 +0000 (+0800) Subject: ppp 链接 优化,ping 有所提升,startdial,stopdial可以正常重试了 X-Git-Tag: leiniao_debug_1.0.0_20250922_020716~84^2~2 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=955897dfe951651acbf9259a8ba55bc4f3fff8eb;p=mirrors%2FFD230.git ppp 链接 优化,ping 有所提升,startdial,stopdial可以正常重试了 --- diff --git a/code/sdk/zhihui/ppp/example/ppp_at_cmd.c b/code/sdk/zhihui/ppp/example/ppp_at_cmd.c index 91d137f21..4000de9c6 100644 --- a/code/sdk/zhihui/ppp/example/ppp_at_cmd.c +++ b/code/sdk/zhihui/ppp/example/ppp_at_cmd.c @@ -1273,6 +1273,10 @@ static errcode_t at_ppp_check_data_flow(uint8_t *para, uint32_t paraLen) switch (ppp_state) { case PPP_STATE_IDLE: state_str = "IDLE"; break; case PPP_STATE_INITIALIZED: state_str = "INITIALIZED"; break; + case PPP_STATE_INIT: state_str = "INIT"; break; + case PPP_STATE_AT_HANDSHAKE: state_str = "AT_HANDSHAKE"; break; + case PPP_STATE_SET_BAUDRATE: state_str = "SET_BAUDRATE"; break; + case PPP_STATE_DIALING: state_str = "DIALING"; break; case PPP_STATE_CONNECTING: state_str = "CONNECTING"; break; case PPP_STATE_CONNECTED: state_str = "CONNECTED"; break; case PPP_STATE_DISCONNECTING: state_str = "DISCONNECTING"; break; diff --git a/code/sdk/zhihui/ppp/example/ppp_example.c b/code/sdk/zhihui/ppp/example/ppp_example.c index 5f4b1b9c1..5599d3685 100644 --- a/code/sdk/zhihui/ppp/example/ppp_example.c +++ b/code/sdk/zhihui/ppp/example/ppp_example.c @@ -398,8 +398,11 @@ static void network_monitor_task(void *arg) case PPP_STATE_ERROR: PRINT("PPP state: ERROR\r\n"); break; + case PPP_STATE_CONNECTING: + PRINT("PPP state: CONNECTING\r\n"); + break; default: - PRINT("PPP state: UNKNOWN\r\n"); + PRINT("PPP state: UNKNOWN %d\r\n", state); break; } diff --git a/code/sdk/zhihui/ppp/include/ppp_config.h b/code/sdk/zhihui/ppp/include/ppp_config.h index 5fcb7b4af..040b28c85 100644 --- a/code/sdk/zhihui/ppp/include/ppp_config.h +++ b/code/sdk/zhihui/ppp/include/ppp_config.h @@ -61,7 +61,7 @@ extern "C" { /* 调试配置 */ #define PPP_DEBUG_ENABLE 1 // 启用调试输出 -#define PPP_DEBUG_LEVEL PPP_DEBUG_LEVEL_DEBUG // 默认只显示警告和错误 (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG) +#define PPP_DEBUG_LEVEL PPP_DEBUG_LEVEL_WARN // 默认只显示警告和错误 (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG) /* * 调试级别说明: @@ -82,11 +82,12 @@ typedef enum { PPP_STATE_INIT, // 初始化状态 PPP_STATE_AT_HANDSHAKE, // AT握手状态 PPP_STATE_SET_BAUDRATE, // 设置波特率状态 - PPP_STATE_DIALING, - PPP_STATE_CONNECTING, // 拨号状态 + PPP_STATE_DIALING, // 拨号中 + PPP_STATE_CONNECTING, // 连接中 PPP_STATE_CONNECTED, // 已连接状态 PPP_STATE_DISCONNECTING, // 断开连接状态 - PPP_STATE_ERROR // 错误状态 + PPP_STATE_ERROR, // 错误状态 + PPP_STATE_MAX } ppp_state_t; /* PPP错误码定义 */ @@ -102,7 +103,8 @@ typedef enum { PPP_ERR_MEMORY, // 内存错误 PPP_ERR_UART, // 串口错误 PPP_ERR_INVALID_STATE, // 无效状态 - PPP_ERR_UNKNOWN // 未知错误 + PPP_ERR_UNKNOWN, // 未知错误 + PPP_ERR_MAX } ppp_error_t; #ifdef __cplusplus diff --git a/code/sdk/zhihui/ppp/src/ppp_api.c b/code/sdk/zhihui/ppp/src/ppp_api.c index 667881a12..e6ed97828 100644 --- a/code/sdk/zhihui/ppp/src/ppp_api.c +++ b/code/sdk/zhihui/ppp/src/ppp_api.c @@ -33,8 +33,9 @@ uint8_t g_ppp_enable_debug = PPP_LOG_LEVEL_INFO; // 外部声明cat1_api_enable_cat1函数(在ppp_cat1_api.c中实现) extern void cat1_api_enable_cat1(bool isopen); +static void ppp_check_and_update_state(void); -static errcode_t ppp_api_get_ppp_netif_name(char* netif_name, uint32_t buffer_size); +errcode_t ppp_api_get_ppp_netif_name(char* netif_name, uint32_t buffer_size); /** * @brief 初始化PPP模块 */ @@ -489,7 +490,10 @@ ppp_state_t ppp_get_state(void) { return g_ppp_state; } - +void ppp_set_state(ppp_state_t state) +{ + g_ppp_state = state; +} /** * @brief 注册PPP事件回调函数 */ @@ -727,6 +731,9 @@ errcode_t ppp_test_get_status(char *stats_info, uint32_t buffer_size) return ERRCODE_INVALID_PARAM; } + /* 检查并更新PPP状态 */ + ppp_check_and_update_state(); + ppp_serial_stats_t stats; ppp_serial_get_stats(&stats); @@ -1432,7 +1439,7 @@ errcode_t ppp_api_get_default_netif(char* netif_name, uint32_t buffer_size) * @param buffer_size 缓冲区大小 * @return ERRCODE_SUCC-成功,其他-失败 */ -static errcode_t ppp_api_get_ppp_netif_name(char* netif_name, uint32_t buffer_size) +errcode_t ppp_api_get_ppp_netif_name(char* netif_name, uint32_t buffer_size) { if (netif_name == NULL || buffer_size == 0) { PPP_DEBUG_ERROR("Invalid parameters"); @@ -2061,4 +2068,26 @@ errcode_t ppp_api_force_ipcp_renegotiation(char* result_info, uint32_t buffer_si PPP_DEBUG_INFO("IPCP renegotiation %s", ip_acquired ? "succeeded" : "failed"); return ip_acquired ? ERRCODE_SUCC : ERRCODE_FAIL; +} + +/** + * @brief 检查并更新PPP状态(基于实际网络状态) + */ +static void ppp_check_and_update_state(void) +{ + /* 获取网络接口信息 */ + ppp_lwip_network_info_t lwip_info; + ppp_error_t ret = ppp_lwip_get_network_info(&lwip_info); + + if (ret == PPP_ERR_OK && lwip_info.local_ip != 0) { + /* 有有效IP地址,应该是CONNECTED状态 */ + if (g_ppp_state == PPP_STATE_CONNECTING) { + g_ppp_state = PPP_STATE_CONNECTED; + PPP_DEBUG_CRITICAL("PPP state corrected to CONNECTED (IP: %u.%u.%u.%u)", + (lwip_info.local_ip >> 0) & 0xFF, + (lwip_info.local_ip >> 8) & 0xFF, + (lwip_info.local_ip >> 16) & 0xFF, + (lwip_info.local_ip >> 24) & 0xFF); + } + } } \ No newline at end of file diff --git a/code/sdk/zhihui/ppp/src/ppp_lwip.c b/code/sdk/zhihui/ppp/src/ppp_lwip.c index d8978d539..c84e4e5f2 100644 --- a/code/sdk/zhihui/ppp/src/ppp_lwip.c +++ b/code/sdk/zhihui/ppp/src/ppp_lwip.c @@ -137,6 +137,16 @@ ppp_error_t ppp_lwip_init(const ppp_lwip_config_t *config) /* 使用标准PPP/LCP配置 */ PPP_DEBUG_INFO("Using standard PPP/LCP configuration..."); + /* 配置LCP Magic Number以避免loopback检测问题 */ + /* 使用简单的随机数生成唯一的Magic Number */ + static uint32_t magic_counter = 0x12345678; + uint32_t magic_number = magic_counter++; + magic_number ^= (uint32_t)g_lwip_ctx.ppp_pcb; /* 使用PCB地址增加随机性 */ + g_lwip_ctx.ppp_pcb->lcp_wantoptions.neg_magicnumber = 1; + g_lwip_ctx.ppp_pcb->lcp_wantoptions.magicnumber = magic_number; + g_lwip_ctx.ppp_pcb->lcp_allowoptions.neg_magicnumber = 1; + PPP_DEBUG_INFO("LCP Magic Number configured: 0x%08X", magic_number); + /* 使用标准PPP/LCP配置 */ PPP_DEBUG_INFO("Using standard PPP/LCP configuration..."); @@ -606,6 +616,8 @@ static const char* ppp_get_lcp_code_name(uint8_t code) default: return "Unknown"; } } +extern errcode_t ppp_api_get_ppp_netif_name(char* netif_name, uint32_t buffer_size); +extern void ppp_set_state(ppp_state_t state); /** * @brief PPP网络接口状态回调函数 @@ -638,17 +650,28 @@ static void ppp_lwip_netif_status_callback(struct netif *netif) } if (should_set_default) { - /* 检查当前默认接口 */ - struct netif *current_default = netif_default; - if (current_default != netif) { - PPP_DEBUG_INFO("Setting PPP interface as default (was: %s)...", - current_default ? "other" : "none"); - netif_set_default(netif); - PPP_DEBUG_CRITICAL("PPP interface set as default network interface"); - } else { - PPP_DEBUG_INFO("PPP interface is already the default"); + /* 获取实际的PPP网络接口名称 */ + char ppp_netif_name[16]; + errcode_t ret = ppp_api_get_ppp_netif_name(ppp_netif_name, sizeof(ppp_netif_name)); + if (ret != ERRCODE_SUCC) { + strncpy_s(ppp_netif_name, sizeof(ppp_netif_name), "pp1", sizeof(ppp_netif_name) - 1); + } + + PPP_DEBUG_INFO("PPP netif name: %s", ppp_netif_name); + PPP_DEBUG_INFO("Setting default network interface to: %s", ppp_netif_name); + + /* 设置为默认网络接口 */ + netif_set_default(netif); + PPP_DEBUG_INFO("Default network interface set to: %s", ppp_netif_name); + + /* 强制更新PPP状态为CONNECTED(如果还没有更新的话) */ + if (ppp_get_state() == PPP_STATE_CONNECTING) { + ppp_set_state(PPP_STATE_CONNECTED); + PPP_DEBUG_CRITICAL("PPP state force updated to CONNECTED (IP assigned)"); } + PPP_DEBUG_CRITICAL("PPP interface (%s) automatically set as default network interface", ppp_netif_name); + /* 更新本地IP地址信息 */ uint32_t old_local_ip = g_lwip_ctx.local_ip; g_lwip_ctx.local_ip = ip4_addr_get_u32(&netif->ip_addr); diff --git a/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c b/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c index a267379c4..c48f72f95 100644 --- a/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c +++ b/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c @@ -95,7 +95,7 @@ static void ppp_lwip_receive_thread(void *arg) PPP_DEBUG_DEBUG("PPP complete frame found: %u bytes", frame_len); - /* 将完整帧传递给lwIP */ + /* 将完整帧传递给lwIP - 让lwIP自己验证帧的有效性 */ ppp_lwip_input(stream_buffer + frame_start, frame_len); complete_frames++; } @@ -114,7 +114,8 @@ static void ppp_lwip_receive_thread(void *arg) } stream_pos = remaining; frame_start = 0; - in_frame = false; + /* 保持in_frame状态,不要重置为false */ + /* in_frame状态应该保持,因为我们可能正在处理一个跨缓冲区的帧 */ } } else if (ret != PPP_ERR_OK) { /* 检查是否是因为线程停止导致的错误 */ @@ -129,13 +130,13 @@ static void ppp_lwip_receive_thread(void *arg) no_data_count++; /* 减少无数据时的日志输出频率,避免日志开销 */ - if (no_data_count % 1000 == 0) { // 每1000次无数据时打印一次 + if (no_data_count % 2000 == 0) { /* 每2000次无数据时打印一次 */ PPP_DEBUG_DEBUG("PPP RX: No data available (count: %u)", no_data_count); } - /* 短暂让出CPU,避免过度占用 */ - if (no_data_count % 20 == 0) { // 每20次无数据后短暂休眠 - osal_msleep(1); // 1ms休眠,让出CPU + /* 短暂让出CPU,避免过度占用 - 优化性能 */ + if (no_data_count % 10 == 0) { /* 每10次无数据后短暂休眠 */ + osal_msleep(1); /* 1ms休眠,让出CPU */ } } diff --git a/code/sdk/zhihui/ppp/src/ppp_serial.c b/code/sdk/zhihui/ppp/src/ppp_serial.c index b12f5c2c5..17ff98b15 100644 --- a/code/sdk/zhihui/ppp/src/ppp_serial.c +++ b/code/sdk/zhihui/ppp/src/ppp_serial.c @@ -289,7 +289,7 @@ ppp_error_t ppp_serial_switch_to_ppp_mode(void) g_serial_ctx.current_mode = PPP_SERIAL_MODE_PPP_DATA; PPP_DEBUG_CRITICAL("Serial mode switched to PPP_DATA (%d)", g_serial_ctx.current_mode); - PPP_DEBUG_CRITICAL("PPP data mode active - UART will use direct read with 50ms timeout (optimized)"); + PPP_DEBUG_CRITICAL("PPP data mode active - UART will use direct read with 200ms timeout (balanced)"); PPP_DEBUG_INFO("=== PPP Data Mode Switch Complete ==="); return PPP_ERR_OK; } @@ -462,11 +462,11 @@ ppp_error_t ppp_serial_read(uint8_t *buffer, uint32_t buffer_size, uint32_t *byt break; case PPP_SERIAL_MODE_PPP_DATA: - /* PPP数据模式:使用优化的直接UART读取,减少超时时间提高响应性 */ + /* PPP数据模式:使用优化的直接UART读取,平衡响应性和完整性 */ { - /* 使用较短的超时时间来提高网络响应性 */ - // PPP_DEBUG_DEBUG("PPP mode: Attempting UART read (timeout: 50ms)"); - int32_t read_result = uapi_uart_read(g_serial_ctx.uart_bus, buffer, buffer_size, 50); + /* 使用适中的超时时间来平衡响应性和帧完整性 */ + // PPP_DEBUG_DEBUG("PPP mode: Attempting UART read (timeout: 200ms)"); + int32_t read_result = uapi_uart_read(g_serial_ctx.uart_bus, buffer, buffer_size, 200); if (read_result > 0) { *bytes_read = (uint32_t)read_result; g_serial_ctx.rx_bytes += *bytes_read;