am "Separate NAT from forwarding."

merged from goog/mirror-m-wireless-internal-release
35e36db Separate NAT from forwarding.
This commit is contained in:
Vinit Deshpande
2015-03-15 13:40:20 -07:00
3 changed files with 44 additions and 0 deletions

View File

@@ -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

View File

@@ -1293,6 +1293,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);

View File

@@ -978,6 +978,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) {
@@ -1031,8 +1037,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) {}