link

博客分享了两个链接,一个是Python书籍资源链接,另一个是Google群组中PyWoodpecker相关讨论线程链接,为Python学习提供了资源途径。
部署运行你感兴趣的模型镜像

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

这是一个网络管理函数的reload函数,请关注link_up的部分,分析每个link_up的场景,找到哪个上下文是网络变换时上网的代码 LOCAL S32 nifc_reload(DS_MSG *msg) { LINK_STATUS link_status = {0}; LINK link_data = {0}; DIAG_ADDR target_addr; /* reload 可能发生在start前,此时按照静态ip方式进行连接 */ U32 link_type = g_link_params.link_type; S32 final_phy_status = 0; S32 tmp_media_type = 0; PHY_STATUS phy_status = {0}; memset(&target_addr, 0, sizeof(target_addr)); if (NULL == msg) { return ERROR; } if (ds_path_id_exist(msg->id, msg->num, LED_CONFIG_PATH)) { if (LINK_UP == g_link_params.link_phy_status) { link_event_led(TRUE); } } ds_read(LINK_PATH, (U8 *)&link_data, sizeof(link_data)); /* 物理状态发生变化; */ if (ds_path_id_exist(msg->id, msg->num, PHY_STATUS_PATH)) { if (-1 != g_inet_link_up_timer) { NIFC_DEBUG("nifc timer is not needed"); inet_del_timer(g_inet_link_up_timer); g_inet_link_up_timer = -1; } ds_read(LINK_STATUS_PATH, (U8 *)&link_status, sizeof(link_status)); ds_read(PHY_STATUS_PATH, &phy_status, sizeof(PHY_STATUS)); final_phy_status = LINK_DOWN; if (phy_status.ether || phy_status.wlan) { final_phy_status = LINK_UP; } if (phy_status.ether) { tmp_media_type |= MEDIA_TYPE_ETH; } if (phy_status.wlan) { tmp_media_type |= MEDIA_TYPE_WLAN; } NIFC_DEBUG("ether: %d wlan: %d media_type: %d tmp_media_type: %d", phy_status.ether, phy_status.wlan, g_link_params.media_type, tmp_media_type); if (g_link_params.media_type == (MEDIA_TYPE_ETH | MEDIA_TYPE_WLAN) && tmp_media_type == MEDIA_TYPE_ETH) { g_link_params.dial[g_link_params.link_type].link_up(); } g_link_params.media_type = tmp_media_type; /* 最终状态没变化; */ if (final_phy_status == g_link_params.link_phy_status) { goto reload_link_data; } g_link_params.link_phy_status = final_phy_status; link_status.phy_status = g_link_params.link_phy_status; ds_write(LINK_STATUS_PATH, (U8 *)&link_status, sizeof(link_status)); /* 物理连接断开; */ if (LINK_DOWN == link_status.phy_status) { #ifdef CONFIG_MOBILE_ACCESS_SET_SUPPORT if(g_lte_info_data.internet_wired_enable == 1 || (g_lte_info_data.internet_wired_enable ==2 && g_lte_info_data.auto_switch_wired == 1)) { link_event_led(FALSE); } #else link_event_led(FALSE); #endif link_status.error_code = LINK_CODE_PHYDOWN; ds_write(LINK_STATUS_PATH, (U8 *)&link_status, sizeof(link_status)); if ((LINK_UP == link_status.link_status) || (LINK_LINKING_UP == link_status.link_status)) { if (-1 == g_link_down_timer) { NIFC_DEBUG("link down timer start"); g_link_down_timer = inet_add_timer(link_down_timer_handle, 0, 6, EXECUTE_SINGLE); } } } /* 插入网线; */ if (LINK_UP == g_link_params.link_phy_status) { #ifdef CONFIG_MOBILE_ACCESS_SET_SUPPORT #ifdef CONFIG_REALTEK_SWITCH LED_CONFIG led_config = {0}; ds_read(LED_CONFIG_PATH, &led_config, sizeof(led_config)); switch_link_event_led(LED_STATE_NETWORK_CABLE_INSERT); if(g_lte_info_data.internet_wired_enable == 1 || (g_lte_info_data.internet_wired_enable == 2 && g_lte_info_data.auto_switch_wired == 1)) { inet_add_timer(link_event_led, TRUE, 2, EXECUTE_SINGLE); } else { inet_add_timer(switch_link_event_led, led_config.state, 2, EXECUTE_SINGLE); } #else if(g_lte_info_data.internet_wired_enable == 1 || (g_lte_info_data.internet_wired_enable == 2 && g_lte_info_data.auto_switch_wired == 1)) { link_event_led(TRUE); } #endif #else link_event_led(TRUE); #endif if (-1 != g_link_down_timer) { NIFC_DEBUG("link down timer is not needed"); inet_del_timer(g_link_down_timer); g_link_down_timer = -1; } if (phy_status.diag_phy == PHY_STATUS_ONBOARDING) { phy_status.diag_phy = PHY_STATUS_IDLE; ds_write(PHY_STATUS_PATH, (U8 *)&phy_status, sizeof(PHY_STATUS)); } else if (phy_status.diag_phy == PHY_STATUS_IDLE) { phy_status.diag_phy = PHY_STATUS_DIAG; ds_write(PHY_STATUS_PATH, (U8 *)&phy_status, sizeof(PHY_STATUS)); #ifdef CONFIG_MOBILE_ACCESS_SET_SUPPORT if(g_lte_info_data.internet_wired_enable == 1|| (g_lte_info_data.internet_wired_enable == 2 && g_lte_info_data.auto_switch_wired == 1)) #endif { NSD_SEND(NETWORK_DIAGNOSE_REQ_MID, NULL, 0); } if (-1 == g_receive_diag_timeout) { NIFC_DEBUG("link up timer start"); g_link_params.dial[g_link_params.link_type].link_up(); if (0 == ds_read(DIAGNOSE_ADDR_PATH, (void*)(&target_addr), sizeof(DIAG_ADDR)) #ifdef CONFIG_MOBILE_ACCESS_SET_SUPPORT || (g_lte_info_data.internet_wired_enable == 1 || (g_lte_info_data.internet_wired_enable == 2 && g_lte_info_data.auto_switch_wired == 1) ) #endif ) { NIFC_DEBUG("diagnose module is not built."); g_receive_diag_timeout = inet_add_timer(link_up_timer_handle, 0, NETWORK_WITHOUT_DIAGNOSE_TIMEOUT, EXECUTE_SINGLE); } else { g_receive_diag_timeout = inet_add_timer(link_up_timer_handle, 0, NETWORK_DIAGNOSE_MAX_TIMEOUT, EXECUTE_SINGLE); } } g_network_diagnose_req = TRUE; goto reload_link_data; } else { goto reload_link_data; } if ((LINK_CODE_PHYDOWN == link_status.error_code) || (LINK_CODE_INET_ERR == link_status.error_code)) { if (WAN_TYPE_DHCP == link_data.wan_type) { wan_dhcp.delay_set_ip = TRUE; } g_link_params.dial[g_link_params.link_type].link_up(); } } } #ifdef CONFIG_MOBILE_ACCESS_SET_SUPPORT if(ds_path_id_exist(msg->id, msg->num, LTE_INFO_DATA_PATH)) { LTE_CONFIG_INFO_DATA new_lte_info_data = {0}; ds_read(LTE_INFO_DATA_PATH,(U8*)&new_lte_info_data, sizeof(LTE_CONFIG_INFO_DATA)); if((g_lte_info_data.internet_wired_enable != new_lte_info_data.internet_wired_enable) || (g_lte_info_data.auto_switch_wired != new_lte_info_data.auto_switch_wired)) { g_lte_info_data.internet_wired_enable = new_lte_info_data.internet_wired_enable; g_lte_info_data.auto_switch_wired = new_lte_info_data.auto_switch_wired; if(new_lte_info_data.internet_wired_enable == 1 || new_lte_info_data.auto_switch_wired == 1) { NIFC_OP_LOG("internet_wried_enable status change."); ds_read(LINK_STATUS_PATH, (U8*)&link_status, sizeof(link_status)); ds_read(PHY_STATUS_PATH, &phy_status, sizeof(phy_status)); final_phy_status = LINK_DOWN; if(phy_status.ether || phy_status.wlan) { final_phy_status = LINK_UP; } if (phy_status.ether) { tmp_media_type |= MEDIA_TYPE_ETH; } if (phy_status.wlan) { tmp_media_type |= MEDIA_TYPE_WLAN; } NIFC_DEBUG("ether: %d wlan: %d media_type: %d tmp_media_type: %d", phy_status.ether, phy_status.wlan, g_link_params.media_type, tmp_media_type); if (g_link_params.media_type == MEDIA_TYPE_ETH && tmp_media_type == MEDIA_TYPE_ETH) { g_link_params.dial[g_link_params.link_type].link_up(); } g_link_params.media_type = tmp_media_type; g_link_params.link_phy_status = final_phy_status; link_status.phy_status = g_link_params.link_phy_status; ds_write(LINK_STATUS_PATH, (U8 *)&link_status, sizeof(link_status)); if(LINK_DOWN == link_status.phy_status) { link_event_led(FALSE); link_status.error_code = LINK_CODE_PHYDOWN; ds_write(LINK_STATUS_PATH, (U8*)&link_status, sizeof(link_status)); if((LINK_UP == link_status.link_status) || (LINK_LINKING_UP == link_status.link_status)) { if(-1 == g_link_down_timer) { NIFC_DEBUG("link down timer start"); g_link_down_timer = inet_add_timer(link_down_timer_handle, 0, 6, EXECUTE_SINGLE); } } } if(LINK_UP == g_link_params.link_phy_status) { link_event_led(TRUE); if (-1 != g_link_down_timer) { NIFC_DEBUG("link down timer is not needed"); inet_del_timer(g_link_down_timer); g_link_down_timer = -1; } if (phy_status.diag_phy == PHY_STATUS_ONBOARDING) { phy_status.diag_phy = PHY_STATUS_IDLE; ds_write(PHY_STATUS_PATH, (U8 *)&phy_status, sizeof(PHY_STATUS)); } else if (phy_status.diag_phy == PHY_STATUS_IDLE) { phy_status.diag_phy = PHY_STATUS_DIAG; ds_write(PHY_STATUS_PATH, (U8 *)&phy_status, sizeof(PHY_STATUS)); #ifdef CONFIG_MOBILE_ACCESS_SET_SUPPORT if(g_lte_info_data.internet_wired_enable == 1 || (g_lte_info_data.internet_wired_enable == 2 && g_lte_info_data.auto_switch_wired == 1)) #endif { NSD_SEND(NETWORK_DIAGNOSE_REQ_MID, NULL, 0); } if (-1 == g_receive_diag_timeout) { NIFC_DEBUG("link up timer start"); g_link_params.dial[g_link_params.link_type].link_up(); if (0 == ds_read(DIAGNOSE_ADDR_PATH, (void*)(&target_addr), sizeof(DIAG_ADDR)) #ifdef CONFIG_MOBILE_ACCESS_SET_SUPPORT || (g_lte_info_data.internet_wired_enable == 1 || (g_lte_info_data.internet_wired_enable == 2 && g_lte_info_data.auto_switch_wired == 1) ) #endif ) { NIFC_DEBUG("diagnose module is not built."); g_receive_diag_timeout = inet_add_timer(link_up_timer_handle, 0, NETWORK_WITHOUT_DIAGNOSE_TIMEOUT, EXECUTE_SINGLE); } else { g_receive_diag_timeout = inet_add_timer(link_up_timer_handle, 0, NETWORK_DIAGNOSE_MAX_TIMEOUT, EXECUTE_SINGLE); } } g_network_diagnose_req = TRUE; goto reload_link_data; } else { goto reload_link_data; } if ((LINK_CODE_PHYDOWN == link_status.error_code) || (LINK_CODE_INET_ERR == link_status.error_code)) { if (WAN_TYPE_DHCP == link_data.wan_type) { wan_dhcp.delay_set_ip = TRUE; } g_link_params.dial[g_link_params.link_type].link_up(); } } } } if((g_lte_info_data.mtu != new_lte_info_data.mtu) && (new_lte_info_data.mtu >= 1300) && (new_lte_info_data.mtu <= 1500)) { struct device usb0dev = {0}; INFO_INTERNET info_internet = {0}; g_lte_info_data.mtu = new_lte_info_data.mtu; LTE_DHCP_IP lte_dhcp_ip = {0}; if(0 == ds_read(LTE_DHCP_IP_PATH, (U8*)&lte_dhcp_ip, sizeof(LTE_DHCP_IP))) { NIFC_ERROR("Read lte dhcp ip config fail."); return ERROR; } if(0 == ds_read(INFO_INTERNET_PATH, (U8*)&info_internet, sizeof(INFO_INTERNET))) { NIFC_ERROR("Read config path %s fail.", INFO_INTERNET_PATH); return ERROR; } lte_dhcp_ip.mtu = g_lte_info_data.mtu; ds_advanced_write(LTE_DHCP_IP_PATH, (U8*)&lte_dhcp_ip, sizeof(lte_dhcp_ip), DS_FLAG_SAVE_FLASH); if((g_lte_info_data.internet_wired_enable == 0 || (g_lte_info_data.internet_wired_enable == 2 && g_lte_info_data.auto_switch_wired == 0)) && info_internet.link_status == INTERNET_4G_CONNECTED) { NIFC_INFO("4G network is connected now and starting to modify the MTU of the 4G network."); #ifdef CONFIG_LTE_OPEN_QMI system_init_device(&usb0dev, DT_NORMAL, "wwan0"); #else system_init_device(&usb0dev, DT_NORMAL, "usb0"); #endif if(OK != system_if_set_mtu(&usb0dev, lte_dhcp_ip.mtu)) { NIFC_ERROR("usb network card set mtu failed."); } } } } #endif reload_link_data: if (ds_path_id_exist(msg->id, msg->num, LINK_PATH)) { /* 如果双工模式发生了变化,会触发物理端口状态跳变 */ if (g_link_params.wan_rate != link_data.wan_rate) { if (etherdev.ifindex >= 0 && OK == system_set_wan_rate(&etherdev, link_data.wan_rate)) { NIFC_OP_LOG("Wan rate change from %s to %s.", wan_rate_name[g_link_params.wan_rate], wan_rate_name[link_data.wan_rate]); g_link_params.wan_rate = link_data.wan_rate; } } /* WAN口接入类型发生了变化。 */ if (g_link_params.link_type != link_data.wan_type) { NIFC_OP_LOG("Wan type change from %s to %s", wan_type_name[link_type], wan_type_name[link_data.wan_type]); g_cloud_sdk_stop_dhcpc_flag = 0; wan_type_switch(link_data.wan_type); } } if ((ds_path_id_exist(msg->id, msg->num, STATIC_IP_PATH)) && (link_type == WAN_TYPE_STATIC_IP) && (link_type == link_data.wan_type)) { g_link_params.dial[link_type].link_down(LINK_CODE_MANUAL); link_up_delay(link_type); } if ((ds_path_id_exist(msg->id, msg->num, DHCPC_PATH)) && (link_type == WAN_TYPE_DHCP) && (link_type == link_data.wan_type)) { wan_dhcp.delay_set_ip = TRUE; g_link_params.dial[link_type].link_down(LINK_CODE_MANUAL); link_up_delay(link_type); } #ifdef CONFIG_IPV6 if ((ds_path_id_exist(msg->id, msg->num, IPV6_INFO_PATH))) { update_dns(); } #endif return SLP_ENONE; }
最新发布
12-25
<think>首先,用户的问题是:分析每个link_up的场景,找到哪个上下文是网络变换时上网的代码。具体来说,用户关注的是网络管理函数中的reload函数,特别是link_up的部分。 我需要理解代码:这是C语言代码,函数是nifc_reload,处理网络重载事件。用户想知道在哪些场景下会调用link_up,以及网络变换时上网的代码在哪里。 关键部分是关于link_up的调用: 1. 在代码中,我看到有几个地方调用了`g_link_params.dial[g_link_params.link_type].link_up();`。 - 第一个地方在物理状态变化部分: ```c if (g_link_params.media_type == (MEDIA_TYPE_ETH | MEDIA_TYPE_WLAN) && tmp_media_type == MEDIA_TYPE_ETH) { g_link_params.dial[g_link_params.link_type].link_up(); } ``` 这里,当媒体类型从同时支持以太和WLAN变为仅以太时,调用link_up。 - 第二个地方在物理连接恢复(插入网线)时: ```c if (LINK_UP == g_link_params.link_phy_status) { // ... 其他代码 if (phy_status.diag_phy == PHY_STATUS_IDLE) { // ... 设置诊断状态 if (-1 == g_receive_diag_timeout) { NIFC_DEBUG("link up timer start"); g_link_params.dial[g_link_params.link_type].link_up(); // ... 设置定时器 } } // ... 其他情况 if ((LINK_CODE_PHYDOWN == link_status.error_code) || (LINK_CODE_INET_ERR == link_status.error_code)) { if (WAN_TYPE_DHCP == link_data.wan_type) { wan_dhcp.delay_set_ip = TRUE; } g_link_params.dial[g_link_params.link_type].link_up(); } } ``` 这里,在物理状态变为LINK_UP时,如果诊断状态是IDLE,或者有错误代码(如PHYDOWN或INET_ERR),则调用link_up。 - 第三个地方在LTE信息数据变化部分(在CONFIG_MOBILE_ACCESS_SET_SUPPORT宏内): ```c if (g_link_params.media_type == MEDIA_TYPE_ETH && tmp_media_type == MEDIA_TYPE_ETH) { g_link_params.dial[g_link_params.link_type].link_up(); } ``` 类似第一个场景,但这是在LTE设置改变时。 还有在物理连接恢复时的类似调用。 - 在reload_link_data标签后,当WAN类型发生变化时,有`wan_type_switch(link_data.wan_type);`,但这不是直接调用link_up,而是切换WAN类型。在wan_type_switch函数中,可能会触发link_up。 用户代码中没有提供wan_type_switch的实现,但根据上下文,它可能处理WAN类型切换。 另外,在底部,有: ```c if ((ds_path_id_exist(msg->id, msg->num, STATIC_IP_PATH)) && (link_type == WAN_TYPE_STATIC_IP) && (link_type == link_data.wan_type)) { g_link_params.dial[link_type].link_down(LINK_CODE_MANUAL); link_up_delay(link_type); } if ((ds_path_id_exist(msg->id, msg->num, DHCPC_PATH)) && (link_type == WAN_TYPE_DHCP) && (link_type == link_data.wan_type)) { wan_dhcp.delay_set_ip = TRUE; g_link_params.dial[link_type].link_down(LINK_CODE_MANUAL); link_up_delay(link_type); } ``` 这里,当静态IP或DHCP配置变化时,调用link_down然后link_up_delay。link_up_delay可能是一个函数,延迟调用link_up,但函数未定义在此。 所以,直接调用link_up的地方是那些g_link_params.dial[...].link_up()的调用点。 现在,用户问的是“网络变换时上网的代码”。网络变换可能指的是网络状态变化,如物理连接变化、WAN类型变化等。 关键场景: 1. 物理状态变化:当物理连接状态从DOWN变为UP时,会触发link_up调用。例如,插入网线(LINK_UP)时。 2. 媒体类型变化:当媒体类型改变时,如从双模式变为仅以太。 3. 错误恢复:当有错误(如PHYDOWN或INET_ERR)时,调用link_up来重新连接。 4. LTE设置变化:当有线网络启用状态改变时,可能触发link_up。 5. WAN类型变化:在wan_type_switch中可能隐含link_up,但代码中未显示。 对于“网络变换时上网的代码”,最直接的是在物理状态变为LINK_UP时调用的link_up。例如: ```c if (LINK_UP == g_link_params.link_phy_status) { // ... g_link_params.dial[g_link_params.link_type].link_up(); // ... } ``` 以及在错误恢复时。 具体到“上网”,link_up函数可能是启动网络连接的过程。 在代码中,当插入网线时,有详细处理: - 设置LED - 删除定时器 - 如果诊断状态是IDLE,则启动诊断(发送NETWORK_DIAGNOSE_REQ_MID) - 然后调用link_up - 设置定时器处理超时 所以,link_up是实际启动网络连接的函数。 总结link_up被调用的主要场景: 1. 当媒体类型从混合变为仅以太(可能是在WLAN断开时切换到以太)。 2. 当物理连接状态变为UP(如插入网线),并且诊断状态允许时。 3. 当有网络错误需要恢复时。 4. 在LTE设置变化导致有线网络启用时。 对于用户的问题“找到哪个上下文是网络变换时上网的代码”,我认为是当物理连接状态变为LINK_UP时的上下文,特别是当phy_status.diag_phy == PHY_STATUS_IDLE时,直接调用link_up。 代码片段: ```c if (phy_status.diag_phy == PHY_STATUS_IDLE) { phy_status.diag_phy = PHY_STATUS_DIAG; ds_write(PHY_STATUS_PATH, (U8 *)&phy_status, sizeof(PHY_STATUS)); // ... 条件检查 if (-1 == g_receive_diag_timeout) { NIFC_DEBUG("link up timer start"); g_link_params.dial[g_link_params.link_type].link_up(); // <--- 这里上网的代码 // ... 设置定时器 } g_network_diagnose_req = TRUE; goto reload_link_data; } ``` 此外,在错误情况下: ```c if ((LINK_CODE_PHYDOWN == link_status.error_code) || (LINK_CODE_INET_ERR == link_status.error_code)) { // ... g_link_params.dial[g_link_params.link_type].link_up(); // <--- 错误恢复时上网 } ``` 所以,这些是网络变换时触发上网的代码上下文。 现在,回答用户的问题: - 分析每个link_up的场景:我列出了几个场景。 - 网络变换时上网的代码:指向上面的调用点。 在回答中,我需要用中文,并最后输出3-5个相关问题。 回答结构: 1. 解释link_up被调用的不同场景。 2. 指出网络变换时上网的具体代码位置。 3. 然后输出§§相关问题§§。 相关问题:基于用户的问题和我的回答,提出相关问题。例如: 1. link_up函数的具体实现是什么? 2. 当WAN类型变化时,如何触发网络连接? 3. 诊断过程在连接建立中起什么作用? 4. 定时器g_receive_diag_timeout如何处理连接超时? 5. 在LTE设置变化时,网络连接如何被影响? 确保输出格式:回答后,第一行是"§§相关问题§§",然后列出1. 2. 3. 等。 </think> ### 分析 `link_up` 的场景及网络变换时上网的代码 在 `nifc_reload` 函数中,`link_up` 的调用通过函数指针 `g_link_params.dial[g_link_params.link_type].link_up()` 实现,用于触发网络连接建立(上网)。以下是每个 `link_up` 调用的具体场景分析: 1. **媒体类型变化(双模切单模)** - **场景**:当网络媒体类型从同时支持以太网(ETH)和 WLAN 变为仅支持以太网时触发。 - **代码位置**: ```c if (g_link_params.media_type == (MEDIA_TYPE_ETH | MEDIA_TYPE_WLAN) && tmp_media_type == MEDIA_TYPE_ETH) { g_link_params.dial[g_link_params.link_type].link_up(); } ``` - **触发条件**:物理状态变化(如 WLAN 断开,仅剩 ETH 连接),需重新建立连接。 2. **物理连接恢复(插入网线)** - **场景**:物理状态从 `LINK_DOWN` 变为 `LINK_UP`(如插入网线),且诊断状态为 `PHY_STATUS_IDLE` 时触发。 - **代码位置**: ```c if (LINK_UP == g_link_params.link_phy_status) { // ... if (phy_status.diag_phy == PHY_STATUS_IDLE) { if (-1 == g_receive_diag_timeout) { g_link_params.dial[g_link_params.link_type].link_up(); // 上网入口 // 设置诊断定时器 } } } ``` - **附加逻辑**:启动诊断流程(`NETWORK_DIAGNOSE_REQ_MID`),并设置超时定时器。 3. **网络错误恢复** - **场景**:当链路错误码为 `LINK_CODE_PHYDOWN`(物理断开)或 `LINK_CODE_INET_ERR`(网络错误)时,主动重连。 - **代码位置**: ```c if ((LINK_CODE_PHYDOWN == link_status.error_code) || (LINK_CODE_INET_ERR == link_status.error_code)) { g_link_params.dial[g_link_params.link_type].link_up(); } ``` - **触发条件**:错误恢复逻辑,确保网络中断后自动重新连接。 4. **LTE 设置变更(有线网络启用)** - **场景**:LTE 配置(如 `internet_wired_enable` 或 `auto_switch_wired`)变更,且物理媒体类型为以太网时触发。 - **代码位置**(在 `CONFIG_MOBILE_ACCESS_SET_SUPPORT` 宏内): ```c if (g_link_params.media_type == MEDIA_TYPE_ETH && tmp_media_type == MEDIA_TYPE_ETH) { g_link_params.dial[g_link_params.link_type].link_up(); } ``` - **触发条件**:用户启用有线网络切换功能(如从 4G 切回以太网)。 5. **WAN 类型变更(间接触发)** - **场景**:WAN 接入类型(如 DHCP/静态 IP)变化时,通过 `wan_type_switch` 和 `link_up_delay` 间接触发 `link_up`。 - **代码位置**: ```c if (g_link_params.link_type != link_data.wan_type) { wan_type_switch(link_data.wan_type); // 内部可能调用 link_up } if (...) { link_up_delay(link_type); // 延迟调用 link_up } ``` - **说明**:`wan_type_switch` 和 `link_up_delay` 的具体实现在外部,但最终会调用 `link_up`。 ### 网络变换时上网的核心代码 **上下文**:当物理连接状态变为 `LINK_UP`(如插入网线)时,**诊断状态为 `PHY_STATUS_IDLE`** 的代码块是直接触发上网的入口: ```c if (phy_status.diag_phy == PHY_STATUS_IDLE) { phy_status.diag_phy = PHY_STATUS_DIAG; ds_write(PHY_STATUS_PATH, ...); if (-1 == g_receive_diag_timeout) { g_link_params.dial[g_link_params.link_type].link_up(); // 网络变换时上网的核心调用 // 设置定时器处理诊断超时 } g_network_diagnose_req = TRUE; } ``` **逻辑说明**: - 物理连接恢复后,先更新诊断状态,然后调用 `link_up` 启动网络连接。 - 同时发送诊断请求(`NETWORK_DIAGNOSE_REQ_MID`)并设置定时器(`g_receive_diag_timeout`),确保连接可靠性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值