diff options
author | Paul Jensen <pauljensen@google.com> | 2016-03-18 12:11:57 -0400 |
---|---|---|
committer | Paul Jensen <pauljensen@google.com> | 2016-03-24 11:00:19 -0400 |
commit | e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7 (patch) | |
tree | 24c14545aed27d992ef9108ae7f98f9007707075 /service | |
parent | 4e54617758f86acef751bc8588257a58ed985b0f (diff) |
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
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/WifiNative.java | 19 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/WifiStateMachine.java | 36 | ||||
-rw-r--r-- | service/jni/com_android_server_wifi_WifiNative.cpp | 29 |
3 files changed, 47 insertions, 37 deletions
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 <sys/socket.h> #include <sys/klog.h> #include <linux/if.h> +#include <linux/if_arp.h> #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<jobject> 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<jclass> 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, "<init>", "(III)V"); + if (constructor == 0) { + ALOGE("Error in constructor ID for android/net/apf/ApfCapabilities"); + return NULL; + } + JNIObject<jobject> 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}, |