LCOV - code coverage report
Current view: top level - src/drivers - driver_common.c (source / functions) Hit Total Coverage
Test: wpa_supplicant/hostapd combined for hwsim test run 1475438200 Lines: 90 168 53.6 %
Date: 2016-10-02 Functions: 7 8 87.5 %

          Line data    Source code
       1             : /*
       2             :  * Common driver-related functions
       3             :  * Copyright (c) 2003-2011, Jouni Malinen <j@w1.fi>
       4             :  *
       5             :  * This software may be distributed under the terms of the BSD license.
       6             :  * See README for more details.
       7             :  */
       8             : 
       9             : #include "includes.h"
      10             : #include "utils/common.h"
      11             : #include "driver.h"
      12             : 
      13        5789 : void wpa_scan_results_free(struct wpa_scan_results *res)
      14             : {
      15             :         size_t i;
      16             : 
      17        5789 :         if (res == NULL)
      18        5790 :                 return;
      19             : 
      20       12805 :         for (i = 0; i < res->num; i++)
      21        7017 :                 os_free(res->res[i]);
      22        5788 :         os_free(res->res);
      23        5788 :         os_free(res);
      24             : }
      25             : 
      26             : 
      27      135367 : const char * event_to_string(enum wpa_event_type event)
      28             : {
      29             : #define E2S(n) case EVENT_ ## n: return #n
      30      135367 :         switch (event) {
      31        4784 :         E2S(ASSOC);
      32          18 :         E2S(DISASSOC);
      33           6 :         E2S(MICHAEL_MIC_FAILURE);
      34        5717 :         E2S(SCAN_RESULTS);
      35          14 :         E2S(ASSOCINFO);
      36        1199 :         E2S(INTERFACE_STATUS);
      37           0 :         E2S(PMKID_CANDIDATE);
      38           0 :         E2S(STKSTART);
      39           0 :         E2S(TDLS);
      40           0 :         E2S(FT_RESPONSE);
      41          22 :         E2S(IBSS_RSN_START);
      42        4570 :         E2S(AUTH);
      43        5134 :         E2S(DEAUTH);
      44          51 :         E2S(ASSOC_REJECT);
      45          19 :         E2S(AUTH_TIMED_OUT);
      46           1 :         E2S(ASSOC_TIMED_OUT);
      47           0 :         E2S(WPS_BUTTON_PUSHED);
      48       16459 :         E2S(TX_STATUS);
      49          10 :         E2S(RX_FROM_UNKNOWN);
      50       36565 :         E2S(RX_MGMT);
      51        2035 :         E2S(REMAIN_ON_CHANNEL);
      52        1929 :         E2S(CANCEL_REMAIN_ON_CHANNEL);
      53           0 :         E2S(RX_PROBE_REQ);
      54           0 :         E2S(NEW_STA);
      55       14103 :         E2S(EAPOL_RX);
      56           7 :         E2S(SIGNAL_CHANGE);
      57          32 :         E2S(INTERFACE_ENABLED);
      58          76 :         E2S(INTERFACE_DISABLED);
      59       17811 :         E2S(CHANNEL_LIST_CHANGED);
      60          10 :         E2S(INTERFACE_UNAVAILABLE);
      61           0 :         E2S(BEST_CHANNEL);
      62          28 :         E2S(UNPROT_DEAUTH);
      63          19 :         E2S(UNPROT_DISASSOC);
      64           0 :         E2S(STATION_LOW_ACK);
      65           2 :         E2S(IBSS_PEER_LOST);
      66           0 :         E2S(DRIVER_GTK_REKEY);
      67           0 :         E2S(SCHED_SCAN_STOPPED);
      68           2 :         E2S(DRIVER_CLIENT_POLL_OK);
      69       18734 :         E2S(EAPOL_TX_STATUS);
      70          39 :         E2S(CH_SWITCH);
      71           0 :         E2S(WNM);
      72           0 :         E2S(CONNECT_FAILED_REASON);
      73          32 :         E2S(DFS_RADAR_DETECTED);
      74           7 :         E2S(DFS_CAC_FINISHED);
      75           6 :         E2S(DFS_CAC_ABORTED);
      76           0 :         E2S(DFS_NOP_FINISHED);
      77          56 :         E2S(SURVEY);
      78        5714 :         E2S(SCAN_STARTED);
      79           6 :         E2S(AVOID_FREQUENCIES);
      80         150 :         E2S(NEW_PEER_CANDIDATE);
      81           0 :         E2S(ACS_CHANNEL_SELECTED);
      82           0 :         E2S(DFS_CAC_STARTED);
      83           0 :         E2S(P2P_LO_STOP);
      84             :         }
      85             : 
      86           0 :         return "UNKNOWN";
      87             : #undef E2S
      88             : }
      89             : 
      90             : 
      91          96 : const char * channel_width_to_string(enum chan_width width)
      92             : {
      93          96 :         switch (width) {
      94             :         case CHAN_WIDTH_20_NOHT:
      95          14 :                 return "20 MHz (no HT)";
      96             :         case CHAN_WIDTH_20:
      97          49 :                 return "20 MHz";
      98             :         case CHAN_WIDTH_40:
      99          13 :                 return "40 MHz";
     100             :         case CHAN_WIDTH_80:
     101           5 :                 return "80 MHz";
     102             :         case CHAN_WIDTH_80P80:
     103           9 :                 return "80+80 MHz";
     104             :         case CHAN_WIDTH_160:
     105           6 :                 return "160 MHz";
     106             :         default:
     107           0 :                 return "unknown";
     108             :         }
     109             : }
     110             : 
     111             : 
     112         214 : int ht_supported(const struct hostapd_hw_modes *mode)
     113             : {
     114         214 :         if (!(mode->flags & HOSTAPD_MODE_FLAG_HT_INFO_KNOWN)) {
     115             :                 /*
     116             :                  * The driver did not indicate whether it supports HT. Assume
     117             :                  * it does to avoid connection issues.
     118             :                  */
     119           0 :                 return 1;
     120             :         }
     121             : 
     122             :         /*
     123             :          * IEEE Std 802.11n-2009 20.1.1:
     124             :          * An HT non-AP STA shall support all EQM rates for one spatial stream.
     125             :          */
     126         214 :         return mode->mcs_set[0] == 0xff;
     127             : }
     128             : 
     129             : 
     130          13 : int vht_supported(const struct hostapd_hw_modes *mode)
     131             : {
     132          13 :         if (!(mode->flags & HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN)) {
     133             :                 /*
     134             :                  * The driver did not indicate whether it supports VHT. Assume
     135             :                  * it does to avoid connection issues.
     136             :                  */
     137           0 :                 return 1;
     138             :         }
     139             : 
     140             :         /*
     141             :          * A VHT non-AP STA shall support MCS 0-7 for one spatial stream.
     142             :          * TODO: Verify if this complies with the standard
     143             :          */
     144          13 :         return (mode->vht_mcs_set[0] & 0x3) != 3;
     145             : }
     146             : 
     147             : 
     148           0 : static int wpa_check_wowlan_trigger(const char *start, const char *trigger,
     149             :                                     int capa_trigger, u8 *param_trigger)
     150             : {
     151           0 :         if (os_strcmp(start, trigger) != 0)
     152           0 :                 return 0;
     153           0 :         if (!capa_trigger)
     154           0 :                 return 0;
     155             : 
     156           0 :         *param_trigger = 1;
     157           0 :         return 1;
     158             : }
     159             : 
     160             : 
     161             : struct wowlan_triggers *
     162        2004 : wpa_get_wowlan_triggers(const char *wowlan_triggers,
     163             :                         const struct wpa_driver_capa *capa)
     164             : {
     165             :         struct wowlan_triggers *triggers;
     166             :         char *start, *end, *buf;
     167             :         int last;
     168             : 
     169        2004 :         if (!wowlan_triggers)
     170        2004 :                 return NULL;
     171             : 
     172           0 :         buf = os_strdup(wowlan_triggers);
     173           0 :         if (buf == NULL)
     174           0 :                 return NULL;
     175             : 
     176           0 :         triggers = os_zalloc(sizeof(*triggers));
     177           0 :         if (triggers == NULL)
     178           0 :                 goto out;
     179             : 
     180             : #define CHECK_TRIGGER(trigger) \
     181             :         wpa_check_wowlan_trigger(start, #trigger,                       \
     182             :                                   capa->wowlan_triggers.trigger,     \
     183             :                                   &triggers->trigger)
     184             : 
     185           0 :         start = buf;
     186           0 :         while (*start != '\0') {
     187           0 :                 while (isblank((unsigned char) *start))
     188           0 :                         start++;
     189           0 :                 if (*start == '\0')
     190           0 :                         break;
     191           0 :                 end = start;
     192           0 :                 while (!isblank((unsigned char) *end) && *end != '\0')
     193           0 :                         end++;
     194           0 :                 last = *end == '\0';
     195           0 :                 *end = '\0';
     196             : 
     197           0 :                 if (!CHECK_TRIGGER(any) &&
     198           0 :                     !CHECK_TRIGGER(disconnect) &&
     199           0 :                     !CHECK_TRIGGER(magic_pkt) &&
     200           0 :                     !CHECK_TRIGGER(gtk_rekey_failure) &&
     201           0 :                     !CHECK_TRIGGER(eap_identity_req) &&
     202           0 :                     !CHECK_TRIGGER(four_way_handshake) &&
     203           0 :                     !CHECK_TRIGGER(rfkill_release)) {
     204           0 :                         wpa_printf(MSG_DEBUG,
     205             :                                    "Unknown/unsupported wowlan trigger '%s'",
     206             :                                    start);
     207           0 :                         os_free(triggers);
     208           0 :                         triggers = NULL;
     209           0 :                         goto out;
     210             :                 }
     211             : 
     212           0 :                 if (last)
     213           0 :                         break;
     214           0 :                 start = end + 1;
     215             :         }
     216             : #undef CHECK_TRIGGER
     217             : 
     218             : out:
     219           0 :         os_free(buf);
     220           0 :         return triggers;
     221             : }
     222             : 
     223             : 
     224          52 : const char * driver_flag_to_string(u64 flag)
     225             : {
     226             : #define DF2S(x) case WPA_DRIVER_FLAGS_ ## x: return #x
     227          52 :         switch (flag) {
     228           0 :         DF2S(DRIVER_IE);
     229           0 :         DF2S(SET_KEYS_AFTER_ASSOC);
     230           0 :         DF2S(DFS_OFFLOAD);
     231           0 :         DF2S(4WAY_HANDSHAKE);
     232           0 :         DF2S(WIRED);
     233           2 :         DF2S(SME);
     234           2 :         DF2S(AP);
     235           2 :         DF2S(SET_KEYS_AFTER_ASSOC_DONE);
     236           2 :         DF2S(HT_2040_COEX);
     237           2 :         DF2S(P2P_CONCURRENT);
     238           0 :         DF2S(P2P_DEDICATED_INTERFACE);
     239           2 :         DF2S(P2P_CAPABLE);
     240           2 :         DF2S(AP_TEARDOWN_SUPPORT);
     241           2 :         DF2S(P2P_MGMT_AND_NON_P2P);
     242           2 :         DF2S(SANE_ERROR_CODES);
     243           2 :         DF2S(OFFCHANNEL_TX);
     244           2 :         DF2S(EAPOL_TX_STATUS);
     245           2 :         DF2S(DEAUTH_TX_STATUS);
     246           0 :         DF2S(BSS_SELECTION);
     247           2 :         DF2S(TDLS_SUPPORT);
     248           2 :         DF2S(TDLS_EXTERNAL_SETUP);
     249           0 :         DF2S(PROBE_RESP_OFFLOAD);
     250           2 :         DF2S(AP_UAPSD);
     251           0 :         DF2S(INACTIVITY_TIMER);
     252           2 :         DF2S(AP_MLME);
     253           2 :         DF2S(SAE);
     254           0 :         DF2S(OBSS_SCAN);
     255           2 :         DF2S(IBSS);
     256           2 :         DF2S(RADAR);
     257           0 :         DF2S(DEDICATED_P2P_DEVICE);
     258           2 :         DF2S(QOS_MAPPING);
     259           2 :         DF2S(AP_CSA);
     260           2 :         DF2S(MESH);
     261           0 :         DF2S(ACS_OFFLOAD);
     262           0 :         DF2S(KEY_MGMT_OFFLOAD);
     263           2 :         DF2S(TDLS_CHANNEL_SWITCH);
     264           2 :         DF2S(HT_IBSS);
     265           2 :         DF2S(VHT_IBSS);
     266           0 :         DF2S(SUPPORT_HW_MODE_ANY);
     267           0 :         DF2S(OFFCHANNEL_SIMULTANEOUS);
     268           2 :         DF2S(FULL_AP_CLIENT_STATE);
     269           0 :         DF2S(P2P_LISTEN_OFFLOAD);
     270             :         }
     271           0 :         return "UNKNOWN";
     272             : #undef DF2S
     273             : }

Generated by: LCOV version 1.10