From: 孙春阳 Date: Sun, 21 Sep 2025 16:32:56 +0000 (+0800) Subject: 修改ppp协议中的mtu协商配置。现在不会有超大包了。 X-Git-Tag: leiniao_debug_1.0.0_20250922_020716~1^2~1 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=224747af82c89ec5cc936c628cf68b38d0aefefb;p=mirrors%2FFD230.git 修改ppp协议中的mtu协商配置。现在不会有超大包了。 --- 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 {