Lamdoc船长的宝藏http://blog.csdn.net/lamdoc/article/category/1164160

android ethernet unplug/plug enable/disable 管理

android ethernet 管理, 可以分为两类:


1. 是网线插拔,unplug/plug。

unplug 时, eth0 可以up, 但是IP 必须为0, 因为打开internel时,必须快速出现连不上页面,而不是延迟好几十秒,才出现连不上。

plug in之后,IP 能自动恢复。


2. 是Setting里EthernetConfiguration 的勾选项。enable/disable。

disable ethernet 时, eth0 必须是down的, enable之后,才up,然后能自动恢复IP。


3. 是static ip configuration


IP

NETMASK

DNS

GATEWAY

4个IP选项,静态IP设置。

android ethernet 设计的几个模块

分类: Android ethernet 218人阅读 评论(0) 收藏 举报

ethernet related files:

1. packages/app/Settings/: //Setting中添加选项代码
packages/apps/Settings/src/com/android/settings/ethernet/EthernetSettings.java
packages/apps/Settings/src/com/android/settings/ethernet/EthernetEnabler.java
packages/apps/Settings/src/com/android/settings/ethernet/EthernetConfigDialog.java


2. frameworks/base/ :

SystemUI: //状态栏(status_bar)显示部分代码
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java //现实statusbar

ConnectivityService:
frameworks/base/services/java/com/android/server/ConnectivityService.java //这里是ethernet部分程序的起始点

jni:
frameworks/base/core/jni/android_net_ethernet.cpp //新加的一些jni

本来就有的ethernet:
frameworks/base/services/java/com/android/server/EthernetService.java
frameworks/base/services/java/com/android/server/NetworkManagementService.java
frameworks/base/core/java/android/net/NetworkStats.java

新添加的ethernet:
frameworks/base/ethernet/* // 这是主要ethernet部分,java api 代码。
frameworks/base/ethernet/java/android/net/ethernet/EthernetManager.java

调试android ethernet 的常用命令

分类: Android ethernet 124人阅读 评论(0) 收藏 举报 1. netcfg

netcfg //查看ip情况

netcfg eth0 up dhcp //通过dhcp 自动获取ip和网关

2. ifconfig

ifconfig eth0 128.224.156.81 up

ifconfig eth0 128.224.156.81 netmask 255.255.255.0 up

3. gateway 配置

route add default gw 192.168.0.1 dev eth0

4. dns 配置

echo "nameserver 128.224.160.11" > resolv.conf

nameserver 128.224.160.11


setprop net.dns1 128.224.160.11

setprop net.dns2 147.11.100.30

4. mac adddr
ifconfig eth0 hw ether 00:11:22:33:44:55

android ethernet的2个辅助模块 libnetutils 和 dhcpcd

1. 一个是 system/core/libnetutils/* , 即libnetutils.so 库. 这里面有两个.c经常会调用到

ifc_utils.c

dhcp_utils.c


java会 通过 JNI (CPP)再调用到 C代码


2. 第二个是 /external/dhcpcd/*, 生成/system/bin/dhcpcd.

这个是 守护进程 dhcpcd_eth0 会用到的工具。

ConnectivityService 中调用 EthernetStateTracker 和 EthernetService

分类: Android ethernet 342人阅读 评论(2) 收藏 举报

u最近在研究android 中的 ethernet 部分,主要集中在上层JAVA service 和java api。

整个 android 系统的mobile, wifi,wimax 和 bluetooth 都是通过ConnectivitySerivice 来提供服务的。
android本身不自带ethernet服务,需要新加 android-x86 里拿的ics-ethernet patch。

接下来分析 ConnectivityService 是怎么提供 ethernet 服务的。


1. 最开始,ConnectivityService 中会创建 EthernetStateTracker 和 EthernetService。
frameworks/base/services/java/com/android/server/ConnectivityService.java:

[java] view plain copy print ?
  1. caseConnectivityManager.TYPE_ETHERNET:
  2. //mNetTrackers[netType]=EthernetDataTracker.getInstance();
  3. //mNetTrackers[netType].startMonitoring(context,mHandler);
  4. if(DBG)log("StartingEthernetService.");
  5. //创建EthernetStateTracker
  6. EthernetStateTrackerest=newEthernetStateTracker(context,mHandler);
  7. //创建EthernetService
  8. EthernetServiceethService=newEthernetService(context,est);
  9. <PREclass=javaname="code">//向ServiceManager中添加ETHERNET_SERVICE服务
  10. ServiceManager.addService(Context.ETHERNET_SERVICE,ethService);
  11. mNetTrackers[ConnectivityManager.TYPE_ETHERNET]=est;//赋值EthernetStateTracker.
  12. //调用EthernetStateTracker的startMonitoring
  13. est.startMonitoring(context,mHandler);
  14. break;</PRE>
  15. <PRE></PRE>
  16. <P></P>
  17. <Pstyle="BACKGROUND-COLOR:rgb(255,255,255)"><SPANstyle="COLOR:#663300;FONT-SIZE:16px"><STRONG><SPANstyle="FONT-FAMILY:宋体">a.mNetTrackers定义:</SPAN></STRONG></SPAN></P>
  18. <P></P>
  19. <PREclass=javaname="code">/**
  20. *Sometimeswewanttorefertotheindividualnetworkstate
  21. *trackersseparately,andsometimeswejustwanttotreatthem
  22. *abstractly.
  23. */
  24. privateNetworkStateTrackermNetTrackers[];
  25. //网络状态跟踪,no_connected,connecting,connected,三种状态
  26. </PRE><BR>
  27. <P></P>
  28. <SPANstyle="FONT-FAMILY:宋体"><SPANstyle="FONT-SIZE:12px"><SPANstyle="COLOR:#990000"><STRONG><SPANstyle="FONT-SIZE:16px"><SPANstyle="BACKGROUND-COLOR:rgb(255,255,255);COLOR:#663300">b.EthernetStateTracker.startMonitoring():</SPAN><BR>
  29. </SPAN></STRONG></SPAN></SPAN></SPAN><PREclass=javaname="code">publicvoidstartMonitoring(Contextcontext,Handlertarget){
  30. if(localLOGV)Slog.v(TAG,"starttomonitortheethernetdevices");
  31. if(mServiceStarted){//获得systemService中ethernet_service的上下文
  32. mEM=(EthernetManager)context.getSystemService(Context.ETHERNET_SERVICE);
  33. mContext=context;
  34. mCsHandler=target;
  35. intstate=mEM.getState();
  36. if(state!=mEM.ETHERNET_STATE_DISABLED){
  37. if(state==mEM.ETHERNET_STATE_UNKNOWN){
  38. //maybethisisthefirsttimewerun,sosetittoenabled
  39. mEM.setEnabled(mEM.getDeviceNameList()!=null);//setmEMtoenabled.
  40. }else{
  41. try{
  42. //ifit'snotthefirsttimewerun,resettheinterface.
  43. resetInterface();
  44. }catch(UnknownHostExceptione){
  45. Slog.e(TAG,"Wrongethernetconfiguration");
  46. }
  47. }
  48. }
  49. }
  50. }
  51. </PRE><SPANstyle="COLOR:#ff0000"><STRONG><SPANstyle="FONT-SIZE:16px"><BR>
  52. 2.创建EthernetStateTracker:</SPAN></STRONG></SPAN><SPANstyle="FONT-SIZE:16px"><BR>
  53. </SPAN>frameworks/base/ethernet/java/android/net/ethernet/EthernetStateTracker.java<BR>
  54. <BR>
  55. <DIVid=codeTextclass=codeText><PREclass=javaname="code">publicEthernetStateTracker(Contextcontext,Handlertarget){
  56. //创建NetworkInfo,可以用来查看网络状况
  57. mNetworkInfo=newNetworkInfo(ConnectivityManager.TYPE_ETHERNET,0,"ETH","");
  58. mLinkProperties=newLinkProperties();//网络链接属性
  59. if(localLOGV)Slog.v(TAG,"Starts...");
  60. //EthernetNative通过JNI调用到libnetutil.so中去了。
  61. if(EthernetNative.initEthernetNative()!=0){
  62. Slog.e(TAG,"Cannotinitethernetdevicelayers");
  63. return;
  64. }
  65. if(localLOGV)Slog.v(TAG,"Successed");
  66. mServiceStarted=true;
  67. //创建DHCP线程
  68. HandlerThreaddhcpThread=newHandlerThread("DHCPHandlerThread");
  69. dhcpThread.start();
  70. mDhcpTarget=newDhcpHandler(dhcpThread.getLooper(),this);
  71. mMonitor=newEthernetMonitor(this);//创建EthernetMonitor
  72. mDhcpInfo=newDhcpInfoInternal();//创建DhcpInfoInternal,用来描述DHCPIP配置
  73. mDhcpInfo1=newDhcpInfo();//创建DhcpInfo,用来描述staticip配置
  74. }</PRE><BR>
  75. <SPANstyle="COLOR:#663300;FONT-SIZE:16px"><STRONG>a.DhcpHandler():<SPANstyle="FONT-SIZE:12px">
  76. 这个类不知道干啥的。。</SPAN></STRONG></SPAN><BR>
  77. <PREclass=javaname="code">privateclassDhcpHandlerextendsHandler{
  78. publicDhcpHandler(Looperlooper,Handlertarget){
  79. super(looper);
  80. mTrackerTarget=target;//赋值mTrackerTarget.
  81. }
  82. </PRE><BR>
  83. <SPANstyle="COLOR:#663300;FONT-SIZE:16px"><STRONG>b.EthernetMonitor():这个会单独介绍<BR>
  84. <BR>
  85. c.DhcpInfoInternal():这个应该是DhcpInfo的新一代。</STRONG></SPAN><BR>
  86. frameworks/base/core/java/android/net/DhcpInfoInternal.java<BR>
  87. <BR>
  88. <PREclass=javaname="code">/**
  89. *AsimpleobjectforretrievingtheresultsofaDHCPrequest.
  90. *Replaces(internally)theIPv4-onlyDhcpInfoclass.
  91. *@hide
  92. */
  93. publicclassDhcpInfoInternal{
  94. privatefinalstaticStringTAG="DhcpInfoInternal";
  95. publicStringipAddress;
  96. publicintprefixLength;
  97. publicStringdns1;
  98. publicStringdns2;
  99. publicStringserverAddress;
  100. publicintleaseDuration;
  101. privateCollection<RouteInfo>mRoutes;
  102. </PRE><BR>
  103. <SPANstyle="COLOR:#663300;FONT-SIZE:16px"><STRONG>d.DhcpInfo类内容明显和DhcpInfoInternal不同:</STRONG></SPAN><BR>
  104. frameworks/base/core/java/android/net/DhcpInfo.java<BR>
  105. <PREclass=javaname="code">/**
  106. *AsimpleobjectforretrievingtheresultsofaDHCPrequest.
  107. */
  108. publicclassDhcpInfoimplementsParcelable{
  109. publicintipAddress;
  110. publicintgateway;
  111. publicintnetmask;
  112. publicintdns1;
  113. publicintdns2;
  114. publicintserverAddress;
  115. publicintleaseDuration;
  116. </PRE><BR>
  117. <BR>
  118. </DIV>
  119. <SPANstyle="COLOR:#f00000;FONT-SIZE:16px"><STRONG>3.<SPANstyle="FONT-FAMILY:宋体">
  120. 创建</SPAN><SPANstyle="FONT-FAMILY:宋体">EthernetService</SPAN></STRONG></SPAN><SPANstyle="FONT-SIZE:16px">:</SPAN><BR>
  121. frameworks/base/services/java/com/android/server/EthernetService.java<BR>
  122. <BR>
  123. <PREclass=javaname="code">publicEthernetService(Contextcontext,EthernetStateTrackerTracker){
  124. mTracker=Tracker;
  125. mContext=context;
  126. isEnabled=getPersistedState();
  127. if(localLOGV==true)Slog.i(TAG,"Ethernetdevenabled"+isEnabled);
  128. getDeviceNameList();//从驱动获得设备表
  129. setState(isEnabled);//设置enabled状态
  130. Slog.d(TAG,"xxha:----------------------StartPolling()");
  131. mTracker.StartPolling();//开始监听驱动层的事件信号
  132. }</PRE><BR>
  133. <SPANstyle="COLOR:#663300"><STRONG><SPANstyle="FONT-SIZE:16px">a.getDeviceNameList():</SPAN></STRONG></SPAN><BR>
  134. <PREclass=javaname="code">/**
  135. *getalltheethernetdevicenames
  136. *@returninterfacenamelistonsuccess,{@codenull}onfailure
  137. */
  138. publicString[]getDeviceNameList(){
  139. return(scanDevice()>0)?DevName:null;//扫描设备
  140. }
  141. </PRE><BR>
  142. <PREclass=javaname="code">privateintscanDevice(){
  143. inti,j;
  144. if((i=EthernetNative.getInterfaceCnt())==0)
  145. return0;
  146. DevName=newString[i];
  147. for(j=0;j<i;j++){
  148. DevName[j]=EthernetNative.getInterfaceName(j);//获取设备名eth0,sit0
  149. if(DevName[j]==null)
  150. break;
  151. if(localLOGV)Slog.v(TAG,"device"+j+"name"+DevName[j]);
  152. }
  153. returni;
  154. }
  155. </PRE><SPANstyle="COLOR:#663300"><STRONG><SPANstyle="FONT-SIZE:16px"><BR>
  156. b.mTracker.StartPolling()</SPAN></STRONG></SPAN><BR>
  157. <PREclass=javaname="code">publicvoidStartPolling(){
  158. mMonitor.startMonitoring();//这个也会调到EthernetMonitor中的startMonitoring()去。
  159. }
  160. </PRE><BR>
  161. <BR>
  162. <BR>
  163. <BR>
  164. <SPANstyle="FONT-FAMILY:宋体"><BR>
  165. <BR>
  166. </SPAN>
  167. <P></P>
  168. <PRE></PRE>

EthernetMornitor 与 EthernetStateTracker

分类: Android ethernet 173人阅读 评论(0) 收藏 举报

EthernetMornitor 这个类位于: frameworks/base/ethernet/java/android/net/ethernet/EthernetMonitor.java

它会监听底层ethernet 状态 的 event.

1. EthernetMonitor :

[java] view plain copy print ?
  1. /**
  2. *Listensforeventsfromkernel,andpassesthemon
  3. *tothe{@linkEtherentStateTracker}forhandling.Runsinitsownthread.
  4. *
  5. *@hide
  6. */
  7. publicclassEthernetMonitor{
  8. privatestaticfinalStringTAG="EthernetMonitor";
  9. privatestaticfinalintCONNECTED=1;
  10. privatestaticfinalintDISCONNECTED=2;
  11. privatestaticfinalintPHYUP=3;
  12. privatestaticfinalStringconnectedEvent="CONNECTED";
  13. privatestaticfinalStringdisconnectedEvent="DISCONNECTED";
  14. privatestaticfinalintADD_ADDR=20;
  15. privatestaticfinalintRM_ADDR=21;
  16. privatestaticfinalintNEW_LINK=16;
  17. privatestaticfinalintDEL_LINK=17;
  18. privatestaticfinalbooleanlocalLOGV=false;
  19. privateEthernetStateTrackermTracker;
  20. //EthernetMonitor是EthernetStateTraker的一个辅助
  21. publicEthernetMonitor(EthernetStateTrackertracker){
  22. mTracker=tracker;
  23. }

a. startMonitoring(): 会在 EthernetStateTracker.StartPolling()中 调用此函数。

[java] view plain copy print ?
  1. publicvoidstartMonitoring(){
  2. newMonitorThread().start();//线程开始
  3. }
  4. classMonitorThreadextendsThread{
  5. publicMonitorThread(){
  6. super("EthMonitor");
  7. }
  8. publicvoidrun(){
  9. //noinspectionInfiniteLoopStatement
  10. for(;;){//不断的在监听kernelevent
  11. intindex;
  12. inti;
  13. intcmd;
  14. Stringdev;
  15. if(localLOGV)Slog.v(TAG,"gopollevents");
  16. StringeventName=EthernetNative.waitForEvent();//waitforevent
  17. if(eventName==null){
  18. continue;
  19. }
  20. if(localLOGV)Slog.v(TAG,"getevent"+eventName);
  21. /*
  22. *Mapeventnameintoeventenum
  23. */
  24. i=0;
  25. while(i<eventName.length()){
  26. index=eventName.substring(i).indexOf(":");
  27. if(index==-1)
  28. break;
  29. dev=eventName.substring(i,index);
  30. i+=index+1;
  31. index=eventName.substring(i).indexOf(":");
  32. if(index==-1)
  33. break;
  34. cmd=Integer.parseInt(eventName.substring(i,i+index));
  35. i+=index+1;
  36. //dev指eth0,cmd是event参数。
  37. if(localLOGV)Slog.v(TAG,"dev:"+dev+"ev"+cmd);
  38. switch(cmd){
  39. caseDEL_LINK://断开连接
  40. handleEvent(dev,DISCONNECTED);
  41. break;
  42. caseADD_ADDR://添加IPaddress,即链接成功
  43. handleEvent(dev,CONNECTED);
  44. break;
  45. caseNEW_LINK://phyup状态
  46. handleEvent(dev,PHYUP);
  47. break;
  48. }
  49. }
  50. }
  51. }


b. handleEvent(String ifname,int event)

[java] view plain copy print ?
  1. /**
  2. *HandleallsupplicanteventsexceptSTATE-CHANGE
  3. *@parameventtheeventtype
  4. *@paramremaindertherestofthestringfollowingthe
  5. *eventnameand" — "
  6. */
  7. voidhandleEvent(Stringifname,intevent){
  8. switch(event){
  9. caseDISCONNECTED:
  10. mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.DISCONNECTED);
  11. break;
  12. caseCONNECTED:
  13. mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.CONNECTED);
  14. break;
  15. casePHYUP:
  16. mTracker.notifyPhyConnected(ifname);
  17. break;
  18. default:
  19. mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.FAILED);
  20. break;
  21. }
  22. }

c. EthernetStateTraker.notifyStateChange():

[java] view plain copy print ?
  1. publicvoidnotifyStateChange(Stringifname,DetailedStatestate){
  2. if(localLOGV)Slog.i(TAG,"reportnewstate"+state.toString()+"ondev"+ifname);
  3. if(ifname.equals(mInterfaceName)){//判断eth0名称是否正确
  4. if(localLOGV)Slog.v(TAG,"updatenetworkstatetracker");
  5. synchronized(this){//发送ConnectedorDisconnected消息
  6. this.sendEmptyMessage(state.equals(DetailedState.CONNECTED)
  7. ?EVENT_HW_CONNECTED:EVENT_HW_DISCONNECTED);
  8. }
  9. }
  10. }

d. EthernetStateTraker.notifyPhyConnected():

[java] view plain copy print ?
  1. publicvoidnotifyPhyConnected(Stringifname){
  2. if(localLOGV)Slog.v(TAG,"reportinterfaceisupfor"+ifname);
  3. synchronized(this){//发送Phyconnected消息
  4. this.sendEmptyMessage(EVENT_HW_PHYCONNECTED);
  5. }
  6. }


2. 发送消息之后,EthernetStateTraker 会handleMessage():

[java] view plain copy print ?
  1. publicvoidhandleMessage(Messagemsg){
  2. synchronized(this){
  3. switch(msg.what){
  4. caseEVENT_INTERFACE_CONFIGURATION_SUCCEEDED://连接成功
  5. if(localLOGV)Slog.i(TAG,"receivedconfiguredsucceeded,stack="+mStackConnected+"HW="+mHWConnected);
  6. mStackConnected=true;
  7. if(mHWConnected)
  8. setState(true,msg.what);
  9. break;
  10. caseEVENT_INTERFACE_CONFIGURATION_FAILED://链接失败
  11. mStackConnected=false;
  12. //starttoretry?
  13. break;
  14. caseEVENT_HW_CONNECTED://HW连接上了
  15. if(localLOGV)Slog.i(TAG,"receivedHWconnected,stack="+mStackConnected+"HW="+mHWConnected);
  16. mHWConnected=true;
  17. if(mStackConnected)
  18. setState(true,msg.what);
  19. break;
  20. caseEVENT_HW_DISCONNECTED://hw断开
  21. if(localLOGV)Slog.i(TAG,"receiveddisconnectedevents,stack="+mStackConnected+"HW="+mHWConnected);
  22. setState(false,msg.what);
  23. break;
  24. caseEVENT_HW_PHYCONNECTED://phy连上
  25. if(localLOGV)Slog.i(TAG,"interfaceupevent,kickoffconnectionrequest");
  26. if(!mStartingDhcp){
  27. intstate=mEM.getState();
  28. if(state!=mEM.ETHERNET_STATE_DISABLED){
  29. EthernetDevInfoinfo=mEM.getSavedConfig();//获得以前已有的连接IP
  30. if(info!=null&&mEM.isConfigured()){
  31. try{
  32. configureInterface(info);//配置IP
  33. }catch(UnknownHostExceptione){
  34. //TODOAuto-generatedcatchblock
  35. //e.printStackTrace();
  36. Slog.e(TAG,"Cannotconfigureinterface");
  37. }
  38. }
  39. }
  40. }
  41. setState(true,msg.what);
  42. break;
  43. }
  44. }
  45. }

3. setState(boolean state, int event):

[java] view plain copy print ?
  1. privatevoidsetState(booleanstate,intevent){
  2. if(mNetworkInfo.isConnected()!=state){
  3. if(state){//connectedordisconnected.
  4. mNetworkInfo.setDetailedState(DetailedState.CONNECTED,null,null);
  5. }else{
  6. mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED,null,null);
  7. stopInterface(true);
  8. }
  9. mNetworkInfo.setIsAvailable(state);
  10. postNotification(event);
  11. }
  12. }

a. stopInterface():

[java] view plain copy print ?
  1. /**
  2. *Stopetherentinterface
  3. *@paramsuspend{@codefalse}disabletheinterface{@codetrue}onlyresettheconnectionwithoutdisabletheinterface
  4. *@returntrue
  5. */
  6. publicbooleanstopInterface(booleansuspend){
  7. if(mEM!=null){
  8. EthernetDevInfoinfo=mEM.getSavedConfig();
  9. if(info!=null&&mEM.isConfigured()){
  10. synchronized(mDhcpTarget){
  11. mInterfaceStopped=true;
  12. if(localLOGV)Slog.i(TAG,"stopdhcpandinterface");
  13. //stopDhcpHandlerLooper
  14. mDhcpTarget.removeMessages(EVENT_DHCP_START);
  15. Stringifname=info.getIfName();//eth0
  16. if(!NetworkUtils.stopDhcp(ifname)){//stopdhcpcd_eth0service
  17. if(localLOGV)Slog.w(TAG,"CouldnotstopDHCP");
  18. }
  19. //reseteth0,removerouteandip
  20. NetworkUtils.resetConnections(ifname,NetworkUtils.RESET_ALL_ADDRESSES);
  21. NetworkUtils.removeDefaultRoute(ifname);
  22. mStartingDhcp=false;
  23. if(!suspend)//ifsuspend=false,turneth0todown.
  24. NetworkUtils.disableInterface(ifname);
  25. mLinkProperties.clear();
  26. }
  27. }
  28. }
  29. returntrue;
  30. }

b. postNotification(int event), 给ConnectivityService 发送 event state changed 消息.

[java] view plain copy print ?
  1. privatevoidpostNotification(intevent){
  2. Messagemsg=mCsHandler.obtainMessage(EVENT_STATE_CHANGED,newNetworkInfo(mNetworkInfo));
  3. msg.sendToTarget();
  4. }

4. configureInterface(EthernetDevInfo info), 配置 IP 函数:

[java] view plain copy print ?
  1. privatebooleanconfigureInterface(EthernetDevInfoinfo)throwsUnknownHostException{
  2. mStackConnected=false;
  3. mHWConnected=false;
  4. mInterfaceStopped=false;
  5. mStartingDhcp=true;
  6. //DHCP方式获得IP
  7. if(info.getConnectMode().equals(EthernetDevInfo.ETHERNET_CONN_MODE_DHCP)){
  8. if(localLOGV)Slog.i(TAG,"triggerdhcpfordevice"+info.getIfName());
  9. sDnsPropNames=newString[]{
  10. "dhcp."+mInterfaceName+".dns1",
  11. "dhcp."+mInterfaceName+".dns2"
  12. };
  13. mDhcpTarget.sendEmptyMessage(EVENT_DHCP_START);
  14. }else{//staticIP设置方式
  15. intevent;
  16. sDnsPropNames=newString[]{
  17. "net."+mInterfaceName+".dns1",
  18. "net."+mInterfaceName+".dns2"
  19. };
  20. //从输入栏获取ip,gateway,netmask,dns值
  21. mDhcpInfo1.ipAddress=lookupHost(info.getIpAddress());
  22. mDhcpInfo1.gateway=lookupHost(info.getRouteAddr());
  23. mDhcpInfo1.netmask=lookupHost(info.getNetMask());
  24. mDhcpInfo1.dns1=lookupHost(info.getDnsAddr());
  25. mDhcpInfo1.dns2=0;
  26. if(localLOGV)Slog.i(TAG,"setipmanually"+mDhcpInfo1.toString());
  27. //配置之前擦除以前的route
  28. NetworkUtils.removeDefaultRoute(info.getIfName());
  29. //配置成功
  30. if(NetworkUtils.configureInterface(info.getIfName(),mDhcpInfo1)){
  31. event=EVENT_INTERFACE_CONFIGURATION_SUCCEEDED;
  32. SystemProperties.set("net.dns1",info.getDnsAddr());
  33. SystemProperties.set("net."+info.getIfName()+".dns1",info.getDnsAddr());
  34. SystemProperties.set("net."+info.getIfName()+".dns2","0.0.0.0");
  35. if(localLOGV)
  36. Slog.v(TAG,"StaticIPconfigurationsucceeded");
  37. }else{//配置失败
  38. event=EVENT_INTERFACE_CONFIGURATION_FAILED;
  39. if(localLOGV)Slog.w(TAG,"StaticIPconfigurationfailed");
  40. }
  41. this.sendEmptyMessage(event);//给EthernetStateTracker发送message
  42. }
  43. returntrue;
  44. }
  45. <PRE></PRE><SPANstyle="COLOR:#ff0000"><STRONG><SPANstyle="FONT-SIZE:16px">5.resetInterface(),这个和stopInterface差不多:</SPAN></STRONG></SPAN>
  46. <P></P>
  47. <P></P>
  48. <PREclass=javaname="code">/**
  49. *resetethernetinterface
  50. *@returntrue
  51. *@throwsUnknownHostException
  52. */
  53. publicbooleanresetInterface()throwsUnknownHostException{
  54. /*
  55. *Thiswillguideustoenabledtheenableddevice
  56. */
  57. if(mEM!=null){
  58. EthernetDevInfoinfo=mEM.getSavedConfig();
  59. if(info!=null&&mEM.isConfigured()){
  60. synchronized(this){
  61. mInterfaceName=info.getIfName();
  62. if(localLOGV)Slog.i(TAG,"resetdevice"+mInterfaceName);
  63. NetworkUtils.resetConnections(mInterfaceName,NetworkUtils.RESET_ALL_ADDRESSES);
  64. //StopDHCP
  65. if(mDhcpTarget!=null){
  66. mDhcpTarget.removeMessages(EVENT_DHCP_START);
  67. }
  68. if(!NetworkUtils.stopDhcp(mInterfaceName)){
  69. if(localLOGV)Slog.w(TAG,"CouldnotstopDHCP");
  70. }
  71. mLinkProperties.clear();
  72. configureInterface(info);//比stopInterface多了一步重新配置IP。
  73. }
  74. }
  75. }
  76. returntrue;
  77. }
  78. </PRE><BR>
  79. <BR>
  80. <P></P>
  81. <PRE></PRE>
  82. <PRE></PRE>
  83. <PRE></PRE>
  84. <PRE></PRE>

NetWorkUtils 和 android_net_NetUtils.cpp

分类: Android ethernet 249人阅读 评论(0) 收藏 举报

EthernetStateTracker 中会,用到 NetWorkUtils 类中的一些函数, 这些函数,会调用JNI: android_net_NetUtils.cpp, 然后调到 libnetutils 库中去。

如:

NetworkUtils.disableInterface(ifname);

NetworkUtils.runDhcp(mInterfaceName, mDhcpInfo);

NetworkUtils.stopDhcp(mInterfaceName);

NetworkUtils.resetConnections(mInterfaceName, NetworkUtils.RESET_ALL_ADDRESSES);

NetworkUtils.configureInterface(info.getIfName(), mDhcpInfo1);

NetworkUtils.removeDefaultRoute(ifname);

等等。


1. NetworkUtils 类: frameworks/base/core/java/android/net/NetworkUtils.java

[java] view plain copy print ?
  1. /**
  2. *Nativemethodsformanagingnetworkinterfaces.
  3. *
  4. *{@hide}
  5. */
  6. publicclassNetworkUtils{
  7. privatestaticfinalStringTAG="NetworkUtils";
  8. /**Bringthenamednetworkinterfaceup.*/
  9. publicnativestaticintenableInterface(StringinterfaceName);
  10. /**Bringthenamednetworkinterfacedown.*/
  11. publicnativestaticintdisableInterface(StringinterfaceName);
  12. /**Removethedefaultrouteforthenamedinterface.*/
  13. publicnativestaticintremoveDefaultRoute(StringinterfaceName);
  14. /**Settingbit0indicatesresetingofIPv4addressesrequired*/
  15. publicstaticfinalintRESET_IPV4_ADDRESSES=0x01;
  16. /**Settingbit1indicatesresetingofIPv4addressesrequired*/
  17. publicstaticfinalintRESET_IPV6_ADDRESSES=0x02;
  18. /**Resetalladdresses*/
  19. publicstaticfinalintRESET_ALL_ADDRESSES=RESET_IPV4_ADDRESSES|RESET_IPV6_ADDRESSES;
  20. /**
  21. *ResetIPv6orIPv4socketsthatareconnectedviathenamedinterface.
  22. *
  23. *@paraminterfaceNameistheinterfacetoreset
  24. *@parammask{@see#RESET_IPV4_ADDRESSES}and{@see#RESET_IPV6_ADDRESSES}
  25. */
  26. publicnativestaticintresetConnections(StringinterfaceName,intmask);
  27. /**
  28. *StarttheDHCPclientdaemon,inordertohaveitrequestaddresses
  29. *forthenamedinterface,andthenconfiguretheinterfacewiththose
  30. *addresses.Thiscallblocksuntilitobtainsaresult(eithersuccess
  31. *orfailure)fromthedaemon.
  32. *@paraminterfaceNamethenameoftheinterfacetoconfigure
  33. *@paramipInfoiftherequestsucceeds,thisobjectisfilledinwith
  34. *theIPaddressinformation.
  35. *@return{@codetrue}forsuccess,{@codefalse}forfailure
  36. */
  37. publicnativestaticbooleanrunDhcp(StringinterfaceName,DhcpInfoInternalipInfo);
  38. /**
  39. *InitiaterenewalontheDhcpclientdaemon.Thiscallblocksuntilitobtains
  40. *aresult(eithersuccessorfailure)fromthedaemon.
  41. *@paraminterfaceNamethenameoftheinterfacetoconfigure
  42. *@paramipInfoiftherequestsucceeds,thisobjectisfilledinwith
  43. *theIPaddressinformation.
  44. *@return{@codetrue}forsuccess,{@codefalse}forfailure
  45. */
  46. publicnativestaticbooleanrunDhcpRenew(StringinterfaceName,DhcpInfoInternalipInfo);
  47. /**
  48. *ShutdowntheDHCPclientdaemon.
  49. *@paraminterfaceNamethenameoftheinterfaceforwhichthedaemon
  50. *shouldbestopped
  51. *@return{@codetrue}forsuccess,{@codefalse}forfailure
  52. */
  53. publicnativestaticbooleanstopDhcp(StringinterfaceName);
  54. /**
  55. *WhenstaticIPconfigurationhasbeenspecified,configurethenetwork
  56. *interfaceaccordingtothevaluessupplied.
  57. *@paraminterfaceNamethenameoftheinterfacetoconfigure
  58. *@paramipInfotheIPaddress,defaultgateway,andDNSserveraddresses
  59. *withwhichtoconfiguretheinterface.
  60. *@return{@codetrue}forsuccess,{@codefalse}forfailure
  61. */
  62. publicstaticbooleanconfigureInterface(StringinterfaceName,DhcpInfoipInfo){
  63. returnconfigureNative(interfaceName,
  64. ipInfo.ipAddress,
  65. ipInfo.netmask,
  66. ipInfo.gateway,
  67. ipInfo.dns1,
  68. ipInfo.dns2);
  69. }
  70. privatenativestaticbooleanconfigureNative(
  71. StringinterfaceName,intipAddress,intnetmask,intgateway,intdns1,intdns2);

2. android_net_NetUtils.cpp JNI 中的函数映射关系。

[cpp] view plain copy print ?
  1. /*
  2. *JNIregistration.
  3. */
  4. staticJNINativeMethodgNetworkUtilMethods[]={
  5. /*name,signature,funcPtr*/
  6. {"enableInterface","(Ljava/lang/String;)I",(void*)android_net_utils_enableInterface},
  7. {"disableInterface","(Ljava/lang/String;)I",(void*)android_net_utils_disableInterface},
  8. {"resetConnections","(Ljava/lang/String;I)I",(void*)android_net_utils_resetConnections},
  9. {"removeDefaultRoute","(Ljava/lang/String;)I",(void*)android_net_utils_removeDefaultRoute},
  10. {"runDhcp","(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z",(void*)android_net_utils_runDhcp},
  11. {"runDhcpRenew","(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z",(void*)android_net_utils_runDhcpRenew},
  12. {"stopDhcp","(Ljava/lang/String;)Z",(void*)android_net_utils_stopDhcp},
  13. {"releaseDhcpLease","(Ljava/lang/String;)Z",(void*)android_net_utils_releaseDhcpLease},
  14. {"getDhcpError","()Ljava/lang/String;",(void*)android_net_utils_getDhcpError},
  15. {"configureNative","(Ljava/lang/String;IIIII)Z",(void*)android_net_utils_configureInterface},
  16. };

3. enableInterface(), diableInterface() , resetConnection():

[cpp] view plain copy print ?
  1. staticjintandroid_net_utils_enableInterface(JNIEnv*env,jobjectclazz,jstringifname)
  2. {
  3. intresult;
  4. constchar*nameStr=env->GetStringUTFChars(ifname,NULL);
  5. result=::ifc_enable(nameStr);//这里就会调用到libnetutils中的ifc_utils.c去
  6. env->ReleaseStringUTFChars(ifname,nameStr);
  7. return(jint)result;
  8. }
  9. staticjintandroid_net_utils_disableInterface(JNIEnv*env,jobjectclazz,jstringifname)
  10. {
  11. intresult;
  12. constchar*nameStr=env->GetStringUTFChars(ifname,NULL);
  13. result=::ifc_disable(nameStr);
  14. env->ReleaseStringUTFChars(ifname,nameStr);
  15. return(jint)result;
  16. }
  17. staticjintandroid_net_utils_resetConnections(JNIEnv*env,jobjectclazz,
  18. jstringifname,jintmask)
  19. {
  20. intresult;
  21. constchar*nameStr=env->GetStringUTFChars(ifname,NULL);
  22. LOGD("android_net_utils_resetConnectionsinenv=%pclazz=%piface=%smask=0x%x\n",
  23. env,clazz,nameStr,mask);
  24. result=::ifc_reset_connections(nameStr,mask);
  25. env->ReleaseStringUTFChars(ifname,nameStr);
  26. return(jint)result;
  27. }

4. runDhcp() , stopDhcp():

[java] view plain copy print ?
  1. staticjbooleanandroid_net_utils_runDhcpCommon(JNIEnv*env,jobjectclazz,jstringifname,
  2. jobjectinfo,boolrenew)
  3. {
  4. intresult;
  5. charipaddr[PROPERTY_VALUE_MAX];
  6. uint32_tprefixLength;
  7. chargateway[PROPERTY_VALUE_MAX];
  8. chardns1[PROPERTY_VALUE_MAX];
  9. chardns2[PROPERTY_VALUE_MAX];
  10. charserver[PROPERTY_VALUE_MAX];
  11. uint32_tlease;
  12. constchar*nameStr=env->GetStringUTFChars(ifname,NULL);
  13. if(nameStr==NULL)return(jboolean)false;
  14. if(renew){
  15. result=::dhcp_do_request_renew(nameStr,ipaddr,gateway,&prefixLength,
  16. dns1,dns2,server,&lease);
  17. }else{
  18. result=::dhcp_do_request(nameStr,ipaddr,gateway,&prefixLength,
  19. dns1,dns2,server,&lease);//调用dhcp_utils.c中的函数,获取route
  20. }
  21. env->ReleaseStringUTFChars(ifname,nameStr);
  22. if(result==0){
  23. env->SetObjectField(info,dhcpInfoInternalFieldIds.ipaddress,env->NewStringUTF(ipaddr));
  24. //setthegateway
  25. jclasscls=env->FindClass("java/net/InetAddress");
  26. jmethodIDmethod=env->GetStaticMethodID(cls,"getByName",
  27. "(Ljava/lang/String;)Ljava/net/InetAddress;");
  28. jvalueargs[1];
  29. args[0].l=env->NewStringUTF(gateway);
  30. jobjectinetAddressObject=env->CallStaticObjectMethodA(cls,method,args);
  31. if(!env->ExceptionOccurred()){
  32. cls=env->FindClass("android/net/RouteInfo");
  33. method=env->GetMethodID(cls,"<init>","(Ljava/net/InetAddress;)V");
  34. args[0].l=inetAddressObject;
  35. jobjectrouteInfoObject=env->NewObjectA(cls,method,args);
  36. cls=env->FindClass("android/net/DhcpInfoInternal");
  37. method=env->GetMethodID(cls,"addRoute","(Landroid/net/RouteInfo;)V");
  38. args[0].l=routeInfoObject;
  39. env->CallVoidMethodA(info,method,args);
  40. }else{
  41. //ifwehaveanexception(hostnotfoundperhaps),justdon'taddtheroute
  42. env->ExceptionClear();
  43. }
  44. env->SetIntField(info,dhcpInfoInternalFieldIds.prefixLength,prefixLength);
  45. env->SetObjectField(info,dhcpInfoInternalFieldIds.dns1,env->NewStringUTF(dns1));
  46. env->SetObjectField(info,dhcpInfoInternalFieldIds.dns2,env->NewStringUTF(dns2));
  47. env->SetObjectField(info,dhcpInfoInternalFieldIds.serverAddress,
  48. env->NewStringUTF(server));
  49. env->SetIntField(info,dhcpInfoInternalFieldIds.leaseDuration,lease);
  50. }
  51. return(jboolean)(result==0);
  52. }
[cpp] view plain copy print ?
  1. staticjbooleanandroid_net_utils_runDhcp(JNIEnv*env,jobjectclazz,jstringifname,jobjectinfo)
  2. {
  3. returnandroid_net_utils_runDhcpCommon(env,clazz,ifname,info,false);
  4. }
  5. staticjbooleanandroid_net_utils_runDhcpRenew(JNIEnv*env,jobjectclazz,jstringifname,jobjectinfo)
  6. {
  7. returnandroid_net_utils_runDhcpCommon(env,clazz,ifname,info,true);
  8. }
  9. staticjbooleanandroid_net_utils_stopDhcp(JNIEnv*env,jobjectclazz,jstringifname)
  10. {
  11. intresult;
  12. constchar*nameStr=env->GetStringUTFChars(ifname,NULL);
  13. result=::dhcp_stop(nameStr);//这个调用libnetutils中的dhcp_utils.c
  14. env->ReleaseStringUTFChars(ifname,nameStr);
  15. return(jboolean)(result==0);
  16. }

5. 新添加的2个函数: removeDefaultRoute() 和 configureInterface():

[cpp] view plain copy print ?
  1. staticjintandroid_net_utils_removeDefaultRoute(JNIEnv*env,jobjectclazz,jstringifname)
  2. {
  3. intresult;
  4. constchar*nameStr=env->GetStringUTFChars(ifname,NULL);
  5. result=::ifc_remove_default_route(nameStr);
  6. env->ReleaseStringUTFChars(ifname,nameStr);
  7. return(jint)result;
  8. }
  9. staticjbooleanandroid_net_utils_configureInterface(JNIEnv*env,
  10. jobjectclazz,
  11. jstringifname,
  12. jintipaddr,
  13. jintmask,
  14. jintgateway,
  15. jintdns1,
  16. jintdns2)
  17. {
  18. intresult;
  19. uint32_tlease;
  20. constchar*nameStr=env->GetStringUTFChars(ifname,NULL);
  21. result=::ifc_configure(nameStr,ipaddr,mask,gateway,dns1,dns2);
  22. env->ReleaseStringUTFChars(ifname,nameStr);
  23. return(jboolean)(result==0);
  24. }

6. libnetutils.so C 库导出来的 函数名, 这里主要用到了 ifc_utils.c 和 dhcp_utils.c 中的一些函数:

[cpp] view plain copy print ?
  1. extern"C"{
  2. intifc_enable(constchar*ifname);
  3. intifc_disable(constchar*ifname);
  4. intifc_reset_connections(constchar*ifname,intreset_mask);
  5. intifc_remove_default_route(constchar*ifname);
  6. intifc_configure(constchar*ifname,
  7. in_addr_taddress,
  8. in_addr_tprefixLength,
  9. in_addr_tgateway,
  10. in_addr_tdns1,
  11. in_addr_tdns2);
  12. intdhcp_do_request(constchar*ifname,
  13. constchar*ipaddr,
  14. constchar*gateway,
  15. uint32_t*prefixLength,
  16. constchar*dns1,
  17. constchar*dns2,
  18. constchar*server,
  19. uint32_t*lease);
  20. intdhcp_do_request_renew(constchar*ifname,
  21. constchar*ipaddr,
  22. constchar*gateway,
  23. uint32_t*prefixLength,
  24. constchar*dns1,
  25. constchar*dns2,
  26. constchar*server,
  27. uint32_t*lease);
  28. intdhcp_stop(constchar*ifname);
  29. intdhcp_release_lease(constchar*ifname);
  30. char*dhcp_get_errmsg();
  31. }

dhcpcd守护进程分析

最近在调android ethernet功能,android本身不带 ethernet 功能,需要打patch。这个patch可以在setting里出来 ethernet configuration 选项。即添加了用户配置IP的功能。
我打上patch之后,点击选上DHCP功能,结果路由器一直不能自动分配IP。

经检测,命令行里运行 netcfg eth0 up dhcp 时,ethernet能被正常启动,DHCP能分配到IP。

但是Setting里选上时,dhcp却不能正常分配IP。 这很费解,我先后查看了,
/system/core/libnetutils/*
/externel/dhcpcd/*
发现都没什么问题。

在Setting中点击turn on ethernet选项时,从log看到能调到

  1. E/EthernetStateTracker( 185): DhcpHandler: DHCP request failed: Timed out waiting for dhcpcd to start
  2. D/EthernetStateTracker( 185): DhcpHandler: DHCP request started

说明patch是好的能正常工作,能正常掉用dhcp,只是DHCP运行不成功。

然后我查了 getprop: 显示 init.svc.dhcpcd_eth0 = stop
正常应该是running的,这样DHCP 才能运行成功。

最后调试了两天,才搞明白,原来是 init.rc 中 dhcpcd_eth0 守护进程的问题:

改成:

  1. on property:init.svc.dhcpcd_eth0=stopped
  2. start dhcpcd_eth0

  3. service dhcpcd_eth0 /system/bin/dhcpcd -ABKL -f /system/etc/dhcpcd/dhcpcd.conf -d eth0
  4. class main
  5. disabled
  6. oneshot

这样就可以了。

这时init.svc.dhcpcd_eth0 就会是 running 了。这时再点击Setting -> ethernet configuration, DHCP就能正常分配IP了。

libnetutils 和dhcpcd 调用过程如下:

1. libnetutils 调用过程:

  1. jni
  2. =>runDhcp
  3. =>android_net_utils_runDhcp
  4. libs/netutils/dhcp_utils.c
  5. =>dhcp_do_request
  6. =>
  7. static const char DAEMON_NAME[] = "dhcpcd";
  8. static const char DAEMON_PROP_NAME[] = "init.svc.dhcpcd";
  9. static const char DHCP_PROP_NAME_PREFIX[] = "dhcp";
  10. const char *ctrl_prop = "ctl.start";
  11. const char *desired_status = "running";
  12. snprintf(result_prop_name, sizeof(result_prop_name), "%s.%s.result",
  13. DHCP_PROP_NAME_PREFIX,
  14. interface);
  15. property_set(result_prop_name, "");//设置dhcp.eth0.result="";等到成功完成dhcp之后,
  16. property_set(ctrl_prop, DAEMON_NAME);//向名字为dhcpcd的service,发送"ctrl.start"启动命令字,该service在init.rc中
  17. //init.rc中dhcpcd服务进程命令字
  18. //service dhcpcd /system/bin/dhcpcd eth0
  19. // disabled
  20. // oneshot
  21. wait_for_property(DAEMON_PROP_NAME, desired_status, 10);
  22. //init.c=>init进程
  23. //=>handle_property_set_fd因为是"ctrl.start"命令字,所以调用handle_control_message处理控制信息
  24. //=>handle_control_message
  25. //=>msg_start
  26. //=>
  27. // struct service *svc = service_find_by_name(name);
  28. // service_start(svc);//启动svc,即执行:/system/bin/dhcpcd eth0
  29. //=>service_start
  30. //=>pid = fork();
  31. // if(pid == 0)execve(svc->args[0], (char**) svc->args, (char**) ENV);子进程执行execve运行/system/bin/dhcpcd,参数为eth0
  32. //=>否则父进程,即init进程将
  33. //=>notify_service_state(svc->name, "running");设置该svc的状态prop
  34. // snprintf(pname, sizeof(pname), "init.svc.%s", name);
  35. // property_set(pname, state);//所以这样上面wait_for_property(DAEMON_PROP_NAME, desired_status, 10);也才能够正常pass[luther.gliethttp].
  36. wait_for_property(result_prop_name, NULL, 15);//等待dhcp.eth0.result=非空

2. dhcpcd 调用过程:


  1. system/extra/dhcpcd-4.0.0-beta9/dhcpcd.c
  2. dhcpcd
  3. =>main
  4. # define SYSCONFDIR "/system/etc/dhcpcd"
  5. #define PACKAGE "dhcpcd"
  6. # define CONFIG SYSCONFDIR "/" PACKAGE ".conf"
  7. # define LIBEXECDIR "/system/etc/dhcpcd"
  8. # define SCRIPT LIBEXECDIR "/" PACKAGE "-run-hooks"
  9. =>strlcpy(options->script, SCRIPT, sizeof(options->script));//默认的options->script="/system/etc/dhcpcd /dhcpcd-run-hooks"
  10. =>f = fopen(cf ? cf : CONFIG, "r");//如果没有指定.conf文件,那么使用默认.conf文件
  11. =>parse_config_line//解析"/system/etc/dhcpcd/dhcpcd.conf"默认配置文件
  12. =>parse_option
  13. =>如果在"/system/etc/dhcpcd/dhcpcd.conf""script"这个节
  14. =>那么执行strlcpy(options->script, oarg, sizeof(options->script));直接拷贝
  15. /*
  16. {"script", required_argument, NULL, 'c'},
  17. {"option", required_argument, NULL, 'o'},
  18. "/system/etc/dhcpcd/dhcpcd.conf"中的部分内容如下:
  19. ...
  20. option domain_name_servers, domain_name, domain_search, host_name
  21. ...
  22. */
  23. =>dhcp_run
  24. =>handle_dhcp_packet
  25. =>handle_dhcp
  26. =>bind_dhcp
  27. reason = "TIMEOUT";reason = "BOUND";reason = "REBIND";reason = "RENEW";
  28. system/extra/dhcpcd-4.0.0-beta9/configure.c
  29. => configure(iface, reason, state->new, state->old, &state->lease, options, 1);
  30. //如果dhcp超时或者dhcp成功,都会调用exec_script来执行脚本,
  31. //执行setprop dhcp.${interface}.result "failed"或者
  32. //执行setprop dhcp.${interface}.result "ok"
  33. =>exec_script(options, iface->name, reason, NULL, old);
  34. =>然后configure_env通过环境变量将reason传递到脚本中
  35. int exec_script(const struct options *options, const char *iface, const char *reason,
  36. const struct dhcp_message *dhcpn, const struct dhcp_message *dhcpo)
  37. =>pid = fork();
  38. =>if(pid == 0)execve(options->script, argv, env);//子进程执行脚本,默认"/system/etc/dhcpcd/dhcpcd-run-hooks"
  39. //dhcpcd-run-hooks脚本会根据level值,决定是否执行system/etc/dhcpcd/dhcpcd-hook/*目录下的相应文件
  40. //我们的系统在该system/etc/dhcpcd/dhcpcd-hook/*目录下有如下3个文件
  41. //95-configured
  42. //20-dns.conf
  43. //01-test
  44. =>父进程返回while (waitpid(pid, &status, 0) == -1)等待子进程脚本执行完成

  45. system/extra/dhcpcd-4.0.0-beta9/dhcpcd-hooks/20-dns.conf
  46. system/extra/dhcpcd-4.0.0-beta9/dhcpcd-hooks/95-configured
  47. ...
  48. setprop dhcp.${interface}.ipaddress "${new_ip_address}"
  49. setprop dhcp.${interface}.result "ok"//设置属性为ok
  50. setprop dhcp.${interface}.result "failed"

dhcpcd 工具

dhcpcd 源代码 位于 external/dhcpcd/*

这个目录的源代码生成 /system/bin/dhcpcd 命令工具和一些信息文件。

0605/external/dhcpcd$ ls *
android.conf CleanSpec.mk configure.h dhcpcd.conf dhcp.h if-linux.c logger.c NOTICE ThirdPartyProject.prop
Android.mk client.c control.c dhcpcd.conf.5 duid.c if-linux-wireless.c logger.h platform-bsd.c
arp.c client.h control.h dhcpcd.conf.5.in duid.h if-options.c lpf.c platform.h
arp.h common.c defs.h dhcpcd.h eloop.c if-options.h Makefile platform-linux.c
bind.c common.h dhcp.c dhcpcd-run-hooks eloop.h if-pref.c Makefile.inc README
bind.h config.h dhcpcd.8 dhcpcd-run-hooks.8 ifaddrs.c if-pref.h MODULE_LICENSE_BSD_LIKE showlease.c
bpf.c config.mk dhcpcd.8.in dhcpcd-run-hooks.8.in ifaddrs.h ipv4ll.c net.c signals.c
bpf-filter.h configure.c dhcpcd.c dhcpcd-run-hooks.in if-bsd.c ipv4ll.h net.h signals.h

compat:
arc4random.c arc4random.h closefrom.c closefrom.h getline.c getline.h linkaddr.c strlcpy.c strlcpy.h

dhcpcd-hooks:
01-test 10-mtu 20-resolv.conf 30-hostname 50-ntp.conf 50-yp.conf 95-configured
02-dump 20-dns.conf 29-lookup-hostname 50-dhcpcd-compat 50-ypbind 90-NetworkManager Makefile

mk:
cc.mk depend.mk dist.mk files.mk man.mk os-BSD.mk os-Darwin.mk os-Linux.mk os.mk prog.mk scripts.mk sys.mk

这里代码比较多,暂不细究了。


更多相关文章

  1. C语言函数以及函数的使用
  2. android selector 中的几个关键状态
  3. android aidl 进程通信 调用错误
  4. 知识梳理之Android进程
  5. Android多进程之Binder解绑监听的问题
  6. android状态栏工具类
  7. android检查手机网络状态
  8. 有关XML的点击状态背景图的设置

随机推荐

  1. 第一章 andriod studio 安装与环境搭建
  2. Android(安卓)View的绘制过程复习
  3. android 关于程序升级问题
  4. android背景选择器selector用法汇总
  5. Android里面用XML定义菜单资源
  6. Android(安卓)软键盘盖住输入框的问题
  7. csr8811蓝牙芯片porting总结
  8. Android常用控件之悬浮窗(Service实现)
  9. EditText 的常用属性与解释
  10. Android(安卓)2.2兼容性移植