diff --git a/ajax/networking/get_frequencies.php b/ajax/networking/get_frequencies.php
index 156413b0..ba85a386 100644
--- a/ajax/networking/get_frequencies.php
+++ b/ajax/networking/get_frequencies.php
@@ -1,43 +1,20 @@
parseIwList($iface);
- // get frequencies supported by device
- exec('iw '.$phy.' info | sed -rn "s/^.*\*\s([0-9]{4})\sMHz.*/\1/p"', $frequencies);
-
- if (count(preg_grep('/^24[0-9]{2}/i', $frequencies)) >0) {
- $flags += NL80211_BAND_24GHZ;
- }
- if (count(preg_grep('/^5[0-9]{3}/i', $frequencies)) >0) {
- $flags += NL80211_BAND_5GHZ;
- }
+ # debug
+ #foreach ($supportedFrequencies as $frequency) {
+ # echo "
Frequency: {$frequency['MHz']} MHz, Channel: {$frequency['Channel']}, dBm: {$frequency['dBm']}\n";
+ #}
- switch ($flags) {
- case NL80211_BAND_24GHZ:
- $msg = sprintf(_("The selected interface (%s) has support for the 2.4 GHz wireless band only."), $iface);
- break;
- case NL80211_BAND_5GHZ:
- $msg = sprintf(_("The selected interface (%s) has support for the 5 GHz wireless band only."), $iface);
- break;
- case NL80211_BAND_24GHZ | NL80211_BAND_5GHZ:
- $msg = sprintf(_("The selected interface (%s) has support for both the 2.4 and 5 GHz wireless bands."), $iface);
- break;
- default:
- $msg = sprintf(_("The selected interface (%s) does not support wireless mode operation."), $iface);
- }
- echo json_encode($msg);
+ echo json_encode($supportedFrequencies);
}
diff --git a/ajax/networking/get_nl80211_band.php b/ajax/networking/get_nl80211_band.php
new file mode 100644
index 00000000..156413b0
--- /dev/null
+++ b/ajax/networking/get_nl80211_band.php
@@ -0,0 +1,43 @@
+0) {
+ $flags += NL80211_BAND_24GHZ;
+ }
+ if (count(preg_grep('/^5[0-9]{3}/i', $frequencies)) >0) {
+ $flags += NL80211_BAND_5GHZ;
+ }
+
+ switch ($flags) {
+ case NL80211_BAND_24GHZ:
+ $msg = sprintf(_("The selected interface (%s) has support for the 2.4 GHz wireless band only."), $iface);
+ break;
+ case NL80211_BAND_5GHZ:
+ $msg = sprintf(_("The selected interface (%s) has support for the 5 GHz wireless band only."), $iface);
+ break;
+ case NL80211_BAND_24GHZ | NL80211_BAND_5GHZ:
+ $msg = sprintf(_("The selected interface (%s) has support for both the 2.4 and 5 GHz wireless bands."), $iface);
+ break;
+ default:
+ $msg = sprintf(_("The selected interface (%s) does not support wireless mode operation."), $iface);
+ }
+ echo json_encode($msg);
+}
+
diff --git a/app/js/custom.js b/app/js/custom.js
index 175a609a..3c2a45f4 100644
--- a/app/js/custom.js
+++ b/app/js/custom.js
@@ -185,7 +185,7 @@ function contentLoaded() {
setupBtns();
break;
case "hostapd_conf":
- loadChannel();
+ getChannel();
setHardwareModeTooltip();
break;
case "dhcpd_conf":
@@ -264,13 +264,6 @@ function setDHCPToggles(state) {
$('#dhcp-iface').prop('disabled', !state);
}
-function loadChannel() {
- $.get('ajax/networking/get_channel.php',function(data){
- jsonData = JSON.parse(data);
- loadChannelSelect(jsonData);
- });
-}
-
$('#debugModal').on('shown.bs.modal', function (e) {
var csrfToken = $('meta[name=csrf_token]').attr('content');
$.post('ajax/system/sys_debug.php',{'csrf_token': csrfToken},function(data){
@@ -391,53 +384,76 @@ $(".custom-file-input").on("change", function() {
$(this).siblings(".custom-file-label").addClass("selected").html(fileName);
});
-/*
-Sets the wirelss channel select options based on hw_mode and country_code.
-
-Methodology: In North America up to channel 11 is the maximum allowed WiFi 2.4Ghz channel,
-except for the US that allows channel 12 & 13 in low power mode with additional restrictions.
-Canada allows channel 12 in low power mode. Because it's unsure if low powered mode can be
-supported the channels are not selectable for those countries. Also Uzbekistan and Colombia
-allow up to channel 11 as maximum channel on the 2.4Ghz WiFi band.
-Source: https://en.wikipedia.org/wiki/List_of_WLAN_channels
-Additional: https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git
-*/
-function loadChannelSelect(selected) {
- // Fetch wireless regulatory data
- $.getJSON("config/wireless.json", function(json) {
- var hw_mode = $('#cbxhwmode').val();
- var country_code = $('#cbxcountries').val();
- var channel_select = $('#cbxchannel');
- var data = json["wireless_regdb"];
- var selectablechannels = Array.range(1,14);
-
- // Assign array of countries to valid frequencies (channels)
- var countries_2_4Ghz_max11ch = data["2_4GHz_max11ch"].countries;
- var countries_2_4Ghz_max14ch = data["2_4GHz_max14ch"].countries;
- var countries_5Ghz_max48ch = data["5Ghz_max48ch"].countries;
-
- // Map selected hw_mode and country to determine channel list
- if (hw_mode === 'a') {
- selectablechannels = data["5Ghz_max48ch"].channels;
- } else if (($.inArray(country_code, countries_2_4Ghz_max11ch) !== -1) && (hw_mode !== 'ac') ) {
- selectablechannels = data["2_4GHz_max11ch"].channels;
- } else if (($.inArray(country_code, countries_2_4Ghz_max14ch) !== -1) && (hw_mode === 'b')) {
- selectablechannels = data["2_4GHz_max14ch"].channels;
- } else if (($.inArray(country_code, countries_5Ghz_max48ch) !== -1) && (hw_mode === 'ac')) {
- selectablechannels = data["5Ghz_max48ch"].channels;
- }
-
- // Set channel select with available values
- selected = (typeof selected === 'undefined') ? selectablechannels[0] : selected;
- channel_select.empty();
- $.each(selectablechannels, function(key,value) {
- channel_select.append($("").attr("value", value).text(value));
- });
- channel_select.val(selected);
+ // Retrieves the 'channel' value specified in hostapd.conf
+function getChannel() {
+ $.get('ajax/networking/get_channel.php',function(data){
+ jsonData = JSON.parse(data);
+ loadChannelSelect(jsonData);
});
}
-/* Sets hardware mode tooltip text for selected interface.
+/*
+ Sets the wirelss channel select options based on frequencies reported by iw.
+
+ See: https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git
+ Also: https://en.wikipedia.org/wiki/List_of_WLAN_channels
+*/
+function loadChannelSelect(selected) {
+ var iface = $('#cbxinterface').val();
+ var hwmodeText = '';
+ var csrfToken = $('meta[name=csrf_token]').attr('content');
+
+ // update hardware mode tooltip
+ setHardwareModeTooltip();
+
+ $.post('ajax/networking/get_frequencies.php',{'interface': iface, 'csrf_token': csrfToken, 'selected': selected},function(response){
+ var hw_mode = $('#cbxhwmode').val();
+ var country_code = $('#cbxcountries').val();
+ var channel_select = $('#cbxchannel');
+ var btn_save = $('#btnSaveHostapd');
+ var data = JSON.parse(response);
+ var selectableChannels = [];
+
+ // Map selected hw_mode to available channels
+ if (hw_mode === 'a') {
+ selectableChannels = data.filter(item => item.MHz.toString().startsWith('5'));
+ } else if (hw_mode !== 'ac') {
+ selectableChannels = data.filter(item => item.MHz.toString().startsWith('24'));
+ } else if (hw_mode === 'b') {
+ selectableChannels = data.filter(item => item.MHz.toString().startsWith('24'));
+ } else if (hw_mode === 'ac') {
+ selectableChannels = data.filter(item => item.MHz.toString().startsWith('5'));
+ }
+
+ // If selected channel doeesn't exist in allowed channels, set default or null (unsupported)
+ if (!selectableChannels.find(item => item.Channel === selected)) {
+ if (selectableChannels.length === 0) {
+ selectableChannels[0] = { Channel: null };
+ } else {
+ defaultChannel = selectableChannels[0].Channel;
+ selected = defaultChannel
+ }
+ }
+
+ // Set channel select with available values
+ channel_select.empty();
+ if (selectableChannels[0].Channel === null) {
+ channel_select.append($("").attr("value", "").text("---"));
+ channel_select.prop("disabled", true);
+ btn_save.prop("disabled", true);
+ } else {
+ channel_select.prop("disabled", false);
+ btn_save.prop("disabled", false);
+ $.each(selectableChannels, function(key,value) {
+ channel_select.append($("").attr("value", value.Channel).text(value.Channel));
+ });
+ channel_select.val(selected);
+ }
+ });
+}
+
+/* Sets hardware mode tooltip text for selected interface
+ * and calls loadChannelSelect()
*/
function setHardwareModeTooltip() {
var iface = $('#cbxinterface').val();
@@ -447,7 +463,7 @@ function setHardwareModeTooltip() {
if ($('#cbxhwmode').find('option[value="ac"]').prop('disabled') == true ) {
var hwmodeText = $('#hwmode').attr('data-tooltip');
}
- $.post('ajax/networking/get_frequencies.php?',{'interface': iface, 'csrf_token': csrfToken},function(data){
+ $.post('ajax/networking/get_nl80211_band.php?',{'interface': iface, 'csrf_token': csrfToken},function(data){
var responseText = JSON.parse(data);
$('#tiphwmode').attr('data-original-title', responseText + '\n' + hwmodeText );
});
diff --git a/src/RaspAP/Parsers/IwParser.php b/src/RaspAP/Parsers/IwParser.php
index 324935cf..7eba393e 100644
--- a/src/RaspAP/Parsers/IwParser.php
+++ b/src/RaspAP/Parsers/IwParser.php
@@ -28,7 +28,6 @@ class IwParser {
}
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.