• 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] = {''};  
    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  
  • 相关阅读:
    Mockito
    输入一个链表,输出该链表中倒数第k个结点。
    序列化
    全排列
    PostgreSQL libpq学习指南二
    PostgreSQL libpq 客户端接口(一)
    PostgreSQL 中的shared buffer
    通过 Unwrapper 解密 DBMS 程序包
    openGuassDB介绍及安装实践
    PostgreSQL中的ACID特性介绍
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8243794.html
Copyright © 2020-2023  润新知