diff options
-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}, |