问题背景:
Android10,MTK平台,AOSP 9638方案,在连接了Ethernet手动设置IP信息,断电上电重启TV设备后,以太网回连失败,ip信息为空问题,但拔插网线或者串口执行ifconfig eth0 down 、 ifconfig eth0 up可恢复正常。
解决方案:
首先在EthernetTracker.java中更改maybeTrackInterface()方法的类型,然后启动一个工作线程,判断当前以太网接口是否处于活动状态,即读取sys/class/net/eth0/carrier的值,如果为1则为活动状态,读取文件内容并返回连接状态true,否则会记录错误并返回 false,最后执行updateInterfaceState(mIfaceTmp, false); 和 updateInterfaceState(mIfaceTmp, true); 以此重启网络接口,相当于串口执行ifconfig eth0 down 、 ifconfig eth0 up 的效果。
代码对策:
--- a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
+++ b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
@@ -45,6 +45,10 @@ import java.net.InetAddress;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
/**
* Tracks Ethernet interfaces and manages interface configurations.
*
@@ -236,12 +240,15 @@ final class EthernetTracker {
}
}
- private void maybeTrackInterface(String iface) {
+ //private void maybeTrackInterface(String iface) {
+ private boolean maybeTrackInterface(String iface) {
+ Log.d("zxx","11111");
if (DBG) Log.i(TAG, "maybeTrackInterface " + iface);
// If we don't already track this interface, and if this interface matches
// our regex, start tracking it.
if (!iface.matches(mIfaceMatch) || mFactory.hasInterface(iface)) {
- return;
+ //return;
+ return false;
}
if (mIpConfigForDefaultInterface != null) {
@@ -250,18 +257,58 @@ final class EthernetTracker {
}
addInterface(iface);
+ return true;
}
private void trackAvailableInterfaces() {
try {
final String[] ifaces = mNMService.listInterfaces();
for (String iface : ifaces) {
- maybeTrackInterface(iface);
+ //maybeTrackInterface(iface);
+ if (maybeTrackInterface(iface)) {
+ String mIfaceTmp = iface;
+ new Thread(new Runnable() {
+ public void run() {
+ //carrier is always 1 when kernel boot up,
+ // sleep a little time to wait kernel's correct carrier status
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException ignore) {
+ }
+ if(isEthernetInterfaceActive()){
+ IpConfiguration config = getIpConfiguration(mIfaceTmp);
+ if(config != null && IpAssignment.STATIC == config.getIpAssignment())
+ {
+ updateInterfaceState(mIfaceTmp, false);
+ updateInterfaceState(mIfaceTmp, true);
+ }
+ }else{
+ updateInterfaceState(mIfaceTmp, false);
+ }
+ }
+ }).start();
+ break;
+ }
}
} catch (RemoteException | IllegalStateException e) {
Log.e(TAG, "Could not get list of interfaces " + e);
}
}
+
+ private boolean isEthernetInterfaceActive() {
+ String ifaceName = "eth0"; //check carrier status;ifaceName depond on actual situation
+ try {
+ String carrierFilePath = "/sys/class/net/" + ifaceName + "/carrier";
+ BufferedReader reader = new BufferedReader(new FileReader(carrierFilePath));
+ String carrierStatus = reader.readLine();
+ reader.close();
+ return "1".equals(carrierStatus);
+ } catch (IOException e) {
+ Log.e(TAG, "Could not read carrier status for interface " + ifaceName, e);
+ return false;
+ }
+ }
+
private class InterfaceObserver extends BaseNetworkObserver {