libs/iwinfo: return bitrate in kilobits to properly handle .5 rates
[project/luci.git] / libs / iwinfo / src / iwinfo_wl.c
index 37f4de1..8519dbc 100644 (file)
@@ -128,13 +128,18 @@ int wl_get_channel(const char *ifname, int *buf)
        return wl_ioctl(ifname, WLC_GET_CHANNEL, buf, sizeof(buf));
 }
 
+int wl_get_frequency(const char *ifname, int *buf)
+{
+       return wext_get_frequency(ifname, buf);
+}
+
 int wl_get_bitrate(const char *ifname, int *buf)
 {
        int ret = -1;
        int rate = 0;
 
        if( !(ret = wl_ioctl(ifname, WLC_GET_RATE, &rate, sizeof(rate))) && (rate > 0))
-               *buf = rate / 2;
+               *buf = ((rate / 2) * 1000) + ((rate & 1) ? 500 : 0);
 
        return ret;
 }
@@ -152,16 +157,14 @@ int wl_get_signal(const char *ifname, int *buf)
 
        wl_ioctl(ifname, WLC_GET_BSS_INFO, tmp, WLC_IOCTL_MAXLEN);
 
-       rssi = 0;
-       rssi_count = 0;
-
        if( !wl_ioctl(ifname, WLC_GET_AP, &ap, sizeof(ap)) && !ap )
        {
-               rssi = tmp[WL_BSS_RSSI_OFFSET];
-               rssi_count = 1;
+               *buf = tmp[WL_BSS_RSSI_OFFSET];
        }
        else
        {
+               rssi = rssi_count = 0;
+
                /* Calculate average rssi from conntected stations */
                if( (macs = wl_read_assoclist(ifname)) != NULL )
                {
@@ -171,16 +174,16 @@ int wl_get_signal(const char *ifname, int *buf)
 
                                if( !wl_ioctl(ifname, WLC_GET_RSSI, &starssi, 12) )
                                {
-                                       rssi += starssi.rssi;
+                                       rssi -= starssi.rssi;
                                        rssi_count++;
                                }
                        }
 
                        free(macs);
                }
-       }
 
-       *buf = (rssi == 0 || rssi_count == 0) ? 1 : (rssi / rssi_count);
+               *buf = (rssi == 0 || rssi_count == 0) ? 1 : -(rssi / rssi_count);
+       }
 
        return 0;
 }
@@ -363,3 +366,43 @@ int wl_get_assoclist(const char *ifname, char *buf, int *len)
        return -1;
 }
 
+int wl_get_txpwrlist(const char *ifname, char *buf, int *len)
+{
+       struct iwinfo_txpwrlist_entry entry;
+       uint8_t dbm[8] = { 0, 6, 8, 10, 12, 14, 16, 18 };
+       uint8_t mw[8]  = { 1, 3, 6, 10, 15, 25, 39, 63 };
+       int i;
+
+       for( i = 0; i < 8; i++ )
+       {
+               entry.dbm = dbm[i];
+               entry.mw  = mw[i];
+               memcpy(&buf[i*sizeof(entry)], &entry, sizeof(entry));
+       }
+
+       *len = 8 * sizeof(entry);
+       return 0;
+}
+
+int wl_get_scanlist(const char *ifname, char *buf, int *len)
+{
+       return wext_get_scanlist(ifname, buf, len);
+}
+
+int wl_get_mbssid_support(const char *ifname, int *buf)
+{
+       wlc_rev_info_t revinfo;
+
+       /* Multi bssid support only works on corerev >= 9 */
+       if( !wl_ioctl(ifname, WLC_GET_REVINFO, &revinfo, sizeof(revinfo)) )
+       {
+               if( revinfo.corerev >= 9 )
+               {
+                       *buf = 1;
+                       return 0;
+               }
+       }
+
+       return -1;
+}
+