docs: add documentation about multidomain support (#1365)
This commit is contained in:
		
							parent
							
								
									046103e5a2
								
							
						
					
					
						commit
						c0e7b96d1d
					
				
							
								
								
									
										272
									
								
								docs/features/multidomain.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								docs/features/multidomain.rst
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,272 @@ | ||||
| Multidomain Support | ||||
| =================== | ||||
| 
 | ||||
| Preamble | ||||
| -------- | ||||
| 
 | ||||
| There comes a time when a mesh network grows past sensible boundaries. | ||||
| As broadcast traffic grows, mesh networks experience scaling issues and | ||||
| using them becomes very unpleasant. An approach to solve this follows | ||||
| the well-known “divide and conquer” paradigm and splits a large network | ||||
| into multiple smaller networks. These smaller networks start with a | ||||
| dedicated layer 2 network each, which are interconnected via their | ||||
| gateways by layer 3 routing. Gluon is already field-tested handling a | ||||
| single domain and the multidomain feature allows for the reconfiguration | ||||
| of key parameters that decide which domain a node participates in, | ||||
| without the need of a distinct set of firmware images for each mesh domain. | ||||
| 
 | ||||
| Overview | ||||
| -------- | ||||
| 
 | ||||
| Multidomain support allows to build a single firmware with multiple, | ||||
| switchable domain configurations. The nomenclature is as follows: | ||||
| 
 | ||||
| -  ``site``: an aggregate over multiple domains | ||||
| -  ``domain``: mesh network with connectivity parameters that prevent | ||||
|    accidental bridging with other domains | ||||
| -  ``domain code``: unique domain identifier | ||||
| -  ``domain name``: pretty name for a domain code | ||||
| 
 | ||||
| By default Gluon builds firmware with a single domain embedded into | ||||
| ``site.conf``. To use multiple domains, enable it in ``site.mk``: | ||||
| 
 | ||||
| :: | ||||
| 
 | ||||
|     GLUON_MULTIDOMAIN=1 | ||||
| 
 | ||||
| In the site repository, create the ``domains/`` directory, which will | ||||
| hold your domain configurations. Each domain configuration file is named | ||||
| after its primary ``domain_code``, additional domain codes and names are | ||||
| supported. | ||||
| 
 | ||||
| :: | ||||
| 
 | ||||
|     site/ | ||||
|     |-- site.conf | ||||
|     |-- site.mk | ||||
|     |-- i18n/ | ||||
|     |-- domains/ | ||||
|       |-- alpha_centauri.conf | ||||
|       |-- beta_centauri.conf | ||||
|       |-- gamma_centauri.conf | ||||
| 
 | ||||
| The domain configuration ``alpha_centauri.conf`` could look like this. | ||||
| 
 | ||||
| :: | ||||
| 
 | ||||
|     { | ||||
|       domain_names = { | ||||
|         alpha_centauri = 'Alpha Centauri' | ||||
|       }, | ||||
| 
 | ||||
|       -- more domain specific config follows below | ||||
|     } | ||||
| 
 | ||||
| In this example “Alpha Centauri” is the user-visible ``domain_name`` for the | ||||
| domain_code ``alpha_centauri``. Also note that the domain code | ||||
| ``alpha_centauri`` matches the filename ``alpha_centauri.conf``. | ||||
| 
 | ||||
| Additional domain codes/names can be added to ``domain_names``, which | ||||
| are treated as aliases for the their domain configuration. Aliases can | ||||
| be used to offer more fine-grained and well-recognizable domain choices | ||||
| to users. Having multiple aliases on a single domain is a helpful | ||||
| precursor to splitting the domain into even smaller blocks. | ||||
| 
 | ||||
| Furthermore you have to specify the ``default_domain`` in the ``site.conf``. | ||||
| This domain is applied in following cases: | ||||
| 
 | ||||
| - When the config mode is skipped. | ||||
| - When a domain is removed in a new firmware release, the default_domain | ||||
|   will be chosen then. | ||||
| - When a user selects a wrong domain code via uci. | ||||
| 
 | ||||
| Please note, that this value is saved to uci, so changing the `default_domain` | ||||
| value in the `site.conf` in a new firmware release only affects the actual | ||||
| domain of a router, if and only if one of the above conditions matches. | ||||
| 
 | ||||
| 
 | ||||
| Switching the domain | ||||
| -------------------- | ||||
| 
 | ||||
| **via commandline**: | ||||
| 
 | ||||
| :: | ||||
| 
 | ||||
|     uci set gluon.core.domain="newdomaincode" | ||||
|     gluon-reconfigure | ||||
|     reboot | ||||
| 
 | ||||
| **via config mode:** | ||||
| 
 | ||||
| To allow switching the domain via config mode, ``config-mode-domain-select`` | ||||
| has to be added to GLUON_FEATURES in the site.mk. | ||||
| 
 | ||||
| |image0| | ||||
| 
 | ||||
| Allowed site variables | ||||
| ---------------------- | ||||
| 
 | ||||
| Internally the site variables are merged from the ``site.conf`` and the | ||||
| selected ``domain.conf``, so the most variables are also allowed in | ||||
| ``site.conf`` and in ``domain.conf``. But there are some exceptions, | ||||
| which do not make sense in a domain or site specific way. The following | ||||
| sections give an overview over variables that are only usable in either | ||||
| site or domain context. | ||||
| 
 | ||||
| site.conf only variables | ||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ||||
| 
 | ||||
| -  Used in as initial default values, when the firmware was just flashed | ||||
|    and/or the config mode is skipped, so they do not make sense in a | ||||
|    domain specific way: | ||||
| 
 | ||||
|    -  authorized_keys | ||||
|    -  default_domain | ||||
|    -  poe_passthrough | ||||
|    -  mesh_on_wan | ||||
|    -  mesh_on_lan | ||||
|    -  single_as_lan | ||||
|    -  setup_mode.skip | ||||
|    -  autoupdater.branch | ||||
|    -  mesh_vpn.enabled | ||||
|    -  mesh_vpn.pubkey_privacy | ||||
|    -  mesh_vpn.bandwidth_limit | ||||
|    -  mesh_vpn.bandwidth_limit.enabled | ||||
|    -  mesh_vpn.bandwidth_limit.ingress | ||||
|    -  mesh_vpn.bandwidth_limit.egress | ||||
| 
 | ||||
| -  Variables that influence the appearance of the config mode, | ||||
|    domain-independent because they are relevant before a domain was selected. | ||||
| 
 | ||||
|    -  config_mode.geo_location.show_altitude | ||||
|    -  config_mode.hostname.optional | ||||
|    -  config_mode.remote_login | ||||
|    -  config_mode.remote_login.show_password_form | ||||
|    -  config_mode.remote_login.min_password_length | ||||
|    -  hostname_prefix | ||||
|    -  mesh_vpn.fastd.configurable | ||||
|    -  roles.default | ||||
|    -  roles.list | ||||
| 
 | ||||
| -  Specific to a firmware build itself: | ||||
| 
 | ||||
|    -  site_code | ||||
|    -  site_name | ||||
|    -  autoupdater.branches.*.name | ||||
|    -  autoupdater.branches.*.good_signatures | ||||
|    -  autoupdater.branches.*.pubkeys | ||||
| 
 | ||||
| -  We simply do not see any reason, why these variables could be helpful | ||||
|    in a domain specific way: | ||||
| 
 | ||||
|    -  mesh_vpn.fastd.syslog_level | ||||
|    -  wifi*.ibss.supported_basic_rates | ||||
|    -  wifi*.mesh.supported_basic_rates | ||||
|    -  timezone | ||||
|    -  regdom | ||||
| 
 | ||||
| domain.conf only variables | ||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||||
| 
 | ||||
| -  Obviously: | ||||
| 
 | ||||
|    -  domain_names | ||||
| 
 | ||||
|       -  a table of domain codes to domain names | ||||
|          ``domain_names = { foo = 'Foo Domain', bar = 'Bar Domain', baz = 'Baz Domain' }`` | ||||
| 
 | ||||
|    -  hide_domain | ||||
| 
 | ||||
|       -  prevents a domain name(s) from appearing in config mode, either | ||||
|          boolean or array of domain codes | ||||
| 
 | ||||
|          -  ``true``, ``false`` | ||||
|          -  ``{ 'foo', 'bar' }`` | ||||
| 
 | ||||
| -  Because each domain is considered as an own layer 2 network, these | ||||
|    values should be different in each domain: | ||||
| 
 | ||||
|    -  next_node.ip4 | ||||
|    -  next_node.ip6 | ||||
|    -  next_node.name | ||||
|    -  prefix6 | ||||
|    -  prefix4 | ||||
|    -  extra_prefixes6 | ||||
| 
 | ||||
| -  To prevent accidential bridging of different domains, all meshing | ||||
|    technologies should be seperated: | ||||
| 
 | ||||
|    -  domain_seed (wired mesh) | ||||
| 
 | ||||
|       -  must be a random value used to derive the vxlan id for wired meshing | ||||
| 
 | ||||
|    -  wifi*.ibss.ssid | ||||
|    -  wifi*.ibss.bssid | ||||
|    -  wifi*.mesh.id | ||||
|    -  mesh_vpn.fastd.groups.*.peers.remotes | ||||
|    -  mesh_vpn.fastd.groups.*.peers.key | ||||
|    -  mesh_vpn.tunneldigger.brokers | ||||
| 
 | ||||
| -  Clients consider WiFi networks sharing the same ESSID as if they were | ||||
|    the same L2 network and try to reconfirm and reuse previous | ||||
|    addressing. If multiple neighbouring domains shared the same ESSID, | ||||
|    the roaming experience of clients would degrade. | ||||
| 
 | ||||
|    -  wifi*.ap.ssid | ||||
| 
 | ||||
| - Some values should be only set in legacy domains and not in new domains. | ||||
|    -  mesh.vxlan | ||||
| 
 | ||||
|        -  By default, this value is `true`. It should be only set to `false` | ||||
|           for one legacy domain, since vxlan prevents accidental wired | ||||
|           merges of domains. For old domains this value is still available | ||||
|           to keep compatibility between all nodes in one domain. | ||||
| 
 | ||||
|    -  next_node.mac | ||||
| 
 | ||||
|        -  For new domains, the default value should be used, since there is | ||||
|           no need for a special mac (or domain specific mac). For old domains | ||||
|           this value is still available to keep compatibility between all | ||||
|           nodes in one domain. | ||||
| 
 | ||||
| Example config | ||||
| -------------- | ||||
| 
 | ||||
| site.mk | ||||
| ^^^^^^^ | ||||
| 
 | ||||
| .. literalinclude:: ../multidomain-site-example/site.mk | ||||
|   :language: makefile | ||||
| 
 | ||||
| site.conf | ||||
| ^^^^^^^^^ | ||||
| 
 | ||||
| .. literalinclude:: ../multidomain-site-example/site.conf | ||||
|   :language: lua | ||||
| 
 | ||||
| domains/alpha_centauri.conf | ||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||||
| 
 | ||||
| .. literalinclude:: ../multidomain-site-example/domains/alpha_centauri.conf | ||||
|   :language: lua | ||||
| 
 | ||||
| i18n/en.po | ||||
| ^^^^^^^^^^ | ||||
| 
 | ||||
| .. literalinclude:: ../multidomain-site-example/i18n/en.po | ||||
|   :language: po | ||||
| 
 | ||||
| i18n/de.po | ||||
| ^^^^^^^^^^ | ||||
| 
 | ||||
| .. literalinclude:: ../multidomain-site-example/i18n/de.po | ||||
|   :language: po | ||||
| 
 | ||||
| modules | ||||
| ^^^^^^^ | ||||
| 
 | ||||
| .. literalinclude:: ../multidomain-site-example/modules | ||||
|   :language: makefile | ||||
| 
 | ||||
| 
 | ||||
| .. |image0| image:: multidomain_configmode.gif | ||||
							
								
								
									
										
											BIN
										
									
								
								docs/features/multidomain_configmode.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/features/multidomain_configmode.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 57 KiB | 
| @ -25,6 +25,7 @@ Several Freifunk communities in Germany use Gluon as the foundation of their Fre | ||||
|    features/wired-mesh | ||||
|    features/dns-forwarder | ||||
|    features/monitoring | ||||
|    features/multidomain | ||||
|    features/authorized-keys | ||||
|    features/roles | ||||
|    features/vpn | ||||
|  | ||||
							
								
								
									
										61
									
								
								docs/multidomain-site-example/domains/alpha_centauri.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								docs/multidomain-site-example/domains/alpha_centauri.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| { | ||||
|   -- multiple codes/names can be defined, the first one is the primary name | ||||
|   -- additional aliases can be defined | ||||
|   domain_names = { | ||||
|     alpha_centauri = 'Alpha Centauri', | ||||
|     rigil_kentaurus = 'Rigil Kentaurus', | ||||
|     proxima_centauri = 'Proxima Centauri', | ||||
|   }, | ||||
| 
 | ||||
|   -- 32 byte random data in hexadecimal encoding | ||||
|   -- Can be generated using: echo $(hexdump -v -n 32 -e '1/1 "%02x"' </dev/urandom) | ||||
|   domain_seed = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', | ||||
| 
 | ||||
|   -- unique network prefixes per domain | ||||
|   prefix4 = '10.xxx.0.0/20', | ||||
|   prefix6 = 'fdxx:xxxx:xxxx:xxxx::/64', | ||||
| 
 | ||||
|   next_node = { | ||||
|     ip4 = '10.xxx.yyy.zzz', | ||||
|     ip6 = 'fdxx:xxxx:xxxx:xxxx::xxxx', | ||||
|   }, | ||||
| 
 | ||||
|   wifi24= { | ||||
|     ap = { | ||||
|       ssid = "alpha-centauri.example.org", | ||||
|       channel = 1, | ||||
|     }, | ||||
|     mesh = { | ||||
|       id = 'ueH3uXjdp', -- usually you don't want users to connect to this mesh-SSID, so use a cryptic id that no one will accidentally mistake for the client WiFi | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   wifi5= { | ||||
|     ap = { | ||||
|       ssid = "alpha-centauri.example.org", | ||||
|       channel = 44, | ||||
|     }, | ||||
|     mesh = { | ||||
|       id = 'ueH3uXjdp', | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   mesh_vpn = { | ||||
|     fastd = { | ||||
|       groups = { | ||||
|         backbone = { | ||||
|           peers = { | ||||
|             peer1 = { | ||||
|               key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', | ||||
|               remotes = {'"peer1.example.org" port xxxxx'}, | ||||
|             }, | ||||
|             peer2 = { | ||||
|               key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', | ||||
|               remotes = {'"peer2.example.org" port xxxxx'}, | ||||
|             }, | ||||
|           }, | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
							
								
								
									
										1
									
								
								docs/multidomain-site-example/i18n
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								docs/multidomain-site-example/i18n
									
									
									
									
									
										Symbolic link
									
								
							| @ -0,0 +1 @@ | ||||
| ../site-example/i18n/ | ||||
							
								
								
									
										1
									
								
								docs/multidomain-site-example/modules
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								docs/multidomain-site-example/modules
									
									
									
									
									
										Symbolic link
									
								
							| @ -0,0 +1 @@ | ||||
| ../site-example/modules | ||||
							
								
								
									
										52
									
								
								docs/multidomain-site-example/site.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								docs/multidomain-site-example/site.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| { | ||||
|   site_name = 'Centauri Mesh', | ||||
|   site_code = 'centauri', | ||||
|   default_domain = 'alpha_centauri', | ||||
| 
 | ||||
|   timezone = 'CET-1CEST,M3.5.0,M10.5.0/3', | ||||
|   ntp_server = {'ntp1.example.org', 'ntp2.example.org'}, | ||||
|   regdom = 'DE', | ||||
| 
 | ||||
|   wifi24 = { | ||||
|     mesh = { | ||||
|       mcast_rate = 12000, | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   wifi5 = { | ||||
|     mesh = { | ||||
|       mcast_rate = 12000, | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   mesh_vpn = { | ||||
|     mtu = 1312, | ||||
| 
 | ||||
|     fastd = { | ||||
|       methods = {'salsa2012+umac'}, | ||||
|     }, | ||||
| 
 | ||||
|     bandwidth_limit = { | ||||
|       enabled = false, | ||||
|       egress = 200, -- kbit/s | ||||
|       ingress = 3000, -- kbit/s | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   autoupdater = { | ||||
|     branch = 'stable', | ||||
| 
 | ||||
|     branches = { | ||||
|       stable = { | ||||
|         name = 'stable', | ||||
|         mirrors = {'http://update.example.org/stable/sysupgrade'}, | ||||
|         good_signatures = 2, | ||||
|         pubkeys = { | ||||
|           'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', -- Alice | ||||
|           'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', -- Bob | ||||
|           'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', -- Mary | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
							
								
								
									
										60
									
								
								docs/multidomain-site-example/site.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								docs/multidomain-site-example/site.mk
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | ||||
| ##	gluon site.mk makefile example
 | ||||
| 
 | ||||
| ##	GLUON_FEATURES
 | ||||
| #		Specify Gluon features/packages to enable;
 | ||||
| #		Gluon will automatically enable a set of packages
 | ||||
| #		depending on the combination of features listed
 | ||||
| 
 | ||||
| GLUON_FEATURES := \
 | ||||
| 	autoupdater \
 | ||||
| 	ebtables-filter-multicast \
 | ||||
| 	ebtables-filter-ra-dhcp \
 | ||||
| 	mesh-batman-adv-15 \
 | ||||
| 	mesh-vpn-fastd \
 | ||||
| 	radvd \
 | ||||
| 	respondd \
 | ||||
| 	status-page \
 | ||||
| 	web-advanced \
 | ||||
| 	web-wizard | ||||
| 
 | ||||
| ##	GLUON_MULTIDOMAIN
 | ||||
| #		Build gluon with multidomain support.
 | ||||
| 
 | ||||
| GLUON_MULTIDOMAIN=1 | ||||
| 
 | ||||
| ##	GLUON_SITE_PACKAGES
 | ||||
| #		Specify additional Gluon/LEDE packages to include here;
 | ||||
| #		A minus sign may be prepended to remove a packages from the
 | ||||
| #		selection that would be enabled by default or due to the
 | ||||
| #		chosen feature flags
 | ||||
| 
 | ||||
| 
 | ||||
| GLUON_SITE_PACKAGES := haveged iwinfo | ||||
| 
 | ||||
| ##	DEFAULT_GLUON_RELEASE
 | ||||
| #		version string to use for images
 | ||||
| #		gluon relies on
 | ||||
| #			opkg compare-versions "$1" '>>' "$2"
 | ||||
| #		to decide if a version is newer or not.
 | ||||
| 
 | ||||
| DEFAULT_GLUON_RELEASE := 0.6+exp$(shell date '+%Y%m%d') | ||||
| 
 | ||||
| # Variables set with ?= can be overwritten from the command line
 | ||||
| 
 | ||||
| ##	GLUON_RELEASE
 | ||||
| #		call make with custom GLUON_RELEASE flag, to use your own release version scheme.
 | ||||
| #		e.g.:
 | ||||
| #			$ make images GLUON_RELEASE=23.42+5
 | ||||
| #		would generate images named like this:
 | ||||
| #			gluon-ff%site_code%-23.42+5-%router_model%.bin
 | ||||
| 
 | ||||
| GLUON_RELEASE ?= $(DEFAULT_GLUON_RELEASE) | ||||
| 
 | ||||
| # Default priority for updates.
 | ||||
| GLUON_PRIORITY ?= 0 | ||||
| 
 | ||||
| # Region code required for some images; supported values: us eu
 | ||||
| GLUON_REGION ?= eu | ||||
| 
 | ||||
| # Languages to include
 | ||||
| GLUON_LANGS ?= en de | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user