动态修改usb共享网络的ip、网关

例如修改usb共享时usb0网卡的ip,掩码以及网关,为 10.10.1.1/24,网关10.10.1.10。ue作为server端dhcp给pc分配ip后,pc共享上网.

1、IpServer.java

代码路径 packages/modules/Connectivity/Tethering/src/android/net/ip/IpServer.java

代码修改

--- a/Tethering/src/android/net/ip/IpServer.java
+++ b/Tethering/src/android/net/ip/IpServer.java
@@ -74,6 +74,7 @@
 
 import java.net.Inet4Address;
 import java.net.Inet6Address;
+import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -83,6 +84,7 @@
 import java.util.Objects;
 import java.util.Random;
 import java.util.Set;
 
 /**
  * Provides the interface to IP-layer serving functionality for a given network
@@ -111,6 +113,10 @@
 
     // TODO: have PanService use some visible version of this constant
     private static final String BLUETOOTH_IFACE_ADDR = "192.168.44.1/24";
+    // TODO: add for customer request
+    public static final boolean Customer_Configure_Ip = true;
+    public static final String CUSTOMER_IFACE_ADDR = "10.10.1.1/24";
+    public static final String CUSTOMER_GATEWAY = "10.10.1.10";
 
     // TODO: have this configurable
     private static final int DHCP_LEASE_TIME_SECS = 3600;
@@ -519,6 +525,15 @@
 
     private RouteInfo getDirectConnectedRoute(@NonNull final LinkAddress ipv4Address) {
         Objects.requireNonNull(ipv4Address);
+        if (Customer_Configure_Ip) {
+            try{
+            InetAddress maddress = InetAddress.getByName(CUSTOMER_GATEWAY);
+            mLog.e("maddress gateway is " + maddress.toString());
+            return new RouteInfo(PrefixUtils.asIpPrefix(ipv4Address), maddress, mIfaceName, RTN_UNICAST);
+            } catch (UnknownHostException e){
+                e.printStackTrace();
+            }
+        }
         return new RouteInfo(PrefixUtils.asIpPrefix(ipv4Address), null, mIfaceName, RTN_UNICAST);
     }
 
@@ -608,6 +623,7 @@
 
         if (enabled) {
             mIpv4Address = requestIpv4Address(true /* useLastAddress */);
+            mLog.e("mIpv4Address is " + mIpv4Address.toString());
         }
 
         if (mIpv4Address == null) {
@@ -645,6 +661,7 @@
         if (enabled) {
             mLinkProperties.addLinkAddress(mIpv4Address);
             mLinkProperties.addRoute(getDirectConnectedRoute(mIpv4Address));
+            mLog.e("mLinkProperties is " + mLinkProperties.toString());
         } else {
             mLinkProperties.removeLinkAddress(mIpv4Address);
             mLinkProperties.removeRoute(getDirectConnectedRoute(mIpv4Address));
@@ -658,6 +675,9 @@
         if (mInterfaceType == TetheringManager.TETHERING_BLUETOOTH) {
             return new LinkAddress(BLUETOOTH_IFACE_ADDR);
         }
+        if (Customer_Configure_Ip) {
+            return new LinkAddress(CUSTOMER_IFACE_ADDR);
+        }
 
         return mPrivateAddressCoordinator.requestDownstreamAddress(this, useLastAddress);
     }

2、修改Android.dp

代码路径

android.bp位于
vendor\sprd\platform\frameworks\base
vendor\sprd\platform\frameworks\base\services

代码修改

--- a/Android.bp
+++ b/Android.bp
@@ -61,6 +61,7 @@
         "radio_interactor_common",
         "unsupportedappusage",
         "ims-common",
+        "TetheringApiCurrentLib",
     ],
 
     //system_ext_specific: true,
diff --git a/services/Android.bp b/services/Android.bp
old mode 100644
new mode 100755
index 82640f3..58f6b19
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -22,6 +22,7 @@
     static_libs: [
         "oemnetd_aidl_interface-java",
         "unisoc_service-wifi",
+        "TetheringApiCurrentLib",
     ],

3、NetworkAdapterService.java

--- a/services/core/java/com/android/server/NetworkAdapterService.java
+++ b/services/core/java/com/android/server/NetworkAdapterService.java
@@ -94,6 +94,7 @@
 import static android.net.ConnectivityManager.TYPE_MOBILE;
 import static android.net.ConnectivityManager.TYPE_WIFI;
 import java.util.concurrent.TimeUnit;
+import android.net.ip.IpServer;
 
 
 
@@ -121,7 +122,7 @@
     protected Thread mSrvReceiverThread;
     protected DaemonSrvReceiver mSrvDaemonReceiver;
     protected HandlerThread mHandlerThread;
-    private final TelephonyManager mTelephonyManager;
+    private final TelephonyManager mTelephonyManager;
 
     private final Object mDaemonLock = new Object();
 
@@ -851,6 +852,18 @@
         @Override
         public void addressUpdated(String iface, LinkAddress address) {
             Log.d(TAG, "addressUpdated interface: " + iface + ", LinkAddress: " + address);
+            Log.d(TAG, "addressUpdated interface: Customer_Configure_Ip " + IpServer.Customer_Configure_Ip);
+            if(IpServer.Customer_Configure_Ip && iface.contains("usb") && address.isIpv4()) {
+                      Log.d(TAG, "add customer configure gateway in usb tethering: " + IpServer.CUSTOMER_GATEWAY);
+                      try {
+                          String routeCmd = "ip route add default via " + IpServer.CUSTOMER_GATEWAY + " dev " + iface;
+                          if(iface.contains("usb0")) {
+                              mOemNetd.runCmds(routeCmd);
+                          }
+                      } catch (Exception e) {
+                          Log.e(TAG, "Configure Gateway Exception: " + e);
+                      }
+                  }
             if(!TextUtils.isEmpty(getVpnInterface()) && iface.contains("p2p-wlan") && address.isIpv4()) {
                 Network Network = null;
                 try {
@@ -886,6 +899,18 @@
         @Override
         public void addressRemoved(String iface, LinkAddress address) {
             Log.d(TAG, "addressRemoved interface: " + iface + ", LinkAddress: " + address);
+            Log.d(TAG, "addressRemoved interface: Customer_Configure_Ip " + IpServer.Customer_Configure_Ip);
+            if(IpServer.Customer_Configure_Ip && iface.contains("usb") && address.isIpv4()) {
+                      Log.d(TAG, "del customer configure gateway in usb tethering: " + IpServer.CUSTOMER_GATEWAY);
+                      try {
+                          String routeCmd = "ip route del default via " + IpServer.CUSTOMER_GATEWAY + " dev " + iface;
+                          if(iface.contains("usb0")) {
+                              mOemNetd.runCmds(routeCmd);
+                          }
+                      } catch (Exception e) {
+                          Log.e(TAG, "Configure Gateway Exception: " + e);
+                      }
+                  }
             if(!TextUtils.isEmpty(getVpnInterface()) && iface.contains("p2p-wlan") && address.isIpv4()) {
                 Network Network = null;
                 try {

你可能感兴趣的:(Android源码,网络,tcp/ip,网络协议)