Android系统DHCP问题

Posted 请给我倒杯茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 [email protected]  
  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  

以上是关于Android系统DHCP问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )

Android 逆向Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )

android DHCP流程

Android wifi 从连接态自动断开的解决办法(dhcp导致)

Android4.4 以太网和DHCP启动过程介绍

android4.0以上怎么代码设置有线网的静态ip地址