RK android10 双以太网上层实现

本文档介绍了在Android 10中如何处理双以太网连接,特别是更新 ConnectivityService.java 文件来处理网络状态。内容包括更新网络代理信息、保存和更新双网口的IP、子网掩码、网关和DNS信息,以及添加特定路由的逻辑。

diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java

index f9423db..ce4f253 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java

         // send out another legacy broadcast - currently only used for suspend/unsuspend
         // toggle
         public void update(NetworkAgentInfo nai) {
@@ -3299,6 +3211,9 @@
                             nai.getCurrentScoreAsValidated())) {
                 return false;
             }
+            if(nai.getCurrentScore()>0 && nai.networkInfo.getType()==ConnectivityManager.TYPE_ETHERNET){
+                return false;
+            }
         }
         return true;
     }
@@ -5621,6 +5536,70 @@
         updateUids(nai, null, nai.networkCapabilities);
     }
 
+    private final static String nullIpInfo = "0.0.0.0";
+    private void saveEthernetInformation(LinkProperties mLinkProperties,boolean up) {//分别保存双网口ip地址信息
+       Log.i(TAG, "saveEthernetInformation " + mLinkProperties.getInterfaceName());
+       Log.i(TAG, "saveEthernetInformation up  " +up);
+       if(up){
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".ipaddress",getLinkIpAddress(mLinkProperties));
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".mask",getLinkNetmask(mLinkProperties));
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".gateway",getLinkGateway(mLinkProperties));
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".dns1",getLinkDns(mLinkProperties));
+       }else{
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".ipaddress",null);
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".mask",null);
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".gateway",null);
+          SystemProperties.set("dhcp."+ mLinkProperties.getInterfaceName() +".dns1",null);
+       }
+       Log.i(TAG, "saveEthernetInformation ipaddress  " +SystemProperties.get("dhcp."+ mLinkProperties.getInterfaceName() +".ipaddress")+"  ="+mLinkProperties.getInterfaceName());
+    }
+    private String getLinkIpAddress(LinkProperties mLinkProperties) {
+        for (LinkAddress l : mLinkProperties.getLinkAddresses()) {
+            InetAddress source = l.getAddress();
+            //Log.d(TAG, "getIpAddress: " + source.getHostAddress());
+            if (source instanceof Inet4Address) {
+                return source.getHostAddress();
+            }
+        }
+        return "";
+    }
+    private String getLinkNetmask(LinkProperties mLinkProperties) {
+        for (LinkAddress l : mLinkProperties.getLinkAddresses()) {
+            InetAddress source = l.getAddress();
+            if (source instanceof Inet4Address) {
+                return linkprefix2netmask(l.getPrefixLength());
+            }
+        }
+        return "";
+    }
+    private  String linkprefix2netmask(int prefix) {
+        // convert prefix to netmask
+        if (true) {
+            int mask = 0xFFFFFFFF << (32 - prefix);
+            //Log.d(TAG, "mask = " + mask + " prefix = " + prefix);
+            return ((mask>>>24) & 0xff) + "." + ((mask>>>16) & 0xff) + "." + ((mask>>>8) & 0xff) + "." + ((mask) & 0xff);
+        } else {
+            return NetworkUtils.intToInetAddress(NetworkUtils.prefixLengthToNetmaskInt(prefix)).getHostName();
+        }
+    }
+    private String getLinkGateway(LinkProperties mLinkProperties) {
+        for (RouteInfo route : mLinkProperties.getRoutes()) {
+            if (route.hasGateway()) {
+                 InetAddress gateway = route.getGateway();
+                 if (route.isIPv4Default()) {
+                     return gateway.getHostAddress();
+                 }
+            }
+        }
+        return "";
+    }
+    private String getLinkDns(LinkProperties mLinkProperties) {
+        String dns = "";
+        for (InetAddress nameserver : mLinkProperties.getDnsServers()) {
+            dns += nameserver.getHostAddress();
+        }
+        return dns;
+    }
     private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties newLp,
             LinkProperties oldLp) {
         int netId = networkAgent.network.netId;
@@ -5647,6 +5626,26 @@
 
         updateRoutes(newLp, oldLp, netId);
         updateDnses(newLp, oldLp, netId);

+        saveEthernetInformation(newLp,true);
+
+        int NetworkType = networkAgent.networkInfo.getType();
+        if(NetworkType == ConnectivityManager.TYPE_ETHERNET) {
+             CompareResult<RouteInfo> routeDiff = new CompareResult<RouteInfo>();
+             for (RouteInfo route : newLp.getAllRoutes()) {
+                 if (route.hasGateway()) continue;
+                 if (!(route.getDestination().getAddress() instanceof Inet4Address)) continue;
+                 try {
+                    mNMS.addLegacyRouteForNetId(netId, route, getCallingUid());
+
+                 } catch (Exception e) {
+                    // never crash - catch them all
+                    loge("Exception trying to add a route: " + e);
+                 }
+            }
+        }
         // Make sure LinkProperties represents the latest private DNS status.
         // This does not need to be done before updateDnses because the
         // LinkProperties are not the source of the private DNS configuration.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值