Ver código fonte

Funktion zum Pollen des Wlan-Verbindungsstatus.

Rind 1 ano atrás
pai
commit
cecd89357e
2 arquivos alterados com 214 adições e 19 exclusões
  1. 21 9
      src/gfanetmon.h
  2. 193 10
      src/gfawifimon.cpp

+ 21 - 9
src/gfanetmon.h

@@ -84,6 +84,10 @@ public:
 	~CGfaWifiScanResults(void);
 
 public:
+	void Clear(void);
+
+	bool FromWirelessInfo(const char *pszIfName, const struct wireless_info &wli);
+
 	int32_t	GetNWID(void) const {
 		return nwID;
 	}
@@ -202,6 +206,10 @@ public:
 		return "";
 	}
 
+	void SetConnected(bool bConnected) {
+		m_bConnected = bConnected;
+	}
+
 	bool GetConnected(void) const {
 		return m_bConnected;
 	}
@@ -213,21 +221,20 @@ public:
 	uint16_t encFlags;			// Encoding flags
 	uint32_t qualPerc;			// Quality in Percent
 	int32_t qualBars;			// Quality in Bars (0 - 7)
+	double freqHz;				// Frequency/channel in Hz
+	bool m_bConnected;
+    struct sockaddr	ap_addr;	// MAC address
+	char essid[IW_ESSID_MAX_SIZE + 1];	// ESSID
+	char qualStr[129];					// Quality string
+		
+	std::string name;
+	std::string itfName;
 
 	std::vector<uint32_t> m_bitRates;
 	std::vector<std::string> m_groupCiphers;
 	std::vector<std::string> m_pairwCiphers;
 	std::vector<std::string> m_groupCiphersWPA;
 	std::vector<std::string> m_pairwCiphersWPA;
-		
-	double freqHz;				// Frequency/channel in Hz
-    struct sockaddr	ap_addr;	// MAC address
-
-	std::string name;
-	std::string itfName;
-	char essid[IW_ESSID_MAX_SIZE + 1];	// ESSID
-	char qualStr[129];					// Quality string
-	bool m_bConnected;
 
 private:
 	uint32_t CompactTrailingZeros(uint32_t v) const;
@@ -236,6 +243,8 @@ private:
 	static std::string ConcatStrings(std::vector<std::string> &arr);
 };
 
+/////////////////////////////////////////////////////////////////////////////
+
 class CWpaSupplicantConfig
 {
 public:
@@ -248,6 +257,8 @@ private:
 	static bool WpaKeyFromPassphrase(const char *pszEssID, const char *pszPassphrase, std::string &key);
 };
 
+/////////////////////////////////////////////////////////////////////////////
+
 class CGfaWifiMon
 {
 public:
@@ -400,6 +411,7 @@ public:
 
 	void ProcessConnectedEssid(int nIwFd, const char *pszIfName, std::string &sEssid);
 	bool SetWpaSuppConfig(int cellidx, const char *pszPassphrase);
+	static bool GetConnectionInfo(const char *pszIfName, CGfaWifiScanResults &wsr);
 
 private:
 	void HandleScanToken(	const char *pszIfName,

+ 193 - 10
src/gfawifimon.cpp

@@ -87,6 +87,112 @@ static bool _PushIfNotExists(std::vector<std::string> &arr, const char *pszNew)
 	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)
 {
-	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)
@@ -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)
 {
 	_UNUSED(nIwFd);
@@ -811,6 +993,7 @@ void CGfaWifiMon::HandleScanToken(	const char *pszIfName,
 			CGfaWifiScanResults &scr = m_scres.back();
 			if(pszIfName && *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));
 		}
         break;