[RK3399/RK3328][Android10.0]Ethernet:以太网设置静态ip,重启后无法获取IP的问题「建议收藏」

[RK3399/RK3328][Android10.0]Ethernet:以太网设置静态ip,重启后无法获取IP的问题「建议收藏」测试平台Platform:RK3399/RK3328OS:Android10.0现象设置中设置以太网为静态ip,设置后使用ifconfig查看ip显示正常。然后重启,极大概率出现开机后设备没有获取到ip.分析解决测试后发现了几点规律:设置静态ip会开机获取不到ip,但是设置动态ip无问题没有获取到ip时,使用ifconfig查看,发现网卡设备连接正常。此时拔插网线,或者使用ifconfigeth0down+ifconfigeth0up来开关一次设备后,就能正常获取到ip

大家好,又见面了,我是你们的朋友全栈君。

测试平台

Platform: RK3399/RK3328
OS: Android 10.0

现象

设置中设置以太网为静态ip,设置后使用ifconfig查看ip显示正常。然后重启,极大概率出现开机后设备没有获取到ip.

分析解决

测试后发现了几点规律:

  1. 设置静态ip会开机获取不到ip,但是设置动态ip无问题
  2. 没有获取到ip时,使用ifconfig查看,发现网卡设备连接正常。此时拔插网线,或者使用ifconfig eth0 down + ifconfig eth0 up 来开关一次设备后,就能正常获取到ip

根据测试结果采取了如下的解决方案,在开机的时候在Ethernet服务中进行一次ifconfig eth0 down + ifconfig eth0 up的操作来解决.

修改补丁如下,测试20次后无问题,提交给到客户

diff --git a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
index 308e328..919edc6 100644
--- a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
+++ b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
@@ -252,12 +254,41 @@ final class EthernetTracker { 

}
}
-    private void maybeTrackInterface(String iface) { 

+    private boolean maybeTrackInterface(String iface) { 

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 false;
}
if (mIpConfigForDefaultInterface != null) { 

@@ -266,13 +297,31 @@ final class EthernetTracker { 

}
addInterface(iface);
+        return true;
}
private void trackAvailableInterfaces() { 

try { 

final String[] ifaces = mNMService.listInterfaces();
for (String iface : ifaces) { 

-                maybeTrackInterface(iface);
+               if (maybeTrackInterface(iface)) { 

+                    String mIfaceTmp = iface;
+                    new Thread(new Runnable() { 

+                        public void run() { 

+                            // carrier is always 1 when kernel boot up no matter RJ45 plugin or not,
+                            // 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);

注:其实这是种治标不治本的解决办法,但是由于客户追的比较紧先采取这种解决方案,后续有时间再去查一下根本所在(根据测试log等,我猜想这是个由于加载顺序和获取ip的时机导致的随机问题)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139610.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • 红帽linux修改root密码_deepin修改root密码

    红帽linux修改root密码_deepin修改root密码红旗linux超级管理员root密码恢复
     

     中科红旗redflag-linux6桌面版超级管理员root密码恢复
     1.—-启动电脑,出现linux系统的grut界面时候按“↓”上下方向键
     选择进入到RedFlag(2.66.22.1-9)界面,光标到最后1行
     2.—–BootOptionsroroot=LABEL=/vga=788splash=silent
     然后把它“BootOp

  • 【NVIDIA】Win10 + CUDA10 + cuDNN 安装教程

    【NVIDIA】Win10 + CUDA10 + cuDNN 安装教程目录一、前言二、官方安装教程及软件包1、官方教程2、CUDAToolkit10.0Download3、cuDNNDownload三、Win10安装CUDA10及cuDNN1、CUDA安装2、cuDNN配置3、万事大吉,只欠重启四、一些后事问题1:安装过程中电脑自动重启。问题2:安装完成后找不到CUDA文件夹。一、前言其实听早就接触NV…

  • Redis雪崩效应的解决方案(转)[通俗易懂]

    Redis雪崩效应的解决方案(转)[通俗易懂]1、可以使用分布式锁单机版的话本地锁当突然有大量请求到数据库服务器时候,进行请求限制。使用所的机制,保证只有一个线程(请求)操作。否则进行排队等待(集群分布式锁,单机本地锁)。减少服务器吞吐量,效率低。保证只能有一个线程进入实际上只能有一个请求在执行查询操作也可以在此处进行使用限流的策略~2、缓存标记publicobjectGetProductListNew()…

  • 【Java】Java双端队列Deque使用详解

    【Java】Java双端队列Deque使用详解Deque是一个双端队列接口,继承自Queue接口,它们共同的实现类是LinkedList。Deque的功能很强大:代替普通队列Queue:先进先出、队尾进队头出可以作为双端队列:队尾和队头都可以进出还可以作为堆栈使用:先进后出、只能从一端进出注意:Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。jdk文档中关于Deque的使用介…

  • Spring常见面试题总结(超详细回答)

    Spring常见面试题总结(超详细回答)

  • python京东自动签到领金豆_github京东自动签到

    python京东自动签到领金豆_github京东自动签到一.介绍PhantomJS是一个基于WebKit的JavaScriptAPI,它使用QtWebKit作为它核心浏览器的功能,使用WebKit来编译解释执行JavaScript代码,任何你可以在基于WebKit浏览器做的事情,它都能做到。Selenium是一个用于Web应用自动化程序测试的工具,可以让浏览器自动加载页面,获取需要的数据,Selenium自己不带浏览器,所以需要和PhantomJS、…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号