Changeset 34982


Ignore:
Timestamp:
2013-01-02T20:10:29+01:00 (5 years ago)
Author:
jow
Message:

iwinfo: replace more wext calls with nl80211 equivalents, attempt to infer nl80211 tx power from debugfs before querying wext

Location:
trunk/package/network/utils/iwinfo
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/network/utils/iwinfo/Makefile

    r34003 r34982  
    88 
    99PKG_NAME:=libiwinfo 
    10 PKG_RELEASE:=36 
     10PKG_RELEASE:=37 
    1111 
    1212PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 
  • trunk/package/network/utils/iwinfo/src/include/iwinfo.h

    r30825 r34982  
    5151 
    5252enum iwinfo_opmode { 
    53         IWINFO_OPMODE_UNKNOWN = 0, 
    54         IWINFO_OPMODE_MASTER  = 1, 
    55         IWINFO_OPMODE_ADHOC   = 2, 
    56         IWINFO_OPMODE_CLIENT  = 3, 
    57         IWINFO_OPMODE_MONITOR = 4, 
     53        IWINFO_OPMODE_UNKNOWN    = 0, 
     54        IWINFO_OPMODE_MASTER     = 1, 
     55        IWINFO_OPMODE_ADHOC      = 2, 
     56        IWINFO_OPMODE_CLIENT     = 3, 
     57        IWINFO_OPMODE_MONITOR    = 4, 
     58        IWINFO_OPMODE_AP_VLAN    = 5, 
     59        IWINFO_OPMODE_WDS        = 6, 
     60        IWINFO_OPMODE_MESHPOINT  = 7, 
     61        IWINFO_OPMODE_P2P_CLIENT = 8, 
     62        IWINFO_OPMODE_P2P_GO     = 9, 
    5863}; 
    5964 
  • trunk/package/network/utils/iwinfo/src/iwinfo_lib.c

    r33306 r34982  
    22 * iwinfo - Wireless Information Library - Lua Bindings 
    33 * 
    4  *   Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org> 
     4 *   Copyright (C) 2009-2013 Jo-Philipp Wich <xm@subsignal.org> 
    55 * 
    66 * The iwinfo library is free software: you can redistribute it and/or 
     
    5151        "Client", 
    5252        "Monitor", 
     53        "Master (VLAN)", 
     54        "WDS", 
     55        "Mesh Point", 
     56        "P2P Client", 
     57        "P2P Go", 
    5358}; 
    5459 
  • trunk/package/network/utils/iwinfo/src/iwinfo_nl80211.c

    r34003 r34982  
    22 * iwinfo - Wireless Information Library - NL80211 Backend 
    33 * 
    4  *   Copyright (C) 2010 Jo-Philipp Wich <xm@subsignal.org> 
     4 *   Copyright (C) 2010-2013 Jo-Philipp Wich <xm@subsignal.org> 
    55 * 
    66 * The iwinfo library is free software: you can redistribute it and/or 
     
    449449static char * nl80211_hostapd_info(const char *ifname) 
    450450{ 
     451        int mode; 
    451452        char *phy; 
    452453        char path[32] = { 0 }; 
     
    454455        FILE *conf; 
    455456 
    456         if ((phy = nl80211_ifname2phy(ifname)) != NULL) 
     457        if (nl80211_get_mode(ifname, &mode)) 
     458                return NULL; 
     459 
     460        if ((mode == IWINFO_OPMODE_MASTER || mode == IWINFO_OPMODE_AP_VLAN) && 
     461            (phy = nl80211_ifname2phy(ifname)) != NULL) 
    457462        { 
    458463                snprintf(path, sizeof(path), "/var/run/hostapd-%s.conf", phy); 
     
    717722} 
    718723 
     724 
     725static int nl80211_get_mode_cb(struct nl_msg *msg, void *arg) 
     726{ 
     727        int *mode = arg; 
     728        struct nlattr **tb = nl80211_parse(msg); 
     729        const int ifmodes[NL80211_IFTYPE_MAX + 1] = { 
     730                IWINFO_OPMODE_UNKNOWN,          /* unspecified */ 
     731                IWINFO_OPMODE_ADHOC,            /* IBSS */ 
     732                IWINFO_OPMODE_CLIENT,           /* managed */ 
     733                IWINFO_OPMODE_MASTER,           /* AP */ 
     734                IWINFO_OPMODE_AP_VLAN,          /* AP/VLAN */ 
     735                IWINFO_OPMODE_WDS,                      /* WDS */ 
     736                IWINFO_OPMODE_MONITOR,          /* monitor */ 
     737                IWINFO_OPMODE_MESHPOINT,        /* mesh point */ 
     738                IWINFO_OPMODE_P2P_CLIENT,       /* P2P-client */ 
     739                IWINFO_OPMODE_P2P_GO,           /* P2P-GO */ 
     740        }; 
     741 
     742        if (tb[NL80211_ATTR_IFTYPE]) 
     743                *mode = ifmodes[nla_get_u32(tb[NL80211_ATTR_IFTYPE])]; 
     744 
     745        return NL_SKIP; 
     746} 
     747 
    719748int nl80211_get_mode(const char *ifname, int *buf) 
    720749{ 
    721         return wext_get_mode(ifname, buf); 
     750        char *res; 
     751        struct nl80211_msg_conveyor *req; 
     752 
     753        res = nl80211_phy2ifname(ifname); 
     754        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_INTERFACE, 0); 
     755        *buf = IWINFO_OPMODE_UNKNOWN; 
     756 
     757        if (req) 
     758        { 
     759                nl80211_send(req, nl80211_get_mode_cb, buf); 
     760                nl80211_free(req); 
     761        } 
     762 
     763        return (*buf == IWINFO_OPMODE_UNKNOWN) ? -1 : 0; 
     764} 
     765 
     766 
     767struct nl80211_ssid_bssid { 
     768        unsigned char *ssid; 
     769        unsigned char bssid[7]; 
     770}; 
     771 
     772static int nl80211_get_ssid_bssid_cb(struct nl_msg *msg, void *arg) 
     773{ 
     774        int ielen; 
     775        unsigned char *ie; 
     776        struct nl80211_ssid_bssid *sb = arg; 
     777        struct nlattr **tb = nl80211_parse(msg); 
     778        struct nlattr *bss[NL80211_BSS_MAX + 1]; 
     779 
     780        static struct nla_policy bss_policy[NL80211_BSS_MAX + 1] = { 
     781                [NL80211_BSS_INFORMATION_ELEMENTS] = {                 }, 
     782                [NL80211_BSS_STATUS]               = { .type = NLA_U32 }, 
     783        }; 
     784 
     785        if (!tb[NL80211_ATTR_BSS] || 
     786            nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS], 
     787                             bss_policy) || 
     788            !bss[NL80211_BSS_BSSID] || 
     789            !bss[NL80211_BSS_STATUS] || 
     790            !bss[NL80211_BSS_INFORMATION_ELEMENTS]) 
     791        { 
     792                return NL_SKIP; 
     793        } 
     794 
     795        switch (nla_get_u32(bss[NL80211_BSS_STATUS])) 
     796        { 
     797        case NL80211_BSS_STATUS_ASSOCIATED: 
     798        case NL80211_BSS_STATUS_AUTHENTICATED: 
     799        case NL80211_BSS_STATUS_IBSS_JOINED: 
     800 
     801                if (sb->ssid) 
     802                { 
     803                        ie = nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]); 
     804                        ielen = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]); 
     805 
     806                        while (ielen >= 2 && ielen >= ie[1]) 
     807                        { 
     808                                if (ie[0] == 0) 
     809                                { 
     810                                        memcpy(sb->ssid, ie + 2, min(ie[1], IWINFO_ESSID_MAX_SIZE)); 
     811                                        return NL_SKIP; 
     812                                } 
     813 
     814                                ielen -= ie[1] + 2; 
     815                                ie += ie[1] + 2; 
     816                        } 
     817                } 
     818                else 
     819                { 
     820                        sb->bssid[0] = 1; 
     821                        memcpy(sb->bssid + 1, nla_data(bss[NL80211_BSS_BSSID]), 6); 
     822                        return NL_SKIP; 
     823                } 
     824 
     825        default: 
     826                return NL_SKIP; 
     827        } 
    722828} 
    723829 
    724830int nl80211_get_ssid(const char *ifname, char *buf) 
    725831{ 
    726         char *ssid; 
    727  
    728         if (!wext_get_ssid(ifname, buf)) 
    729         { 
     832        char *res; 
     833        struct nl80211_msg_conveyor *req; 
     834        struct nl80211_ssid_bssid sb; 
     835 
     836        /* try to find ssid from scan dump results */ 
     837        res = nl80211_phy2ifname(ifname); 
     838        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_SCAN, NLM_F_DUMP); 
     839 
     840        sb.ssid = buf; 
     841        *buf = 0; 
     842 
     843        if (req) 
     844        { 
     845                nl80211_send(req, nl80211_get_ssid_bssid_cb, &sb); 
     846                nl80211_free(req); 
     847        } 
     848 
     849        /* failed, try to find from hostapd info */ 
     850        if ((*buf == 0) && 
     851            (res = nl80211_hostapd_info(ifname)) && 
     852            (res = nl80211_getval(ifname, res, "ssid"))) 
     853        { 
     854                memcpy(buf, res, strlen(res)); 
     855        } 
     856 
     857        return (*buf == 0) ? -1 : 0; 
     858} 
     859 
     860int nl80211_get_bssid(const char *ifname, char *buf) 
     861{ 
     862        char *res; 
     863        struct nl80211_msg_conveyor *req; 
     864        struct nl80211_ssid_bssid sb; 
     865 
     866        /* try to find bssid from scan dump results */ 
     867        res = nl80211_phy2ifname(ifname); 
     868        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_SCAN, NLM_F_DUMP); 
     869 
     870        sb.ssid = NULL; 
     871        sb.bssid[0] = 0; 
     872 
     873        if (req) 
     874        { 
     875                nl80211_send(req, nl80211_get_ssid_bssid_cb, &sb); 
     876                nl80211_free(req); 
     877        } 
     878 
     879        /* failed, try to find mac from hostapd info */ 
     880        if ((sb.bssid[0] == 0) && 
     881            (res = nl80211_hostapd_info(ifname)) && 
     882            (res = nl80211_getval(ifname, res, "bssid"))) 
     883        { 
     884                sb.bssid[0] = 1; 
     885                sb.bssid[1] = strtol(&res[0],  NULL, 16); 
     886                sb.bssid[2] = strtol(&res[3],  NULL, 16); 
     887                sb.bssid[3] = strtol(&res[6],  NULL, 16); 
     888                sb.bssid[4] = strtol(&res[9],  NULL, 16); 
     889                sb.bssid[5] = strtol(&res[12], NULL, 16); 
     890                sb.bssid[6] = strtol(&res[15], NULL, 16); 
     891        } 
     892 
     893        if (sb.bssid[0]) 
     894        { 
     895                sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", 
     896                        sb.bssid[1], sb.bssid[2], sb.bssid[3], 
     897                        sb.bssid[4], sb.bssid[5], sb.bssid[6]); 
     898 
    730899                return 0; 
    731900        } 
    732         else if ((ssid = nl80211_hostapd_info(ifname)) && 
    733                  (ssid = nl80211_getval(ifname, ssid, "ssid"))) 
    734         { 
    735                 memcpy(buf, ssid, strlen(ssid)); 
    736                 return 0; 
    737         } 
    738901 
    739902        return -1; 
    740903} 
    741904 
    742 int nl80211_get_bssid(const char *ifname, char *buf) 
    743 { 
    744         char *bssid; 
    745         unsigned char mac[6]; 
    746  
    747         if (!wext_get_bssid(ifname, buf)) 
    748         { 
    749                 return 0; 
    750         } 
    751         else if ((bssid = nl80211_hostapd_info(ifname)) && 
    752                  (bssid = nl80211_getval(ifname, bssid, "bssid"))) 
    753         { 
    754                 mac[0] = strtol(&bssid[0],  NULL, 16); 
    755                 mac[1] = strtol(&bssid[3],  NULL, 16); 
    756                 mac[2] = strtol(&bssid[6],  NULL, 16); 
    757                 mac[3] = strtol(&bssid[9],  NULL, 16); 
    758                 mac[4] = strtol(&bssid[12], NULL, 16); 
    759                 mac[5] = strtol(&bssid[15], NULL, 16); 
    760  
    761                 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", 
    762                         mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 
    763  
    764                 return 0; 
    765         } 
    766  
    767         return -1; 
    768 } 
    769  
    770  
    771 static int nl80211_get_frequency_cb(struct nl_msg *msg, void *arg) 
     905 
     906static int nl80211_get_frequency_scan_cb(struct nl_msg *msg, void *arg) 
    772907{ 
    773908        int *freq = arg; 
     
    790925} 
    791926 
     927static int nl80211_get_frequency_info_cb(struct nl_msg *msg, void *arg) 
     928{ 
     929        int *freq = arg; 
     930        struct nlattr **tb = nl80211_parse(msg); 
     931 
     932        if (tb[NL80211_ATTR_WIPHY_FREQ]) 
     933                *freq = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]); 
     934 
     935        return NL_SKIP; 
     936} 
     937 
    792938int nl80211_get_frequency(const char *ifname, int *buf) 
    793939{ 
     
    795941        struct nl80211_msg_conveyor *req; 
    796942 
     943        /* try to find frequency from interface info */ 
     944        res = nl80211_phy2ifname(ifname); 
     945        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_INTERFACE, 0); 
    797946        *buf = 0; 
    798947 
    799         if ((res = nl80211_hostapd_info(ifname)) && 
     948        if (req) 
     949        { 
     950                nl80211_send(req, nl80211_get_frequency_info_cb, buf); 
     951                nl80211_free(req); 
     952        } 
     953 
     954        /* failed, try to find frequency from hostapd info */ 
     955        if ((*buf == 0) && 
     956            (res = nl80211_hostapd_info(ifname)) && 
    800957            (channel = nl80211_getval(NULL, res, "channel"))) 
    801958        { 
     
    805962        else 
    806963        { 
    807                 res = nl80211_phy2ifname(ifname); 
    808                 req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_SCAN, NLM_F_DUMP); 
    809  
    810                 if (req) 
    811                 { 
    812                         nl80211_send(req, nl80211_get_frequency_cb, buf); 
    813                         nl80211_free(req); 
     964                /* failed, try to find frequency from scan results */ 
     965                if (*buf == 0) 
     966                { 
     967                        res = nl80211_phy2ifname(ifname); 
     968                        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_SCAN, 
     969                                          NLM_F_DUMP); 
     970 
     971                        if (req) 
     972                        { 
     973                                nl80211_send(req, nl80211_get_frequency_scan_cb, buf); 
     974                                nl80211_free(req); 
     975                        } 
    814976                } 
    815977        } 
     
    832994int nl80211_get_txpower(const char *ifname, int *buf) 
    833995{ 
     996        char *res; 
     997        char path[PATH_MAX]; 
     998 
     999        res = nl80211_ifname2phy(ifname); 
     1000        snprintf(path, sizeof(path), "/sys/kernel/debug/ieee80211/%s/power", 
     1001                 res ? res : ifname); 
     1002 
     1003        if ((*buf = nl80211_readint(path)) > -1) 
     1004                return 0; 
     1005 
    8341006        return wext_get_txpower(ifname, buf); 
    8351007} 
     
    9321104        struct nl80211_rssi_rate rr; 
    9331105 
    934         if (!wext_get_bitrate(ifname, buf)) 
    935                 return 0; 
    936  
    9371106        nl80211_fill_signal(ifname, &rr); 
    9381107 
     
    9491118{ 
    9501119        struct nl80211_rssi_rate rr; 
    951  
    952         if (!wext_get_signal(ifname, buf)) 
    953                 return 0; 
    9541120 
    9551121        nl80211_fill_signal(ifname, &rr); 
     
    10191185        int signal; 
    10201186 
    1021         if (wext_get_quality(ifname, buf)) 
    1022         { 
    1023                 *buf = 0; 
    1024  
    1025                 if (!nl80211_get_signal(ifname, &signal)) 
    1026                 { 
    1027                         /* A positive signal level is usually just a quality 
    1028                          * value, pass through as-is */ 
    1029                         if (signal >= 0) 
    1030                         { 
    1031                                 *buf = signal; 
    1032                         } 
    1033  
    1034                         /* The cfg80211 wext compat layer assumes a signal range 
    1035                          * of -110 dBm to -40 dBm, the quality value is derived 
    1036                          * by adding 110 to the signal level */ 
    1037                         else 
    1038                         { 
    1039                                 if (signal < -110) 
    1040                                         signal = -110; 
    1041                                 else if (signal > -40) 
    1042                                         signal = -40; 
    1043  
    1044                                 *buf = (signal + 110); 
    1045                         } 
    1046                 } 
    1047         } 
    1048  
    1049         return 0; 
     1187        if (!nl80211_get_signal(ifname, &signal)) 
     1188        { 
     1189                /* A positive signal level is usually just a quality 
     1190                 * value, pass through as-is */ 
     1191                if (signal >= 0) 
     1192                { 
     1193                        *buf = signal; 
     1194                } 
     1195 
     1196                /* The cfg80211 wext compat layer assumes a signal range 
     1197                 * of -110 dBm to -40 dBm, the quality value is derived 
     1198                 * by adding 110 to the signal level */ 
     1199                else 
     1200                { 
     1201                        if (signal < -110) 
     1202                                signal = -110; 
     1203                        else if (signal > -40) 
     1204                                signal = -40; 
     1205 
     1206                        *buf = (signal + 110); 
     1207                } 
     1208 
     1209                return 0; 
     1210        } 
     1211 
     1212        return -1; 
    10501213} 
    10511214 
    10521215int nl80211_get_quality_max(const char *ifname, int *buf) 
    10531216{ 
    1054         if (wext_get_quality_max(ifname, buf)) 
    1055                 /* The cfg80211 wext compat layer assumes a maximum 
    1056                  * quality of 70 */ 
    1057                 *buf = 70; 
     1217        /* The cfg80211 wext compat layer assumes a maximum 
     1218         * quality of 70 */ 
     1219        *buf = 70; 
    10581220 
    10591221        return 0; 
Note: See TracChangeset for help on using the changeset viewer.