This function is for reconfiguring the EAPOL state machine when the EAP<br><div class="gmail_quote">
configuration is changed, either by reconfiguring smartcard modules over<br>
DBus or a reload of the config file.<br>
<br>
Also, modify ctrl_iface_dbus_handlers.c and wpa_supplicant.c to use new<br>
interface.<br>
---<br>
&nbsp;src/eapol_supp/eapol_supp_sm.c &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; 30 +++++++++++++++++++++++++++-<br>
&nbsp;src/eapol_supp/eapol_supp_sm.h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp;8 +++++++<br>
&nbsp;wpa_supplicant/ctrl_iface_dbus_handlers.c | &nbsp; 11 +++++++--<br>
&nbsp;wpa_supplicant/wpa_supplicant.c &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; 14 +++++++++---<br>
&nbsp;4 files changed, 54 insertions(+), 9 deletions(-)<br>
<br>
diff --git a/src/eapol_supp/eapol_supp_sm.c b/src/eapol_supp/eapol_supp_sm.c<br>
index f382ee6..d7b7876 100644<br>
--- a/src/eapol_supp/eapol_supp_sm.c<br>
+++ b/src/eapol_supp/eapol_supp_sm.c<br>
@@ -1772,6 +1772,32 @@ static struct eapol_callbacks eapol_cb =<br>
<br>
<br>
&nbsp;/**<br>
+ * eapol_sm_notify_eap_config - Notification of EAP config change<br>
+ * @sm: Pointer to EAPOL state machine allocated with eapol_sm_init()<br>
+ * @eap_config: Pointer to EAP configuration data<br>
+ * Returns: TRUE if successful, FALSE if not.<br>
+ *<br>
+ * Notify EAPOL state machine that EAP configuration has changed.<br>
+ */<br>
+Boolean eapol_sm_notify_eap_config(struct eapol_sm *sm,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct eap_config *config)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; if (sm == NULL || config == NULL)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return FALSE;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; eapol_sm_invalidate_cached_session(sm);<br>
+ &nbsp; &nbsp; &nbsp; if (sm-&gt;eap)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eap_peer_sm_deinit(sm-&gt;eap);<br>
+ &nbsp; &nbsp; &nbsp; sm-&gt;eap = eap_peer_sm_init(sm, &amp;eapol_cb, sm-&gt;ctx-&gt;msg_ctx,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;config);<br>
+<br>
+ &nbsp; &nbsp; &nbsp; if (sm-&gt;eap == NULL)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return FALSE;<br>
+ &nbsp; &nbsp; &nbsp; else<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return TRUE;<br>
+}<br>
+<br>
+/**<br>
 &nbsp;* eapol_sm_init - Initialize EAPOL state machine<br>
 &nbsp;* @ctx: Pointer to EAPOL context data; this needs to be an allocated buffer<br>
 &nbsp;* and EAPOL state machine will free it in eapol_sm_deinit()<br>
@@ -1806,8 +1832,8 @@ struct eapol_sm *eapol_sm_init(struct eapol_ctx *ctx)<br>
&nbsp;#endif /* EAP_TLS_OPENSSL */<br>
 &nbsp; &nbsp; &nbsp; &nbsp;conf.wps = ctx-&gt;wps;<br>
<br>
- &nbsp; &nbsp; &nbsp; sm-&gt;eap = eap_peer_sm_init(sm, &amp;eapol_cb, sm-&gt;ctx-&gt;msg_ctx, &amp;conf);<br>
- &nbsp; &nbsp; &nbsp; if (sm-&gt;eap == NULL) {<br>
+ &nbsp; &nbsp; &nbsp; if (! eapol_sm_notify_eap_config(sm, &amp;conf))<br>
+ &nbsp; &nbsp; &nbsp; {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;os_free(sm);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return NULL;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
diff --git a/src/eapol_supp/eapol_supp_sm.h b/src/eapol_supp/eapol_supp_sm.h<br>
index 57d7bc1..ba97dcd 100644<br>
--- a/src/eapol_supp/eapol_supp_sm.h<br>
+++ b/src/eapol_supp/eapol_supp_sm.h<br>
@@ -16,6 +16,7 @@<br>
&nbsp;#define EAPOL_SUPP_SM_H<br>
<br>
&nbsp;#include &quot;defs.h&quot;<br>
+#include &quot;eap_peer/eap.h&quot;<br>
<br>
&nbsp;typedef enum { Unauthorized, Authorized } PortStatus;<br>
&nbsp;typedef enum { Auto, ForceUnauthorized, ForceAuthorized } PortControl;<br>
@@ -250,6 +251,9 @@ void eapol_sm_notify_ctrl_response(struct eapol_sm *sm);<br>
&nbsp;void eapol_sm_request_reauth(struct eapol_sm *sm);<br>
&nbsp;void eapol_sm_notify_lower_layer_success(struct eapol_sm *sm, int in_eapol_sm);<br>
&nbsp;void eapol_sm_invalidate_cached_session(struct eapol_sm *sm);<br>
+Boolean eapol_sm_notify_eap_config(struct eapol_sm *sm,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct eap_config *config);<br>
+<br>
&nbsp;#else /* IEEE8021X_EAPOL */<br>
&nbsp;static inline struct eapol_sm *eapol_sm_init(struct eapol_ctx *ctx)<br>
&nbsp;{<br>
@@ -337,6 +341,10 @@ static inline void<br>
eapol_sm_notify_lower_layer_success(struct eapol_sm *sm,<br>
&nbsp;static inline void eapol_sm_invalidate_cached_session(struct eapol_sm *sm)<br>
&nbsp;{<br>
&nbsp;}<br>
+static inline Boolean eapol_sm_notify_eap_config(struct eapol_sm *sm,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct eap_config *config)<br>
+{<br>
+}<br>
&nbsp;#endif /* IEEE8021X_EAPOL */<br>
<br>
&nbsp;#endif /* EAPOL_SUPP_SM_H */<br>
diff --git a/wpa_supplicant/ctrl_iface_dbus_handlers.c<br>
b/wpa_supplicant/ctrl_iface_dbus_handlers.c<br>
index 3c29804..a19e291 100644<br>
--- a/wpa_supplicant/ctrl_iface_dbus_handlers.c<br>
+++ b/wpa_supplicant/ctrl_iface_dbus_handlers.c<br>
@@ -1205,6 +1205,7 @@ DBusMessage * wpas_dbus_iface_set_smartcard_modules(<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char *pkcs11_engine_path = NULL;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char *pkcs11_module_path = NULL;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;struct wpa_dbus_dict_entry entry;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;struct eap_config conf;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (!dbus_message_iter_init(message, &amp;iter))<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
@@ -1244,13 +1245,17 @@ DBusMessage * wpas_dbus_iface_set_smartcard_modules(<br>
 &nbsp; &nbsp; &nbsp; &nbsp;wpa_s-&gt;conf-&gt;pkcs11_engine_path = pkcs11_engine_path;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;os_free(wpa_s-&gt;conf-&gt;pkcs11_module_path);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;wpa_s-&gt;conf-&gt;pkcs11_module_path = pkcs11_module_path;<br>
-#endif /* EAP_TLS_OPENSSL */<br>
<br>
- &nbsp; &nbsp; &nbsp; eapol_sm_deinit(wpa_s-&gt;eapol);<br>
- &nbsp; &nbsp; &nbsp; wpa_supplicant_init_eapol(wpa_s);<br>
+ &nbsp; &nbsp; &nbsp; os_memset(&amp;conf, 0, sizeof(conf));<br>
+ &nbsp; &nbsp; &nbsp; conf.opensc_engine_path = wpa_s-&gt;conf-&gt;opensc_engine_path;<br>
+ &nbsp; &nbsp; &nbsp; conf.pkcs11_engine_path = wpa_s-&gt;conf-&gt;pkcs11_engine_path;<br>
+ &nbsp; &nbsp; &nbsp; conf.pkcs11_module_path = wpa_s-&gt;conf-&gt;pkcs11_module_path;<br>
+ &nbsp; &nbsp; &nbsp; eapol_sm_notify_eap_config(wpa_s-&gt;eapol, &amp;conf);<br>
+#endif /* EAP_TLS_OPENSSL */<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return wpas_dbus_new_success_reply(message);<br>
<br>
+<br>
&nbsp;error:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;os_free(opensc_engine_path);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;os_free(pkcs11_engine_path);<br>
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c<br>
index d23220d..b8aa289 100644<br>
--- a/wpa_supplicant/wpa_supplicant.c<br>
+++ b/wpa_supplicant/wpa_supplicant.c<br>
@@ -537,6 +537,7 @@ static void wpa_supplicant_clear_status(struct<br>
wpa_supplicant *wpa_s)<br>
&nbsp;int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;struct wpa_config *conf;<br>
+ &nbsp; &nbsp; &nbsp; struct eap_config eap_conf;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int reconf_ctrl;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (wpa_s-&gt;confname == NULL)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br>
@@ -559,10 +560,15 @@ int wpa_supplicant_reload_configuration(struct<br>
wpa_supplicant *wpa_s)<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;eapol_sm_invalidate_cached_session(wpa_s-&gt;eapol);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;wpa_s-&gt;current_ssid = NULL;<br>
- &nbsp; &nbsp; &nbsp; /*<br>
- &nbsp; &nbsp; &nbsp; &nbsp;* TODO: should notify EAPOL SM about changes in opensc_engine_path,<br>
- &nbsp; &nbsp; &nbsp; &nbsp;* pkcs11_engine_path, pkcs11_module_path.<br>
- &nbsp; &nbsp; &nbsp; &nbsp;*/<br>
+<br>
+ &nbsp; &nbsp; &nbsp; os_memset(&amp;eap_conf, 0, sizeof(conf));<br>
+#ifdef EAP_TLS_OPENSSL<br>
+ &nbsp; &nbsp; &nbsp; eap_conf.opensc_engine_path = conf-&gt;opensc_engine_path;<br>
+ &nbsp; &nbsp; &nbsp; eap_conf.pkcs11_engine_path = conf-&gt;pkcs11_engine_path;<br>
+ &nbsp; &nbsp; &nbsp; eap_conf.pkcs11_module_path = conf-&gt;pkcs11_module_path;<br>
+#endif /* EAP_TLS_OPENSSL */<br>
+ &nbsp; &nbsp; &nbsp; eapol_sm_notify_eap_config(wpa_s-&gt;eapol, &amp;eap_conf);<br>
+<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (wpa_key_mgmt_wpa_psk(wpa_s-&gt;key_mgmt)) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/*<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * Clear forced success to clear EAP state for next<br>
<font color="#888888">--<br>
1.5.6.3<br>
<br>
</font></div>-- <br>- dds<br><br>