Skip to content

Commit d48c76b

Browse files
committed
Wifi: detect channel and frequency
1 parent 9a1d185 commit d48c76b

File tree

7 files changed

+56
-5
lines changed

7 files changed

+56
-5
lines changed

src/detection/wifi/wifi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ struct FFWifiConnection
1818
double signalQuality; // Percentage
1919
double rxRate;
2020
double txRate;
21+
uint16_t channel;
22+
uint16_t frequency; // MHz
2123
};
2224

2325
typedef struct FFWifiResult

src/detection/wifi/wifi_android.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ const char* ffDetectWifi(FFlist* result)
4343
item->conn.signalQuality = 0.0/0.0;
4444
item->conn.rxRate = 0.0/0.0;
4545
item->conn.txRate = 0.0/0.0;
46+
item->conn.channel = 0;
47+
item->conn.frequency = 0;
4648

4749
ffStrbufAppendS(&item->inf.status, yyjson_get_str(yyjson_obj_get(root, "supplicant_state")));
4850
if(!item->inf.status.length)

src/detection/wifi/wifi_apple.m

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ @interface CWInterface()
8080
item->conn.signalQuality = 0.0/0.0;
8181
item->conn.rxRate = 0.0/0.0;
8282
item->conn.txRate = 0.0/0.0;
83+
item->conn.channel = 0;
84+
item->conn.frequency = 0;
8385

8486
ffStrbufAppendS(&item->inf.description, inf.interfaceName.UTF8String);
8587
ffStrbufSetStatic(&item->inf.status, inf.powerOn ? "Power On" : "Power Off");
@@ -289,6 +291,15 @@ @interface CWInterface()
289291
ffStrbufAppendF(&item->conn.security, "Unknown (%ld)", inf.security);
290292
break;
291293
}
294+
295+
item->conn.channel = (uint16_t) inf.wlanChannel.channelNumber;
296+
switch (inf.wlanChannel.channelBand)
297+
{
298+
case kCWChannelBand2GHz: item->conn.frequency = 2400; break;
299+
case kCWChannelBand5GHz: item->conn.frequency = 5000; break;
300+
case kCWChannelBand6GHz: item->conn.frequency = 6000; break;
301+
default: item->conn.frequency = 0; break;
302+
}
292303
}
293304
return NULL;
294305
}

src/detection/wifi/wifi_bsd.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ const char* ffDetectWifi(FFlist* result)
3434
item->conn.signalQuality = 0.0/0.0;
3535
item->conn.rxRate = 0.0/0.0;
3636
item->conn.txRate = 0.0/0.0;
37+
item->conn.channel = 0;
38+
item->conn.frequency = 0;
3739

3840
ffParsePropLines(ifconfig.chars, "ssid ", &item->conn.ssid);
3941
if (item->conn.ssid.length)

src/detection/wifi/wifi_linux.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,8 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED FFlist* result)
339339
item->conn.signalQuality = 0.0/0.0;
340340
item->conn.rxRate = 0.0/0.0;
341341
item->conn.txRate = 0.0/0.0;
342+
item->conn.channel = 0;
343+
item->conn.frequency = 0;
342344

343345
ffStrbufSetF(&buffer, "/sys/class/net/%s/operstate", i->if_name);
344346
if (!ffAppendFileBuffer(buffer.chars, &item->inf.status))

src/detection/wifi/wifi_windows.c

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const char* ffDetectWifi(FFlist* result)
4949
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanQueryInterface)
5050
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanFreeMemory)
5151
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanCloseHandle)
52+
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanGetNetworkBssList)
5253

5354
DWORD curVersion;
5455
HANDLE hClient = NULL;
@@ -82,21 +83,23 @@ const char* ffDetectWifi(FFlist* result)
8283
item->conn.signalQuality = 0.0/0.0;
8384
item->conn.rxRate = 0.0/0.0;
8485
item->conn.txRate = 0.0/0.0;
86+
item->conn.channel = 0;
87+
item->conn.frequency = 0;
8588

8689
convertIfStateToString(ifInfo->isState, &item->inf.status);
8790

8891
if(ifInfo->isState != wlan_interface_state_connected)
8992
continue;
9093

91-
DWORD connectInfoSize = sizeof(WLAN_CONNECTION_ATTRIBUTES);
92-
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_invalid;
9394
WLAN_CONNECTION_ATTRIBUTES* connInfo = NULL;
95+
DWORD bufSize = sizeof(*connInfo);
96+
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_query_only;
9497

9598
if(ffWlanQueryInterface(hClient,
9699
&ifInfo->InterfaceGuid,
97100
wlan_intf_opcode_current_connection,
98101
NULL,
99-
&connectInfoSize,
102+
&bufSize,
100103
(PVOID*)&connInfo,
101104
&opCode) != ERROR_SUCCESS
102105
) continue;
@@ -107,8 +110,8 @@ const char* ffDetectWifi(FFlist* result)
107110
(const char *)connInfo->wlanAssociationAttributes.dot11Ssid.ucSSID);
108111

109112
for (size_t i = 0; i < sizeof(connInfo->wlanAssociationAttributes.dot11Bssid); i++)
110-
ffStrbufAppendF(&item->conn.bssid, "%.2X-", connInfo->wlanAssociationAttributes.dot11Bssid[i]);
111-
ffStrbufTrimRight(&item->conn.bssid, '-');
113+
ffStrbufAppendF(&item->conn.bssid, "%.2X:", connInfo->wlanAssociationAttributes.dot11Bssid[i]);
114+
ffStrbufTrimRight(&item->conn.bssid, ':');
112115

113116
switch (connInfo->wlanAssociationAttributes.dot11PhyType)
114117
{
@@ -201,7 +204,34 @@ const char* ffDetectWifi(FFlist* result)
201204
else
202205
ffStrbufAppendS(&item->conn.security, "Insecure");
203206

207+
WLAN_BSS_LIST* bssList = NULL;
208+
if (ffWlanGetNetworkBssList(hClient,
209+
&ifInfo->InterfaceGuid,
210+
&connInfo->wlanAssociationAttributes.dot11Ssid,
211+
connInfo->wlanAssociationAttributes.dot11BssType,
212+
connInfo->wlanSecurityAttributes.bSecurityEnabled,
213+
NULL,
214+
&bssList) == ERROR_SUCCESS && bssList->dwNumberOfItems > 0
215+
) {
216+
item->conn.frequency = (uint16_t) (bssList->wlanBssEntries[0].ulChCenterFrequency / 1000);
217+
ffWlanFreeMemory(bssList);
218+
}
219+
204220
ffWlanFreeMemory(connInfo);
221+
222+
ULONG* channelNumber = 0;
223+
bufSize = sizeof(*channelNumber);
224+
if(ffWlanQueryInterface(hClient,
225+
&ifInfo->InterfaceGuid,
226+
wlan_intf_opcode_channel_number,
227+
NULL,
228+
&bufSize,
229+
(PVOID*)&channelNumber,
230+
&opCode) == ERROR_SUCCESS
231+
) {
232+
item->conn.channel = (uint16_t) *channelNumber;
233+
ffWlanFreeMemory(channelNumber);
234+
}
205235
}
206236

207237
exit:

src/modules/wifi/wifi.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut
181181
yyjson_mut_obj_add_real(doc, conn, "signalQuality", wifi->conn.signalQuality);
182182
yyjson_mut_obj_add_real(doc, conn, "rxRate", wifi->conn.rxRate);
183183
yyjson_mut_obj_add_real(doc, conn, "txRate", wifi->conn.txRate);
184+
yyjson_mut_obj_add_uint(doc, conn, "channel", wifi->conn.channel);
185+
yyjson_mut_obj_add_uint(doc, conn, "frequency", wifi->conn.frequency);
184186
}
185187

186188
FF_LIST_FOR_EACH(FFWifiResult, item, result)

0 commit comments

Comments
 (0)