Merge remote-tracking branch 'origin/flexible-wifi'
This commit is contained in:
		
						commit
						26c6a787f6
					
				| @ -35,9 +35,6 @@ | |||||||
|     -- Wireless channel. |     -- Wireless channel. | ||||||
|     channel = 1, |     channel = 1, | ||||||
| 
 | 
 | ||||||
|     -- ESSID used for client network. |  | ||||||
|     ssid = 'entenhausen.freifunk.net', |  | ||||||
| 
 |  | ||||||
|     -- Specifies the channel width in 802.11n and 802.11ac mode. |     -- Specifies the channel width in 802.11n and 802.11ac mode. | ||||||
|     -- Possible values are: |     -- Possible values are: | ||||||
|     -- HT20 (single 20MHz channel), |     -- HT20 (single 20MHz channel), | ||||||
| @ -45,32 +42,33 @@ | |||||||
|     -- HT40+ (2x 20MHz channels, secondary above) |     -- HT40+ (2x 20MHz channels, secondary above) | ||||||
|     htmode = 'HT20', |     htmode = 'HT20', | ||||||
| 
 | 
 | ||||||
|  |     -- ESSID used for client network. | ||||||
|  |     ap = { | ||||||
|  |       ssid = 'entenhausen.freifunk.net', | ||||||
|  |       -- disabled = true, (optional) | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     mesh = { | ||||||
|       -- Adjust these values! |       -- Adjust these values! | ||||||
|     mesh_ssid = 'xe:xx:xx:xx:xx:xx',  -- ESSID used for mesh |       id = 'ffxx-mesh', | ||||||
|     mesh_bssid = 'xe:xx:xx:xx:xx:xx', -- BSSID used for mesh |       mcast_rate = 12000, | ||||||
| 
 |       -- disabled = true, (optional) | ||||||
|     -- Bitrate used for multicast/broadcast packets. |     }, | ||||||
|     mesh_mcast_rate = 12000, |  | ||||||
| 
 |  | ||||||
|     -- (optional) mesh VLAN on 802.11 ad-hoc interface (1-4095) |  | ||||||
|     -- mesh_vlan = 14, |  | ||||||
|     -- client_disabled = true, |  | ||||||
|     -- mesh_disabled = false, |  | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   -- Wireless configuration for 5 GHz interfaces. |   -- Wireless configuration for 5 GHz interfaces. | ||||||
|   -- This should be equal to the 2.4 GHz variant, except |   -- This should be equal to the 2.4 GHz variant, except | ||||||
|   -- for channel and htmode. |   -- for channel and htmode. | ||||||
|   wifi5 = { |   wifi5 = { | ||||||
|     ssid = 'entenhausen.freifunk.net', |  | ||||||
|     channel = 44, |     channel = 44, | ||||||
|     htmode = 'HT20', |     htmode = 'HT20', | ||||||
|     mesh_ssid = 'xx:xx:xx:xx:xx:xx', |     ap = { | ||||||
|     mesh_bssid = 'xx:xx:xx:xx:xx:xx', |       ssid = 'entenhausen.freifunk.net', | ||||||
|     mesh_mcast_rate = 12000, |     }, | ||||||
|     -- mesh_vlan = 14, |     mesh = { | ||||||
|     -- client_disabled = true, |       id = 'ffxx-mesh', | ||||||
|     -- mesh_disabled = false, |       mcast_rate = 12000, | ||||||
|  |     }, | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   -- The next node feature allows clients to always reach the node it is |   -- The next node feature allows clients to always reach the node it is | ||||||
|  | |||||||
| @ -62,24 +62,46 @@ regdom | |||||||
|       regdom = 'DE' |       regdom = 'DE' | ||||||
| 
 | 
 | ||||||
| wifi24 | wifi24 | ||||||
|     WLAN Configuration of your community in the 2.4Ghz radio. Consisting |     WLAN configuration for 2.4 GHz devices. | ||||||
|     of ``ssid`` of your client network, the ``channel`` your community is using, |     ``channel`` must be set to a valid wireless channel for your radio. | ||||||
|     ``htmode``, the adhoc ssid ``mesh_ssid`` used between devices, the adhoc |     ``htmode`` selects the desired htmode (e.g. HT20, HT40- or HT40+). | ||||||
|     bssid ``mesh_bssid`` and the adhoc multicast rate ``mesh_mcast_rate``. | 
 | ||||||
|     Optionally ``mesh_vlan`` can be used to setup VLAN on top of the 802.11 |     There are currently three interface types available. You many choose to | ||||||
|     ad-hoc interface. The options ``mesh_disabled`` and ``client_disabled`` |     configure any subset of them: | ||||||
|     are optional, too. They allow to disable the SSID by default, e.g. for | 
 | ||||||
|     preconfigured node. This only affects first configuraton. |     - ``ap`` creates a master interface where clients may connect | ||||||
|     Combined in an dictionary, e.g.: |     - ``mesh`` creates an 802.11s mesh interface with forwarding disabled | ||||||
|  |     - ``ibss`` creates an ad-hoc interface | ||||||
|  | 
 | ||||||
|  |     Each interface may be disabled by setting ``disabled`` to ``true``. | ||||||
|  |     This will only affect new installations. | ||||||
|  |     Upgrades will not changed the disabled state. | ||||||
|  | 
 | ||||||
|  |     ``ap`` requires a single parameter, a string, named ``ssid`` which sets the interface's ESSID. | ||||||
|  | 
 | ||||||
|  |     ``mesh`` requires a single parameter, a string, named ``id`` which sets the mesh id. | ||||||
|  | 
 | ||||||
|  |     ``ibss`` requires two parametersr: ``ssid`` (a string) and ``bssid`` (a MAC). | ||||||
|  |     An optional parameter ``vlan`` (integer) is supported. | ||||||
|  | 
 | ||||||
|  |     Both ``mesh`` and ``ibss`` accept an optional ``mcast_rate`` (kbit/s) parameter for setting the default multicast datarate. | ||||||
|     :: |     :: | ||||||
| 
 | 
 | ||||||
|        wifi24 = { |        wifi24 = { | ||||||
|          ssid = 'entenhausen.freifunk.net', |  | ||||||
|          channel = 11, |          channel = 11, | ||||||
|          htmode = 'HT40-', |          htmode = 'HT20', | ||||||
|          mesh_ssid = 'ff:ff:ff:ee:ba:be', |          ap = { | ||||||
|          mesh_bssid = 'ff:ff:ff:ee:ba:be', |            ssid = 'entenhausen.freifunk.net', | ||||||
|          mesh_mcast_rate = 12000, |          }, | ||||||
|  |          mesh = { | ||||||
|  |            id = 'entenhausen-mesh', | ||||||
|  |            mcast_rate = 12000, | ||||||
|  |          }, | ||||||
|  |          ibss = { | ||||||
|  |            ssid = 'ff:ff:ff:ee:ba:be', | ||||||
|  |            bssid = 'ff:ff:ff:ee:ba:be', | ||||||
|  |            mcast_rate = 12000, | ||||||
|  |          }, | ||||||
|        }, |        }, | ||||||
| 
 | 
 | ||||||
| wifi5 | wifi5 | ||||||
|  | |||||||
| @ -5,14 +5,20 @@ local site = require 'gluon.site_config' | |||||||
| local uci = require('luci.model.uci').cursor() | local uci = require('luci.model.uci').cursor() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| local function configure_mtu(radio, config) | local function configure_mtu(radio, config, mtu) | ||||||
|   local mesh = 'mesh_' .. radio |   if config.ibss then | ||||||
|  |     local network = 'ibss_' .. radio | ||||||
| 
 | 
 | ||||||
|   if config.mesh_vlan then |     if config.ibss.vlan then | ||||||
|     uci:set('network', mesh, 'mtu', 1532) |       uci:set('network', network, 'mtu', mtu + 4) | ||||||
|     uci:set('network', mesh .. '_vlan', 'mtu', 1528) |       uci:set('network', network .. '_vlan', 'mtu', mtu) | ||||||
|     else |     else | ||||||
|     uci:set('network', mesh, 'mtu', 1528) |       uci:set('network', network, 'mtu', mtu) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   if config.mesh then | ||||||
|  |     uci:set('network', 'mesh_' .. radio, 'mtu', mtu) | ||||||
|   end |   end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| @ -25,13 +31,15 @@ uci:foreach('wireless', 'wifi-device', | |||||||
| 	    end | 	    end | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | local mtu = 1528 | ||||||
|  | 
 | ||||||
| for _, radio in ipairs(radios) do | for _, radio in ipairs(radios) do | ||||||
| 	local hwmode = uci:get('wireless', radio, 'hwmode') | 	local hwmode = uci:get('wireless', radio, 'hwmode') | ||||||
| 
 | 
 | ||||||
| 	if hwmode == '11g' or hwmode == '11ng' then | 	if hwmode == '11g' or hwmode == '11ng' then | ||||||
| 	  configure_mtu(radio, site.wifi24) | 	  configure_mtu(radio, site.wifi24, mtu) | ||||||
| 	elseif hwmode == '11a' or hwmode == '11na' then | 	elseif hwmode == '11a' or hwmode == '11na' then | ||||||
| 	  configure_mtu(radio, site.wifi5) | 	  configure_mtu(radio, site.wifi5, mtu) | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,14 +5,20 @@ local site = require 'gluon.site_config' | |||||||
| local uci = require('luci.model.uci').cursor() | local uci = require('luci.model.uci').cursor() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| local function configure_mtu(radio, config) | local function configure_mtu(radio, config, mtu) | ||||||
|   local mesh = 'mesh_' .. radio |   if config.ibss then | ||||||
|  |     local network = 'ibss_' .. radio | ||||||
| 
 | 
 | ||||||
|   if config.mesh_vlan then |     if config.ibss.vlan then | ||||||
|     uci:set('network', mesh, 'mtu', 1536) |       uci:set('network', network, 'mtu', mtu + 4) | ||||||
|     uci:set('network', mesh .. '_vlan', 'mtu', 1532) |       uci:set('network', network .. '_vlan', 'mtu', mtu) | ||||||
|     else |     else | ||||||
|     uci:set('network', mesh, 'mtu', 1532) |       uci:set('network', network, 'mtu', mtu) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   if config.mesh then | ||||||
|  |     uci:set('network', 'mesh_' .. radio, 'mtu', mtu) | ||||||
|   end |   end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| @ -25,13 +31,15 @@ uci:foreach('wireless', 'wifi-device', | |||||||
| 	    end | 	    end | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | local mtu = 1532 | ||||||
|  | 
 | ||||||
| for _, radio in ipairs(radios) do | for _, radio in ipairs(radios) do | ||||||
| 	local hwmode = uci:get('wireless', radio, 'hwmode') | 	local hwmode = uci:get('wireless', radio, 'hwmode') | ||||||
| 
 | 
 | ||||||
| 	if hwmode == '11g' or hwmode == '11ng' then | 	if hwmode == '11g' or hwmode == '11ng' then | ||||||
| 	  configure_mtu(radio, site.wifi24) | 	  configure_mtu(radio, site.wifi24, mtu) | ||||||
| 	elseif hwmode == '11a' or hwmode == '11na' then | 	elseif hwmode == '11a' or hwmode == '11na' then | ||||||
| 	  configure_mtu(radio, site.wifi5) | 	  configure_mtu(radio, site.wifi5, mtu) | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,15 +1,27 @@ | |||||||
| need_string('regdom') | need_string('regdom') | ||||||
| 
 | 
 | ||||||
| for _, config in ipairs({'wifi24', 'wifi5'}) do | for _, config in ipairs({'wifi24', 'wifi5'}) do | ||||||
|    need_string(config .. '.ssid') |  | ||||||
|    need_number(config .. '.channel') |    need_number(config .. '.channel') | ||||||
|    need_string(config .. '.htmode') |    need_string(config .. '.htmode') | ||||||
|    need_string(config .. '.mesh_ssid') | 
 | ||||||
|    need_string_match(config .. '.mesh_bssid', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') |    if need_table(config .. '.ap', nil, false) then | ||||||
|    need_number(config .. '.mesh_mcast_rate') |       need_string(config .. '.ap.ssid') | ||||||
|    need_number(config .. '.mesh_vlan', false) |       need_boolean(config .. '.ap.disabled', false) | ||||||
|    need_boolean(config .. '.client_disabled', false) |    end | ||||||
|    need_boolean(config .. '.mesh_disabled', false) | 
 | ||||||
|  |    if need_table(config .. '.ibss', nil, false) then | ||||||
|  |       need_string(config .. '.ibss.ssid') | ||||||
|  |       need_string_match(config .. '.ibss.bssid', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') | ||||||
|  |       need_number(config .. '.ibss.mcast_rate', false) | ||||||
|  |       need_number(config .. '.ibss.vlan', false) | ||||||
|  |       need_boolean(config .. '.ibss.disabled', false) | ||||||
|  |    end | ||||||
|  | 
 | ||||||
|  |    if need_table(config .. '.mesh', nil, false) then | ||||||
|  |       need_string(config .. '.mesh.id') | ||||||
|  |       need_number(config .. '.mesh.mcast_rate', false) | ||||||
|  |       need_boolean(config .. '.mesh.disabled', false) | ||||||
|  |    end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| need_boolean('mesh_on_wan', false) | need_boolean('mesh_on_wan', false) | ||||||
|  | |||||||
| @ -6,70 +6,61 @@ local util = require 'gluon.util' | |||||||
| local uci = require('luci.model.uci').cursor() | local uci = require('luci.model.uci').cursor() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| local function configure_radio(radio, index, config) | local function is_disabled(config, name) | ||||||
|   uci:delete('wireless', radio, 'disabled') |   local disabled = config and config.disabled | ||||||
| 
 |   if uci:get('wireless', name) then | ||||||
|   uci:set('wireless', radio, 'channel', config.channel) |     disabled = uci:get_bool('wireless', name, 'disabled') | ||||||
|   uci:set('wireless', radio, 'htmode', config.htmode) |  | ||||||
|   uci:set('wireless', radio, 'country', site.regdom) |  | ||||||
| 
 |  | ||||||
|   local client = 'client_' .. radio |  | ||||||
|   local mesh = 'mesh_' .. radio |  | ||||||
| 
 |  | ||||||
|   local disable_state_client = false |  | ||||||
|   local disable_state_mesh = false |  | ||||||
| 
 |  | ||||||
|   if uci:get('wireless', client) then |  | ||||||
|     disable_state_client = uci:get_bool('wireless', client, "disabled") |  | ||||||
|   elseif config.client_disabled then |  | ||||||
|     disable_state_client = true |  | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   if uci:get('wireless', mesh) then |   return disabled and 1 or 0 | ||||||
|     disable_state_mesh = uci:get_bool('wireless', mesh, "disabled") | end | ||||||
|   elseif config.mesh_disabled then |  | ||||||
|     disable_state_mesh = true |  | ||||||
|   end |  | ||||||
| 
 | 
 | ||||||
|   local client_ifname | local function configure_client(config, radio, index, suffix) | ||||||
|   local mesh_ifname |   local name = 'client_' .. radio | ||||||
|   local radio_suffix = radio:match('^radio(%d+)$') |   local disabled = is_disabled(config, name) | ||||||
|   if radio_suffix then |  | ||||||
|     client_ifname = 'client' .. radio_suffix |  | ||||||
|     mesh_ifname = 'mesh' .. radio_suffix |  | ||||||
|   end |  | ||||||
| 
 | 
 | ||||||
|   uci:delete('wireless', client) |   uci:delete('wireless', name) | ||||||
|   uci:section('wireless', 'wifi-iface', client, | 
 | ||||||
|  |   if config then | ||||||
|  |     uci:section('wireless', 'wifi-iface', name, | ||||||
|       { |       { | ||||||
|         device = radio, |         device = radio, | ||||||
|         network = 'client', |         network = 'client', | ||||||
|         mode = 'ap', |         mode = 'ap', | ||||||
|         ssid = config.ssid, |         ssid = config.ssid, | ||||||
|         macaddr = util.generate_mac(2, index), |         macaddr = util.generate_mac(2, index), | ||||||
| 		ifname = client_ifname, |         ifname = suffix and 'client' .. suffix, | ||||||
| 		disabled = disable_state_client and 1 or 0, |         disabled = disabled, | ||||||
|       } |       } | ||||||
|     ) |     ) | ||||||
|  |   end | ||||||
|  | end | ||||||
| 
 | 
 | ||||||
|   uci:delete('network', mesh) | local function configure_ibss(config, radio, index, suffix) | ||||||
|   uci:delete('network', mesh .. '_vlan') |   local name = 'ibss_' .. radio | ||||||
|  |   local disabled = is_disabled(config, name) | ||||||
| 
 | 
 | ||||||
|   if config.mesh_vlan then |   uci:delete('network', name) | ||||||
| 	uci:section('network', 'interface', mesh, |   uci:delete('network', name .. '_vlan') | ||||||
|  |   uci:delete('wireless', name) | ||||||
|  | 
 | ||||||
|  |   if config then | ||||||
|  |     if config.vlan then | ||||||
|  |       uci:section('network', 'interface', name, | ||||||
|         { |         { | ||||||
|           proto = 'none', |           proto = 'none', | ||||||
|         } |         } | ||||||
|       ) |       ) | ||||||
| 	uci:section('network', 'interface', mesh .. '_vlan', | 
 | ||||||
|  |       uci:section('network', 'interface', name .. '_vlan', | ||||||
|         { |         { | ||||||
| 		ifname = '@' .. mesh .. '.' .. config.mesh_vlan, |           ifname = '@' .. name .. '.' .. config.vlan, | ||||||
|           proto = 'batadv', |           proto = 'batadv', | ||||||
|           mesh = 'bat0', |           mesh = 'bat0', | ||||||
|         } |         } | ||||||
|       ) |       ) | ||||||
|     else |     else | ||||||
| 	uci:section('network', 'interface', mesh, |       uci:section('network', 'interface', name, | ||||||
|         { |         { | ||||||
|           proto = 'batadv', |           proto = 'batadv', | ||||||
|           mesh = 'bat0', |           mesh = 'bat0', | ||||||
| @ -77,20 +68,65 @@ local function configure_radio(radio, index, config) | |||||||
|       ) |       ) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|   uci:delete('wireless', mesh) |     uci:section('wireless', 'wifi-iface', name, | ||||||
|   uci:section('wireless', 'wifi-iface', mesh, |  | ||||||
|       { |       { | ||||||
|         device = radio, |         device = radio, | ||||||
| 		network = mesh, |         network = name, | ||||||
|         mode = 'adhoc', |         mode = 'adhoc', | ||||||
| 		ssid = config.mesh_ssid, |         ssid = config.ssid, | ||||||
| 		bssid = config.mesh_bssid, |         bssid = config.bssid, | ||||||
|         macaddr = util.generate_mac(3, index), |         macaddr = util.generate_mac(3, index), | ||||||
| 		mcast_rate = config.mesh_mcast_rate, |         mcast_rate = config.mcast_rate, | ||||||
| 		ifname = mesh_ifname, |         ifname = suffix and 'ibss' .. suffix, | ||||||
| 		disabled = disable_state_mesh and 1 or 0, |         disabled = disabled, | ||||||
|       } |       } | ||||||
|     ) |     ) | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | local function configure_mesh(config, radio, index, suffix) | ||||||
|  |   local name = 'mesh_' .. radio | ||||||
|  |   local disabled = is_disabled(config, name) | ||||||
|  | 
 | ||||||
|  |   uci:delete('network', name) | ||||||
|  |   uci:delete('wireless', name) | ||||||
|  | 
 | ||||||
|  |   if config then | ||||||
|  |     uci:section('network', 'interface', name, | ||||||
|  |       { | ||||||
|  |         proto = 'batadv', | ||||||
|  |         mesh = 'bat0', | ||||||
|  |       } | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     uci:section('wireless', 'wifi-iface', name, | ||||||
|  |       { | ||||||
|  |         device = radio, | ||||||
|  |         network = name, | ||||||
|  |         mode = 'mesh', | ||||||
|  |         mesh_id = config.id, | ||||||
|  |         mesh_fwding = 0, | ||||||
|  |         macaddr = util.generate_mac(5, index), | ||||||
|  |         mcast_rate = config.mcast_rate, | ||||||
|  |         ifname = suffix and 'mesh' .. suffix, | ||||||
|  |         disabled = disabled, | ||||||
|  |       } | ||||||
|  |     ) | ||||||
|  |   end | ||||||
|  | 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 | end | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -84,9 +84,11 @@ function need_table(varname, subcheck, required) | |||||||
| 
 | 
 | ||||||
|    assert_type(var, 'table', "site.conf error: expected `" .. varname .. "' to be a table") |    assert_type(var, 'table', "site.conf error: expected `" .. varname .. "' to be a table") | ||||||
| 
 | 
 | ||||||
|  |    if subcheck then | ||||||
|       for k, v in pairs(var) do |       for k, v in pairs(var) do | ||||||
|          subcheck(k, v) |          subcheck(k, v) | ||||||
|       end |       end | ||||||
|  |    end | ||||||
| 
 | 
 | ||||||
|    return var |    return var | ||||||
| end | end | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user