]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
eap_proxy: Add support for SIM state change indication from eap_proxy
authorPurushottam Kushwaha <pkushwah@qti.qualcomm.com>
Tue, 13 Dec 2016 13:00:21 +0000 (18:30 +0530)
committerJouni Malinen <j@w1.fi>
Mon, 19 Dec 2016 20:21:07 +0000 (22:21 +0200)
This registers a new callback to indicate change in SIM state. This
helps to do some clean up (more specifically pmksa_flush) based on the
state change of the SIM. Without this, the reconnection using the cached
PMKSA could happen though the SIM is changed.

Currently eap_proxy_sim_state corresponds to only SIM_STATE_ERROR. This
can be further extended.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/common/defs.h
src/eap_peer/eap.h
src/eapol_supp/eapol_supp_sm.c
src/eapol_supp/eapol_supp_sm.h
wpa_supplicant/wpas_glue.c

index 672bdf617fef4591770d2528006ea5e7edb93ddc..eaccced22a762522240b006f7a5bbe740c34f362 100644 (file)
@@ -376,4 +376,8 @@ enum beacon_rate_type {
        BEACON_RATE_VHT
 };
 
+enum eap_proxy_sim_state {
+       SIM_STATE_ERROR,
+};
+
 #endif /* DEFS_H */
index 7b013ee15f332f6b23c4cbf592a8fe8d075332a6..932584fb287373a7f37e3006f59bd8ac43164951 100644 (file)
@@ -252,6 +252,14 @@ struct eapol_callbacks {
         * @ctx: eapol_ctx from eap_peer_sm_init() call
         */
        void (*eap_proxy_cb)(void *ctx);
+
+       /**
+        * eap_proxy_notify_sim_status - Notification of SIM status change
+        * @ctx: eapol_ctx from eap_peer_sm_init() call
+        * @sim_state: One of enum value from sim_state
+        */
+       void (*eap_proxy_notify_sim_status)(void *ctx,
+                                           enum eap_proxy_sim_state sim_state);
 #endif /* CONFIG_EAP_PROXY */
 
        /**
index 7fdb277239cbb916b69f53dc4e079f7c78957672..97e7e71678002555f919a233e05538bd965bb749 100644 (file)
@@ -1999,6 +1999,7 @@ static void eapol_sm_notify_status(void *ctx, const char *status,
 
 
 #ifdef CONFIG_EAP_PROXY
+
 static void eapol_sm_eap_proxy_cb(void *ctx)
 {
        struct eapol_sm *sm = ctx;
@@ -2006,6 +2007,18 @@ static void eapol_sm_eap_proxy_cb(void *ctx)
        if (sm->ctx->eap_proxy_cb)
                sm->ctx->eap_proxy_cb(sm->ctx->ctx);
 }
+
+
+static void
+eapol_sm_eap_proxy_notify_sim_status(void *ctx,
+                                    enum eap_proxy_sim_state sim_state)
+{
+       struct eapol_sm *sm = ctx;
+
+       if (sm->ctx->eap_proxy_notify_sim_status)
+               sm->ctx->eap_proxy_notify_sim_status(sm->ctx->ctx, sim_state);
+}
+
 #endif /* CONFIG_EAP_PROXY */
 
 
@@ -2034,6 +2047,7 @@ static const struct eapol_callbacks eapol_cb =
        eapol_sm_notify_status,
 #ifdef CONFIG_EAP_PROXY
        eapol_sm_eap_proxy_cb,
+       eapol_sm_eap_proxy_notify_sim_status,
 #endif /* CONFIG_EAP_PROXY */
        eapol_sm_set_anon_id
 };
index b48cab2eeba47a9d87dff44bf71c8042cd9ebf70..cb06e9a07c38f3d7425debca901593de71c7cccb 100644 (file)
@@ -277,6 +277,14 @@ struct eapol_ctx {
         * @ctx: eapol_ctx from eap_peer_sm_init() call
         */
        void (*eap_proxy_cb)(void *ctx);
+
+       /**
+        * eap_proxy_notify_sim_status - Notification of SIM status change
+        * @ctx: eapol_ctx from eap_peer_sm_init() call
+        * @status: One of enum value from sim_state
+        */
+       void (*eap_proxy_notify_sim_status)(void *ctx,
+                                           enum eap_proxy_sim_state sim_state);
 #endif /* CONFIG_EAP_PROXY */
 
        /**
index a5498ee8a13ba367a9e7b3ba99b5c4a320924a14..6b4d81f62e77a2b7296a9623a877e2701255d188 100644 (file)
@@ -893,6 +893,7 @@ static void wpa_supplicant_eap_param_needed(void *ctx,
 
 
 #ifdef CONFIG_EAP_PROXY
+
 static void wpa_supplicant_eap_proxy_cb(void *ctx)
 {
        struct wpa_supplicant *wpa_s = ctx;
@@ -908,6 +909,25 @@ static void wpa_supplicant_eap_proxy_cb(void *ctx)
                wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
        }
 }
+
+
+static void
+wpa_supplicant_eap_proxy_notify_sim_status(void *ctx,
+                                          enum eap_proxy_sim_state sim_state)
+{
+       struct wpa_supplicant *wpa_s = ctx;
+
+       wpa_printf(MSG_DEBUG, "eap_proxy: SIM card status %u", sim_state);
+       switch (sim_state) {
+       case SIM_STATE_ERROR:
+               wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
+               break;
+       default:
+               wpa_printf(MSG_DEBUG, "eap_proxy: SIM card status unknown");
+               break;
+       }
+}
+
 #endif /* CONFIG_EAP_PROXY */
 
 
@@ -1018,6 +1038,8 @@ int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s)
        ctx->eap_param_needed = wpa_supplicant_eap_param_needed;
 #ifdef CONFIG_EAP_PROXY
        ctx->eap_proxy_cb = wpa_supplicant_eap_proxy_cb;
+       ctx->eap_proxy_notify_sim_status =
+               wpa_supplicant_eap_proxy_notify_sim_status;
 #endif /* CONFIG_EAP_PROXY */
        ctx->port_cb = wpa_supplicant_port_cb;
        ctx->cb = wpa_supplicant_eapol_cb;