Android系统DHCP问题【转】

本文转载自:http://blog.csdn.net/tankai19880619/article/details/42972551

一、现象

12小时压测wifi连接后,发现网络连接中断;相关log:

我们关心状态变化部分ConnectivityService: ConnectivityChange for WIFI

[plain]  view plain  copy
 
  1. 01-19-17:42;0501-01 08:00:38.552   954  1117 D ConnectivityService: --NetworkStateTracker.EVENT_STATE_CHANGED handle--  
  2. 01-19-17:42;0501-01 08:00:38.552   954  1117 D ConnectivityService: ConnectivityChange for WIFI: CONNECTED/CONNECTED  
  3. 01-19-17:42;0501-01 08:00:38.552   954  1117 D ConnectivityService: Setting TCP values: [524288,1048576,2097152,262144,524288,1048576] which comes from [net.tcp.buffersize.wifi]  
  4. /12hago  
  5. 01-20-05:14;2201-01 19:33:18.943  1267  1386 V shizx   : @@@clienttype:@@@TCL-CN-MT55CD-F3700A-LG  
  6. 01-20-05:14;22ERROR!!! MlmeEnqueueForRecv: un-recongnized mgmt->subtype=15  
  7. 01-20-05:14;2301-01 19:33:19.572   954  1808 E Dhinit:   
  8. 01-20-05:14;23 waitpid returned pid 1835, status = 00000009  
  9. 01-20-05:14;23cpStateMacinit: process 'dhcpcd_wlan0', pid 1835 exited  
  10. 01-20-05:14;23hine: DHCP failed on wlan0: Timed out waiting for DHCP Renew to finish  
  11. 01-20-05:14;2301-01 19:33:19.574   954  1808 D DHCP    : ifc_init, return = 0  
  12. 01-20-05:14;2301-01 19:33:19.574   954  1808 D DHCP    : ifc_set_addr(wlan0, xx) = 0  
  13. 01-20-05:14;2301-01 19:33:19.574   954  1808 D DHCP    : ifc_close  
  14. 01-20-05:14;2301-01 19:33:19.779   954  1115 D WifiHW  : send cmd is DRIVER POWERMODE 0   
  15. 01-20-05:14;2301-01 19:33:19.779   954  1115 D WifiHW  : send cmd is DRIVER BTCOEXMODE 2   
  16. 01-20-05:14;2301-01 19:33:19.781   954  1115 E WifiStateMachine: IP configuration failed  
  17. 01-20-05:14;2301-01 19:33:19.781   954  1115 D WifiHW  : send cmd is DISCONNECT   
  18. 01-20-05:14;2301-01 19:33:19.782  1558  1558 D wpa_supplicant: wpa_driver_wext_deauthenticate  
  19. 01-20-05:14;2301-01 19:33:19.789  1558  1558 D wpa_supplicant: wpa_driver_wext_set_key: alg=0 key_idx=0 set_tx=0 seq_len=0 key_len=0  
  20. 01-20-05:14;2301-01 19:33:19.790  1558  1558 D wpa_supplicant: wpa_driver_wext_set_key: alg=0 key_idx=1 set_tx=0 seq_len=0 key_len=0  
  21. 01-20-05:14;2301-01 19:33:19.790   954  1110 D NetdConnector: RCV <- {600 Iface linkstate wlan0 up}  
  22. 01-20-05:14;2301-01 19:33:19.793  1558  1558 D wpa_supplicant: wpa_driver_wext_set_key: alg=0 key_idx=2 set_tx=0 seq_len=0 key_len=0  
  23. 01-20-05:14;2301-01 19:33:19.793  1558  1558 D wpa_supplicant: wpa_driver_wext_set_key: alg=0 key_idx=3 set_tx=0 seq_len=0 key_len=0  
  24. 01-20-05:14;2301-01 19:33:19.794  1558  1558 D wpa_supplicant: wpa_driver_wext_set_key: alg=0 key_idx=0 set_tx=0 seq_len=0 key_len=0  
  25. 01-20-05:14;2301-01 19:33:19.795  1558  1558 D wpa_supplicant: wpa_driver_wext_set_operstate: operstate 1->0 (DORMANT)  
  26. 01-20-05:14;2301-01 19:33:19.795  1558  1558 D wpa_supplicant: netlinkinit:   
  27. 01-20-05:14;23 waitpid returned pid 1126, status = 00000009  
  28. 01-20-05:14;23init: process 'dhcpcd_eth0', pid 1126 exited  
  29. 01-20-05:14;23: Operstate: linkmode=-1, operstate=5  

二、分析

关键部分:

[plain]  view plain  copy
 
  1. DhcpStateMachine: DHCP failed on wlan0: Timed out waiting for DHCP Renew to finish  
  2. init: waitpid returned pid 1835, status = 00000009  
  3. init: process 'dhcpcd_wlan0', pid 1835 exited  

1.frameworks/base/core/java/android/net/DhcpStateMachine.java

[java]  view plain  copy
 
  1. private boolean runDhcp(DhcpAction dhcpAction) {  
  2.   if (dhcpAction == DhcpAction.START) {  
  3.     if (DBG) Log.d(TAG, "DHCP request on " + mInterfaceName);  
  4.     success = NetworkUtils.runDhcp(mInterfaceName, dhcpInfoInternal);  
  5.     mDhcpInfo = dhcpInfoInternal;  
  6.   } else if (dhcpAction == DhcpAction.RENEW) {  
  7.      if (DBG) Log.d(TAG, "DHCP renewal on " + mInterfaceName);  
  8.      success = NetworkUtils.runDhcpRenew(mInterfaceName, dhcpInfoInternal); //f分析该函数  
  9.      dhcpInfoInternal.updateFromDhcpRequest(mDhcpInfo);  
  10.   }  
  11.   if (success) {  
  12.     ......  
  13.   } else {  
  14.      //这里就是打印:DhcpStateMachine: DHCP failed on wlan0: Timed out waiting for DHCP Renew to finish  
  15.      Log.e(TAG, "DHCP failed on " + mInterfaceName + ": " +  
  16.                     NetworkUtils.getDhcpError());  
  17.      NetworkUtils.stopDhcp(mInterfaceName);  
  18.      mController.obtainMessage(CMD_POST_DHCP_ACTION, DHCP_FAILURE, 0)  
  19.                 .sendToTarget();  
  20.   }  
  21.   return success;  
  22. }  

2.frameworks/base/core/java/android/net/NetworkUtils.java

[java]  view plain  copy
 
  1. public native static boolean runDhcpRenew(String interfaceName, DhcpInfoInternal ipInfo);  

3.frameworks/base/core/jni/android_net_NetUtils.cpp

[cpp]  view plain  copy
 
  1. static jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info)  
  2. {  
  3.   return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true);  
  4. }  
  5.   
  6. static jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname,  
  7.         jobject info, bool renew)  
  8. {  
  9.   if (renew) {  
  10.     result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength,  
  11.                 dns1, dns2, server, &lease, vendorInfo);  
  12.   }  
  13. }  

4.system/core/libnetutils/dhcp_utils.c

[cpp]  view plain  copy
 
  1. int dhcp_do_request_renew(const char *interface,  
  2.                     char *ipaddr,  
  3.                     char *gateway,  
  4.                     uint32_t *prefixLength,  
  5.                     char *dns[],  
  6.                     char *server,  
  7.                     uint32_t *lease,  
  8.                     char *vendorInfo,  
  9.                     char *domain,  
  10.                     char *mtu)  
  11. {  
  12.   if (wait_for_property(result_prop_name, NULL, 30) < 0) {  
  13.     snprintf(errmsg, sizeof(errmsg), "%s", "Timed out waiting for DHCP Renew to finish"); //这是最关键的错误部分  
  14.     return -1;  
  15.   }  
  16. }  
  17.   
  18. static int wait_for_property(const char *name, const char *desired_value, int maxwait)  
  19. {  
  20.     char value[PROPERTY_VALUE_MAX] = {'\0'};  
  21.     int maxnaps = (maxwait * 1000) / NAP_TIME;  
  22.   
  23.     if (maxnaps < 1) {  
  24.         maxnaps = 1;  
  25.     }  
  26.   
  27. //add by tank  
  28. //  add for MStar Android Patch Begin  
  29.     maxnaps = maxnaps + 1;  
  30.     usleep(50*1000);  
  31. //  add for MStar Android Patch End  
  32. //end tank  
  33.     while (maxnaps-- > 0) {  
  34.         usleep(NAP_TIME * 1000);  
  35.         if (property_get(name, value, NULL)) {  
  36.             if (desired_value == NULL ||  
  37.                     strcmp(value, desired_value) == 0) {  
  38.                 return 0;  
  39.             }  
  40.         }  
  41. //add by tank@  
  42. //  add for MStar Android Patch Begin               
  43.                 usleep(NAP_TIME * 1000);  
  44. //  add for MStar Android Patch End  
  45. //end tank  
  46.     }  
  47.     return -1; /* failure */  
  48. }  

三、解决

合入上处4中add by tank后问题解决。

其他问题,mac地址冲突导致重启后无法获取IP。

[plain]  view plain  copy
 
    1. D/NetdConnector(  958): RCV <- {213 5c:36:b8:4d:ab:7a 0.0.0.0 0 [up broadcast multicast]}  
    2. D/NetdConnector(  958): RSP <- {213 5c:36:b8:4d:ab:7a 0.0.0.0 0 [up broadcast multicast]}  
    3. D/NetworkManagementService(  958): rsp <213 5c:36:b8:4d:ab:7a 0.0.0.0 0 [up broadcast multicast]>  
    4. D/NetworkManagementService(  958): flags <[up broadcast multicast]>  
    5. D/NetworkManagementService(  958): Registering observer  
    6. I/EthernetStateTracker(  958): reset device eth0  
    7. D/NetUtils(  958): android_net_utils_resetConnections in env=0x7d6950 clazz=0xad200001 iface=eth0 mask=0x3  
    8. D/DHCP    (  958): ifc_init, return = 0  
    9. D/DHCP    (  958): ifc_close  
    10. D/DHCP    (  958): ifc_init, return = 0  
    11. D/DHCP    (  958): ifc_up(eth0) = 0  
    12. D/DHCP    (  958): ifc_close  
    13. D/DHCP    (  958): ifc_init, return = 0  
    14. D/DHCP    (  958): ifc_close  
    15. D/DHCP    (  958): ifc_init, return = 0  
    16. D/DHCP    (  958): ifc_close  
    17. D/dhcp    ( 1124): enter dhcpcd service   
    18. D/dhcp    ( 1124): enter dhcpcd service add options  
    19. D/dhcp    ( 1124): enter dhcpcd service leave option  
    20. D/dhcp    ( 1124): enter dhcpcd service chdir  
    21. D/dhcp    ( 1124): enter dhcpcd service dump  
    22. D/dhcp    ( 1124): enter dhcpcd service master  
    23. E/dhcp    ( 1124): version 5.2.10 starting  
    24. D/DHCP    ( 1124): ifc_init, return = 0  
    25. D/DHCP    ( 1124): ifc_close  
    26. F/dhcp    ( 1124): eth0: using hwaddr 5c:36:b8:4d:ab:7a  
    27. F/dhcp    ( 1124): eth0: executing `/system/etc/dhcpcd/dhcpcd-run-hooks', reason PREINIT  
    28. I/dhcp    ( 1124): host does not support a monotonic clock - timing can skew  
    29. F/dhcp    ( 1124): eth0: reading lease `/data/misc/dhcp/dhcpcd-eth0.lease'  
    30. E/dhcp    ( 1124): eth0: broadcasting for a lease  
    31. F/dhcp    ( 1124): eth0: sending DISCOVER (xid 0xd92bbde3), next in 3.54 seconds  

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/8243794.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以在系统目录下的/etc目录中找到网络配置文件,其中最常见的是wpa_supplicant.conf文件,它存储了Wi-Fi网络的配置信息。此外,还有dhclient.conf文件和resolv.conf文件等。这些文件的具体路径和内容可能因不同的Android版本和设备而异。 ### 回答2: Android系统的网络配置文件是指用于配置设备上的网络连接信息的文件。它以XML格式保存,并包含了设备的网络连接信息、代理设置、DNS配置等内容,以实现设备与互联网的连接。 Android系统的网络配置文件主要包括以下几个关键元素: 1. SSID和密码:网络配置文件中包含了设备连接Wi-Fi网络所需的SSID和密码信息。这些信息可以让设备自动连接已知的Wi-Fi网络。 2. 代理设置:代理服务器允许设备通过它们来连接互联网。网络配置文件可以配置设备在使用特定网络时使用代理服务器。代理服务器可以为设备提供安全性和访问控制等功能。 3. DNS配置:DNS(Domain Name System)将域名换为IP地址,使设备能够访问互联网资源。网络配置文件可以配置设备使用特定的DNS服务器。这样可以提高网络解析速度和安全性。 4. IP配置:网络配置文件可以配置设备的IP地址、子网掩码和网关信息。这些配置是设备与本地网络通信所必需的,以及设备与外部网络通信的基础。 通过修改网络配置文件,用户可以自定义设备上的网络连接设置,例如添加新的Wi-Fi网络、配置代理服务器、更改DNS服务器等。这样可以满足用户对特定网络环境的需求,同时也提高了设备与互联网的连接稳定性和安全性。 总之,Android系统的网络配置文件是重要的网络连接设置文件,它能够帮助设备实现与互联网的连接,并提供了灵活的定制选项,以满足用户对网络连接的特定需求。 ### 回答3: Android系统的网络配置文件是指一组存储在设备上的文件,用于配置和管理设备的网络连接。这些文件包含了设备需要连接到网络所需的信息和参数。 首先,Android系统的网络配置文件主要包括"wifi-internal-config.xml"、"wpa_supplicant.conf"、"dhcpcd.conf"等几个关键文件。其中,"wifi-internal-config.xml"是用于配置设备的Wi-Fi网络连接信息的文件。它包含了设备需要连接到的Wi-Fi网络的名称(SSID)、密码(password)、加密方式(encryption)、IP地址等相关设置。 其次,"wpa_supplicant.conf"是一个用于管理设备的Wi-Fi网络连接及身份验证的配置文件。它存储了设备连接的Wi-Fi网络的身份验证所需的信息,包括网络的SSID、密码、安全协议等。 另外,"dhcpcd.conf"是一个用于配置设备通过动态主机配置协议(DHCP)获取IP地址的文件。在该文件中,可以设置设备需要连接的网络接口、IP地址、子网掩码、网关、DNS服务器等相关参数。 通过这些网络配置文件,Android系统可以根据用户的配置信息,自动连接到合适的Wi-Fi网络并获取IP地址。这样,用户就可以方便地访问互联网、发送和接收数据。 总之,Android系统的网络配置文件是非常重要的,它们定义了设备的网络连接设置和身份验证信息,确保设备能够顺利连接到网络并进行数据交换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值