Separate NAT from forwarding.
Bug: 19500693 Change-Id: I39878644e21d51def1c31d1857e815f473ef0938
This commit is contained in:
@@ -177,6 +177,18 @@ interface INetworkManagementService
|
||||
*/
|
||||
String[] getDnsForwarders();
|
||||
|
||||
/**
|
||||
* Enables unidirectional packet forwarding from {@code fromIface} to
|
||||
* {@code toIface}.
|
||||
*/
|
||||
void startInterfaceForwarding(String fromIface, String toIface);
|
||||
|
||||
/**
|
||||
* Disables unidirectional packet forwarding from {@code fromIface} to
|
||||
* {@code toIface}.
|
||||
*/
|
||||
void stopInterfaceForwarding(String fromIface, String toIface);
|
||||
|
||||
/**
|
||||
* Enables Network Address Translation between two interfaces.
|
||||
* The address and netmask of the external interface is used for
|
||||
|
||||
@@ -1259,6 +1259,27 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
return filtered;
|
||||
}
|
||||
|
||||
private void modifyInterfaceForward(boolean add, String fromIface, String toIface) {
|
||||
final Command cmd = new Command("ipfwd", add ? "add" : "remove", fromIface, toIface);
|
||||
try {
|
||||
mConnector.execute(cmd);
|
||||
} catch (NativeDaemonConnectorException e) {
|
||||
throw e.rethrowAsParcelableException();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startInterfaceForwarding(String fromIface, String toIface) {
|
||||
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
|
||||
modifyInterfaceForward(true, fromIface, toIface);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopInterfaceForwarding(String fromIface, String toIface) {
|
||||
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
|
||||
modifyInterfaceForward(false, fromIface, toIface);
|
||||
}
|
||||
|
||||
private void modifyNat(String action, String internalInterface, String externalInterface)
|
||||
throws SocketException {
|
||||
final Command cmd = new Command("nat", action, internalInterface, externalInterface);
|
||||
|
||||
@@ -980,6 +980,12 @@ public class Tethering extends BaseNetworkObserver {
|
||||
} catch (Exception e) {
|
||||
if (VDBG) Log.e(TAG, "Exception in forceUpdate: " + e.toString());
|
||||
}
|
||||
try {
|
||||
mNMService.stopInterfaceForwarding(mIfaceName, mMyUpstreamIfaceName);
|
||||
} catch (Exception e) {
|
||||
if (VDBG) Log.e(
|
||||
TAG, "Exception in removeInterfaceForward: " + e.toString());
|
||||
}
|
||||
try {
|
||||
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
|
||||
} catch (Exception e) {
|
||||
@@ -1033,8 +1039,13 @@ public class Tethering extends BaseNetworkObserver {
|
||||
if (newUpstreamIfaceName != null) {
|
||||
try {
|
||||
mNMService.enableNat(mIfaceName, newUpstreamIfaceName);
|
||||
mNMService.startInterfaceForwarding(mIfaceName,
|
||||
newUpstreamIfaceName);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Exception enabling Nat: " + e.toString());
|
||||
try {
|
||||
mNMService.disableNat(mIfaceName, newUpstreamIfaceName);
|
||||
} catch (Exception ee) {}
|
||||
try {
|
||||
mNMService.untetherInterface(mIfaceName);
|
||||
} catch (Exception ee) {}
|
||||
|
||||
Reference in New Issue
Block a user