summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Jensen <pauljensen@google.com>2016-03-18 12:11:57 -0400
committerPaul Jensen <pauljensen@google.com>2016-03-24 11:00:19 -0400
commite1dab7a2e3ab5911f812a302b4beed1f6eb5aba7 (patch)
tree24c14545aed27d992ef9108ae7f98f9007707075
parent4e54617758f86acef751bc8588257a58ed985b0f (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
-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},