From 177086b88141784a44fea042d57d050979331475 Mon Sep 17 00:00:00 2001
From: Nils Schneider <nils@nilsschneider.net>
Date: Sun, 16 Aug 2015 14:37:32 +0200
Subject: [PATCH] gluon-radio-config: basic wireless configuration

Split basic radio configuration from gluon-mesh-batman-adv as this will
be required for virtually any wireless mesh protocol.

This package takes care of setting:

  - wireless channel,
  - htmode and
  - regulatory domain

gluon-mesh-batman-adv-core depends on this package.
---
 docs/index.rst                                |  2 ++
 docs/package/gluon-radio-config.rst           | 20 ++++++++++++
 .../files/usr/lib/lua/gluon/util.lua          | 27 ++++++++++++++++
 package/gluon-mesh-batman-adv-core/Makefile   |  2 +-
 .../gluon-mesh-batman-adv-core/check_site.lua |  5 ---
 .../320-gluon-mesh-batman-adv-core-wireless   | 26 +---------------
 package/gluon-radio-config/Makefile           | 31 +++++++++++++++++++
 package/gluon-radio-config/check_site.lua     |  6 ++++
 .../lib/gluon/upgrade/250-gluon-radio-config  | 18 +++++++++++
 9 files changed, 106 insertions(+), 31 deletions(-)
 create mode 100644 docs/package/gluon-radio-config.rst
 create mode 100644 package/gluon-radio-config/Makefile
 create mode 100644 package/gluon-radio-config/check_site.lua
 create mode 100755 package/gluon-radio-config/files/lib/gluon/upgrade/250-gluon-radio-config

diff --git a/docs/index.rst b/docs/index.rst
index 19e174c97..2b4bc8db2 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -49,6 +49,8 @@ Packages
 .. toctree::
    :maxdepth: 1
 
+   package/gluon-radio-config
+
 Releases
 --------
 
diff --git a/docs/package/gluon-radio-config.rst b/docs/package/gluon-radio-config.rst
new file mode 100644
index 000000000..b253b1545
--- /dev/null
+++ b/docs/package/gluon-radio-config.rst
@@ -0,0 +1,20 @@
+gluon-radio-config
+==================
+
+This package takes care of setting basic wireless settings:
+
+- regulatory domain
+- htmode
+- channel
+
+site.conf
+---------
+
+regdom
+    regulatory domain (e.g. *de*)
+
+wifi24.channel / wifi5.channel
+    wireless channel for radio
+
+wifi24.htmode / wifi5.htmode
+    desired HT mode (e.g. *HT20*)
diff --git a/package/gluon-core/files/usr/lib/lua/gluon/util.lua b/package/gluon-core/files/usr/lib/lua/gluon/util.lua
index cf3677cb7..7d7809b1a 100644
--- a/package/gluon-core/files/usr/lib/lua/gluon/util.lua
+++ b/package/gluon-core/files/usr/lib/lua/gluon/util.lua
@@ -26,9 +26,13 @@ end
 local os = os
 local string = string
 local tonumber = tonumber
+local ipairs = ipairs
+local table = table
 
 local nixio = require 'nixio'
 local sysconfig = require 'gluon.sysconfig'
+local site = require 'gluon.site_config'
+local uci = require('luci.model.uci').cursor()
 
 
 module 'gluon.util'
@@ -77,3 +81,26 @@ function generate_mac(f, i)
 
   return string.format('%02x:%02x:%02x:%s:%s:%s', m1, m2, m3, m4, m5, m6)
 end
+
+-- Iterate over all radios defined in UCI calling
+-- f(radio, index, site.wifiX) for each radio found while passing
+--  site.wifi24 for 2.4 GHz devices and site.wifi5 for 5 GHz ones.
+function iterate_radios(f)
+  local radios = {}
+
+  uci:foreach('wireless', 'wifi-device',
+    function(s)
+      table.insert(radios, s['.name'])
+    end
+  )
+
+  for index, radio in ipairs(radios) do
+    local hwmode = uci:get('wireless', radio, 'hwmode')
+
+    if hwmode == '11g' or hwmode == '11ng' then
+      f(radio, index, site.wifi24)
+    elseif hwmode == '11a' or hwmode == '11na' then
+      f(radio, index, site.wifi5)
+    end
+  end
+end
diff --git a/package/gluon-mesh-batman-adv-core/Makefile b/package/gluon-mesh-batman-adv-core/Makefile
index 8358089cd..bb3dc5378 100644
--- a/package/gluon-mesh-batman-adv-core/Makefile
+++ b/package/gluon-mesh-batman-adv-core/Makefile
@@ -11,7 +11,7 @@ define Package/gluon-mesh-batman-adv-core
   SECTION:=gluon
   CATEGORY:=Gluon
   TITLE:=Support for batman-adv meshing (core)
-  DEPENDS:=+gluon-core +firewall +libiwinfo-lua
+  DEPENDS:=+gluon-core +gluon-radio-config +firewall +libiwinfo-lua
 endef
 
 define Build/Prepare
diff --git a/package/gluon-mesh-batman-adv-core/check_site.lua b/package/gluon-mesh-batman-adv-core/check_site.lua
index 25ae9dff4..2c5badc2b 100644
--- a/package/gluon-mesh-batman-adv-core/check_site.lua
+++ b/package/gluon-mesh-batman-adv-core/check_site.lua
@@ -1,9 +1,4 @@
-need_string('regdom')
-
 for _, config in ipairs({'wifi24', 'wifi5'}) do
-   need_number(config .. '.channel')
-   need_string(config .. '.htmode')
-
    if need_table(config .. '.ap', nil, false) then
       need_string(config .. '.ap.ssid')
       need_boolean(config .. '.ap.disabled', false)
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless b/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless
index cd9f885a5..2c16d0e00 100755
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless
@@ -118,36 +118,12 @@ end
 local function configure_radio(radio, index, config)
   local suffix = radio:match('^radio(%d+)$')
 
-  uci:delete('wireless', radio, 'disabled')
-
-  uci:set('wireless', radio, 'channel', config.channel)
-  uci:set('wireless', radio, 'htmode', config.htmode)
-  uci:set('wireless', radio, 'country', site.regdom)
-
   configure_client(config.ap, radio, index, suffix)
   configure_ibss(config.ibss, radio, index, suffix)
   configure_mesh(config.mesh, radio, index, suffix)
 end
 
-
-local radios = {}
-
-uci:foreach('wireless', 'wifi-device',
-  function(s)
-    table.insert(radios, s['.name'])
-  end
-)
-
-for index, radio in ipairs(radios) do
-  local hwmode = uci:get('wireless', radio, 'hwmode')
-
-  if hwmode == '11g' or hwmode == '11ng' then
-    configure_radio(radio, index, site.wifi24)
-  elseif hwmode == '11a' or hwmode == '11na' then
-    configure_radio(radio, index, site.wifi5)
-  end
-end
-
+util.iterate_radios(configure_radio)
 
 uci:save('wireless')
 uci:save('network')
diff --git a/package/gluon-radio-config/Makefile b/package/gluon-radio-config/Makefile
new file mode 100644
index 000000000..9157e8044
--- /dev/null
+++ b/package/gluon-radio-config/Makefile
@@ -0,0 +1,31 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-radio-config
+PKG_VERSION:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include $(GLUONDIR)/include/package.mk
+
+define Package/gluon-radio-config
+  SECTION:=gluon
+  CATEGORY:=Gluon
+  TITLE:=Basic radio config (regdom, channel, htmode)
+  DEPENDS:=+gluon-core
+endef
+
+define Build/Prepare
+	mkdir -p $(PKG_BUILD_DIR)
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+endef
+
+define Package/gluon-radio-config/install
+	$(CP) ./files/* $(1)/
+endef
+
+$(eval $(call BuildPackage,gluon-radio-config))
diff --git a/package/gluon-radio-config/check_site.lua b/package/gluon-radio-config/check_site.lua
new file mode 100644
index 000000000..b804d9fe6
--- /dev/null
+++ b/package/gluon-radio-config/check_site.lua
@@ -0,0 +1,6 @@
+need_string('regdom')
+
+for _, config in ipairs({'wifi24', 'wifi5'}) do
+   need_number(config .. '.channel')
+   need_string(config .. '.htmode')
+end
diff --git a/package/gluon-radio-config/files/lib/gluon/upgrade/250-gluon-radio-config b/package/gluon-radio-config/files/lib/gluon/upgrade/250-gluon-radio-config
new file mode 100755
index 000000000..62e6dcdee
--- /dev/null
+++ b/package/gluon-radio-config/files/lib/gluon/upgrade/250-gluon-radio-config
@@ -0,0 +1,18 @@
+#!/usr/bin/lua
+
+local util = require 'gluon.util'
+local uci = require('luci.model.uci').cursor()
+local site = require 'gluon.site_config'
+
+local function configure_radio(radio, index, config)
+  uci:delete('wireless', radio, 'disabled')
+
+  uci:set('wireless', radio, 'channel', config.channel)
+  uci:set('wireless', radio, 'htmode', config.htmode)
+  uci:set('wireless', radio, 'country', site.regdom)
+end
+
+util.iterate_radios(configure_radio)
+
+uci:save('wireless')
+uci:commit('wireless')
-- 
GitLab