]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
FST: Use more robust interface-find for event messages
authorJouni Malinen <j@w1.fi>
Sun, 26 Jul 2015 10:39:55 +0000 (13:39 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 26 Jul 2015 15:12:09 +0000 (18:12 +0300)
It is possible for there to be multiple FST groups, so the hardcoded
mechanism of selecting the first one when sending out an event message
may not be sufficient. Get the interface from the caller, if available,
and if not, go through all groups in search of an interface to send the
event on.

Signed-off-by: Jouni Malinen <j@w1.fi>
src/fst/fst_ctrl_iface.c

index cb18c5e6f0d6b4b8cf8ab51984461ab99046647e..06bba5a552d8c3735f11576390769b8a48582872 100644 (file)
@@ -78,12 +78,11 @@ static Boolean format_session_state_extra(const union fst_event_extra *extra,
 }
 
 
-static void fst_ctrl_iface_notify(u32 session_id,
+static void fst_ctrl_iface_notify(struct fst_iface *f, u32 session_id,
                                  enum fst_event_type event_type,
                                  const union fst_event_extra *extra)
 {
        struct fst_group *g;
-       struct fst_iface *f;
        char extra_str[128] = "";
        const struct fst_event_extra_session_state *ss;
        const struct fst_event_extra_iface_state *is;
@@ -94,13 +93,15 @@ static void fst_ctrl_iface_notify(u32 session_id,
         * on global Control Interface, so we just pick the 1st one.
         */
 
-       g = fst_first_group();
-       if (!g)
-               return;
-
-       f = fst_group_first_iface(g);
-       if (!f)
-               return;
+       if (!f) {
+               foreach_fst_group(g) {
+                       f = fst_group_first_iface(g);
+                       if (f)
+                               break;
+               }
+               if (!f)
+                       return;
+       }
 
        WPA_ASSERT(f->iface_obj.ctx);
 
@@ -702,7 +703,7 @@ static void fst_ctrl_iface_on_iface_state_changed(struct fst_iface *i,
        os_strlcpy(extra.iface_state.group_id, fst_iface_get_group_id(i),
                   sizeof(extra.iface_state.group_id));
 
-       fst_ctrl_iface_notify(FST_INVALID_SESSION_ID,
+       fst_ctrl_iface_notify(i, FST_INVALID_SESSION_ID,
                              EVENT_FST_IFACE_STATE_CHANGED, &extra);
 }
 
@@ -726,7 +727,7 @@ static void fst_ctrl_iface_on_event(enum fst_event_type event_type,
 {
        u32 session_id = s ? fst_session_get_id(s) : FST_INVALID_SESSION_ID;
 
-       fst_ctrl_iface_notify(session_id, event_type, extra);
+       fst_ctrl_iface_notify(i, session_id, event_type, extra);
 }