|
@@ -87,6 +87,112 @@ static bool _PushIfNotExists(std::vector<std::string> &arr, const char *pszNew)
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int _GetConnectionInfo(int nIwFd, const char *pszIfName, struct wireless_info *info)
|
|
|
|
+{
|
|
|
|
+ struct iwreq wrq;
|
|
|
|
+
|
|
|
|
+ memset((char*) info, 0, sizeof(struct wireless_info));
|
|
|
|
+
|
|
|
|
+ /* Get basic information */
|
|
|
|
+ if(::iw_get_basic_config(nIwFd, pszIfName, &(info->b)) < 0)
|
|
|
|
+ {
|
|
|
|
+ /* If no wireless name : no wireless extensions */
|
|
|
|
+ /* But let's check if the interface exists at all */
|
|
|
|
+ struct ifreq ifr;
|
|
|
|
+
|
|
|
|
+ strncpy(ifr.ifr_name, pszIfName, IFNAMSIZ);
|
|
|
|
+ if(::ioctl(nIwFd, SIOCGIFFLAGS, &ifr) < 0)
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ else
|
|
|
|
+ return -ENOTSUP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Get ranges */
|
|
|
|
+ if(::iw_get_range_info(nIwFd, pszIfName, &(info->range)) >= 0)
|
|
|
|
+ info->has_range = 1;
|
|
|
|
+
|
|
|
|
+ /* Get AP address */
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWAP, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_ap_addr = 1;
|
|
|
|
+ memcpy(&(info->ap_addr), &(wrq.u.ap_addr), sizeof (sockaddr));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Get bit rate */
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWRATE, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_bitrate = 1;
|
|
|
|
+ memcpy(&(info->bitrate), &(wrq.u.bitrate), sizeof(iwparam));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Get Power Management settings */
|
|
|
|
+ wrq.u.power.flags = 0;
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWPOWER, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_power = 1;
|
|
|
|
+ memcpy(&(info->power), &(wrq.u.power), sizeof(iwparam));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Get stats */
|
|
|
|
+ if(::iw_get_stats(nIwFd, pszIfName, &(info->stats), &info->range, info->has_range) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_stats = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+//#ifndef WE_ESSENTIAL
|
|
|
|
+ /* Get NickName */
|
|
|
|
+ wrq.u.essid.pointer = (caddr_t) info->nickname;
|
|
|
|
+ wrq.u.essid.length = IW_ESSID_MAX_SIZE + 2;
|
|
|
|
+ wrq.u.essid.flags = 0;
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWNICKN, &wrq) >= 0)
|
|
|
|
+ if(wrq.u.data.length > 1)
|
|
|
|
+ info->has_nickname = 1;
|
|
|
|
+
|
|
|
|
+ if((info->has_range) && (info->range.we_version_compiled > 9))
|
|
|
|
+ {
|
|
|
|
+ /* Get Transmit Power */
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWTXPOW, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_txpower = 1;
|
|
|
|
+ memcpy(&(info->txpower), &(wrq.u.txpower), sizeof(iwparam));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Get sensitivity */
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWSENS, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_sens = 1;
|
|
|
|
+ memcpy(&(info->sens), &(wrq.u.sens), sizeof(iwparam));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if((info->has_range) && (info->range.we_version_compiled > 10))
|
|
|
|
+ {
|
|
|
|
+ /* Get retry limit/lifetime */
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWRETRY, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_retry = 1;
|
|
|
|
+ memcpy(&(info->retry), &(wrq.u.retry), sizeof(iwparam));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Get RTS threshold */
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWRTS, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_rts = 1;
|
|
|
|
+ memcpy(&(info->rts), &(wrq.u.rts), sizeof(iwparam));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Get fragmentation threshold */
|
|
|
|
+ if(::iw_get_ext(nIwFd, pszIfName, SIOCGIWFRAG, &wrq) >= 0)
|
|
|
|
+ {
|
|
|
|
+ info->has_frag = 1;
|
|
|
|
+ memcpy(&(info->frag), &(wrq.u.frag), sizeof(iwparam));
|
|
|
|
+ }
|
|
|
|
+//#endif /* WE_ESSENTIAL */
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
@@ -229,16 +335,7 @@ private:
|
|
|
|
|
|
CGfaWifiScanResults::CGfaWifiScanResults(void)
|
|
CGfaWifiScanResults::CGfaWifiScanResults(void)
|
|
{
|
|
{
|
|
- channel = -1;
|
|
|
|
- nwID = 0;
|
|
|
|
- mode = 0;
|
|
|
|
- encFlags = 0;
|
|
|
|
- freqHz = 0.0;
|
|
|
|
- m_bConnected = false;
|
|
|
|
-
|
|
|
|
- memset(&ap_addr, 0, sizeof(ap_addr));
|
|
|
|
- memset(essid, 0, sizeof(essid));
|
|
|
|
- memset(qualStr, 0, sizeof(qualStr));
|
|
|
|
|
|
+ Clear();
|
|
}
|
|
}
|
|
|
|
|
|
CGfaWifiScanResults::~CGfaWifiScanResults(void)
|
|
CGfaWifiScanResults::~CGfaWifiScanResults(void)
|
|
@@ -528,6 +625,72 @@ void CGfaWifiScanResults::SetWPAStrings(unsigned char *iebuf, int buflen)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void CGfaWifiScanResults::Clear(void)
|
|
|
|
+{
|
|
|
|
+ nwID = 0;
|
|
|
|
+ channel = -1;
|
|
|
|
+ mode = 0;
|
|
|
|
+ encFlags = 0;
|
|
|
|
+ qualPerc = 0;
|
|
|
|
+ qualBars = 0;
|
|
|
|
+ freqHz = 0.0;
|
|
|
|
+ m_bConnected = false;
|
|
|
|
+ memset(&ap_addr, 0, sizeof(ap_addr));
|
|
|
|
+ memset(essid, 0, sizeof(essid));
|
|
|
|
+ memset(qualStr, 0, sizeof(qualStr));
|
|
|
|
+
|
|
|
|
+ name.clear();
|
|
|
|
+ itfName.clear();
|
|
|
|
+ m_bitRates.clear();
|
|
|
|
+ m_groupCiphers.clear();
|
|
|
|
+ m_pairwCiphers.clear();
|
|
|
|
+ m_groupCiphersWPA.clear();
|
|
|
|
+ m_pairwCiphersWPA.clear();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool CGfaWifiScanResults::FromWirelessInfo(const char *pszIfName, const struct wireless_info &wli)
|
|
|
|
+{
|
|
|
|
+ Clear();
|
|
|
|
+
|
|
|
|
+ if(!wli.has_stats)
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ SetConnected(true);
|
|
|
|
+
|
|
|
|
+ ::iw_print_stats(qualStr, sizeof(qualStr) - 1, &wli.stats.qual, &wli.range, wli.has_range);
|
|
|
|
+ SetQualityPercAndBars(&wli.stats.qual, &wli.range, wli.has_range);
|
|
|
|
+
|
|
|
|
+ if(pszIfName && *pszIfName)
|
|
|
|
+ itfName = pszIfName;
|
|
|
|
+
|
|
|
|
+ if(wli.has_ap_addr)
|
|
|
|
+ memcpy(&ap_addr, &wli.ap_addr, sizeof(ap_addr));
|
|
|
|
+
|
|
|
|
+ if(wli.b.has_nwid)
|
|
|
|
+ nwID = wli.b.nwid.value;
|
|
|
|
+
|
|
|
|
+ if(wli.b.has_freq)
|
|
|
|
+ {
|
|
|
|
+ freqHz = wli.b.freq;
|
|
|
|
+ if(wli.has_range)
|
|
|
|
+ channel = iw_freq_to_channel(freqHz, &wli.range);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(wli.b.has_mode)
|
|
|
|
+ mode = wli.b.mode;
|
|
|
|
+
|
|
|
|
+ if(wli.b.name[0])
|
|
|
|
+ name = wli.b.name;
|
|
|
|
+
|
|
|
|
+ if(wli.b.essid_len && wli.b.essid[0])
|
|
|
|
+ memcpy(essid, wli.b.essid, (wli.b.essid_len <= IW_ESSID_MAX_SIZE) ? wli.b.essid_len : IW_ESSID_MAX_SIZE);
|
|
|
|
+
|
|
|
|
+ if(wli.has_bitrate)
|
|
|
|
+ AddBitrate(wli.bitrate.value);
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
@@ -600,6 +763,25 @@ void CGfaWifiMon::ProcessConnectedEssid(int nIwFd, const char *pszIfName, std::s
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool CGfaWifiMon::GetConnectionInfo(const char *pszIfName, CGfaWifiScanResults &wsr)
|
|
|
|
+{
|
|
|
|
+ int nIwFd;
|
|
|
|
+
|
|
|
|
+ if((nIwFd = ::iw_sockets_open()) >= 0)
|
|
|
|
+ {
|
|
|
|
+ struct wireless_info wli;
|
|
|
|
+ int ret = _GetConnectionInfo(nIwFd, pszIfName, &wli);
|
|
|
|
+ ::iw_sockets_close(nIwFd);
|
|
|
|
+ if(ret == 0)
|
|
|
|
+ {
|
|
|
|
+ return wsr.FromWirelessInfo(pszIfName, wli);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ wsr.Clear();
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+
|
|
int CGfaWifiMon::IwScan(int nIwFd, char *pszIfName, char *args[], int count)
|
|
int CGfaWifiMon::IwScan(int nIwFd, char *pszIfName, char *args[], int count)
|
|
{
|
|
{
|
|
_UNUSED(nIwFd);
|
|
_UNUSED(nIwFd);
|
|
@@ -811,6 +993,7 @@ void CGfaWifiMon::HandleScanToken( const char *pszIfName,
|
|
CGfaWifiScanResults &scr = m_scres.back();
|
|
CGfaWifiScanResults &scr = m_scres.back();
|
|
if(pszIfName && *pszIfName)
|
|
if(pszIfName && *pszIfName)
|
|
scr.itfName = pszIfName;
|
|
scr.itfName = pszIfName;
|
|
|
|
+ memcpy(&scr.ap_addr, &event->u.ap_addr, sizeof(scr.ap_addr));
|
|
TRACE("Cell %02d - Address: %s\n", state->ap_num, iw_saether_ntop(&event->u.ap_addr, buffer));
|
|
TRACE("Cell %02d - Address: %s\n", state->ap_num, iw_saether_ntop(&event->u.ap_addr, buffer));
|
|
}
|
|
}
|
|
break;
|
|
break;
|