From 224747af82c89ec5cc936c628cf68b38d0aefefb Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AD=99=E6=98=A5=E9=98=B3?= Date: Mon, 22 Sep 2025 00:32:56 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9ppp=E5=8D=8F=E8=AE=AE=E4=B8=AD?= =?utf8?q?=E7=9A=84mtu=E5=8D=8F=E5=95=86=E9=85=8D=E7=BD=AE=E3=80=82?= =?utf8?q?=E7=8E=B0=E5=9C=A8=E4=B8=8D=E4=BC=9A=E6=9C=89=E8=B6=85=E5=A4=A7?= =?utf8?q?=E5=8C=85=E4=BA=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- code/sdk/zhihui/ppp/include/ppp_api.h | 5 ++ code/sdk/zhihui/ppp/src/ppp_lwip.c | 59 +++++++++++++++++++++++ code/sdk/zhihui/ppp/src/ppp_lwip_thread.c | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/code/sdk/zhihui/ppp/include/ppp_api.h b/code/sdk/zhihui/ppp/include/ppp_api.h index 86c69b1e9..61eddc156 100644 --- a/code/sdk/zhihui/ppp/include/ppp_api.h +++ b/code/sdk/zhihui/ppp/include/ppp_api.h @@ -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 diff --git a/code/sdk/zhihui/ppp/src/ppp_lwip.c b/code/sdk/zhihui/ppp/src/ppp_lwip.c index 61885111b..28d78b980 100644 --- a/code/sdk/zhihui/ppp/src/ppp_lwip.c +++ b/code/sdk/zhihui/ppp/src/ppp_lwip.c @@ -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 diff --git a/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c b/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c index 7ee2a77a9..bf798adaa 100644 --- a/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c +++ b/code/sdk/zhihui/ppp/src/ppp_lwip_thread.c @@ -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 { -- 2.17.1