Separate NAT from forwarding.
Bug: 19500693 Change-Id: I39878644e21d51def1c31d1857e815f473ef0938
This commit is contained in:
@@ -177,6 +177,18 @@ interface INetworkManagementService
|
|||||||
*/
|
*/
|
||||||
String[] getDnsForwarders();
|
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.
|
* Enables Network Address Translation between two interfaces.
|
||||||
* The address and netmask of the external interface is used for
|
* The address and netmask of the external interface is used for
|
||||||
|
|||||||
@@ -1259,6 +1259,27 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
|||||||
return filtered;
|
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)
|
private void modifyNat(String action, String internalInterface, String externalInterface)
|
||||||
throws SocketException {
|
throws SocketException {
|
||||||
final Command cmd = new Command("nat", action, internalInterface, externalInterface);
|
final Command cmd = new Command("nat", action, internalInterface, externalInterface);
|
||||||
|
|||||||
@@ -980,6 +980,12 @@ public class Tethering extends BaseNetworkObserver {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (VDBG) Log.e(TAG, "Exception in forceUpdate: " + e.toString());
|
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 {
|
try {
|
||||||
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
|
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -1033,8 +1039,13 @@ public class Tethering extends BaseNetworkObserver {
|
|||||||
if (newUpstreamIfaceName != null) {
|
if (newUpstreamIfaceName != null) {
|
||||||
try {
|
try {
|
||||||
mNMService.enableNat(mIfaceName, newUpstreamIfaceName);
|
mNMService.enableNat(mIfaceName, newUpstreamIfaceName);
|
||||||
|
mNMService.startInterfaceForwarding(mIfaceName,
|
||||||
|
newUpstreamIfaceName);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(TAG, "Exception enabling Nat: " + e.toString());
|
Log.e(TAG, "Exception enabling Nat: " + e.toString());
|
||||||
|
try {
|
||||||
|
mNMService.disableNat(mIfaceName, newUpstreamIfaceName);
|
||||||
|
} catch (Exception ee) {}
|
||||||
try {
|
try {
|
||||||
mNMService.untetherInterface(mIfaceName);
|
mNMService.untetherInterface(mIfaceName);
|
||||||
} catch (Exception ee) {}
|
} catch (Exception ee) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user