link

博客内容主要提及了对CPU的研究,还给出了相关网址http://www.cpushack.com/ 。

Study of cpu http://www.cpushack.com/

 

这是一个网络管理函数的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值