rk3568双以太网共存问题

硬件上使用 eth0(RK3568 GMAC) + eth1(PCIe转以太网,RTL8111)

eth0部分dts配置:

&gmac1 {
    phy-mode = "rgmii";
    clock_in_out = "output";

    snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
    snps,reset-active-low;
    /* Reset time is 20ms, 100ms for rtl8211f */
    snps,reset-delays-us = <0 20000 100000>;

    assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
    assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>;
    assigned-clock-rates = <0>, <125000000>;

    pinctrl-names = "default";
    pinctrl-0 = <&gmac1m1_miim
             &gmac1m1_tx_bus2
             &gmac1m1_rx_bus2
             &gmac1m1_rgmii_clk
             &gmac1m1_rgmii_bus>;

    tx_delay = <0x2f>;
    rx_delay = <0x22>;

    phy-handle = <&rgmii_phy1>;
    status = "okay";
};

&mdio1 {
    rgmii_phy1: phy@1 {
        compatible = "ethernet-phy-ieee802.3-c22";
        reg = <0x1>;
    };
};
eth1部分见:https://www.cnblogs.com/wmc245376374/p/19689062

 

目前单独的功能都已经正常,就是双以太网共存还有问题。

网络共存,需要加上以下补丁:

frameworks/base
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 9014e2398250..473a8bbe680f 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -266,8 +266,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
     private static final String REQUEST_ARG = "requests";
 
     private static final boolean DBG = true;
-    private static final boolean DDBG = Log.isLoggable(TAG, Log.DEBUG);
-    private static final boolean VDBG = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final boolean DDBG = true;//Log.isLoggable(TAG, Log.DEBUG);
+    private static final boolean VDBG = true;//Log.isLoggable(TAG, Log.VERBOSE);
 
     private static final boolean LOGD_BLOCKED_NETWORKINFO = true;
 
@@ -1234,7 +1234,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
         handleAlwaysOnNetworkRequest(
                 mDefaultMobileDataRequest,Settings.Global.MOBILE_DATA_ALWAYS_ON, true);
         handleAlwaysOnNetworkRequest(mDefaultWifiRequest, Settings.Global.WIFI_ALWAYS_REQUESTED,
-                false);
+                true);
     }
 
     private void registerSettingsCallbacks() {
@@ -3248,7 +3248,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
         // 2. If the network was lingering and there are now requests, unlinger it.
         // 3. If this network is unneeded (which implies it is not lingering), and there is at least
         //    one lingered request, start lingering.
-        nai.updateLingerTimer();
+    /*     nai.updateLingerTimer();
         if (nai.isLingering() && nai.numForegroundNetworkRequests() > 0) {
             if (DBG) log("Unlingering " + nai.toShortString());
             nai.unlinger();
@@ -3261,7 +3261,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
             nai.linger();
             logNetworkEvent(nai, NetworkEvent.NETWORK_LINGER);
             return true;
-        }
+        }*/
         return false;
     }
 
@@ -6695,7 +6695,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
     }
 
     private void teardownUnneededNetwork(NetworkAgentInfo nai) {
-        if (nai.numRequestNetworkRequests() != 0) {
+    /*     if (nai.numRequestNetworkRequests() != 0) {
             for (int i = 0; i < nai.numNetworkRequests(); i++) {
                 NetworkRequest nr = nai.requestAt(i);
                 // Ignore listening requests.
@@ -6705,6 +6705,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
             }
         }
         nai.asyncChannel.disconnect();
+    */
+    loge("hcq skip teardownUnneededNetwork: " + nai.network());
     }
 
     private void handleLingerComplete(NetworkAgentInfo oldNetwork) {

 

 

system/netd

diff --git a/server/RouteController.cpp b/server/RouteController.cpp
index 3ea57663..d33fc3e7 100644
--- a/server/RouteController.cpp
+++ b/server/RouteController.cpp
@@ -69,7 +69,7 @@ const uint32_t RULE_PRIORITY_IMPLICIT_NETWORK    = 19000;
 const uint32_t RULE_PRIORITY_BYPASSABLE_VPN      = 20000;
 const uint32_t RULE_PRIORITY_VPN_FALLTHROUGH     = 21000;
 const uint32_t RULE_PRIORITY_DEFAULT_NETWORK     = 22000;
-const uint32_t RULE_PRIORITY_DIRECTLY_CONNECTED  = 23000;
+const uint32_t RULE_PRIORITY_DIRECTLY_CONNECTED  = 9999;
 const uint32_t RULE_PRIORITY_UNREACHABLE         = 32000;
 
 const uint32_t ROUTE_TABLE_LOCAL_NETWORK  = 97;
@@ -746,7 +746,7 @@ int RouteController::configureDummyNetwork() {
     mask.netId = FWMARK_NET_ID_MASK;
 
     return modifyIpRule(RTM_NEWRULE, RULE_PRIORITY_DIRECTLY_CONNECTED, RT_TABLE_MAIN,
-                        fwmark.intValue, mask.intValue, IIF_NONE, OIF_NONE, UID_ROOT, UID_ROOT);
+                        fwmark.intValue, mask.intValue/*, IIF_NONE, OIF_NONE, UID_ROOT, UID_ROOT*/);
 }
 
 // Add an explicit unreachable rule close to the end of the prioriy list to make it clear that

 

2.加上以上补丁,发现偶发性外网eth1不能正常上网。需要加上eth1优先级更高来解决这个问题:

diff --git a/java/com/android/server/ethernet/EthernetNetworkFactory.java b/java/com/android/server/ethernet/EthernetNetworkFactory.java
index 1b0eb38..bad22b6 100644
--- a/java/com/android/server/ethernet/EthernetNetworkFactory.java
+++ b/java/com/android/server/ethernet/EthernetNetworkFactory.java
@@ -527,6 +527,19 @@ public class EthernetNetworkFactory extends NetworkFactory {
                 return 0;
             }

+
+            if (name.equals("eth1")) {
+                return 100;
+            }
+
             int[] transportTypes = mCapabilities.getTransportTypes();
             if (transportTypes.length < 1) {

 

3.加了第二点,发现(3588Linux端)<--------------->(3568Android端)可以互ping成功,3568外网eth1也都能正常,但是两边tcp却不能正常通信。

查看路由

image

 这是deepseek回复的答案:

image

 需要添加这两条指令:

ip rule add to 192.168.2.0/24 lookup eth0 priority 1000
ip rule add from 192.168.2.0/24 lookup eth0 priority 1001

我们在开机中启动脚本实现:

index 6b8f9ec2..d185a1be 100755
--- a/init.rk30board.rc
+++ b/init.rk30board.rc
@@ -125,6 +125,17 @@ on boot
     # backlight
     chown system system /sys/class/backlight/rk28_bl/brightness
     chown system system /sys/class/backlight/backlight/brightness
     
     # for hdmi
     chown root system /sys/class/display/HDMI/enable
@@ -318,6 +329,18 @@ service rk_store_keybox /vendor/bin/rk_store_keybox
     class main
     oneshot            
 
+on property:sys.boot_completed=1
+    start eth0_rule
+
+service eth0_rule /system/bin/sh /vendor/bin/set_eth0_rule.sh
+    class main
+    user root
+    group root
+    oneshot
+    disabled
+    seclabel u:r:init:s0
+
+

 

wangmc@rk3588:/data/wangmc/rockchip-rebot/rk3568-android11.0-rebot/device/rockchip/common$ git diff device.mk
diff --git a/device.mk b/device.mk
index e4666e93..f2296076 100644
--- a/device.mk
+++ b/device.mk
@@ -120,6 +120,9 @@ PRODUCT_COPY_FILES += \
     $(call find-copy-subdir-files,*,vendor/rockchip/common/wifi/firmware,$(PRODUCT_OUT)/$(TARGET_COPY_OUT_RECOVERY)/root/vendor/etc/firmware)
 endif
 
+PRODUCT_COPY_FILES += \
+    device/rockchip/common/set_eth0_rule.sh:$(TARGET_COPY_OUT_VENDOR)/bin/set_eth0_rule.sh
+

 

set_eth0_rule.sh
#!/vendor/bin/sh

# 等待以太网接口就绪
while [ ! -d /sys/class/net/eth0 ]; do
    sleep 1
done

ip rule add to 192.168.2.0/24 lookup eth0 priority 1000
ip rule add from 192.168.2.0/24 lookup eth0 priority 1001

tcp测试方法: 

tcp测试:
3588端服务器:nc -l -k -p 8888
3568端客户端:nc 192.168.2.1 8888
在 rk3568 连接成功后:
•
在 Android 终端输入文字,应在 rk3588 的 nc 终端显示
•
在 rk3588 的 nc 终端输入文字,应在 Android 终端显示

5c869f82348d52d9ce5c268d0b764e32

 

 

在以上的基础上,还要实现不连外部以太网的情况下,也要保证WiFi或者4G能正常使用。

这就意味着网络优先级需要更改,eth1>wifi>4G>eth0,内部以太网优先级最低。并且能实现网络共存。

优先级修改:

--- a/java/com/android/server/ethernet/EthernetNetworkFactory.java
+++ b/java/com/android/server/ethernet/EthernetNetworkFactory.java
@@ -77,7 +77,7 @@ public class EthernetNetworkFactory extends NetworkFactory {
     private final static String TAG = EthernetNetworkFactory.class.getSimpleName();
     final static boolean DBG = true;
 
-    private final static int NETWORK_SCORE = 70;
+    private final static int NETWORK_SCORE = 30;
     private static final String NETWORK_TYPE = "Ethernet";
 
     private final ConcurrentHashMap<String, NetworkInterfaceState> mTrackingInterfaces =
@@ -396,7 +396,7 @@ public class EthernetNetworkFactory extends NetworkFactory {
                     new TransportInfo(ConnectivityManager.TYPE_NONE, 1));
             // EthernetNetworkFactory.NETWORK_SCORE
             sTransports.put(NetworkCapabilities.TRANSPORT_ETHERNET,
-                    new TransportInfo(ConnectivityManager.TYPE_ETHERNET, 70));
+                    new TransportInfo(ConnectivityManager.TYPE_ETHERNET, 30));
             // BluetoothTetheringNetworkFactory.NETWORK_SCORE
             sTransports.put(NetworkCapabilities.TRANSPORT_BLUETOOTH,
                     new TransportInfo(ConnectivityManager.TYPE_BLUETOOTH, 69));

@@ -535,7 +539,8 @@ public class EthernetNetworkFactory extends NetworkFactory {
             }
             TransportInfo transportInfo = sTransports.get(transportTypes[0], /* if dne */ null);
             if (transportInfo != null) {
-                return transportInfo.mScore;
+                // return transportInfo.mScore;
+                return NETWORK_SCORE;
             }
             return 0;
         }

现在就实现各个网络分值如下:

外网eth1:100

WiFi:60

SIM卡网络:50

内网eth0:30

还要实现网络共存,不然会出现打开WiFi,eth0会没有ip问题。

frameworks/libs/net

diff --git a/common/src_servicescommon/android/net/NetworkFactory.java b/common/src_servicescommon/android/net/NetworkFactory.java
index 55edd29..020b043 100644
--- a/common/src_servicescommon/android/net/NetworkFactory.java
+++ b/common/src_servicescommon/android/net/NetworkFactory.java
@@ -295,7 +295,7 @@ public class NetworkFactory extends Handler {
             // If the score of this request is higher or equal to that of this factory and some
             // other factory is responsible for it, then this factory should not track the request
             // because it has no hope of satisfying it.
-            && (n.score < mScore || n.providerId == mProvider.getProviderId())
+            // && (n.score < mScore || n.providerId == mProvider.getProviderId())
             // If this factory can't satisfy the capability needs of this request, then it
             // should not be tracked.
             && n.request.canBeSatisfiedBy(mCapabilityFilter)
@@ -313,8 +313,8 @@ public class NetworkFactory extends Handler {
             //   assigned to the factory
             // - This factory can't satisfy the capability needs of the request
             // - The concrete implementation of the factory rejects the request
-            && ((n.score > mScore && n.providerId != mProvider.getProviderId())
-                    || !n.request.canBeSatisfiedBy(mCapabilityFilter)
+            && (//(n.score > mScore && n.providerId != mProvider.getProviderId())
+                    !n.request.canBeSatisfiedBy(mCapabilityFilter)
                     || !acceptRequest(n.request, n.score));
     }

 

posted @ 2025-10-21 09:53  M-kobe  阅读(49)  评论(0)    收藏  举报