这是一个网络管理函数的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*)<e_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*)<e_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(ðerdev, 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;
}