am 141623d4: DO NOT MERGE WiMAX support

* commit '141623d480fe0a6944e5bfea04a2dd4f78b52f20':
  DO NOT MERGE WiMAX support
This commit is contained in:
TK MUN
2011-03-09 22:54:44 -08:00
committed by Android Git Automerger
4 changed files with 153 additions and 7 deletions

View File

@@ -222,9 +222,9 @@ public class ConnectivityManager
/** {@hide} */ /** {@hide} */
public static final int TYPE_ETHERNET = 9; public static final int TYPE_ETHERNET = 9;
/** {@hide} TODO: Need to adjust this for WiMAX. */ /** {@hide} TODO: Need to adjust this for WiMAX. */
public static final int MAX_RADIO_TYPE = TYPE_WIFI; public static final int MAX_RADIO_TYPE = TYPE_ETHERNET;
/** {@hide} TODO: Need to adjust this for WiMAX. */ /** {@hide} TODO: Need to adjust this for WiMAX. */
public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_HIPRI; public static final int MAX_NETWORK_TYPE = TYPE_ETHERNET;
public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;

View File

@@ -209,4 +209,16 @@ public class NetworkUtils {
} }
return result; return result;
} }
/**
* Start the DHCP renew service for wimax,
* This call blocks until it obtains a result (either success
* or failure) from the daemon.
* @param interfaceName the name of the interface to configure
* @param ipInfo if the request succeeds, this object is filled in with
* the IP address information.
* @return {@code true} for success, {@code false} for failure
* {@hide}
*/
public native static boolean runDhcpRenew(String interfaceName, DhcpInfo ipInfo);
} }

View File

@@ -43,6 +43,15 @@ int dhcp_do_request(const char *ifname,
int dhcp_stop(const char *ifname); int dhcp_stop(const char *ifname);
int dhcp_release_lease(const char *ifname); int dhcp_release_lease(const char *ifname);
char *dhcp_get_errmsg(); char *dhcp_get_errmsg();
int dhcp_do_request_renew(const char *ifname,
in_addr_t *ipaddr,
in_addr_t *gateway,
in_addr_t *mask,
in_addr_t *dns1,
in_addr_t *dns2,
in_addr_t *server,
uint32_t *lease);
} }
#define NETUTILS_PKG_NAME "android/net/NetworkUtils" #define NETUTILS_PKG_NAME "android/net/NetworkUtils"
@@ -211,6 +220,28 @@ static jboolean android_net_utils_configureInterface(JNIEnv* env,
return (jboolean)(result == 0); return (jboolean)(result == 0);
} }
static jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
{
int result = -1;
in_addr_t ipaddr, gateway, mask, dns1, dns2, server;
uint32_t lease;
const char *nameStr = env->GetStringUTFChars(ifname, NULL);
result = ::dhcp_do_request_renew(nameStr, &ipaddr, &gateway, &mask,
&dns1, &dns2, &server, &lease);
env->ReleaseStringUTFChars(ifname, nameStr);
if (result == 0 && dhcpInfoFieldIds.dhcpInfoClass != NULL) {
env->SetIntField(info, dhcpInfoFieldIds.ipaddress, ipaddr);
env->SetIntField(info, dhcpInfoFieldIds.gateway, gateway);
env->SetIntField(info, dhcpInfoFieldIds.netmask, mask);
env->SetIntField(info, dhcpInfoFieldIds.dns1, dns1);
env->SetIntField(info, dhcpInfoFieldIds.dns2, dns2);
env->SetIntField(info, dhcpInfoFieldIds.serverAddress, server);
env->SetIntField(info, dhcpInfoFieldIds.leaseDuration, lease);
}
return (jboolean)(result == 0);
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/* /*
@@ -232,6 +263,7 @@ static JNINativeMethod gNetworkUtilMethods[] = {
{ "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease },
{ "configureNative", "(Ljava/lang/String;IIIII)Z", (void *)android_net_utils_configureInterface }, { "configureNative", "(Ljava/lang/String;IIIII)Z", (void *)android_net_utils_configureInterface },
{ "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
{ "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpInfo;)Z", (void *)android_net_utils_runDhcpRenew}
}; };
int register_android_net_NetworkUtils(JNIEnv* env) int register_android_net_NetworkUtils(JNIEnv* env)

View File

@@ -18,10 +18,13 @@ package com.android.server;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.ContentResolver;
import android.content.ContextWrapper;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IConnectivityManager; import android.net.IConnectivityManager;
import android.net.MobileDataStateTracker; import android.net.MobileDataStateTracker;
@@ -29,6 +32,7 @@ import android.net.NetworkInfo;
import android.net.NetworkStateTracker; import android.net.NetworkStateTracker;
import android.net.NetworkUtils; import android.net.NetworkUtils;
import android.net.wifi.WifiStateTracker; import android.net.wifi.WifiStateTracker;
import android.net.wimax.WimaxManagerConstants;
import android.os.Binder; import android.os.Binder;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
@@ -41,19 +45,23 @@ import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.EventLog; import android.util.EventLog;
import android.util.Slog; import android.util.Slog;
import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone;
import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Tethering;
import dalvik.system.DexClassLoader;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.List; import java.util.List;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
/** /**
* @hide * @hide
*/ */
@@ -103,7 +111,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private boolean mTestMode; private boolean mTestMode;
private static ConnectivityService sServiceInstance; private static ConnectivityService sServiceInstance;
private static final int ENABLED = 1; private static final int ENABLED = 1;
private static final int DISABLED = 0; private static final int DISABLED = 0;
@@ -381,6 +388,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mNetTrackers[netType].teardown(); mNetTrackers[netType].teardown();
} }
break; break;
case ConnectivityManager.TYPE_WIMAX:
NetworkStateTracker nst = makeWimaxStateTracker();
if (nst != null) {
nst.startMonitoring();
}
mNetTrackers[netType] = nst;
break;
default: default:
Slog.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " + Slog.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " +
mNetAttributes[netType].mRadio); mNetAttributes[netType].mRadio);
@@ -400,6 +414,94 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
} }
private NetworkStateTracker makeWimaxStateTracker() {
//Initialize Wimax
DexClassLoader wimaxClassLoader;
Class wimaxStateTrackerClass = null;
Class wimaxServiceClass = null;
Class wimaxManagerClass;
String wimaxJarLocation;
String wimaxLibLocation;
String wimaxManagerClassName;
String wimaxServiceClassName;
String wimaxStateTrackerClassName;
NetworkStateTracker wimaxStateTracker = null;
boolean isWimaxEnabled = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_wimaxEnabled);
if (isWimaxEnabled) {
try {
wimaxJarLocation = mContext.getResources().getString(
com.android.internal.R.string.config_wimaxServiceJarLocation);
wimaxLibLocation = mContext.getResources().getString(
com.android.internal.R.string.config_wimaxNativeLibLocation);
wimaxManagerClassName = mContext.getResources().getString(
com.android.internal.R.string.config_wimaxManagerClassname);
wimaxServiceClassName = mContext.getResources().getString(
com.android.internal.R.string.config_wimaxServiceClassname);
wimaxStateTrackerClassName = mContext.getResources().getString(
com.android.internal.R.string.config_wimaxStateTrackerClassname);
wimaxClassLoader = new DexClassLoader(wimaxJarLocation,
new ContextWrapper(mContext).getCacheDir().getAbsolutePath(),
wimaxLibLocation,ClassLoader.getSystemClassLoader());
try {
wimaxManagerClass = wimaxClassLoader.loadClass(wimaxManagerClassName);
wimaxStateTrackerClass = wimaxClassLoader.loadClass(wimaxStateTrackerClassName);
wimaxServiceClass = wimaxClassLoader.loadClass(wimaxServiceClassName);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return null;
}
} catch(Resources.NotFoundException ex) {
Slog.e(TAG, "Wimax Resources does not exist!!! ");
return null;
}
try {
Slog.v(TAG, "Starting Wimax Service... ");
Constructor wmxStTrkrConst = wimaxStateTrackerClass.getConstructor
(new Class[] {Context.class,Handler.class});
wimaxStateTracker = (NetworkStateTracker)wmxStTrkrConst.newInstance(mContext,mHandler);
Constructor wmxSrvConst = wimaxServiceClass.getDeclaredConstructor
(new Class[] {Context.class,wimaxStateTrackerClass});
wmxSrvConst.setAccessible(true);
IBinder svcInvoker = (IBinder) wmxSrvConst.newInstance(mContext,wimaxStateTracker);
wmxSrvConst.setAccessible(false);
ServiceManager.addService(WimaxManagerConstants.WIMAX_SERVICE, svcInvoker);
} catch(ClassCastException ex) {
ex.printStackTrace();
return null;
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
return null;
} catch (InstantiationException ex) {
ex.printStackTrace();
return null;
} catch(IllegalAccessException ex) {
ex.printStackTrace();
return null;
} catch(InvocationTargetException ex) {
ex.printStackTrace();
return null;
} catch(Exception ex) {
ex.printStackTrace();
return null;
}
} else {
Slog.e(TAG, "Wimax is not enabled or not added to the network attributes!!! ");
return null;
}
return wimaxStateTracker;
}
/** /**
* Sets the preferred network. * Sets the preferred network.