From e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Fri, 18 Mar 2016 12:11:57 -0400 Subject: Move ApfFilter from ConnectivityService to IpManager There's a few advantages to having ApfFilter in IpManager: 1. If things go wrong, crashing a particular transport is less bad then crashing ConnectivityService. We also don't want to use ConnectivityService as a dumping ground for transport-specific logic. 2. This makes implementing WifiManager.MulticastLock a lot simpler and safer because enabling/disabling it doesn't have to go through the NetworkAgent, which could risk various races (e.g. installing a filter into the wrong WiFi network). 3. IpManager is the ultimate source for LinkProperties for a particular transport and since ApfFilter uses the LinkProperties it's better to have it closely paired with the IpManager. Likewise, ApfFilter needs to know the APF capabilities of the transport, so having it in the transport avoids having to parcel this information through the NetworkAgent. Bug: 26238573 Change-Id: I99b85f2b64972f0e7572170ec5d1926081aa3429 --- .../java/com/android/server/wifi/WifiNative.java | 19 +++--------- .../com/android/server/wifi/WifiStateMachine.java | 36 +++++++++++++--------- service/jni/com_android_server_wifi_WifiNative.cpp | 29 ++++++++++++----- 3 files changed, 47 insertions(+), 37 deletions(-) (limited to 'service') diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java index dc8447355..e520a024b 100644 --- a/service/java/com/android/server/wifi/WifiNative.java +++ b/service/java/com/android/server/wifi/WifiNative.java @@ -23,6 +23,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.net.apf.ApfCapabilities; import android.net.wifi.RttManager; import android.net.wifi.RttManager.ResponderConfig; import android.net.wifi.ScanResult; @@ -2497,23 +2498,11 @@ public class WifiNative { } } - public static final class PacketFilterCapabilities { - /** - * Version of APF instruction set supported for packet filtering. 0 indicates no support for - * packet filtering using APF programs. - */ - public int apfVersionSupported; - - /** - * Maximum size of APF program allowed. - */ - public int maximumApfProgramSize; - } - private static native PacketFilterCapabilities getPacketFilterCapabilitiesNative(int iface); - public PacketFilterCapabilities getPacketFilterCapabilities() { + private static native ApfCapabilities getApfCapabilitiesNative(int iface); + public ApfCapabilities getApfCapabilities() { synchronized (sLock) { if (isHalStarted()) { - return getPacketFilterCapabilitiesNative(sWlan0Index); + return getApfCapabilitiesNative(sWlan0Index); } else { return null; } diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 3cd2378ba..a9445cc07 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -889,6 +889,9 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven static final int CMD_IPV4_PROVISIONING_SUCCESS = BASE + 200; static final int CMD_IPV4_PROVISIONING_FAILURE = BASE + 201; + /* Push a new APF program to the HAL */ + static final int CMD_INSTALL_PACKET_FILTER = BASE + 202; + // For message logging. private static final Class[] sMessageClasses = { AsyncChannel.class, WifiStateMachine.class, DhcpClient.class }; @@ -1395,6 +1398,11 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven public void onReachabilityLost(String logMsg) { sendMessage(CMD_IP_REACHABILITY_LOST, logMsg); } + + @Override + public void installPacketFilter(byte[] filter) { + sendMessage(CMD_INSTALL_PACKET_FILTER, filter); + } } private void stopIpManager() { @@ -2710,6 +2718,10 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { super.dump(fd, pw, args); + if (args.length == 1 && "apf".equals(args[0])) { + mIpManager.dumpApf(pw); + return; + } mSupplicantStateTracker.dump(fd, pw, args); pw.println("mLinkProperties " + mLinkProperties); pw.println("mWifiInfo " + mWifiInfo); @@ -2761,6 +2773,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_USER_ACTION); mWifiLogger.dump(fd, pw, args); mWifiQualifiedNetworkSelector.dump(fd, pw, args); + mIpManager.dumpApf(pw); } public void handleUserSwitch(int userId) { @@ -3308,6 +3321,9 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven sb.append(" ").append((String) msg.obj); } break; + case CMD_INSTALL_PACKET_FILTER: + sb.append(" len=" + ((byte[])msg.obj).length); + break; case CMD_ROAM_WATCHDOG_TIMER: sb.append(" "); sb.append(Integer.toString(msg.arg1)); @@ -5010,6 +5026,9 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; deferMessage(message); break; + case CMD_INSTALL_PACKET_FILTER: + mWifiNative.installPacketFilter((byte[]) message.obj); + break; default: loge("Error! unhandled message" + message); break; @@ -7127,11 +7146,6 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven if (this != mNetworkAgent) return; unwantedNetwork(NETWORK_STATUS_UNWANTED_DISABLE_AUTOJOIN); } - - @Override - protected boolean installPacketFilter(byte[] filter) { - return mWifiNative.installPacketFilter(filter); - } } void unwantedNetwork(int reason) { @@ -7257,16 +7271,6 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven } setNetworkDetailedState(DetailedState.CONNECTING); - WifiNative.PacketFilterCapabilities packetFilterCapabilities = - mWifiNative.getPacketFilterCapabilities(); - if (packetFilterCapabilities != null) { - mNetworkMisc.apfVersionSupported = - packetFilterCapabilities.apfVersionSupported; - mNetworkMisc.maximumApfProgramSize = - packetFilterCapabilities.maximumApfProgramSize; - mNetworkMisc.apfPacketFormat = ARPHRD_ETHER; - } - mNetworkAgent = new WifiNetworkAgent(getHandler().getLooper(), mContext, "WifiNetworkAgent", mNetworkInfo, mNetworkCapabilitiesFilter, mLinkProperties, 60, mNetworkMisc); @@ -7699,6 +7703,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven final IpManager.ProvisioningConfiguration prov = mIpManager.buildProvisioningConfiguration() .withPreDhcpAction() + .withApfCapabilities(mWifiNative.getApfCapabilities()) .build(); mIpManager.startProvisioning(prov); obtainingIpWatchdogCount++; @@ -7717,6 +7722,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven final IpManager.ProvisioningConfiguration prov = mIpManager.buildProvisioningConfiguration() .withStaticConfiguration(config) + .withApfCapabilities(mWifiNative.getApfCapabilities()) .build(); mIpManager.startProvisioning(prov); } diff --git a/service/jni/com_android_server_wifi_WifiNative.cpp b/service/jni/com_android_server_wifi_WifiNative.cpp index 35b0be7af..275e00d2a 100644 --- a/service/jni/com_android_server_wifi_WifiNative.cpp +++ b/service/jni/com_android_server_wifi_WifiNative.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "wifi.h" #include "wifi_hal.h" #include "jni_helper.h" @@ -1401,7 +1402,7 @@ static jobject android_net_wifi_get_rtt_capabilities(JNIEnv *env, jclass cls, ji } } -static jobject android_net_wifi_get_packet_filter_capabilities(JNIEnv *env, jclass cls, +static jobject android_net_wifi_get_apf_capabilities(JNIEnv *env, jclass cls, jint iface) { JNIHelper helper(env); @@ -1410,10 +1411,24 @@ static jobject android_net_wifi_get_packet_filter_capabilities(JNIEnv *env, jcla wifi_error ret = hal_fn.wifi_get_packet_filter_capabilities(handle, &version, &max_len); if (WIFI_SUCCESS == ret) { - JNIObject capabilities = helper.createObject( - "com/android/server/wifi/WifiNative$PacketFilterCapabilities"); - helper.setIntField(capabilities, "apfVersionSupported", version); - helper.setIntField(capabilities, "maximumApfProgramSize", max_len); + // Cannot just use createObject() because members are final and initializer values must be + // passed via ApfCapabilities(). + JNIObject apf_cls(helper, env->FindClass("android/net/apf/ApfCapabilities")); + if (apf_cls == NULL) { + ALOGE("Error in finding class android/net/apf/ApfCapabilities"); + return NULL; + } + jmethodID constructor = env->GetMethodID(apf_cls, "", "(III)V"); + if (constructor == 0) { + ALOGE("Error in constructor ID for android/net/apf/ApfCapabilities"); + return NULL; + } + JNIObject capabilities(helper, env->NewObject(apf_cls, constructor, version, + max_len, ARPHRD_ETHER)); + if (capabilities == NULL) { + ALOGE("Could not create new object of android/net/apf/ApfCapabilities"); + return NULL; + } ALOGD("APF version supported: %d", version); ALOGD("Maximum APF program size: %d", max_len); return capabilities.detach(); @@ -2314,8 +2329,8 @@ static JNINativeMethod gWifiMethods[] = { { "setInterfaceUpNative", "(Ljava/lang/String;Z)Z", (void*) android_net_wifi_set_interface_up}, { "getRttCapabilitiesNative", "(I)Landroid/net/wifi/RttManager$RttCapabilities;", (void*) android_net_wifi_get_rtt_capabilities}, - { "getPacketFilterCapabilitiesNative", "(I)Lcom/android/server/wifi/WifiNative$PacketFilterCapabilities;", - (void*) android_net_wifi_get_packet_filter_capabilities}, + { "getApfCapabilitiesNative", "(I)Landroid/net/apf/ApfCapabilities;", + (void*) android_net_wifi_get_apf_capabilities}, { "installPacketFilterNative", "(I[B)Z", (void*) android_net_wifi_install_packet_filter}, {"setCountryCodeHalNative", "(ILjava/lang/String;)Z", (void*) android_net_wifi_set_Country_Code_Hal}, -- cgit v1.2.3