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 记录数据活动时间
*/
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;
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...");
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!");
}
#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