atheros: Add more robust and complete debug info for ioctl failures
authorJouni Malinen <j@w1.fi>
Sat, 17 Apr 2010 18:45:34 +0000 (21:45 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 17 Apr 2010 18:45:34 +0000 (21:45 +0300)
src/drivers/driver_atheros.c

index d1cd3f7..149805f 100644 (file)
@@ -69,6 +69,108 @@ struct madwifi_driver_data {
 static int madwifi_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
                              int reason_code);
 
+static const char * athr_get_ioctl_name(int op)
+{
+       switch (op) {
+       case IEEE80211_IOCTL_SETPARAM:
+               return "SETPARAM";
+       case IEEE80211_IOCTL_GETPARAM:
+               return "GETPARAM";
+       case IEEE80211_IOCTL_SETKEY:
+               return "SETKEY";
+       case IEEE80211_IOCTL_SETWMMPARAMS:
+               return "SETWMMPARAMS";
+       case IEEE80211_IOCTL_DELKEY:
+               return "DELKEY";
+       case IEEE80211_IOCTL_GETWMMPARAMS:
+               return "GETWMMPARAMS";
+       case IEEE80211_IOCTL_SETMLME:
+               return "SETMLME";
+       case IEEE80211_IOCTL_GETCHANINFO:
+               return "GETCHANINFO";
+       case IEEE80211_IOCTL_SETOPTIE:
+               return "SETOPTIE";
+       case IEEE80211_IOCTL_GETOPTIE:
+               return "GETOPTIE";
+       case IEEE80211_IOCTL_ADDMAC:
+               return "ADDMAC";
+       case IEEE80211_IOCTL_DELMAC:
+               return "DELMAC";
+       case IEEE80211_IOCTL_GETCHANLIST:
+               return "GETCHANLIST";
+       case IEEE80211_IOCTL_SETCHANLIST:
+               return "SETCHANLIST";
+       case IEEE80211_IOCTL_KICKMAC:
+               return "KICKMAC";
+       case IEEE80211_IOCTL_CHANSWITCH:
+               return "CHANSWITCH";
+       case IEEE80211_IOCTL_GETMODE:
+               return "GETMODE";
+       case IEEE80211_IOCTL_SETMODE:
+               return "SETMODE";
+       case IEEE80211_IOCTL_GET_APPIEBUF:
+               return "GET_APPIEBUF";
+       case IEEE80211_IOCTL_SET_APPIEBUF:
+               return "SET_APPIEBUF";
+       case IEEE80211_IOCTL_SET_ACPARAMS:
+               return "SET_ACPARAMS";
+       case IEEE80211_IOCTL_FILTERFRAME:
+               return "FILTERFRAME";
+       case IEEE80211_IOCTL_SET_RTPARAMS:
+               return "SET_RTPARAMS";
+       case IEEE80211_IOCTL_SENDADDBA:
+               return "SENDADDBA";
+       case IEEE80211_IOCTL_GETADDBASTATUS:
+               return "GETADDBASTATUS";
+       case IEEE80211_IOCTL_SENDDELBA:
+               return "SENDDELBA";
+       case IEEE80211_IOCTL_SET_MEDENYENTRY:
+               return "SET_MEDENYENTRY";
+       case IEEE80211_IOCTL_SET_ADDBARESP:
+               return "SET_ADDBARESP";
+       case IEEE80211_IOCTL_GET_MACADDR:
+               return "GET_MACADDR";
+       case IEEE80211_IOCTL_SET_HBRPARAMS:
+               return "SET_HBRPARAMS";
+       case IEEE80211_IOCTL_SET_RXTIMEOUT:
+               return "SET_RXTIMEOUT";
+       case IEEE80211_IOCTL_STA_STATS:
+               return "STA_STATS";
+       case IEEE80211_IOCTL_GETWPAIE:
+               return "GETWPAIE";
+       default:
+               return "??";
+       }
+}
+
+
+static const char * athr_get_param_name(int op)
+{
+       switch (op) {
+       case IEEE80211_IOC_MCASTCIPHER:
+               return "MCASTCIPHER";
+       case IEEE80211_PARAM_MCASTKEYLEN:
+               return "MCASTKEYLEN";
+       case IEEE80211_PARAM_UCASTCIPHERS:
+               return "UCASTCIPHERS";
+       case IEEE80211_PARAM_KEYMGTALGS:
+               return "KEYMGTALGS";
+       case IEEE80211_PARAM_RSNCAPS:
+               return "RSNCAPS";
+       case IEEE80211_PARAM_WPA:
+               return "WPA";
+       case IEEE80211_PARAM_AUTHMODE:
+               return "AUTHMODE";
+       case IEEE80211_PARAM_PRIVACY:
+               return "PRIVACY";
+       case IEEE80211_PARAM_COUNTERMEASURES:
+               return "COUNTERMEASURES";
+       default:
+               return "??";
+       }
+}
+
+
 static int
 set80211priv(struct madwifi_driver_data *drv, int op, void *data, int len)
 {
@@ -98,40 +200,11 @@ set80211priv(struct madwifi_driver_data *drv, int op, void *data, int len)
        }
 
        if (ioctl(drv->ioctl_sock, op, &iwr) < 0) {
-               int first = IEEE80211_IOCTL_SETPARAM;
-               static const char *opnames[] = {
-                       "ioctl[IEEE80211_IOCTL_SETPARAM]",
-                       "ioctl[IEEE80211_IOCTL_GETPARAM]",
-                       "ioctl[IEEE80211_IOCTL_SETKEY]",
-                       "ioctl[IEEE80211_IOCTL_SETWMMPARAMS]",
-                       "ioctl[IEEE80211_IOCTL_DELKEY]",
-                       "ioctl[IEEE80211_IOCTL_GETWMMPARAMS]",
-                       "ioctl[IEEE80211_IOCTL_SETMLME]",
-                       "ioctl[IEEE80211_IOCTL_GETCHANINFO]",
-                       "ioctl[IEEE80211_IOCTL_SETOPTIE]",
-                       "ioctl[IEEE80211_IOCTL_GETOPTIE]",
-                       "ioctl[IEEE80211_IOCTL_ADDMAC]",
-                       "ioctl[IEEE80211_IOCTL_DELMAC]",
-                       "ioctl[IEEE80211_IOCTL_GETCHANLIST]",
-                       "ioctl[IEEE80211_IOCTL_SETCHANLIST]",
-                       "ioctl[IEEE80211_IOCTL_KICKMAC]",
-                       "ioctl[IEEE80211_IOCTL_CHANSWITCH]",
-                       "ioctl[IEEE80211_IOCTL_GETMODE]",
-                       "ioctl[IEEE80211_IOCTL_SETMODE]",
-                       "ioctl[IEEE80211_IOCTL_GET_APPIEBUF]",
-                       "ioctl[IEEE80211_IOCTL_SET_APPIEBUF]",
-                       NULL,
-                       "ioctl[IEEE80211_IOCTL_FILTERFRAME]",
-               };
-               int idx = op - first;
-               if (first <= op &&
-                   idx < (int) (sizeof(opnames) / sizeof(opnames[0])) &&
-                   opnames[idx])
-                       perror(opnames[idx]);
-               else {
-                       perror("ioctl[unknown???]");
-                       wpa_printf(MSG_DEBUG, "Failed ioctl: 0x%x", op);
-               }
+               wpa_printf(MSG_DEBUG, "atheros: %s: %s: ioctl op=0x%x "
+                          "(%s) len=%d failed: %d (%s)",
+                          __func__, drv->iface, op,
+                          athr_get_ioctl_name(op),
+                          len, errno, strerror(errno));
                return -1;
        }
        return 0;
@@ -149,8 +222,9 @@ set80211param(struct madwifi_driver_data *drv, int op, int arg)
 
        if (ioctl(drv->ioctl_sock, IEEE80211_IOCTL_SETPARAM, &iwr) < 0) {
                perror("ioctl[IEEE80211_IOCTL_SETPARAM]");
-               wpa_printf(MSG_DEBUG, "%s: Failed to set parameter (op %d "
-                          "arg %d)", __func__, op, arg);
+               wpa_printf(MSG_DEBUG, "%s: %s: Failed to set parameter (op %d "
+                          "(%s) arg %d)", __func__, drv->iface, op,
+                          athr_get_param_name(op), arg);
                return -1;
        }
        return 0;