From 141623d480fe0a6944e5bfea04a2dd4f78b52f20 Mon Sep 17 00:00:00 2001 From: TK MUN Date: Wed, 23 Feb 2011 18:55:55 +0900 Subject: [PATCH] DO NOT MERGE WiMAX support - In Connectivity service, start WiMAX service - 4G icon display in StatusBarPolicy - Add DHCP renew - Add radio for WiMAX Change-Id: Iffff012b270d80e84ec8fbd4486921a8adb847dd Signed-off-by: TK MUN --- .../java/android/net/ConnectivityManager.java | 4 +- core/java/android/net/NetworkUtils.java | 12 ++ core/jni/android_net_NetUtils.cpp | 32 +++++ .../android/server/ConnectivityService.java | 112 +++++++++++++++++- 4 files changed, 153 insertions(+), 7 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 711c6cd012..cd5ceeb875 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -219,9 +219,9 @@ public class ConnectivityManager /** {@hide} */ public static final int TYPE_ETHERNET = 9; /** {@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. */ - 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; diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index e4f3d5c0f1..81362c9283 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -143,4 +143,16 @@ public class NetworkUtils { } 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); } diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp index feb0dadc15..fe151cdb29 100644 --- a/core/jni/android_net_NetUtils.cpp +++ b/core/jni/android_net_NetUtils.cpp @@ -44,6 +44,15 @@ int dhcp_do_request(const char *ifname, int dhcp_stop(const char *ifname); int dhcp_release_lease(const char *ifname); 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" @@ -212,6 +221,28 @@ static jboolean android_net_utils_configureInterface(JNIEnv* env, 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); +} // ---------------------------------------------------------------------------- /* @@ -233,6 +264,7 @@ static JNINativeMethod gNetworkUtilMethods[] = { { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, { "configureNative", "(Ljava/lang/String;IIIII)Z", (void *)android_net_utils_configureInterface }, { "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) diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 4e5aa334fa..43aa32d114 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -18,16 +18,20 @@ package com.android.server; import android.app.Notification; import android.app.NotificationManager; -import android.content.ContentResolver; import android.content.Context; +import android.content.ContentResolver; +import android.content.ContextWrapper; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; import android.net.ConnectivityManager; import android.net.IConnectivityManager; import android.net.MobileDataStateTracker; import android.net.NetworkInfo; import android.net.NetworkStateTracker; import android.net.wifi.WifiStateTracker; +import android.net.wimax.WimaxManagerConstants; import android.os.Binder; import android.os.Handler; import android.os.IBinder; @@ -40,17 +44,21 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.EventLog; import android.util.Slog; - import com.android.internal.telephony.Phone; - import com.android.server.connectivity.Tethering; - +import dalvik.system.DexClassLoader; import java.io.FileDescriptor; 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.GregorianCalendar; import java.util.List; + + /** * @hide */ @@ -100,7 +108,6 @@ public class ConnectivityService extends IConnectivityManager.Stub { private boolean mTestMode; private static ConnectivityService sServiceInstance; - private static final int ENABLED = 1; private static final int DISABLED = 0; @@ -378,6 +385,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetTrackers[netType].teardown(); } break; + case ConnectivityManager.TYPE_WIMAX: + NetworkStateTracker nst = makeWimaxStateTracker(); + if (nst != null) { + nst.startMonitoring(); + } + mNetTrackers[netType] = nst; + break; default: Slog.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " + mNetAttributes[netType].mRadio); @@ -397,6 +411,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.