summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiNative.java19
-rw-r--r--service/java/com/android/server/wifi/WifiStateMachine.java36
-rw-r--r--service/jni/com_android_server_wifi_WifiNative.cpp29
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},