aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Biren <gbiren@google.com>2022-03-31 14:53:33 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2022-03-31 14:53:33 +0000
commit621ef2db6261d5ab9fb830d2d8c98d02a66de0e0 (patch)
tree0cecfa0db2b29f6ebbea4f33472ee79dd1164bec
parent8a54208507ddf0e555385b71e229f61f69078488 (diff)
parent3a2ec2ce7cf4465919a9b5f9ddfbf5ba52ac14b9 (diff)
downloadwpa_supplicant_8-621ef2db6261d5ab9fb830d2d8c98d02a66de0e0.tar.gz
Merge "Notify the framework when an auxiliary event occurs in wpa_supplicant." into tm-dev
-rw-r--r--src/eap_peer/eap.c11
-rw-r--r--src/eap_peer/eap.h14
-rw-r--r--src/eap_peer/eap_tls_common.c4
-rw-r--r--src/eapol_supp/eapol_supp_sm.c25
-rw-r--r--src/eapol_supp/eapol_supp_sm.h14
-rw-r--r--wpa_supplicant/aidl/aidl.cpp40
-rw-r--r--wpa_supplicant/aidl/aidl.h15
-rw-r--r--wpa_supplicant/aidl/aidl_manager.cpp19
-rw-r--r--wpa_supplicant/aidl/aidl_manager.h3
-rw-r--r--wpa_supplicant/notify.c17
-rw-r--r--wpa_supplicant/notify.h6
-rw-r--r--wpa_supplicant/wpa_supplicant.c11
-rw-r--r--wpa_supplicant/wpas_glue.c18
13 files changed, 195 insertions, 2 deletions
diff --git a/src/eap_peer/eap.c b/src/eap_peer/eap.c
index 7dcfe4ff..5fd370f7 100644
--- a/src/eap_peer/eap.c
+++ b/src/eap_peer/eap.c
@@ -429,6 +429,17 @@ SM_STATE(EAP, GET_METHOD)
wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_METHOD
"EAP vendor %u method %u (%s) selected",
sm->reqVendor, method, sm->m->name);
+
+ if (sm->eapol_cb->notify_eap_method_selected) {
+ char *format_str = "EAP vendor %u method %u (%s) selected";
+ int msg_len = snprintf(NULL, 0, format_str,
+ sm->reqVendor, method, sm->m->name) + 1;
+ char *msg = os_malloc(msg_len);
+ snprintf(msg, msg_len, format_str,
+ sm->reqVendor, method, sm->m->name);
+ sm->eapol_cb->notify_eap_method_selected(sm->eapol_ctx, msg);
+ os_free(msg);
+ }
return;
nak:
diff --git a/src/eap_peer/eap.h b/src/eap_peer/eap.h
index a40d007d..aae1a416 100644
--- a/src/eap_peer/eap.h
+++ b/src/eap_peer/eap.h
@@ -281,6 +281,20 @@ struct eapol_callbacks {
* @len: Length of anonymous identity in octets
*/
void (*set_anon_id)(void *ctx, const u8 *id, size_t len);
+
+ /**
+ * notify_eap_method_selected - Report that the EAP method was selected
+ * @ctx: eapol_ctx from eap_peer_sm_init() call
+ * @reason_string: Information to log about the event
+ */
+ void (*notify_eap_method_selected)(void *ctx, const char* reason_string);
+
+ /**
+ * notify_open_ssl_failure - Report that an OpenSSL failure occurred
+ * @ctx: eapol_ctx from eap_peer_sm_init() call
+ * @reason_string: Information to log about the event
+ */
+ void (*notify_open_ssl_failure)(void *ctx, const char* reason_string);
};
/**
diff --git a/src/eap_peer/eap_tls_common.c b/src/eap_peer/eap_tls_common.c
index 0e00801d..1aaca360 100644
--- a/src/eap_peer/eap_tls_common.c
+++ b/src/eap_peer/eap_tls_common.c
@@ -778,6 +778,10 @@ int eap_peer_tls_process_helper(struct eap_sm *sm, struct eap_ssl_data *data,
wpa_printf(MSG_DEBUG, "SSL: Failed - tls_out available to "
"report error (len=%u)",
(unsigned int) wpabuf_len(data->tls_out));
+ if (sm->eapol_cb->notify_open_ssl_failure) {
+ sm->eapol_cb->notify_open_ssl_failure(sm->eapol_ctx,
+ "TLS processing has failed");
+ }
ret = -1;
/* TODO: clean pin if engine used? */
if (wpabuf_len(data->tls_out) == 0) {
diff --git a/src/eapol_supp/eapol_supp_sm.c b/src/eapol_supp/eapol_supp_sm.c
index 861eea2a..4e663690 100644
--- a/src/eapol_supp/eapol_supp_sm.c
+++ b/src/eapol_supp/eapol_supp_sm.c
@@ -2075,6 +2075,27 @@ static void eapol_sm_set_anon_id(void *ctx, const u8 *id, size_t len)
}
+static void
+eapol_sm_notify_eap_method_selected(void *ctx,
+ const char* reason_string)
+{
+ struct eapol_sm *sm = ctx;
+
+ if (sm->ctx->eap_method_selected_cb)
+ sm->ctx->eap_method_selected_cb(sm->ctx->ctx, reason_string);
+}
+
+
+static void
+eapol_sm_notify_open_ssl_failure(void *ctx,
+ const char* reason_string)
+{
+ struct eapol_sm *sm = ctx;
+
+ if (sm->ctx->open_ssl_failure_cb)
+ sm->ctx->open_ssl_failure_cb(sm->ctx->ctx, reason_string);
+}
+
static const struct eapol_callbacks eapol_cb =
{
eapol_sm_get_config,
@@ -2095,7 +2116,9 @@ static const struct eapol_callbacks eapol_cb =
eapol_sm_eap_proxy_notify_sim_status,
eapol_sm_get_eap_proxy_imsi,
#endif /* CONFIG_EAP_PROXY */
- eapol_sm_set_anon_id
+ eapol_sm_set_anon_id,
+ eapol_sm_notify_eap_method_selected,
+ eapol_sm_notify_open_ssl_failure
};
diff --git a/src/eapol_supp/eapol_supp_sm.h b/src/eapol_supp/eapol_supp_sm.h
index 753b947a..630a38e8 100644
--- a/src/eapol_supp/eapol_supp_sm.h
+++ b/src/eapol_supp/eapol_supp_sm.h
@@ -307,6 +307,20 @@ struct eapol_ctx {
* Automatically triggers a reconnect when not.
*/
int (*confirm_auth_cb)(void *ctx);
+
+ /**
+ * eap_method_selected_cb - Notification of EAP method selection
+ * @ctx: eapol_ctx from eap_peer_sm_init() call
+ * @reason_string: Information to log about the event
+ */
+ void (*eap_method_selected_cb)(void *ctx, const char* reason_string);
+
+ /**
+ * open_ssl_failure_cb - Notification of an OpenSSL failure
+ * @ctx: eapol_ctx from eap_peer_sm_init() call
+ * @reason_string: Information to log about the event
+ */
+ void (*open_ssl_failure_cb)(void *ctx, const char* reason_string);
};
diff --git a/wpa_supplicant/aidl/aidl.cpp b/wpa_supplicant/aidl/aidl.cpp
index f078e710..eb384971 100644
--- a/wpa_supplicant/aidl/aidl.cpp
+++ b/wpa_supplicant/aidl/aidl.cpp
@@ -22,6 +22,7 @@ extern "C"
}
using aidl::android::hardware::wifi::supplicant::AidlManager;
+using aidl::android::hardware::wifi::supplicant::AuxiliarySupplicantEventCode;
using aidl::android::hardware::wifi::supplicant::DppEventType;
using aidl::android::hardware::wifi::supplicant::DppFailureCode;
using aidl::android::hardware::wifi::supplicant::DppProgressCode;
@@ -961,3 +962,42 @@ void wpas_aidl_notify_ceritification(struct wpa_supplicant *wpa_s,
cert_hash,
cert);
}
+
+void wpas_aidl_notify_auxiliary_event(struct wpa_supplicant *wpa_s,
+ AuxiliarySupplicantEventCode event_code, const char *reason_string)
+{
+ if (!wpa_s)
+ return;
+
+ AidlManager *aidl_manager = AidlManager::getInstance();
+ if (!aidl_manager)
+ return;
+
+ wpa_printf(MSG_DEBUG, "Notify auxiliary event, code=%d",
+ static_cast<int>(event_code));
+ aidl_manager->notifyAuxiliaryEvent(wpa_s, event_code, reason_string);
+}
+
+void wpas_aidl_notify_eap_method_selected(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{
+ wpas_aidl_notify_auxiliary_event(wpa_s,
+ AuxiliarySupplicantEventCode::EAP_METHOD_SELECTED,
+ reason_string);
+}
+
+void wpas_aidl_notify_ssid_temp_disabled(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{
+ wpas_aidl_notify_auxiliary_event(wpa_s,
+ AuxiliarySupplicantEventCode::SSID_TEMP_DISABLED,
+ reason_string);
+}
+
+void wpas_aidl_notify_open_ssl_failure(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{
+ wpas_aidl_notify_auxiliary_event(wpa_s,
+ AuxiliarySupplicantEventCode::OPEN_SSL_FAILURE,
+ reason_string);
+}
diff --git a/wpa_supplicant/aidl/aidl.h b/wpa_supplicant/aidl/aidl.h
index 71275e3d..fcd462b0 100644
--- a/wpa_supplicant/aidl/aidl.h
+++ b/wpa_supplicant/aidl/aidl.h
@@ -133,6 +133,12 @@ extern "C"
int num_altsubject,
const char *cert_hash,
const struct wpabuf *cert);
+ void wpas_aidl_notify_eap_method_selected(struct wpa_supplicant *wpa_s,
+ const char *reason_string);
+ void wpas_aidl_notify_ssid_temp_disabled(struct wpa_supplicant *wpa_s,
+ const char *reason_string);
+ void wpas_aidl_notify_open_ssl_failure(struct wpa_supplicant *wpa_s,
+ const char *reason_string);
#else // CONFIG_CTRL_IFACE_AIDL
static inline int wpas_aidl_register_interface(struct wpa_supplicant *wpa_s)
{
@@ -293,6 +299,15 @@ void wpas_aidl_notify_ceritification(struct wpa_supplicant *wpa_s,
const char *cert_hash,
const struct wpabuf *cert)
{}
+void wpas_aidl_notify_eap_method_selected(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{}
+void wpas_aidl_notify_ssid_temp_disabled(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{}
+void wpas_aidl_notify_open_ssl_failure(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{}
#endif // CONFIG_CTRL_IFACE_AIDL
#ifdef _cplusplus
diff --git a/wpa_supplicant/aidl/aidl_manager.cpp b/wpa_supplicant/aidl/aidl_manager.cpp
index f9f04129..e18292a9 100644
--- a/wpa_supplicant/aidl/aidl_manager.cpp
+++ b/wpa_supplicant/aidl/aidl_manager.cpp
@@ -1546,7 +1546,8 @@ void AidlManager::notifyEapError(struct wpa_supplicant *wpa_s, int error_code)
misc_utils::charBufToString(wpa_s->ifname),
std::bind(
&ISupplicantStaIfaceCallback::onEapFailure,
- std::placeholders::_1, std::vector<uint8_t>(), error_code));
+ std::placeholders::_1,
+ macAddrToVec(wpa_s->bssid), error_code));
}
/**
@@ -1967,6 +1968,22 @@ void AidlManager::notifyCertification(struct wpa_supplicant *wpa_s,
misc_utils::charBufToString(wpa_s->ifname), current_ssid->id, func);
}
+void AidlManager::notifyAuxiliaryEvent(struct wpa_supplicant *wpa_s,
+ AuxiliarySupplicantEventCode event_code, const char *reason_string)
+{
+ if (!wpa_s)
+ return;
+
+ const std::function<
+ ndk::ScopedAStatus(std::shared_ptr<ISupplicantStaIfaceCallback>)>
+ func = std::bind(
+ &ISupplicantStaIfaceCallback::onAuxiliarySupplicantEvent,
+ std::placeholders::_1, event_code, macAddrToVec(wpa_s->bssid),
+ misc_utils::charBufToString(reason_string));
+ callWithEachStaIfaceCallback(
+ misc_utils::charBufToString(wpa_s->ifname), func);
+}
+
/**
* Retrieve the |ISupplicantP2pIface| aidl object reference using the provided
* ifname.
diff --git a/wpa_supplicant/aidl/aidl_manager.h b/wpa_supplicant/aidl/aidl_manager.h
index babb2cc3..15f8e28b 100644
--- a/wpa_supplicant/aidl/aidl_manager.h
+++ b/wpa_supplicant/aidl/aidl_manager.h
@@ -150,6 +150,9 @@ public:
int num_altsubject,
const char *cert_hash,
const struct wpabuf *cert);
+ void notifyAuxiliaryEvent(struct wpa_supplicant *wpa_s,
+ AuxiliarySupplicantEventCode event_code,
+ const char *reason_string);
// Methods called from aidl objects.
void notifyExtRadioWorkStart(struct wpa_supplicant *wpa_s, uint32_t id);
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 70c4b430..72c62601 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -1287,3 +1287,20 @@ void wpas_notify_interworking_select_done(struct wpa_supplicant *wpa_s)
#endif /* CONFIG_INTERWORKING */
+void wpas_notify_eap_method_selected(struct wpa_supplicant *wpa_s,
+ const char* reason_string)
+{
+ wpas_aidl_notify_eap_method_selected(wpa_s, reason_string);
+}
+
+void wpas_notify_ssid_temp_disabled(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{
+ wpas_aidl_notify_ssid_temp_disabled(wpa_s, reason_string);
+}
+
+void wpas_notify_open_ssl_failure(struct wpa_supplicant *wpa_s,
+ const char *reason_string)
+{
+ wpas_aidl_notify_open_ssl_failure(wpa_s, reason_string);
+}
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index 437a67e1..80357495 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -208,5 +208,11 @@ void wpas_notify_interworking_ap_added(struct wpa_supplicant *wpa_s,
const char *type, int bh, int bss_load,
int conn_capab);
void wpas_notify_interworking_select_done(struct wpa_supplicant *wpa_s);
+void wpas_notify_eap_method_selected(struct wpa_supplicant *wpa_s,
+ const char* reason_string);
+void wpas_notify_ssid_temp_disabled(struct wpa_supplicant *wpa_s,
+ const char *reason_string);
+void wpas_notify_open_ssl_failure(struct wpa_supplicant *wpa_s,
+ const char *reason_string);
#endif /* NOTIFY_H */
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 53d4a01f..139907f1 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -8145,6 +8145,17 @@ void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
"id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
ssid->auth_failures, dur, reason);
+
+ char *format_str = "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s";
+ int msg_len = snprintf(NULL, 0, format_str,
+ ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
+ ssid->auth_failures, dur, reason) + 1;
+ char *msg = os_malloc(msg_len);
+ snprintf(msg, msg_len, format_str,
+ ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
+ ssid->auth_failures, dur, reason);
+ wpas_notify_ssid_temp_disabled(wpa_s, msg);
+ os_free(msg);
}
diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
index 7f8fad25..a995f261 100644
--- a/wpa_supplicant/wpas_glue.c
+++ b/wpa_supplicant/wpas_glue.c
@@ -1159,6 +1159,22 @@ static void wpa_supplicant_set_anon_id(void *ctx, const u8 *id, size_t len)
}
}
}
+
+static void wpa_supplicant_eap_method_selected_cb(void *ctx,
+ const char* reason_string)
+{
+ struct wpa_supplicant *wpa_s = ctx;
+
+ wpas_notify_eap_method_selected(wpa_s, reason_string);
+}
+
+static void wpa_supplicant_open_ssl_failure_cb(void *ctx,
+ const char* reason_string)
+{
+ struct wpa_supplicant *wpa_s = ctx;
+
+ wpas_notify_open_ssl_failure(wpa_s, reason_string);
+}
#endif /* IEEE8021X_EAPOL */
@@ -1205,6 +1221,8 @@ int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s)
ctx->eap_error_cb = wpa_supplicant_eap_error_cb;
ctx->confirm_auth_cb = wpa_supplicant_eap_auth_start_cb;
ctx->set_anon_id = wpa_supplicant_set_anon_id;
+ ctx->eap_method_selected_cb = wpa_supplicant_eap_method_selected_cb;
+ ctx->open_ssl_failure_cb = wpa_supplicant_open_ssl_failure_cb;
ctx->cb_ctx = wpa_s;
wpa_s->eapol = eapol_sm_init(ctx);
if (wpa_s->eapol == NULL) {