Changeset 36465


Ignore:
Timestamp:
2013-04-27T11:45:06+02:00 (5 years ago)
Author:
jow
Message:

AA: iwinfo: merge r34982, r35005, r35007, r35471, r36292, r36339, r36417, r36449, r36450

Location:
branches/attitude_adjustment/package/iwinfo
Files:
6 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/attitude_adjustment/package/iwinfo/Makefile

    r34004 r36465  
    11# 
    2 # Copyright (C) 2010-2012 Jo-Philipp Wich <xm@subsignal.org> 
     2# Copyright (C) 2010-2013 Jo-Philipp Wich <xm@subsignal.org> 
    33# 
    44# This is free software, licensed under the GPL 2 license. 
     
    88 
    99PKG_NAME:=libiwinfo 
    10 PKG_RELEASE:=36 
     10PKG_RELEASE:=43 
    1111 
    1212PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 
     
    4040  CATEGORY:=Languages 
    4141  TITLE:=libiwinfo Lua binding 
    42   DEPENDS:=+libiwinfo +liblua +lua 
     42  DEPENDS:=+libiwinfo +liblua 
    4343  MAINTAINER:=Jo-Philipp Wich <xm@subsignal.org> 
    4444endef 
     
    102102        $(INSTALL_DIR) $(1)/usr/lib 
    103103        $(INSTALL_BIN) $(PKG_BUILD_DIR)/libiwinfo.so $(1)/usr/lib/libiwinfo.so 
     104        $(INSTALL_DIR) $(1)/usr/share/libiwinfo 
     105        $(INSTALL_DATA) $(PKG_BUILD_DIR)/hardware.txt $(1)/usr/share/libiwinfo/hardware.txt 
    104106endef 
    105107 
  • branches/attitude_adjustment/package/iwinfo/src/include/iwinfo.h

    r30825 r36465  
    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 
     
    128133 
    129134struct iwinfo_hardware_entry { 
    130         const char *vendor_name; 
    131         const char *device_name; 
     135        char vendor_name[64]; 
     136        char device_name[64]; 
    132137        uint16_t vendor_id; 
    133138        uint16_t device_id; 
     
    139144 
    140145extern const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[]; 
    141 extern const struct iwinfo_hardware_entry IWINFO_HARDWARE_ENTRIES[]; 
     146 
     147#define IWINFO_HARDWARE_FILE    "/usr/share/libiwinfo/hardware.txt" 
    142148 
    143149 
  • branches/attitude_adjustment/package/iwinfo/src/iwinfo_cli.c

    r30825 r36465  
    1818 
    1919#include <stdio.h> 
     20#include <glob.h> 
    2021 
    2122#include "iwinfo.h" 
     
    736737{ 
    737738        int i; 
     739        char *p; 
    738740        const struct iwinfo_ops *iw; 
    739  
    740         if (argc < 3) 
     741        glob_t globbuf; 
     742 
     743        if (argc > 1 && argc < 3) 
    741744        { 
    742745                fprintf(stderr, 
     
    753756        } 
    754757 
     758        if (argc == 1) 
     759        { 
     760                glob("/sys/class/net/*", 0, NULL, &globbuf); 
     761 
     762                for (i = 0; i < globbuf.gl_pathc; i++) 
     763                { 
     764                        p = strrchr(globbuf.gl_pathv[i], '/'); 
     765 
     766                        if (!p) 
     767                                continue; 
     768 
     769                        iw = iwinfo_backend(++p); 
     770 
     771                        if (!iw) 
     772                                continue; 
     773 
     774                        print_info(iw, p); 
     775                        printf("\n"); 
     776                } 
     777 
     778                globfree(&globbuf); 
     779                return 0; 
     780        } 
     781 
    755782        iw = iwinfo_backend(argv[1]); 
    756783 
  • branches/attitude_adjustment/package/iwinfo/src/iwinfo_lib.c

    r33306 r36465  
    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 
     
    309314}; 
    310315 
    311 /* 
    312  * hardware database 
    313  */ 
    314  
    315 const char VENDOR_UBNT[] = "Ubiquiti"; 
    316 const char VENDOR_ATH[]  = "Atheros"; 
    317 const char VENDOR_RALINK[]  = "RaLink"; 
    318  
    319 const struct iwinfo_hardware_entry IWINFO_HARDWARE_ENTRIES[] = { 
    320 /*      { vendor, model, vendorid, deviceid, subsys vendorid, subsys deviceid, poweroff, freqoff } */ 
    321 #if defined(USE_MADWIFI) || defined(USE_NL80211) 
    322         { VENDOR_UBNT, "PowerStation2 (18V)",   0xffff, 0xffff, 0xffff, 0xb102,  0,     0 }, 
    323         { VENDOR_UBNT, "PowerStation2 (16D)",   0xffff, 0xffff, 0xffff, 0xb202,  0,     0 }, 
    324         { VENDOR_UBNT, "PowerStation2 (EXT)",   0xffff, 0xffff, 0xffff, 0xb302,  0,     0 }, 
    325         { VENDOR_UBNT, "PowerStation5 (22V)",   0xffff, 0xffff, 0xffff, 0xb105,  0,     0 }, 
    326         { VENDOR_UBNT, "PowerStation5 (EXT)",   0xffff, 0xffff, 0xffff, 0xb305,  0,     0 }, 
    327         { VENDOR_UBNT, "PicoStation2",          0xffff, 0xffff, 0xffff, 0xc302,  0,     0 }, 
    328         { VENDOR_UBNT, "PicoStation2 HP",       0xffff, 0xffff, 0xffff, 0xc3a2, 10,     0 }, 
    329         { VENDOR_UBNT, "WispStation5",          0xffff, 0xffff, 0xffff, 0xa105,  0,     0 }, 
    330         { VENDOR_UBNT, "LiteStation2",          0xffff, 0xffff, 0xffff, 0xa002, 10,     0 }, 
    331         { VENDOR_UBNT, "LiteStation5",          0xffff, 0xffff, 0xffff, 0xa005,  5,     0 }, 
    332         { VENDOR_UBNT, "NanoStation2",          0xffff, 0xffff, 0xffff, 0xc002, 10,     0 }, 
    333         { VENDOR_UBNT, "NanoStation5",          0xffff, 0xffff, 0xffff, 0xc005,  5,     0 }, 
    334         { VENDOR_UBNT, "NanoStation Loco2",     0xffff, 0xffff, 0xffff, 0xc102, 10,     0 }, 
    335         { VENDOR_UBNT, "NanoStation Loco5",     0xffff, 0xffff, 0xffff, 0xc105,  5,     0 }, 
    336         { VENDOR_UBNT, "Bullet2",               0xffff, 0xffff, 0xffff, 0xc202, 10,     0 }, 
    337         { VENDOR_UBNT, "Bullet5",               0xffff, 0xffff, 0xffff, 0xc205,  5,     0 }, 
    338         { VENDOR_UBNT, "XR2",                   0x168c, 0x001b, 0x0777, 0x3002, 10,     0 }, 
    339         { VENDOR_UBNT, "XR2",                   0x168c, 0x001b, 0x7777, 0x3002, 10,     0 }, 
    340         { VENDOR_UBNT, "XR2.3",                 0x168c, 0x001b, 0x0777, 0x3b02, 10,     0 }, 
    341         { VENDOR_UBNT, "XR2.6",                 0x168c, 0x001b, 0x0777, 0x3c02, 10,     0 }, 
    342         { VENDOR_UBNT, "XR3-2.8",               0x168c, 0x001b, 0x0777, 0x3b03, 10,     0 }, 
    343         { VENDOR_UBNT, "XR3-3.6",               0x168c, 0x001b, 0x0777, 0x3c03, 10,     0 }, 
    344         { VENDOR_UBNT, "XR3",                   0x168c, 0x001b, 0x0777, 0x3003, 10,     0 }, 
    345         { VENDOR_UBNT, "XR4",                   0x168c, 0x001b, 0x0777, 0x3004, 10,     0 }, 
    346         { VENDOR_UBNT, "XR5",                   0x168c, 0x001b, 0x0777, 0x3005, 10,     0 }, 
    347         { VENDOR_UBNT, "XR5",                   0x168c, 0x001b, 0x7777, 0x3005, 10,     0 }, 
    348         { VENDOR_UBNT, "XR7",                   0x168c, 0x001b, 0x0777, 0x3007, 10,     0 }, 
    349         { VENDOR_UBNT, "XR9",                   0x168c, 0x001b, 0x0777, 0x3009, 10, -1520 }, 
    350         { VENDOR_ATH,  "AR5413",                0x168c, 0x001b, 0x168c, 0x2063,  0,     0 }, 
    351         { VENDOR_UBNT, "SRC",                   0x168c, 0x0013, 0x168c, 0x1042,  1,     0 }, 
    352         { VENDOR_UBNT, "SR2",                   0x168c, 0x0013, 0x0777, 0x2041, 10,     0 }, 
    353         { VENDOR_UBNT, "SR4",                   0x168c, 0x0013, 0x0777, 0x2004,  6,     0 }, 
    354         { VENDOR_UBNT, "SR4",                   0x168c, 0x0013, 0x7777, 0x2004,  6,     0 }, 
    355         { VENDOR_UBNT, "SR4C",                  0x168c, 0x0013, 0x0777, 0x1004,  6,     0 }, 
    356         { VENDOR_UBNT, "SR4C",                  0x168c, 0x0013, 0x7777, 0x1004,  6,     0 }, 
    357         { VENDOR_UBNT, "SR5",                   0x168c, 0x0013, 0x168c, 0x2042,  7,     0 }, 
    358         { VENDOR_UBNT, "SR9",                   0x168c, 0x0013, 0x7777, 0x2009, 12, -1500 }, 
    359         { VENDOR_UBNT, "SR71A",                 0x168c, 0x0027, 0x168c, 0x2082, 10,     0 }, 
    360         { VENDOR_UBNT, "SR71",                  0x168c, 0x0027, 0x0777, 0x4082, 10,     0 }, 
    361 #endif 
    362 #ifdef USE_NL80211 
    363         { VENDOR_UBNT, "PicoStation M2",        0x168c, 0x002a, 0x0777, 0xe302, 12,     0 }, /* ToDo: confirm offset */ 
    364         { VENDOR_UBNT, "NanoStation M2",        0x168c, 0x002a, 0x0777, 0xe012, 12,     0 }, /* ToDo: confirm offset */ 
    365         { VENDOR_UBNT, "NanoStation M5",        0x168c, 0x002a, 0x0777, 0xe005,  5,     0 }, /* ToDo: confirm offset */ 
    366         { VENDOR_UBNT, "Bullet M2",             0x168c, 0x002a, 0x0777, 0xe202, 12,     0 }, 
    367         { VENDOR_UBNT, "Bullet M5",             0x168c, 0x002a, 0x0777, 0xe805,  5,     0 }, 
    368  
    369         { VENDOR_ATH,  "AR9220",                0x168c, 0x0029, 0x168c, 0xa094,  0,     0 }, 
    370         { VENDOR_ATH,  "AR9223",                0x168c, 0x0029, 0x168c, 0xa095,  0,     0 }, 
    371         { VENDOR_ATH,  "AR9280",                0x168c, 0x002a, 0x168c, 0xa093,  0,     0 }, 
    372         { VENDOR_ATH,  "AR9285",                0x168c, 0x002b, 0x168c, 0xa091,  0,     0 }, 
    373         { VENDOR_RALINK,  "Rt3050",             0x1814, 0x3050, 0x1814, 0x0005,  0,     0 }, 
    374         { VENDOR_RALINK,  "Rt3052",             0x1814, 0x3052, 0x1814, 0x0008,  0,     0 }, 
    375         { VENDOR_RALINK,  "Rt3352",             0x1814, 0x3352, 0x1814, 0x000c,  0,     0 }, 
    376 #endif 
    377         { NULL } 
    378 }; 
    379  
    380316 
    381317const char * iwinfo_type(const char *ifname) 
  • branches/attitude_adjustment/package/iwinfo/src/iwinfo_nl80211.c

    r34004 r36465  
    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 
     
    347347        if (freq == 2484) 
    348348                return 14; 
    349  
    350         if (freq < 2484) 
     349        else if (freq < 2484) 
    351350                return (freq - 2407) / 5; 
    352  
    353         return (freq / 5) - 1000; 
     351        else if (freq >= 4910 && freq <= 4980) 
     352                return (freq - 4000) / 5; 
     353        else 
     354                return (freq - 5000) / 5; 
    354355} 
    355356 
    356357static int nl80211_channel2freq(int channel, const char *band) 
    357358{ 
    358         if (channel == 14) 
    359                 return 2484; 
    360  
    361         if ((channel < 14) && (!band || band[0] != 'a')) 
    362                 return (channel * 5) + 2407; 
    363  
    364         if (channel > 0) 
    365                 return (1000 + channel) * 5; 
     359        if (!band || band[0] != 'a') 
     360        { 
     361                if (channel == 14) 
     362                        return 2484; 
     363                else if (channel < 14) 
     364                        return (channel * 5) + 2407; 
     365        } 
     366        else 
     367        { 
     368                if (channel >= 182 && channel <= 196) 
     369                        return (channel * 5) + 4000; 
     370                else 
     371                        return (channel * 5) + 5000; 
     372        } 
    366373 
    367374        return 0; 
     
    449456static char * nl80211_hostapd_info(const char *ifname) 
    450457{ 
     458        int mode; 
    451459        char *phy; 
    452460        char path[32] = { 0 }; 
     
    454462        FILE *conf; 
    455463 
    456         if ((phy = nl80211_ifname2phy(ifname)) != NULL) 
     464        if (nl80211_get_mode(ifname, &mode)) 
     465                return NULL; 
     466 
     467        if ((mode == IWINFO_OPMODE_MASTER || mode == IWINFO_OPMODE_AP_VLAN) && 
     468            (phy = nl80211_ifname2phy(ifname)) != NULL) 
    457469        { 
    458470                snprintf(path, sizeof(path), "/var/run/hostapd-%s.conf", phy); 
     
    717729} 
    718730 
     731 
     732static int nl80211_get_mode_cb(struct nl_msg *msg, void *arg) 
     733{ 
     734        int *mode = arg; 
     735        struct nlattr **tb = nl80211_parse(msg); 
     736        const int ifmodes[NL80211_IFTYPE_MAX + 1] = { 
     737                IWINFO_OPMODE_UNKNOWN,          /* unspecified */ 
     738                IWINFO_OPMODE_ADHOC,            /* IBSS */ 
     739                IWINFO_OPMODE_CLIENT,           /* managed */ 
     740                IWINFO_OPMODE_MASTER,           /* AP */ 
     741                IWINFO_OPMODE_AP_VLAN,          /* AP/VLAN */ 
     742                IWINFO_OPMODE_WDS,                      /* WDS */ 
     743                IWINFO_OPMODE_MONITOR,          /* monitor */ 
     744                IWINFO_OPMODE_MESHPOINT,        /* mesh point */ 
     745                IWINFO_OPMODE_P2P_CLIENT,       /* P2P-client */ 
     746                IWINFO_OPMODE_P2P_GO,           /* P2P-GO */ 
     747        }; 
     748 
     749        if (tb[NL80211_ATTR_IFTYPE]) 
     750                *mode = ifmodes[nla_get_u32(tb[NL80211_ATTR_IFTYPE])]; 
     751 
     752        return NL_SKIP; 
     753} 
     754 
    719755int nl80211_get_mode(const char *ifname, int *buf) 
    720756{ 
    721         return wext_get_mode(ifname, buf); 
     757        char *res; 
     758        struct nl80211_msg_conveyor *req; 
     759 
     760        res = nl80211_phy2ifname(ifname); 
     761        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_INTERFACE, 0); 
     762        *buf = IWINFO_OPMODE_UNKNOWN; 
     763 
     764        if (req) 
     765        { 
     766                nl80211_send(req, nl80211_get_mode_cb, buf); 
     767                nl80211_free(req); 
     768        } 
     769 
     770        return (*buf == IWINFO_OPMODE_UNKNOWN) ? -1 : 0; 
     771} 
     772 
     773 
     774struct nl80211_ssid_bssid { 
     775        unsigned char *ssid; 
     776        unsigned char bssid[7]; 
     777}; 
     778 
     779static int nl80211_get_ssid_bssid_cb(struct nl_msg *msg, void *arg) 
     780{ 
     781        int ielen; 
     782        unsigned char *ie; 
     783        struct nl80211_ssid_bssid *sb = arg; 
     784        struct nlattr **tb = nl80211_parse(msg); 
     785        struct nlattr *bss[NL80211_BSS_MAX + 1]; 
     786 
     787        static struct nla_policy bss_policy[NL80211_BSS_MAX + 1] = { 
     788                [NL80211_BSS_INFORMATION_ELEMENTS] = {                 }, 
     789                [NL80211_BSS_STATUS]               = { .type = NLA_U32 }, 
     790        }; 
     791 
     792        if (!tb[NL80211_ATTR_BSS] || 
     793            nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS], 
     794                             bss_policy) || 
     795            !bss[NL80211_BSS_BSSID] || 
     796            !bss[NL80211_BSS_STATUS] || 
     797            !bss[NL80211_BSS_INFORMATION_ELEMENTS]) 
     798        { 
     799                return NL_SKIP; 
     800        } 
     801 
     802        switch (nla_get_u32(bss[NL80211_BSS_STATUS])) 
     803        { 
     804        case NL80211_BSS_STATUS_ASSOCIATED: 
     805        case NL80211_BSS_STATUS_AUTHENTICATED: 
     806        case NL80211_BSS_STATUS_IBSS_JOINED: 
     807 
     808                if (sb->ssid) 
     809                { 
     810                        ie = nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]); 
     811                        ielen = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]); 
     812 
     813                        while (ielen >= 2 && ielen >= ie[1]) 
     814                        { 
     815                                if (ie[0] == 0) 
     816                                { 
     817                                        memcpy(sb->ssid, ie + 2, min(ie[1], IWINFO_ESSID_MAX_SIZE)); 
     818                                        return NL_SKIP; 
     819                                } 
     820 
     821                                ielen -= ie[1] + 2; 
     822                                ie += ie[1] + 2; 
     823                        } 
     824                } 
     825                else 
     826                { 
     827                        sb->bssid[0] = 1; 
     828                        memcpy(sb->bssid + 1, nla_data(bss[NL80211_BSS_BSSID]), 6); 
     829                        return NL_SKIP; 
     830                } 
     831 
     832        default: 
     833                return NL_SKIP; 
     834        } 
    722835} 
    723836 
    724837int nl80211_get_ssid(const char *ifname, char *buf) 
    725838{ 
    726         char *ssid; 
    727  
    728         if (!wext_get_ssid(ifname, buf)) 
    729         { 
     839        char *res; 
     840        struct nl80211_msg_conveyor *req; 
     841        struct nl80211_ssid_bssid sb; 
     842 
     843        /* try to find ssid from scan dump results */ 
     844        res = nl80211_phy2ifname(ifname); 
     845        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_SCAN, NLM_F_DUMP); 
     846 
     847        sb.ssid = buf; 
     848        *buf = 0; 
     849 
     850        if (req) 
     851        { 
     852                nl80211_send(req, nl80211_get_ssid_bssid_cb, &sb); 
     853                nl80211_free(req); 
     854        } 
     855 
     856        /* failed, try to find from hostapd info */ 
     857        if ((*buf == 0) && 
     858            (res = nl80211_hostapd_info(ifname)) && 
     859            (res = nl80211_getval(ifname, res, "ssid"))) 
     860        { 
     861                memcpy(buf, res, strlen(res)); 
     862        } 
     863 
     864        return (*buf == 0) ? -1 : 0; 
     865} 
     866 
     867int nl80211_get_bssid(const char *ifname, char *buf) 
     868{ 
     869        char *res; 
     870        struct nl80211_msg_conveyor *req; 
     871        struct nl80211_ssid_bssid sb; 
     872 
     873        /* try to find bssid from scan dump results */ 
     874        res = nl80211_phy2ifname(ifname); 
     875        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_SCAN, NLM_F_DUMP); 
     876 
     877        sb.ssid = NULL; 
     878        sb.bssid[0] = 0; 
     879 
     880        if (req) 
     881        { 
     882                nl80211_send(req, nl80211_get_ssid_bssid_cb, &sb); 
     883                nl80211_free(req); 
     884        } 
     885 
     886        /* failed, try to find mac from hostapd info */ 
     887        if ((sb.bssid[0] == 0) && 
     888            (res = nl80211_hostapd_info(ifname)) && 
     889            (res = nl80211_getval(ifname, res, "bssid"))) 
     890        { 
     891                sb.bssid[0] = 1; 
     892                sb.bssid[1] = strtol(&res[0],  NULL, 16); 
     893                sb.bssid[2] = strtol(&res[3],  NULL, 16); 
     894                sb.bssid[3] = strtol(&res[6],  NULL, 16); 
     895                sb.bssid[4] = strtol(&res[9],  NULL, 16); 
     896                sb.bssid[5] = strtol(&res[12], NULL, 16); 
     897                sb.bssid[6] = strtol(&res[15], NULL, 16); 
     898        } 
     899 
     900        if (sb.bssid[0]) 
     901        { 
     902                sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", 
     903                        sb.bssid[1], sb.bssid[2], sb.bssid[3], 
     904                        sb.bssid[4], sb.bssid[5], sb.bssid[6]); 
     905 
    730906                return 0; 
    731907        } 
    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         } 
    738908 
    739909        return -1; 
    740910} 
    741911 
    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) 
     912 
     913static int nl80211_get_frequency_scan_cb(struct nl_msg *msg, void *arg) 
    772914{ 
    773915        int *freq = arg; 
     
    790932} 
    791933 
     934static int nl80211_get_frequency_info_cb(struct nl_msg *msg, void *arg) 
     935{ 
     936        int *freq = arg; 
     937        struct nlattr **tb = nl80211_parse(msg); 
     938 
     939        if (tb[NL80211_ATTR_WIPHY_FREQ]) 
     940                *freq = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]); 
     941 
     942        return NL_SKIP; 
     943} 
     944 
    792945int nl80211_get_frequency(const char *ifname, int *buf) 
    793946{ 
     947        int chn; 
    794948        char *res, *channel; 
    795949        struct nl80211_msg_conveyor *req; 
    796950 
     951        /* try to find frequency from interface info */ 
     952        res = nl80211_phy2ifname(ifname); 
     953        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_INTERFACE, 0); 
    797954        *buf = 0; 
    798955 
    799         if ((res = nl80211_hostapd_info(ifname)) && 
     956        if (req) 
     957        { 
     958                nl80211_send(req, nl80211_get_frequency_info_cb, buf); 
     959                nl80211_free(req); 
     960        } 
     961 
     962        /* failed, try to find frequency from hostapd info */ 
     963        if ((*buf == 0) && 
     964            (res = nl80211_hostapd_info(ifname)) && 
    800965            (channel = nl80211_getval(NULL, res, "channel"))) 
    801966        { 
    802                 *buf = nl80211_channel2freq(atoi(channel), 
    803                                             nl80211_getval(NULL, res, "hw_mode")); 
     967                chn = atoi(channel); 
     968                *buf = nl80211_channel2freq(chn, nl80211_getval(NULL, res, "hw_mode")); 
    804969        } 
    805970        else 
    806971        { 
    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); 
     972                /* failed, try to find frequency from scan results */ 
     973                if (*buf == 0) 
     974                { 
     975                        res = nl80211_phy2ifname(ifname); 
     976                        req = nl80211_msg(res ? res : ifname, NL80211_CMD_GET_SCAN, 
     977                                          NLM_F_DUMP); 
     978 
     979                        if (req) 
     980                        { 
     981                                nl80211_send(req, nl80211_get_frequency_scan_cb, buf); 
     982                                nl80211_free(req); 
     983                        } 
    814984                } 
    815985        } 
     
    8321002int nl80211_get_txpower(const char *ifname, int *buf) 
    8331003{ 
     1004#if 0 
     1005        char *res; 
     1006        char path[PATH_MAX]; 
     1007 
     1008        res = nl80211_ifname2phy(ifname); 
     1009        snprintf(path, sizeof(path), "/sys/kernel/debug/ieee80211/%s/power", 
     1010                 res ? res : ifname); 
     1011 
     1012        if ((*buf = nl80211_readint(path)) > -1) 
     1013                return 0; 
     1014#endif 
     1015 
    8341016        return wext_get_txpower(ifname, buf); 
    8351017} 
     
    9321114        struct nl80211_rssi_rate rr; 
    9331115 
    934         if (!wext_get_bitrate(ifname, buf)) 
    935                 return 0; 
    936  
    9371116        nl80211_fill_signal(ifname, &rr); 
    9381117 
     
    9491128{ 
    9501129        struct nl80211_rssi_rate rr; 
    951  
    952         if (!wext_get_signal(ifname, buf)) 
    953                 return 0; 
    9541130 
    9551131        nl80211_fill_signal(ifname, &rr); 
     
    10191195        int signal; 
    10201196 
    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; 
     1197        if (!nl80211_get_signal(ifname, &signal)) 
     1198        { 
     1199                /* A positive signal level is usually just a quality 
     1200                 * value, pass through as-is */ 
     1201                if (signal >= 0) 
     1202                { 
     1203                        *buf = signal; 
     1204                } 
     1205 
     1206                /* The cfg80211 wext compat layer assumes a signal range 
     1207                 * of -110 dBm to -40 dBm, the quality value is derived 
     1208                 * by adding 110 to the signal level */ 
     1209                else 
     1210                { 
     1211                        if (signal < -110) 
     1212                                signal = -110; 
     1213                        else if (signal > -40) 
     1214                                signal = -40; 
     1215 
     1216                        *buf = (signal + 110); 
     1217                } 
     1218 
     1219                return 0; 
     1220        } 
     1221 
     1222        return -1; 
    10501223} 
    10511224 
    10521225int nl80211_get_quality_max(const char *ifname, int *buf) 
    10531226{ 
    1054         if (wext_get_quality_max(ifname, buf)) 
    1055                 /* The cfg80211 wext compat layer assumes a maximum 
    1056                  * quality of 70 */ 
    1057                 *buf = 70; 
     1227        /* The cfg80211 wext compat layer assumes a maximum 
     1228         * quality of 70 */ 
     1229        *buf = 70; 
    10581230 
    10591231        return 0; 
  • branches/attitude_adjustment/package/iwinfo/src/iwinfo_utils.c

    r33199 r36465  
    2929{ 
    3030        /* Prepare socket */ 
    31         if( ioctl_socket == -1 ) 
     31        if (ioctl_socket == -1) 
    3232        { 
    3333                ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0); 
     
    8383        strncpy(ifr.ifr_name, ifname, IFNAMSIZ); 
    8484 
    85         if( iwinfo_ioctl(SIOCGIFFLAGS, &ifr) ) 
     85        if (iwinfo_ioctl(SIOCGIFFLAGS, &ifr)) 
    8686                return 0; 
    8787 
     
    9797        strncpy(ifr.ifr_name, ifname, IFNAMSIZ); 
    9898 
    99         if( iwinfo_ioctl(SIOCGIFFLAGS, &ifr) ) 
     99        if (iwinfo_ioctl(SIOCGIFFLAGS, &ifr)) 
    100100                return 0; 
    101101 
     
    111111        strncpy(ifr.ifr_name, ifname, IFNAMSIZ); 
    112112 
    113         if( iwinfo_ioctl(SIOCGIFHWADDR, &ifr) ) 
     113        if (iwinfo_ioctl(SIOCGIFHWADDR, &ifr)) 
    114114                return 0; 
    115115 
     
    122122void iwinfo_close(void) 
    123123{ 
    124         if( ioctl_socket > -1 ) 
     124        if (ioctl_socket > -1) 
    125125                close(ioctl_socket); 
     126 
     127        ioctl_socket = -1; 
    126128} 
    127129 
    128130struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id) 
    129131{ 
    130         const struct iwinfo_hardware_entry *e; 
    131  
    132         for (e = IWINFO_HARDWARE_ENTRIES; e->vendor_name; e++) 
    133         { 
    134                 if ((e->vendor_id != 0xffff) && (e->vendor_id != id->vendor_id)) 
    135                         continue; 
    136  
    137                 if ((e->device_id != 0xffff) && (e->device_id != id->device_id)) 
    138                         continue; 
    139  
    140                 if ((e->subsystem_vendor_id != 0xffff) && 
    141                         (e->subsystem_vendor_id != id->subsystem_vendor_id)) 
    142                         continue; 
    143  
    144                 if ((e->subsystem_device_id != 0xffff) && 
    145                         (e->subsystem_device_id != id->subsystem_device_id)) 
    146                         continue; 
    147  
    148                 return (struct iwinfo_hardware_entry *)e; 
    149         } 
     132        FILE *db; 
     133        char buf[256] = { 0 }; 
     134        static struct iwinfo_hardware_entry e; 
     135 
     136        if (!(db = fopen(IWINFO_HARDWARE_FILE, "r"))) 
     137                return NULL; 
     138 
     139        while (fgets(buf, sizeof(buf) - 1, db) != NULL) 
     140        { 
     141                memset(&e, 0, sizeof(e)); 
     142 
     143                if (sscanf(buf, "%hx %hx %hx %hx %hd %hd \"%63[^\"]\" \"%63[^\"]\"", 
     144                               &e.vendor_id, &e.device_id, 
     145                               &e.subsystem_vendor_id, &e.subsystem_device_id, 
     146                               &e.txpower_offset, &e.frequency_offset, 
     147                               e.vendor_name, e.device_name) < 8) 
     148                        continue; 
     149 
     150                if ((e.vendor_id != 0xffff) && (e.vendor_id != id->vendor_id)) 
     151                        continue; 
     152 
     153                if ((e.device_id != 0xffff) && (e.device_id != id->device_id)) 
     154                        continue; 
     155 
     156                if ((e.subsystem_vendor_id != 0xffff) && 
     157                        (e.subsystem_vendor_id != id->subsystem_vendor_id)) 
     158                        continue; 
     159 
     160                if ((e.subsystem_device_id != 0xffff) && 
     161                        (e.subsystem_device_id != id->subsystem_device_id)) 
     162                        continue; 
     163 
     164                break; 
     165        } 
     166 
     167        fclose(db); 
     168 
     169        if (e.device_name[0]) 
     170                return &e; 
    150171 
    151172        return NULL; 
Note: See TracChangeset for help on using the changeset viewer.