ohmu
·
2026-10-15
1extern "C" {
2 #include "wifi.h"
3}
4
5#include <NetworkDevice.h>
6#include <NetworkInterface.h>
7#include <NetworkRoster.h>
8
9static void initWifiResult(FFWifiResult* item, const char* name) {
10 ffStrbufInitS(&item->inf.description, name);
11 ffStrbufInit(&item->inf.status);
12 ffStrbufInit(&item->conn.status);
13 ffStrbufInit(&item->conn.ssid);
14 ffStrbufInit(&item->conn.bssid);
15 ffStrbufInit(&item->conn.protocol);
16 ffStrbufInit(&item->conn.security);
17 item->conn.signalQuality = -DBL_MAX;
18 item->conn.rxRate = -DBL_MAX;
19 item->conn.txRate = -DBL_MAX;
20 item->conn.channel = 0;
21 item->conn.channelWidth = 0;
22 item->conn.frequency = 0;
23}
24
25static void setWifiSecurity(FFstrbuf* security, const wireless_network& network) {
26 switch (network.authentication_mode) {
27 case B_NETWORK_AUTHENTICATION_NONE:
28 if (network.flags & B_NETWORK_IS_ENCRYPTED) {
29 ffStrbufSetStatic(security, "Encrypted");
30 } else {
31 ffStrbufSetStatic(security, "Insecure");
32 }
33 break;
34 case B_NETWORK_AUTHENTICATION_WEP:
35 ffStrbufSetStatic(security, "WEP");
36 break;
37 case B_NETWORK_AUTHENTICATION_WPA:
38 ffStrbufSetStatic(security, "WPA");
39 break;
40 case B_NETWORK_AUTHENTICATION_WPA2:
41 ffStrbufSetStatic(security, "WPA2");
42 break;
43 case B_NETWORK_AUTHENTICATION_EAP:
44 ffStrbufSetStatic(security, "WPA Enterprise");
45 break;
46 default:
47 ffStrbufSetF(security, "Unknown (%lu)", (unsigned long) network.authentication_mode);
48 break;
49 }
50}
51
52static void setWifiBssid(FFstrbuf* bssid, const wireless_network& network) {
53 const uint8* address = network.address.LinkLevelAddress();
54 if (address == nullptr || network.address.LinkLevelAddressLength() < 6) {
55 return;
56 }
57
58 ffStrbufSetF(bssid, "%02X:%02X:%02X:%02X:%02X:%02X",
59 address[0], address[1], address[2], address[3], address[4], address[5]);
60}
61
62const char* ffDetectWifi(FFlist* result) {
63 BNetworkRoster& roster = BNetworkRoster::Default();
64 BNetworkInterface interface;
65 uint32 cookie = 0;
66
67 while (roster.GetNextInterface(&cookie, interface) == B_OK) {
68 if (!interface.Exists()) {
69 continue;
70 }
71
72 BNetworkDevice device(interface.Name());
73 if (!device.Exists() || !device.IsWireless()) {
74 continue;
75 }
76
77 FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
78 initWifiResult(item, interface.Name());
79
80 ffStrbufSetStatic(&item->inf.status, interface.HasLink() ? "Up" : "Down");
81 if (!interface.HasLink() || !device.HasLink()) {
82 ffStrbufSetStatic(&item->conn.status, "Not connected");
83 continue;
84 }
85
86 ffStrbufSetStatic(&item->conn.status, "Connected");
87
88 uint32 networkCookie = 0;
89 wireless_network network = {};
90 if (device.GetNextAssociatedNetwork(networkCookie, network) != B_OK) {
91 continue;
92 }
93
94 ffStrbufSetNS(&item->conn.ssid, (uint32_t) strnlen(network.name, sizeof(network.name)), network.name);
95 setWifiBssid(&item->conn.bssid, network);
96 item->conn.signalQuality = network.signal_strength > 100 ? 100 : network.signal_strength;
97 setWifiSecurity(&item->conn.security, network);
98 }
99
100 return nullptr;
101}