mesh: Write close reason from Mesh Peering Close to debug log
[mech_eap.git] / wpa_supplicant / wmm_ac.c
index 727df41..5625d36 100644 (file)
@@ -427,7 +427,7 @@ wmm_ac_process_param_elem(struct wpa_supplicant *wpa_s, const u8 *ies,
        int i;
 
        /* Parsing WMM Parameter Element */
-       if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) != ParseOK) {
+       if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed) {
                wpa_printf(MSG_DEBUG, "WMM AC: could not parse assoc ies");
                return NULL;
        }
@@ -857,7 +857,7 @@ int wpas_wmm_ac_status(struct wpa_supplicant *wpa_s, char *buf, size_t buflen)
        struct wmm_ac_assoc_data *assoc_info = wpa_s->wmm_ac_assoc_info;
        enum ts_dir_idx idx;
        int pos = 0;
-       u8 ac;
+       u8 ac, up;
 
        if (!assoc_info) {
                return wpa_scnprintf(buf, buflen - pos,
@@ -889,13 +889,14 @@ int wpas_wmm_ac_status(struct wpa_supplicant *wpa_s, char *buf, size_t buflen)
                        dir = wmm_ac_get_direction(tspec);
                        dir_str = get_direction_str(dir);
                        tsid = wmm_ac_get_tsid(tspec);
+                       up = wmm_ac_get_user_priority(tspec);
 
                        pos += wpa_scnprintf(buf + pos, buflen - pos,
-                                            "\tTSID = %u\n"
+                                            "\tTSID=%u UP=%u\n"
                                             "\tAddress = "MACSTR"\n"
                                             "\tWMM AC dir = %s\n"
                                             "\tTotal admitted time = %u\n\n",
-                                            tsid,
+                                            tsid, up,
                                             MAC2STR(wpa_s->bssid),
                                             dir_str,
                                             le_to_host16(tspec->medium_time));
@@ -909,3 +910,86 @@ int wpas_wmm_ac_status(struct wpa_supplicant *wpa_s, char *buf, size_t buflen)
 
        return pos;
 }
+
+
+static u8 wmm_ac_get_tspecs_count(struct wpa_supplicant *wpa_s)
+{
+       int ac, dir, tspecs_count = 0;
+
+       for (ac = 0; ac < WMM_AC_NUM; ac++) {
+               for (dir = 0; dir < TS_DIR_IDX_COUNT; dir++) {
+                       if (wpa_s->tspecs[ac][dir])
+                               tspecs_count++;
+               }
+       }
+
+       return tspecs_count;
+}
+
+
+void wmm_ac_save_tspecs(struct wpa_supplicant *wpa_s)
+{
+       int ac, dir, tspecs_count;
+
+       wpa_printf(MSG_DEBUG, "WMM AC: Save last configured tspecs");
+
+       if (!wpa_s->wmm_ac_assoc_info)
+               return;
+
+       tspecs_count = wmm_ac_get_tspecs_count(wpa_s);
+       if (!tspecs_count) {
+               wpa_printf(MSG_DEBUG, "WMM AC: No configured TSPECs");
+               return;
+       }
+
+       wpa_printf(MSG_DEBUG, "WMM AC: Saving tspecs");
+
+       wmm_ac_clear_saved_tspecs(wpa_s);
+       wpa_s->last_tspecs = os_calloc(tspecs_count,
+                                      sizeof(*wpa_s->last_tspecs));
+       if (!wpa_s->last_tspecs) {
+               wpa_printf(MSG_ERROR, "WMM AC: Failed to save tspecs!");
+               return;
+       }
+
+       for (ac = 0; ac < WMM_AC_NUM; ac++) {
+               for (dir = 0; dir < TS_DIR_IDX_COUNT; dir++) {
+                       if (!wpa_s->tspecs[ac][dir])
+                               continue;
+
+                       wpa_s->last_tspecs[wpa_s->last_tspecs_count++] =
+                               *wpa_s->tspecs[ac][dir];
+               }
+       }
+
+       wpa_printf(MSG_DEBUG, "WMM AC: Successfully saved %d TSPECs",
+                  wpa_s->last_tspecs_count);
+}
+
+
+void wmm_ac_clear_saved_tspecs(struct wpa_supplicant *wpa_s)
+{
+       if (wpa_s->last_tspecs) {
+               wpa_printf(MSG_DEBUG, "WMM AC: Clear saved tspecs");
+               os_free(wpa_s->last_tspecs);
+               wpa_s->last_tspecs = NULL;
+               wpa_s->last_tspecs_count = 0;
+       }
+}
+
+
+int wmm_ac_restore_tspecs(struct wpa_supplicant *wpa_s)
+{
+       unsigned int i;
+
+       if (!wpa_s->wmm_ac_assoc_info || !wpa_s->last_tspecs_count)
+               return 0;
+
+       wpa_printf(MSG_DEBUG, "WMM AC: Restore %u saved tspecs",
+                  wpa_s->last_tspecs_count);
+
+       for (i = 0; i < wpa_s->last_tspecs_count; i++)
+               wmm_ac_add_ts(wpa_s, wpa_s->bssid, &wpa_s->last_tspecs[i]);
+
+       return 0;
+}