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;
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;
}
/* 调试配置 */
#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)
/*
* 调试级别说明:
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错误码定义 */
PPP_ERR_MEMORY, // 内存错误
PPP_ERR_UART, // 串口错误
PPP_ERR_INVALID_STATE, // 无效状态
- PPP_ERR_UNKNOWN // 未知错误
+ PPP_ERR_UNKNOWN, // 未知错误
+ PPP_ERR_MAX
} ppp_error_t;
#ifdef __cplusplus
// 外部声明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模块
*/
{
return g_ppp_state;
}
-
+void ppp_set_state(ppp_state_t state)
+{
+ g_ppp_state = state;
+}
/**
* @brief 注册PPP事件回调函数
*/
return ERRCODE_INVALID_PARAM;
}
+ /* 检查并更新PPP状态 */
+ ppp_check_and_update_state();
+
ppp_serial_stats_t stats;
ppp_serial_get_stats(&stats);
* @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");
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
/* 使用标准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...");
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网络接口状态回调函数
}
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);
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++;
}
}
stream_pos = remaining;
frame_start = 0;
- in_frame = false;
+ /* 保持in_frame状态,不要重置为false */
+ /* in_frame状态应该保持,因为我们可能正在处理一个跨缓冲区的帧 */
}
} else if (ret != PPP_ERR_OK) {
/* 检查是否是因为线程停止导致的错误 */
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 */
}
}
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;
}
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;