ppp 链接 优化,ping 有所提升,startdial,stopdial可以正常重试了
author孙春阳 <snickersun@163.com>
Tue, 16 Sep 2025 03:17:20 +0000 (11:17 +0800)
committer孙春阳 <snickersun@163.com>
Tue, 16 Sep 2025 03:17:20 +0000 (11:17 +0800)
code/sdk/zhihui/ppp/example/ppp_at_cmd.c
code/sdk/zhihui/ppp/example/ppp_example.c
code/sdk/zhihui/ppp/include/ppp_config.h
code/sdk/zhihui/ppp/src/ppp_api.c
code/sdk/zhihui/ppp/src/ppp_lwip.c
code/sdk/zhihui/ppp/src/ppp_lwip_thread.c
code/sdk/zhihui/ppp/src/ppp_serial.c

index 91d137f..4000de9 100644 (file)
@@ -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;
index 5f4b1b9..5599d36 100644 (file)
@@ -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;
         }
        
index 5fcb7b4..040b28c 100644 (file)
@@ -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
index 667881a..e6ed978 100644 (file)
@@ -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
index d8978d5..c84e4e5 100644 (file)
@@ -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);
index a267379..c48f72f 100644 (file)
@@ -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 */
             }
         }
         
index b12f5c2..17ff98b 100644 (file)
@@ -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æ\95°æ\8d®æ¨¡å¼\8fï¼\9a使ç\94¨ä¼\98å\8c\96ç\9a\84ç\9b´æ\8e¥UART读å\8f\96ï¼\8cå\87\8få°\91è¶\85æ\97¶æ\97¶é\97´æ\8f\90é«\98å\93\8dåº\94性 */
+        /* PPPæ\95°æ\8d®æ¨¡å¼\8fï¼\9a使ç\94¨ä¼\98å\8c\96ç\9a\84ç\9b´æ\8e¥UART读å\8f\96ï¼\8c平衡å\93\8dåº\94æ\80§å\92\8cå®\8cæ\95´性 */
             {
-                /* 使用较短的超时时间来提高网络响应性 */
-                // 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;