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>; }; };
目前单独的功能都已经正常,就是双以太网共存还有问题。
网络共存,需要加上以下补丁:
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却不能正常通信。
查看路由

这是deepseek回复的答案:

需要添加这两条指令:
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 终端显示

在以上的基础上,还要实现不连外部以太网的情况下,也要保证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)); }

浙公网安备 33010602011771号