libs/iwinfo: support freqlist() on madwifi master devices
authorJo-Philipp Wich <jow@openwrt.org>
Sat, 21 Nov 2009 01:40:48 +0000 (01:40 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sat, 21 Nov 2009 01:40:48 +0000 (01:40 +0000)
libs/iwinfo/src/iwinfo_madwifi.c

index 99c02dcd053dc99e6313ee3dc88f5c3b6f402ff2..83829cf399440c7e254813c9a82b2c54038f7f3c 100644 (file)
@@ -497,16 +497,39 @@ int madwifi_get_scanlist(const char *ifname, char *buf, int *len)
 int madwifi_get_freqlist(const char *ifname, char *buf, int *len)
 {
        int i, bl;
+       int rc = -1;
+       char cmd[256];
        struct ieee80211req_chaninfo chans;
        struct iwinfo_freqlist_entry entry;
 
-       if( get80211priv(ifname, IEEE80211_IOCTL_GETCHANINFO, &chans, sizeof(chans)) >= 0 )
+       /* A wifiX device? */
+       if( madwifi_iswifi(ifname) )
+       {
+               sprintf(cmd, "wlanconfig ath-channels create nounit "
+                       "wlandev %s wlanmode ap >/dev/null", ifname);
+
+               if( ! WEXITSTATUS(system(cmd)) )
+               {
+                       rc = get80211priv("ath-channels", IEEE80211_IOCTL_GETCHANINFO, &chans, sizeof(chans));
+                       (void) WEXITSTATUS(system("wlanconfig ath-channels destroy"));
+               }
+       }
+
+       /* Its an athX ... */
+       else if( madwifi_isvap(ifname, NULL) )
+       {
+               rc = get80211priv(ifname, IEEE80211_IOCTL_GETCHANINFO, &chans, sizeof(chans));
+       }
+
+
+       /* Got chaninfo? */
+       if( rc >= 0 )
        {
                bl = 0;
 
                for( i = 0; i < chans.ic_nchans; i++ )
                {
-                       entry.mhz     = (int)(chans.ic_chans[i].ic_freq / 1000);
+                       entry.mhz     = chans.ic_chans[i].ic_freq;
                        entry.channel = chans.ic_chans[i].ic_ieee;
 
                        memcpy(&buf[bl], &entry, sizeof(struct iwinfo_freqlist_entry));