mirror of
https://github.com/RaspAP/raspap-webgui.git
synced 2024-11-22 07:30:23 +00:00
Initial commit
This commit is contained in:
parent
66f8cc0b75
commit
55a8eb85eb
1 changed files with 85 additions and 0 deletions
85
src/RaspAP/Parsers/IwParser.php
Normal file
85
src/RaspAP/Parsers/IwParser.php
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Linux iw parser class
|
||||||
|
*
|
||||||
|
* @description Parses output of iw to determine properties of a given physical device (phy)
|
||||||
|
* @author Bill Zimmerman <billzimmerman@gmail.com>
|
||||||
|
* @license https://github.com/raspap/raspap-webgui/blob/master/LICENSE
|
||||||
|
* @see https://wireless.wiki.kernel.org/en/users/Documentation/iw
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace RaspAP\Parsers;
|
||||||
|
|
||||||
|
class IwParser {
|
||||||
|
private $iw_output;
|
||||||
|
|
||||||
|
public function __construct(string $interface = 'wlan0') {
|
||||||
|
|
||||||
|
// Resolve physical device for selected interface
|
||||||
|
$iface = escapeshellarg($interface);
|
||||||
|
exec("iw dev | awk -v iface=".$iface." '/^phy#/ { phy = $0 } $1 == \"Interface\" { interface = $2 } interface == iface { print phy }'", $return);
|
||||||
|
$phy = $return[0];
|
||||||
|
|
||||||
|
// Fetch 'iw info' output for phy
|
||||||
|
$this->iw_output = shell_exec("iw $phy info");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function parseIwList() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (no IR): the AP won't Initiate Radiation until a DFS scan (or similar) is complete on these bands.
|
||||||
|
* (radar detection): the specified channels are shared with radar equipment.
|
||||||
|
* (disabled): self-explanatory.
|
||||||
|
*/
|
||||||
|
$excluded = array(
|
||||||
|
"(no IR, radar detection)",
|
||||||
|
"(radar detection)",
|
||||||
|
"(disabled)",
|
||||||
|
"(no IR)"
|
||||||
|
);
|
||||||
|
$excluded_pattern = implode('|', array_map('preg_quote', $excluded));
|
||||||
|
$pattern = '/\*\s+(\d+)\s+MHz \[(\d+)\] \(([\d.]+) dBm\)\s(?!' .$excluded_pattern. ')/';
|
||||||
|
$supportedFrequencies = [];
|
||||||
|
|
||||||
|
// Match iw_output containing supported frequencies
|
||||||
|
preg_match_all($pattern, $this->iw_output, $matches, PREG_SET_ORDER, 0);
|
||||||
|
|
||||||
|
foreach ($matches as $match) {
|
||||||
|
$frequency = [
|
||||||
|
'MHz' => (int)$match[1],
|
||||||
|
'Channel' => (int)$match[2],
|
||||||
|
'dBm' => (float)$match[3],
|
||||||
|
];
|
||||||
|
$supportedFrequencies[] = $frequency;
|
||||||
|
}
|
||||||
|
return $supportedFrequencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts an ieee80211 frequency to a channel value
|
||||||
|
* Adapted from iw source
|
||||||
|
* @param int $freq
|
||||||
|
* @see https://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git/tree/util.c
|
||||||
|
*/
|
||||||
|
public function ieee80211_frequency_to_channel(int $freq)
|
||||||
|
{
|
||||||
|
/* see 802.11-2007 17.3.8.3.2 and Annex J */
|
||||||
|
if ($freq == 2484) {
|
||||||
|
return 14;
|
||||||
|
} else if ($freq < 2484) {
|
||||||
|
return ($freq - 2407) / 5;
|
||||||
|
} else if ($freq >= 4910 && $freq <= 4980) {
|
||||||
|
return ($freq - 4000) / 5;
|
||||||
|
} else if ($freq <= 45000) { /* DMG band lower limit */
|
||||||
|
return ($freq - 5000) / 5;
|
||||||
|
} else if ($freq >= 58320 && $freq <= 64800) {
|
||||||
|
return ($freq - 56160) / 2160;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue