修改ppp协议中的mtu协商配置。现在不会有超大包了。
author孙春阳 <snickersun@163.com>
Sun, 21 Sep 2025 16:32:56 +0000 (00:32 +0800)
committer孙春阳 <snickersun@163.com>
Sun, 21 Sep 2025 16:32:56 +0000 (00:32 +0800)
code/sdk/zhihui/ppp/include/ppp_api.h
code/sdk/zhihui/ppp/src/ppp_lwip.c
code/sdk/zhihui/ppp/src/ppp_lwip_thread.c

index 86c69b1..61eddc1 100644 (file)
@@ -284,6 +284,11 @@ void ppp_lwip_reset_discard_stats(void);
  */
 void ppp_lwip_print_discard_stats(void);
 
+/**
+ * @brief 打印PPP MRU协商状态 - 用于调试超大帧问题
+ */
+void ppp_lwip_print_mru_status(void);
+
 #ifdef __cplusplus
 }
 #endif
index 6188511..28d78b9 100644 (file)
@@ -59,6 +59,9 @@ static void ppp_lwip_monitor_thread(void *arg);
 static ppp_error_t ppp_lwip_start_connection_monitor(void);
 static void ppp_lwip_stop_connection_monitor(void);
 
+/* 函数前向声明 */
+static void ppp_lwip_print_mru_status(void);
+
 /**
  * @brief 记录数据活动时间
  */
@@ -273,6 +276,15 @@ ppp_error_t ppp_lwip_init(const ppp_lwip_config_t *config)
     g_lwip_ctx.ppp_pcb->lcp_wantoptions.neg_magicnumber = 0;
     g_lwip_ctx.ppp_pcb->lcp_allowoptions.neg_magicnumber = 0;
 
+    /* 启用并强制MRU协商 - 防止接收超大帧 */
+    g_lwip_ctx.ppp_pcb->lcp_wantoptions.neg_mru = 1;
+    g_lwip_ctx.ppp_pcb->lcp_allowoptions.neg_mru = 1;
+    g_lwip_ctx.ppp_pcb->lcp_wantoptions.mru = PPP_MRU_SIZE;  // 使用配置的1500字节
+    g_lwip_ctx.ppp_pcb->lcp_allowoptions.mru = PPP_MRU_SIZE;
+    PPP_DEBUG_INFO("MRU negotiation enabled: want=%u, allow=%u", 
+                  g_lwip_ctx.ppp_pcb->lcp_wantoptions.mru,
+                  g_lwip_ctx.ppp_pcb->lcp_allowoptions.mru);
+
     /* 启用IPCP接受选项 (对应 ipcp-accept-local/remote) */
     g_lwip_ctx.ppp_pcb->ipcp_wantoptions.accept_local = 1;
     g_lwip_ctx.ppp_pcb->ipcp_wantoptions.accept_remote = 1;
@@ -622,6 +634,8 @@ static void ppp_lwip_status_callback(ppp_pcb *pcb, int err_code, void *ctx)
             memset_s(&event, sizeof(event), 0, sizeof(event));
             event.type = PPP_LWIP_EVENT_CONNECTED;
             PPP_DEBUG_CRITICAL("PPP connection established successfully");
+            g_lwip_ctx.connected = true;
+            
             /* 获取IP地址信息 */
             if (g_lwip_ctx.netif) {
                             PPP_DEBUG_DEBUG("PPP netif available, checking IP addresses...");
@@ -667,6 +681,8 @@ static void ppp_lwip_status_callback(ppp_pcb *pcb, int err_code, void *ctx)
                     netif_set_up(g_lwip_ctx.netif);
                     netif_set_link_up(g_lwip_ctx.netif);
                 }
+
+                ppp_lwip_print_mru_status();
             } else {
                 PPP_DEBUG_ERROR("PPP netif is NULL!");
             }
@@ -1150,5 +1166,48 @@ ppp_error_t ppp_lwip_trigger_keepalive(void)
 #endif
 }
 
+/**
+ * @brief 打印PPP MRU协商状态 - 用于调试超大帧问题
+ */
+void ppp_lwip_print_mru_status(void)
+{
+    if (!g_lwip_ctx.initialized || !g_lwip_ctx.ppp_pcb) {
+        PPP_DEBUG_INFO("PPP not initialized, cannot print MRU status");
+        return;
+    }
+
+    PPP_DEBUG_INFO("=== PPP MRU Negotiation Status ===");
+    PPP_DEBUG_INFO("LCP Want Options:");
+    PPP_DEBUG_INFO("  - neg_mru: %s", g_lwip_ctx.ppp_pcb->lcp_wantoptions.neg_mru ? "ENABLED" : "DISABLED");
+    PPP_DEBUG_INFO("  - mru: %u bytes", g_lwip_ctx.ppp_pcb->lcp_wantoptions.mru);
+    
+    PPP_DEBUG_INFO("LCP Allow Options:");
+    PPP_DEBUG_INFO("  - neg_mru: %s", g_lwip_ctx.ppp_pcb->lcp_allowoptions.neg_mru ? "ENABLED" : "DISABLED");
+    PPP_DEBUG_INFO("  - mru: %u bytes", g_lwip_ctx.ppp_pcb->lcp_allowoptions.mru);
+    
+    PPP_DEBUG_INFO("LCP Got Options (from peer):");
+    PPP_DEBUG_INFO("  - neg_mru: %s", g_lwip_ctx.ppp_pcb->lcp_gotoptions.neg_mru ? "ENABLED" : "DISABLED");
+    PPP_DEBUG_INFO("  - mru: %u bytes", g_lwip_ctx.ppp_pcb->lcp_gotoptions.mru);
+    
+    PPP_DEBUG_INFO("LCP His Options (peer's settings):");
+    PPP_DEBUG_INFO("  - neg_mru: %s", g_lwip_ctx.ppp_pcb->lcp_hisoptions.neg_mru ? "ENABLED" : "DISABLED");
+    PPP_DEBUG_INFO("  - mru: %u bytes", g_lwip_ctx.ppp_pcb->lcp_hisoptions.mru);
+    
+    PPP_DEBUG_INFO("Network Interface MTU: %u bytes", g_lwip_ctx.netif ? g_lwip_ctx.netif->mtu : 0);
+    PPP_DEBUG_INFO("================================");
+    
+    /* 检查是否存在MRU不匹配的问题 */
+    if (g_lwip_ctx.ppp_pcb->lcp_hisoptions.neg_mru && 
+        g_lwip_ctx.ppp_pcb->lcp_hisoptions.mru > PPP_MRU_SIZE) {
+        PPP_DEBUG_WARN("WARNING: Peer's MRU (%u) exceeds our limit (%u) - may cause frame drops!", 
+                      g_lwip_ctx.ppp_pcb->lcp_hisoptions.mru, PPP_MRU_SIZE);
+    }
+    
+    if (!g_lwip_ctx.ppp_pcb->lcp_hisoptions.neg_mru) {
+        PPP_DEBUG_WARN("WARNING: Peer did not negotiate MRU - may send frames larger than %u bytes!", 
+                      PPP_MRU_SIZE);
+    }
+}
+
 
 #endif /* LWIP_PPP_SUPPORT */ 
\ No newline at end of file
index 7ee2a77..bf798ad 100644 (file)
@@ -16,7 +16,7 @@
 
 /* PPP帧队列相关 */
 #define PPP_FRAME_QUEUE_SIZE    32      // 队列大小
-#define PPP_MAX_FRAME_SIZE      1500    // PPP最大帧大小
+#define PPP_MAX_FRAME_SIZE      2048    // 从1500增加到2048
 
 /* PPP帧结构 */
 typedef struct {