Android系统DHCP问题

不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述Android系统DHCP问题相关的知识,希望能为你提供帮助。
本文转载自:http://blog.csdn.net/tankai19880619/article/details/42972551
一、现象
【Android系统DHCP问题】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   

    推荐阅读