[RK3399][Android7.1] Ethernet -- 在设置-Ethernet中切换静态/动态模式,然后连接网线,测试网络获取不到IP的问题
2019-03-30 12:05
211 查看
测试平台
Platform: RK3399
OS: Android 7.1
现象
断开网线后,在设置-Ethernet中切换静态/动态模式,然后连接网线,测试网络获取不到IP的问题。
分析
简单分析下代码,设置以太网ip static/dhcp的流程是:
packages/apps/Settings/src/com/android/settings/ethernet/EthernetSettings.java --> mEthManager.setConfiguration(new IpConfiguration(IpAssignment.DHCP, ProxySettings.NONE,null,null));//设置静态Ip mEthManager.setConfiguration(new IpConfiguration(IpAssignment.STATIC,ProxySettings.NONE,mStaticIpConfiguration,null));//设置dhcp --> frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java public void setConfiguration(IpConfiguration config) { ... mTracker.reconnect("eth0"); ... } --> frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java public void reconnect(String iface) { ... updateInterfaceState(iface, false); ... updateInterfaceState(iface, true); } private void updateInterfaceState(String iface, boolean up) { if (!mIface.equals(iface)) { return; } if (!mReconnecting) Log.d(TAG, "updateInterface: " + iface + " link " + (up ? "up" : "down")); if (up && mEthernetCurrentState != EthernetManager.ETHER_STATE_DISCONNECTED) { Log.d(TAG, "Already connected or connecting, skip connect"); return; } ... }
查看流程可以知道切换static/dhcp时会调用reconnect()来重启接口,且重启后up的状态设置为true.但是此时并没有判断以太网的状态,若此时网线没有连接,将up更新为true,那么当插入网线调用updateInterfaceState(iface, true)来获取IP时,由于up已经为true,所以不会进行操作而是直接返回,所以导致获取不到ip的问题。
解决方案
diff --git a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java index 6d4c3e9..0ac7f17 100755 (executable) --- a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java +++ b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java @@ -232,6 +232,15 @@ class EthernetNetworkFactory { /** * Updates interface state variables. * Called on link state changes or on startup. */ private void updateInterfaceState(String iface, boolean up) { if (!mIface.equals(iface)) { return; } if (!mReconnecting) Log.d(TAG, "updateInterface: " + iface + " link " + (up ? "up" : "down")); if (up && mEthernetCurrentState != EthernetManager.ETHER_STATE_DISCONNECTED) { Log.d(TAG, "Already connected or connecting, skip connect"); return; } + + if(up){ + int carrier = getEthernetCarrierState(iface); + Log.d(TAG, "carrier:"+carrier); + if (carrier != 1) { + return; + } + } +
相关文章推荐
- [RK3399][Android7.1.1]Ethernet-网路状态变化时无法更新IP的问题
- CentOS 6.9使用Setup配置网络(解决dhcp模式插入网线不自动获取IP的问题)
- Centos在Vmware中,做Net网络后的联网问题(自动获取可以联网,配置静态IP不可以连接)
- 磊科路由器动态获取IP模式下不显示DNS设置的问题
- android 以太网(ethernet)获取静态信息和动态信息.IP.子网掩码.getaway(以太网 一)
- android 以太网(ethernet)设置静态信息和动态信息.IP.子网掩码.getaway(以太网 二)
- [RK3399][Android7.1] 调试笔记 --- DDR工作频率的获取和设置
- EthernetManager Android 以太网静态IP设置
- 7天hadoop学习(一)之虚拟机的网络连接方式及linux的静态ip设置
- 如何获取Android手机连接当前网络的外网IP
- Linux下设置静态IP和获取动态IP的方法
- [RK3399][Android7.1] 获取gpio函数devm_gpiod_get_optional()
- androidBroadcast Receiver接收不到、静态注册和动态注册发现的问题
- Linux下设置静态IP和获取动态IP的方法
- 请教问题:关于网络--关于一根网线有两个静态IP
- CentOS系统安装完毕后,网络连接方式为NAT,系统无法上网或IP设置成静态后无法上
- ubuntu 设置静态网络ip和动态网络ip
- 树莓派(Debian)系统设置了静态IP之后还会获取动态IP的问题解决(scope global secondary eth0)
- 给在VMWare7上用Host-only方式连接网络的Debian6设置静态IP
- 问题小结(9)-android获取有线网络的ip