<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sudoroom.org/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mitar</id>
	<title>Sudo Room - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://sudoroom.org/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mitar"/>
	<link rel="alternate" type="text/html" href="https://sudoroom.org/wiki/Special:Contributions/Mitar"/>
	<updated>2026-04-23T10:08:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=5MoF_2017-04-05&amp;diff=10542</id>
		<title>5MoF 2017-04-05</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=5MoF_2017-04-05&amp;diff=10542"/>
		<updated>2017-04-06T02:45:54Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Added slides.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Put your name and title of your presentation - additionally a link if anyone wants to learn more.&lt;br /&gt;
&lt;br /&gt;
Please feel free to email ([mailto:info@sudoroom.org info@sudoroom.org]) if you have questions or concerns about this event or 5MoF in general.&lt;br /&gt;
&lt;br /&gt;
1. &lt;br /&gt;
&lt;br /&gt;
2. Chris Jefferies - raspberry pis, auto-wifi raspian, xbee radios, wemos D1mini radios, node-red, MQTT, graphite/grafana, hubot/rocket.chat&lt;br /&gt;
&lt;br /&gt;
3. Eran - CENX4 - A completely open, modular MIDI controller platform&lt;br /&gt;
&lt;br /&gt;
4. Mitar - What is Intel SGX and how you can secure your JavaScript using my new [https://github.com/luckychain/node-secureworker NPM package]. ([https://docs.google.com/presentation/d/1oVyJUyNrsXY1QW0Plyw-jA5a7GeMsR84J-5yJ6IEXks slides])&lt;br /&gt;
&lt;br /&gt;
5. [[User:juul|juul]] - [https://fread.ink/ fread.ink] - Building a free and open source alternate operating system for electronic paper ebook readers.&lt;br /&gt;
&lt;br /&gt;
6. Jake - Buck converters, how do they work?&lt;br /&gt;
&lt;br /&gt;
8. Captain Morgan - Making flexible circuits&lt;br /&gt;
&lt;br /&gt;
9. Robb - Prof-quality open source event live streaming&lt;br /&gt;
&lt;br /&gt;
10. [[User:Romyilano]] - My project to build a healthy eating tool through cartoon characters that interact with your environment.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=5MoF_2017-04-05&amp;diff=10540</id>
		<title>5MoF 2017-04-05</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=5MoF_2017-04-05&amp;diff=10540"/>
		<updated>2017-04-05T23:02:12Z</updated>

		<summary type="html">&lt;p&gt;Mitar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Put your name and title of your presentation - additionally a link if anyone wants to learn more.&lt;br /&gt;
&lt;br /&gt;
Please feel free to email ([mailto:info@sudoroom.org info@sudoroom.org]) if you have questions or concerns about this event or 5MoF in general.&lt;br /&gt;
&lt;br /&gt;
1. &lt;br /&gt;
&lt;br /&gt;
2. Chris Jefferies - raspberry pis, auto-wifi raspian, xbee radios, wemos D1mini radios, node-red, MQTT, graphite/grafana, hubot/rocket.chat&lt;br /&gt;
&lt;br /&gt;
3. Eran - CENX4 - A completely open, modular MIDI controller platform&lt;br /&gt;
&lt;br /&gt;
4. Mitar - What is Intel SGX and how you can secure your JavaScript using my new [https://github.com/luckychain/node-secureworker NPM package].&lt;br /&gt;
&lt;br /&gt;
5. [[User:juul|juul]] - [https://fread.ink/ fread.ink] - Building a free and open source alternate operating system for electronic paper ebook readers.&lt;br /&gt;
&lt;br /&gt;
6. Jake - Buck converters, how do they work?&lt;br /&gt;
&lt;br /&gt;
8. Captain Morgan - Making flexible circuits&lt;br /&gt;
&lt;br /&gt;
9. Robb - Prof-quality open source event live streaming&lt;br /&gt;
&lt;br /&gt;
10. [[User:Romyilano]] - My project to build a healthy eating tool through cartoon characters that interact with your environment.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=5MoF_2017-04-05&amp;diff=10500</id>
		<title>5MoF 2017-04-05</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=5MoF_2017-04-05&amp;diff=10500"/>
		<updated>2017-03-16T07:06:57Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Added SGX presentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Put your name and title of your presentation - additionally a link if anyone wants to learn more.&lt;br /&gt;
&lt;br /&gt;
Please feel free to email ([mailto:info@sudoroom.org info@sudoroom.org]) if you have questions or concerns about this event or 5MoF in general.&lt;br /&gt;
&lt;br /&gt;
1. &lt;br /&gt;
&lt;br /&gt;
2. &lt;br /&gt;
&lt;br /&gt;
3. [[User:tunabananas|tunabananas]] - How to Buy a Building - and keep it radical! - You've got a solid community, but how does one catalyze excited newbie energy / burnt out founders / confused in-betweens into the kind of productivity needed to acquire and maintain a multi-use space when moving from DIY -&amp;gt; DIT -&amp;gt; WE GONNA OWN THIS BUILDING OMG WTF?!?&lt;br /&gt;
&lt;br /&gt;
4. Mitar - What is Intel SGX and how you can secure your JavaScript using my new [https://github.com/luckychain/node-secureworker|NPM package].&lt;br /&gt;
&lt;br /&gt;
5.  &lt;br /&gt;
&lt;br /&gt;
6. &lt;br /&gt;
&lt;br /&gt;
8. &lt;br /&gt;
&lt;br /&gt;
9. &lt;br /&gt;
&lt;br /&gt;
10.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5881</id>
		<title>Mesh/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5881"/>
		<updated>2013-10-26T07:53:21Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Watchdog script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for the sudo mesh firmware.&lt;br /&gt;
&lt;br /&gt;
= Firmware generation features =&lt;br /&gt;
&lt;br /&gt;
It should be easy to generate a new firmware with the following custom config:&lt;br /&gt;
&lt;br /&gt;
*Location and ownership information.&lt;br /&gt;
:Contact info should be saved in a secure database but maybe not on the node itself?&lt;br /&gt;
*Randomly generated passwords set for wpa2, admin interface and ssh.&lt;br /&gt;
:The SSH password should be stored securely and a couple of stickers with the wpa2 and admin password should be printed for the user.&lt;br /&gt;
*Web interface&lt;br /&gt;
*ssh key generation&lt;br /&gt;
&lt;br /&gt;
[http://meshkit.freifunk.net/ Freifunk Meshkit] is pretty neat!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/sudomesh/openwrt-firmware Sudomesh Firmware Github Repo]&lt;br /&gt;
&lt;br /&gt;
Status:&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware should have =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Ranked from most to least important&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== InternetIsDownRedirect == &lt;br /&gt;
&lt;br /&gt;
When the node doesn't have internet access, it will redirect traffic to our mesh hosted [[Mesh/Firmware#Splash_page|Splash Page]].&lt;br /&gt;
&lt;br /&gt;
We need something hosted on the node that can check if it has access to the internet. There's a bit of an issue where certain OSes won't connect to APs that don't have internet access. [[User:Juul|Juul]] will look into building a hack that properly manages these requests and redirects them to our node-hosted site.&lt;br /&gt;
&lt;br /&gt;
InternetIsDownRedirect may also have to fake the expected captive portal detection responses? We need to figure out if android/iOS/Mac/Windows will connect to a wifi that does not have internet access.&lt;br /&gt;
&lt;br /&gt;
Status: Implemented except for OS-specific captive portal requests.&lt;br /&gt;
&lt;br /&gt;
== Splash page ==&lt;br /&gt;
&lt;br /&gt;
We can capture OS specific probes in order to specifically redirect captive portal requests without affecting any other network traffic.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
&lt;br /&gt;
* Brief info on the mesh&lt;br /&gt;
* Link to our website?&lt;br /&gt;
&lt;br /&gt;
Status: &lt;br /&gt;
&lt;br /&gt;
[[User:Juul|Juul]] is in the process of implementing. He needs help with:&lt;br /&gt;
* Finding out captive portal request protocols for different OSes. He's covered Iphone, but needs information on other hardware &lt;br /&gt;
* We need UX/UI designers!&lt;br /&gt;
* Co-located server ($$)&lt;br /&gt;
&lt;br /&gt;
== SSH server ==&lt;br /&gt;
&lt;br /&gt;
The SSH server should be contactable from any interface. It should initially allow root access using a random generated password that the mesh group has and that the node owner can get and change if they are so inclined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Status: Need Key generation feature. Otherwise Implemented in openwrt. See firmware generation above.&lt;br /&gt;
&lt;br /&gt;
== BATMAN-adv ==&lt;br /&gt;
&lt;br /&gt;
We'll use this as the mesh protocol.&lt;br /&gt;
&lt;br /&gt;
Status: Implemented&lt;br /&gt;
&lt;br /&gt;
== Multiple virtual network interfaces with their own SSIDs ==&lt;br /&gt;
&lt;br /&gt;
*One ad-hock mode, unencrypted interface for the mesh nodes, e.g. sudomesh-backchannel&lt;br /&gt;
*One access point mode, unencrypted interface, for non-mesh devices to connect to the mesh, e.g. sudomesh.&lt;br /&gt;
*One access point mode, private interface with WPA2, for the people who own the nodes. [optional]&lt;br /&gt;
&lt;br /&gt;
Traffic on the private interface should be completely separated from traffic on the non-private interfaces unless a client connected to the private interface requests an IP on the mesh.&lt;br /&gt;
&lt;br /&gt;
Maybe the last one is optional because some people may not need that feature (they already have another access point and they want to keep it), but then how do people administrate the router? &lt;br /&gt;
&lt;br /&gt;
In order to serve a secure web admin config to home users, we'll probably always serve 3 APs with one private WPA encrypted home link so that users can access their admin page.&lt;br /&gt;
&lt;br /&gt;
Status: Implemented&lt;br /&gt;
&lt;br /&gt;
== Web admin interface ==&lt;br /&gt;
&lt;br /&gt;
Development information should be put in [[Mesh/Firmware/Web_Admin_Development|Web Admin Dev]]. This section can remain a wish-list.&lt;br /&gt;
&lt;br /&gt;
A very simple one-page interface. It should do at least the following:&lt;br /&gt;
&lt;br /&gt;
*Display some set of user statistics&lt;br /&gt;
:Ideally we could list/graph the number of people who have associated with your mesh node.&lt;br /&gt;
:We could also just list/graph the up/down data of people who have been using the mesh.&lt;br /&gt;
*Set location, name, description.&lt;br /&gt;
:But do you want to know the location centrally as well so that you can display nodes on the map? Will people enter this information twice or will you pull this information from nodes and then display on the map? Same for name and description. I would suggest that information is stored only once. In your case on the node itself. So probably you can then pull this information through nodewatcher scripts on nodes and then display nodes the map. Just really should not require people to enter or maintain information on two places because it desyncs very fast. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people select how much bandwidth they share.&lt;br /&gt;
:They always share 100% when they're not using the connection themselves.&lt;br /&gt;
::This works if people are using their private SSIDs on the node. But if the node is connected to their existing home network you might not easily configure such sharing. But maybe there is a way to detect that host network is free and can limits can be increased. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:Do any ISPs have bandwidth caps around here? If so, let people specify how many MB to share per month.&lt;br /&gt;
:Maybe also a button for temporary increase limits (make them more restrictive) which are then after some time automatically restored.&lt;br /&gt;
*Let people change the admin password and the private wifi wpa2 password.&lt;br /&gt;
:Probably private SSID as well.&lt;br /&gt;
*Donate / &amp;quot;buy routers as presents for your friends&amp;quot;-button.&lt;br /&gt;
:One idea we had (but this is probably better for splash screen) is &amp;quot;adopt a node&amp;quot;. Where a neighbor who uses a node a lot and depends on the node can donate some money to keep it up, but can then give a nickname or avatar to the node. Or something. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Status: [[User:Maxb|Maxb]] is implementing. &lt;br /&gt;
&lt;br /&gt;
Source here:&lt;br /&gt;
&lt;br /&gt;
https://github.com/sudomesh/luci-app-peopleswifi&lt;br /&gt;
&lt;br /&gt;
== Watchdog script ==&lt;br /&gt;
&lt;br /&gt;
Node tests itself to see if it has connectivity, etc and resets itself if necessary. OpenWrt supports the hardware watchdog on our PicoStations without any additional hacking, yay!&lt;br /&gt;
&lt;br /&gt;
By default the hardware watchdog will automatically hard-reset the AP if /dev/watchdog is not written to at least once every 60 seconds. A Lua library has been written to interface with the batman-adv kernel module through the batctl command line utility. We need to identify a list of conditions that require a hard-reset and work them into the Lua watchdog script in the openwrt-firmware repository.&lt;br /&gt;
&lt;br /&gt;
The Freifunk group has an awesome watchdog setup, details: http://wiki.freifunk.net/Kamikaze/LuCI/Watchdog&lt;br /&gt;
&lt;br /&gt;
list of possible reset conditions: high sustained load, cron goes down, sshd goes down.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wlanslovenija/firmware-packages-opkg/tree/master/util/nodewatcher-watchdog nodewatcher watchdog]&lt;br /&gt;
&lt;br /&gt;
== QoS / bandwidth shaping ==&lt;br /&gt;
&lt;br /&gt;
To support letting node owners select how much bandwidth they share.&lt;br /&gt;
&lt;br /&gt;
Status: [[User:Juul|Juul]] is hacking on.&lt;br /&gt;
&lt;br /&gt;
== Internet VPN ==&lt;br /&gt;
&lt;br /&gt;
The firmware should tunnel all Internet traffic from the mesh through a VPN server, unless this feature is specifically disabled.&lt;br /&gt;
&lt;br /&gt;
This should not be a single VPN server, as that would be a single point of failure.&lt;br /&gt;
&lt;br /&gt;
I suggest to use [http://wlan-si.net/blog/2012/10/29/tunneldigger-the-new-vpn-solution/ TunnelDigger]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 21:50, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
[[Mesh/Network_topology|Network Topology]]&lt;br /&gt;
&lt;br /&gt;
Status: [[User:Juul|Juul]] is implementing.&lt;br /&gt;
&lt;br /&gt;
== Mesh VPN ==&lt;br /&gt;
&lt;br /&gt;
If the mesh does not see any other nodes (and maybe even if it does?), and it has internet, then it should connect to another node or two over VPN. The easy solution is to use the same VPN servers as for the internet.&lt;br /&gt;
&lt;br /&gt;
[[Mesh/Network_topology|Network Topology]]&lt;br /&gt;
&lt;br /&gt;
Status: Implemented&lt;br /&gt;
&lt;br /&gt;
== DHCP and batman-adv gateway mode ==&lt;br /&gt;
&lt;br /&gt;
Nodes with an internet connection should run DHCP and [http://www.open-mesh.org/projects/batman-adv/wiki/Gateways batman-adv gateway mode]. We want to detect if the node can connect to a relay in which case it should configure as a batman-adv gateway server node. Otherwise they should configure as batman-adv gateway clients.&lt;br /&gt;
&lt;br /&gt;
Staus: Needs hacking.&lt;br /&gt;
&lt;br /&gt;
== Location and status reporting ==&lt;br /&gt;
&lt;br /&gt;
Something that reports location and status when polled.&lt;br /&gt;
&lt;br /&gt;
We developed this format and easy to publish status data from nodes for our [http://dev.wlan-si.net/wiki/Nodewatcher/NodeTelemetryProvider nodewatcher]. OpenWrt packages are [https://github.com/wlanslovenija/firmware-packages-opkg/tree/master/util here]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:02, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Nice to have:&lt;br /&gt;
&lt;br /&gt;
*Status info: How many nodes is your node connected to. Is the internet link working.&lt;br /&gt;
*An &amp;quot;I don't know what my internet bandwidth is, test it for me&amp;quot;-function.&lt;br /&gt;
*Usage statistics (so people can see how many people they helped get internet!)&lt;br /&gt;
:This is the most important thing! [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:You should add as well graphs on how much bandwidth was consumed by the node. This is useful when hosts see that their Internet is slow and believe that it was because of the node. Then they can check and see if it is really node (which often is not) or maybe just ISP has problems. Important because people like to attribute issues they have to nodes they don't understand. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people put up a bit of info about their node / house / co-op, on a simple web page that people can access only if they're connected to that node. It could be shown as part of the splash page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Status: Waiting for nodewatcher project to finish&lt;br /&gt;
&lt;br /&gt;
== Intelligent Wifi Channel Switching ==&lt;br /&gt;
&lt;br /&gt;
It would be nice to be able to have the network intelligently determine channels&lt;br /&gt;
&lt;br /&gt;
== IPv6 support ==&lt;br /&gt;
&lt;br /&gt;
We should have IPv6 support, but I am ok with launching the mesh with only IPv4 and adding in IPv6 later. ([[User:Juul|Juul]] ([[User talk:Juul|talk]]))&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware could have =&lt;br /&gt;
&lt;br /&gt;
== DNS server ==&lt;br /&gt;
&lt;br /&gt;
Each node could run its own (caching) DNS server. Doing this would allow people to access the admin interface for their node by going to e.g. http://me.mesh/ from the private interface.&lt;br /&gt;
&lt;br /&gt;
== RSSI Testing and Logging ==&lt;br /&gt;
&lt;br /&gt;
At intervals, the nodes could conduct RSSI tests and log them with some way to compare and visualize signal strengths over time.&lt;br /&gt;
&lt;br /&gt;
== Caching web proxy ==&lt;br /&gt;
&lt;br /&gt;
We could use [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] to improve people's browsing experience. Not sure how much cpu and memory this would need. We may not be able to run it on the routers with less than 32 MB ram (e.g. the Bullet 2 HPs). &lt;br /&gt;
&lt;br /&gt;
== Block ads and tracking ==&lt;br /&gt;
&lt;br /&gt;
We could use e.g. [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] with the sources from both adblock plus and ghostery. If we implement this, it should be an optional (default off) feature that you can select on the splash page, with a &amp;quot;remember this&amp;quot; that remembers either using a cookie or using your MAC (but then we'd be logging people's MAC addresses :-S). The block should probably be time-limited (e.g. 30 days).&lt;br /&gt;
&lt;br /&gt;
= Compatible devices =&lt;br /&gt;
&lt;br /&gt;
We should have ready-made images for:&lt;br /&gt;
&lt;br /&gt;
*One really cheap indoor router (with 3G usb stick support?) like [http://wiki.openwrt.org/toh/tp-link/tl-wr703n TP-Link TL-WR703N]&lt;br /&gt;
*One nice high-speed indoor router (300 mbps 802.11n)&lt;br /&gt;
*Ubiquiti hardware. Most of the AirMAX stuff.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Generating&amp;diff=5807</id>
		<title>Mesh/Firmware/Generating</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Generating&amp;diff=5807"/>
		<updated>2013-10-17T13:09:47Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Model (rough) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Model (rough) =&lt;br /&gt;
&lt;br /&gt;
Build Server:  &lt;br /&gt;
The one and only server responsible for building and signing SudoMesh OpenWRT images, mostly a collection of bash scripts.&lt;br /&gt;
&lt;br /&gt;
Configuration Server:  &lt;br /&gt;
One of possibly multiple servers responsible for and authenticated to query, configure and update nodes.&lt;br /&gt;
* python SSL socket server for configuring nodes over secure socket.&lt;br /&gt;
* python web server as a UI to the SSL configuration server.&lt;br /&gt;
** SSL libraries on the client (node) are often big. BusyBox wget does not support SSL for example. In wlan slovenija we were thinking of using SSH/SCP instead. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 06:09, 17 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Node:  &lt;br /&gt;
The basic build block of any mesh!&lt;br /&gt;
*node-admin: extended from the openWRT admin page, used by node owner for configuration.&lt;br /&gt;
*node-conf-client: lua client for accepting configs and answering config queries from a configuraion server.&lt;br /&gt;
&lt;br /&gt;
= Node Attributes =&lt;br /&gt;
&lt;br /&gt;
The following attributes are required of the Build Server at image build time:&lt;br /&gt;
&lt;br /&gt;
*Hardware model&lt;br /&gt;
*Firmware version&lt;br /&gt;
&lt;br /&gt;
The following attributes are required of the Configuration Server for initial configuration:&lt;br /&gt;
&lt;br /&gt;
*SSH host RSA keypair&lt;br /&gt;
*SSH host DSA keypair (optional?)&lt;br /&gt;
*SSH host ECDSA keypair (optional?)&lt;br /&gt;
*SSH keys allowed root access for debugging&lt;br /&gt;
&lt;br /&gt;
The following attributes are required of the Node Op for initial configuration through the Configuration Server:&lt;br /&gt;
&lt;br /&gt;
*Geographic address&lt;br /&gt;
*Node Op name&lt;br /&gt;
*Node Op email address&lt;br /&gt;
*Node Op phone number&lt;br /&gt;
&lt;br /&gt;
= wlan slovenija =&lt;br /&gt;
&lt;br /&gt;
wlan slovenija has a firmware generator tool. Here are some links:&lt;br /&gt;
&lt;br /&gt;
*[https://github.com/wlanslovenija/nodewatcher/blob/master/generator/config_generator.py config_generator.py: the core code for the generator]&lt;br /&gt;
*[https://github.com/wlanslovenija/nodewatcher/blob/master/generator/build_image.py build_image.py: the command line tool that uses config_generator.py]&lt;br /&gt;
&lt;br /&gt;
Some relevant code from config_generator.py:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      buildString = 'make image FILES=&amp;quot;../files&amp;quot; PROFILE=&amp;quot;%s&amp;quot; PACKAGES=&amp;quot;policy-routing olsrd uhttpd tc nodewatcher-core nodewatcher-clients ntpclient hostapd -ppp -ppp-mod-pppoe -wpad-mini kmod-l2tp kmod-l2tp-ip kmod-l2tp-eth tunneldigger wireless-tools qos-scripts %s&amp;quot;' % (profile_map[self.portLayout], pkgs)&lt;br /&gt;
      os.chdir(path)&lt;br /&gt;
      os.system(buildString)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The whole ''nodewatcher'' system is in fact a web interface to the image generator (this is how it all started, historically, as a web interface + IP allocation, and then we added network monitoring, node telemetry and so on).&lt;br /&gt;
&lt;br /&gt;
*[http://nodes.wlan-si.net/ live version]&lt;br /&gt;
&lt;br /&gt;
= freifunk =&lt;br /&gt;
&lt;br /&gt;
Freifunk has a web app called meshkit for generating images.&lt;br /&gt;
&lt;br /&gt;
*[http://meshkit.freifunk.net/ live web app]&lt;br /&gt;
*[https://github.com/freifunk/meshkit source code]&lt;br /&gt;
&lt;br /&gt;
Meshkit takes a strange approach. From the readme file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Meshkit itself just writes a uci config file and stores it in&lt;br /&gt;
/etc/config/meshkwizard in the resulting firmware image. The actual&lt;br /&gt;
configuration is done by meshwizard, which uses community profiles&lt;br /&gt;
and the settings from meshkit to configure the device at first boot after&lt;br /&gt;
the device has been flashed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While I understand why community profiles would be a good idea, it seems odd that the configuration would happen on the device. Why not generate all of the required configuration before generating the image? That way you save a bit of space and an extra reboot of the device.&lt;br /&gt;
&lt;br /&gt;
After looking at the code, I am not inclined to use it. Lots of freifunk-specific stuff. Few comments. In the end, all it does that we really care about is take a few values from the web app, write some config files for openwrt and run &amp;quot;make image&amp;quot; with some parameters. It does have a system for queuing builds, which is nice. Honestly, I think we're going to be better off making our own system&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5524</id>
		<title>Mesh/Firmware/Splash page</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5524"/>
		<updated>2013-09-03T22:42:33Z</updated>

		<summary type="html">&lt;p&gt;Mitar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some operating systems will attempt to detect whether you are behind a captive portal when you connect to a new network. This usually involves fetching a web page with known content from a web server controlled by the company behind the operating system. If a captive portal is detected, the operating system will pop up a dialog showing the web page from the captive portal. &lt;br /&gt;
&lt;br /&gt;
We will run a fake captive portal that causes our splash page to be displayed on any operating system supporting captive portal detection. The fake captive portal will _only_ interfere with captive portal detection traffic. All other traffic will go through unaltered. The fake captive portal will run on the [https://sudoroom.org/wiki/Mesh/Network_topology exit nodes] and so will only be active when the mesh is connected to the internet.&lt;br /&gt;
&lt;br /&gt;
If the mesh becomes disconnected from the internet, then all HTTP GET requests to the internet will receive 302 HTTP redirects to a community portal web app running on a server on the mesh that will inform the user that the internet is down. The redirection is accomplished with [https://github.com/sudomesh/internetisdownredirect internetisdownredirect]. If the node is not connected to any server running the community portal web app, then all HTTP GET requests will receive 302 HTTP redirects to a local web page telling the user that your mesh node has become disconnected from the rest of the mesh, and who to contact about it.&lt;br /&gt;
&lt;br /&gt;
Currently this page talks mostly about how to implement the fake captive portal.&lt;br /&gt;
&lt;br /&gt;
= Types of captive portal detection =&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
Expects HTTP 204 response from http://clients3.google.com/generate_204 &lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
expects zero-length response body from http://www.google.com/blank.html&lt;br /&gt;
&lt;br /&gt;
or something else.&lt;br /&gt;
&lt;br /&gt;
Captive portal detection method [http://www.igate.com/iblog/index.php/android-v4-2-2-updates/ appears to have changed in 4.2.2].&lt;br /&gt;
&lt;br /&gt;
The code that uses the HTTP 204 method is [https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/net/CaptivePortalTracker.java here]. This is the master branch, which I assume is latest stable or latest development, so I'm not sure what this &amp;quot;faster captive portal detection&amp;quot; in 4.2.2 is supposed to mean.&lt;br /&gt;
&lt;br /&gt;
== Mac OS == &lt;br /&gt;
&lt;br /&gt;
Request is made to &amp;quot;http://www.apple.com/library/test/success.html&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
Here is the sequence of events, as verified by [[User:Juul|Juul]] ([[User talk:Juul|talk]]) using an iPhone running iOS 5.0.1:&lt;br /&gt;
&lt;br /&gt;
First a DNS lookup is issued for www.apple.com. Next the following HTTP GET is issued to the resulting IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /library/test/success.html HTTP/1.0&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: CaptiveNetworkSupport-183 wispr&lt;br /&gt;
Connection: close&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The result that it expects is an HTTP 200 with this content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Success&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;Success&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it gets anything else, then it will do the following HTTP GET, again to the www.apple.com IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET / HTTP/1.1&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A405&lt;br /&gt;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br /&gt;
Accept-Language: en-us&lt;br /&gt;
Accept-Encoding: gzip, d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and present the response as the splash page.&lt;br /&gt;
&lt;br /&gt;
It seems that GET requests are also sent to &amp;quot;/library/test/success.html&amp;quot; after the get for &amp;quot;/&amp;quot;, and if it succeeds, then the splash page disappears as soon as it has appeared. &lt;br /&gt;
&lt;br /&gt;
The solutions seems to be to wait for a request for e.g. &amp;quot;http://sudo.mesh/drop_the_splash_page&amp;quot; and remove the redirect for that source IP for some number of hours / days and have a button on the splash page that links to that URL. The &amp;quot;button&amp;quot; could be the entire splash page, but that might be annoying if you're trying to scroll and accidentally click.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
The captive portal detection is called NCSI (Network Connectivity Status Indicator). It works like so:&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of www.msftncsi.com followed by a GET request to the resulting IP with URL http://www.msftncsi.com/ncsi.txt. This file is expected to contain only the text &amp;quot;Microsoft NCSI&amp;quot; (no quotes).&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of dns.msftncsi.com. If the DNS lookup does not result in the IP 131.107.255.255, the internet connection is assumed to be non-functioning.&lt;br /&gt;
&lt;br /&gt;
So: To get a splash page displayed, the initial request to http://www.msftncsi.com/ncsi.txt should not return the expected text (unknown if blocking the connection outright is good enough), but the DNS &lt;br /&gt;
&lt;br /&gt;
More info [http://blog.superuser.com/2011/05/16/windows-7-network-awareness/ here].&lt;br /&gt;
&lt;br /&gt;
= Solutions =&lt;br /&gt;
&lt;br /&gt;
The filtering should happen at the exit nodes (the servers from which traffic flows between the mesh and the internet). This means that we are not limited by the processing power of the routers.&lt;br /&gt;
&lt;br /&gt;
== Current in-progress solution for iOS ==&lt;br /&gt;
&lt;br /&gt;
The exit nodes run a dnsmasq caching dns server. They have an entry for www.apple.com in their /etc/hosts file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
184.85.61.15    www.apple.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is to ensure that the IP for www.apple.com is always the same for all the entire network and is always known. This is not a good solution. Instead, the configuration that relies on the IP should be updated every time the IP for www.apple.com changes.&lt;br /&gt;
&lt;br /&gt;
:Apple is using Akamai and has many addresses. Moreover, it might be that multiple different companies share the same IP? ([[User:Mitar|Mitar]])&lt;br /&gt;
::Since we have caching DNS servers on the mesh exit nodes, everyone connected to the mesh will see the same IP for www.apple.com. If someone sets a different DNS server, then they will simply not see the splash page if they get a different IP for www.apple.com. We are not blocking the IP or even re-directing all of the traffic for the IP. We are simply re-directing port 80 for the IP through a squid proxy and matching on the host name and URL. The content will be delivered normally unless if the URL and host name is not a captive portal deteciton probe. The only way this could be a problem is if something other than an http server is listening on port 80 on www.apple.com. This is not likely to happen in the near future. ([[User:Juul|Juul]] ([[User talk:Juul|talk]]))&lt;br /&gt;
:What about IPv6? ([[User:Mitar|Mitar]])&lt;br /&gt;
::The IPv6 solution is almost identical. ([[User:Juul|Juul]] ([[User talk:Juul|talk]]))&lt;br /&gt;
&lt;br /&gt;
An iptables rule redirects all port 80 traffic for the www.apple.com IP to a different port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -t nat -A PREROUTING -i bat0 -p tcp -d 184.85.61.15 --dport 80 -j REDIRECT --to-port 3128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The squid proxy is run on port 3128 and set to run a program called rewrite.pl that sends alternate responses to specific GET requests.&lt;br /&gt;
&lt;br /&gt;
:Why not using internetisdownredirect to redirect? ([[User:Mitar|Mitar]])&lt;br /&gt;
::We want to run this on the exit nodes. Not on the mesh nodes. ([[User:Juul|Juul]] ([[User talk:Juul|talk]]))&lt;br /&gt;
&lt;br /&gt;
Squid 3.1 configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl mesh src 10.0.0.0/8&lt;br /&gt;
acl manager proto cache_object&lt;br /&gt;
acl localhost src 127.0.0.1/32 ::1&lt;br /&gt;
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1&lt;br /&gt;
acl Safe_ports port 80 &lt;br /&gt;
acl CONNECT method CONNECT&lt;br /&gt;
# Only allow cachemgr access from localhost&lt;br /&gt;
http_access allow manager localhost&lt;br /&gt;
http_access deny manager&lt;br /&gt;
http_access deny !Safe_ports&lt;br /&gt;
http_access allow localhost&lt;br /&gt;
http_access allow mesh&lt;br /&gt;
http_access deny all&lt;br /&gt;
http_port 3128 transparent&lt;br /&gt;
coredump_dir /var/spool/squid3&lt;br /&gt;
# program to run to re-write urls of incoming requests&lt;br /&gt;
url_rewrite_program /etc/squid3/rewrite.pl&lt;br /&gt;
# The number of redirector processes to spawn&lt;br /&gt;
url_rewrite_children 10&lt;br /&gt;
# Bypass rewrite if all rewrite processes are busy&lt;br /&gt;
url_rewrite_bypass on&lt;br /&gt;
# This is almost certainly not needed&lt;br /&gt;
refresh_pattern ^ftp:           1440    20%     10080&lt;br /&gt;
refresh_pattern ^gopher:        1440    0%      1440&lt;br /&gt;
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0&lt;br /&gt;
refresh_pattern .               0       20%     4320&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We should see if we can use the squid ''url_rewrite_access'' directive to ensure that the rewrite.pl program is only run for the specific queries that need rewriting.&lt;br /&gt;
&lt;br /&gt;
The rewrite.pl program simply replies to the captive portal probe queries with the replies from a local apache server. Here is the code of /etc/squid3/rewrite.pl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print $url . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For versions 3.4 of squid and above, the program should look like this instead (reference [http://www.squid-cache.org/Versions/v3/3.1/cfgman/url_rewrite_program.html v3.1 docs] and [http://www.squid-cache.org/Versions/v3/3.4/cfgman/url_rewrite_program.html v3.4 docs]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;OK rewrite-url=http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print &amp;quot;ERR\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An apache 2 with standard configuration is running and in /var/www/splash.html has the following file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta CHARSET=utf8mb4&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;peopleswifi.org&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Welcome to People's Wifi&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;&lt;br /&gt;
          Click anywhere to continue!&lt;br /&gt;
        &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last missing steps are to improve rewrite.pl to add firewall rules that bypass the squid proxy for the source IP after the user clicks past the splash screen. These should be flushed out after some period of time. Also, the matching for http://www.apple.com/ should only be activated for an IP for some minutes immediately after the request to http://www.apple.com/library/test/success.html such that requests to http://www.apple.com from non-captive-portal detecting devices will not be redirected.&lt;br /&gt;
&lt;br /&gt;
One concern is: What happens when the client roams to another mesh node and then stays there until their dhcp lease expires? They may get a new IP if batman-adv decides that another gateway is closer/better. If the client gets a new IP, will it try the captive portal detection again?&lt;br /&gt;
&lt;br /&gt;
:Will not clients have global IPs for whole mesh? ([[User:Mitar|Mitar]])&lt;br /&gt;
::The clients will get an IP that is on the mesh subnet and will be able to communicate with the entire mesh and internet. They will get different IPs depending on which dhcp server / internet gateway that is &amp;quot;closer&amp;quot; to them when their lease is up. This is how it's done in batman-adv. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
:::This is done in batman-adv if you have different topology. If you have VPN tunnels you might do it differently. The issue is that you might not want to have multiple gateways in the network anyway. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 15:42, 3 September 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Proxy ==&lt;br /&gt;
&lt;br /&gt;
A proxy such as Polipo or Squid could be used.&lt;br /&gt;
&lt;br /&gt;
== iptables layer 7 ==&lt;br /&gt;
&lt;br /&gt;
Layer 7 filtering allows the use of regular expression matching of the beginning of the packet data. &lt;br /&gt;
&lt;br /&gt;
== ip-based optimization ==&lt;br /&gt;
&lt;br /&gt;
One of the problems with a proxy and with layer 7 filtering is that it's slow. It would be nice if we could filter only the traffic going to the servers used for captive portal detection (using proxy or layer 7). Unfortunately these servers have not one, but a range of IP addresses (at least for www.apple.com), but a DNS request from an exit node and any user on the mesh going through that same exit node should get the same response. Thus, we should be able to have a script that:&lt;br /&gt;
&lt;br /&gt;
# Periodically looks up the IP for the different servers&lt;br /&gt;
# Adds the result as an entry in /etc/hosts&lt;br /&gt;
# Updates iptables rules to direct traffic to those IP addresses through the proxy or layer 7 rules.&lt;br /&gt;
&lt;br /&gt;
It may be that we could run an actual caching DNS server, but that DNS server would need a hook to be called every time certain entries change.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5462</id>
		<title>Mesh/Decisions</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5462"/>
		<updated>2013-08-23T06:24:52Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Block captive portal detection only */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each new community mesh project faces a set of decisions. This page contains a discussion of some of these decisions.&lt;br /&gt;
&lt;br /&gt;
= Mesh router as primary access point =&lt;br /&gt;
&lt;br /&gt;
Adding a WPA2-PSK encrypted virtal access point to the router would allow node-owners to use the mesh router either as their primary private access point, or as a secondary access point in places where their existing access point doesn't reach. This could be a nice added feature, but would require some more firmware work.&lt;br /&gt;
&lt;br /&gt;
:The issue with that is that primary access points are often optimally in the center of the house, while mesh nodes should be on the edge of the house.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We're already been working on this. The web admin interface will be fairly minimal, allowing changing the ssid and password of the private access point, as well as manual tcp/udp port forwarding. The nat-pmp and upnp daemons will also be installed and the gui will provide access to disable/enable them.&lt;br /&gt;
&lt;br /&gt;
= Commercial || non-commercial =&lt;br /&gt;
&lt;br /&gt;
It may seem obvious that a community mesh project should should be non-commercial in nature, however, all societies are different and the cost and availability of hardware and skilled volunteer labour will vary quite a bit. In some places it may be possible to run a mesh based solely on donations and volunteer efforts. In other places it may be necessary to find sustainable income models. Especially in less developed countries it may be more viable to use the mesh as a way for locals to become small business owners that maintain the network and sell access to the community at affordable rates.&lt;br /&gt;
&lt;br /&gt;
Here are some options spanning the range of non-commercial to commercial:&lt;br /&gt;
&lt;br /&gt;
*Donations, volunteers and grants only.&lt;br /&gt;
*Sale of merchandise.&lt;br /&gt;
*Sale of pre-flashed routers with profit margin.&lt;br /&gt;
*Ads for local businesses on splash page.&lt;br /&gt;
*Pay to get higher bandwidth (freemium).&lt;br /&gt;
*Limited data per day for free. Pay to get more.&lt;br /&gt;
*Free for low-income individuals only.&lt;br /&gt;
*Free for private individuals and non-profits only.&lt;br /&gt;
*Free for node-owners only.&lt;br /&gt;
*Free for node-owners and they node-owners can sell access.&lt;br /&gt;
*Everyone has to pay.&lt;br /&gt;
&lt;br /&gt;
:What about paying in work? Time-banking?&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I think we should stop right before the freemium model [[User:Juul|Juul]] ([[User talk:Juul|talk]]).&lt;br /&gt;
&lt;br /&gt;
= Internet =&lt;br /&gt;
&lt;br /&gt;
== Internet connected mesh || LAN only ==&lt;br /&gt;
&lt;br /&gt;
One big decision is whether to provide internet access through the mesh. A non-internet-connected mesh would provide little popular appeal outside of disaster scenarios, and so would likely have to be designed specifically with disaster scenarios in mind, unless it is simply a platform for hackers and academics to use and learn from.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Our mesh will definitely be internet-connected.&lt;br /&gt;
&lt;br /&gt;
== Sharing of Internet by node-owners ==&lt;br /&gt;
&lt;br /&gt;
Do we let the node-owners share their internet connection with the mesh? If so, how do we prioritize the traffic? Do we let the node-owners decide how much of the bandwidth they share? Do we let them set a data usage cap?&lt;br /&gt;
&lt;br /&gt;
If the node-owners don't use the mesh router as their access point, then there is really no way we can tell how much bandwidth is being used by the node-owner. This means the limit on the mesh-node's internet usage will have to be a hard limit, instead of being able to take advantage of unused internet bandwidth.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We let the node-owners choose to share internet or not. We let them select a percentage of available bandwidth that the mesh can always use. Whether or not this is a hard limit will probably have to depend on whether or not they have another access point that they use (or if they ever use wired ethernet).&lt;br /&gt;
&lt;br /&gt;
== Connecting isolated mesh nodes over the internet ==&lt;br /&gt;
&lt;br /&gt;
It's possible to connect isolated segments of the mesh through the node-owner's internet connections. For layer2 mesh protocols at least, this requires a tunnel to one or more servers that act as mesh nodes on the internet. The mesh nodes could also attempt to directly connect to a few other mesh nodes, but that would require more complication such as NAT traversal.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
I have set up tunneldigger from wlan-slovenia which uses L2TP tunnels for this. Some work is still needed in dealing with MTU correctly.&lt;br /&gt;
&lt;br /&gt;
== Hiding node-owners source IP ==&lt;br /&gt;
&lt;br /&gt;
If someone uses internet provided by the mesh to e.g. download the newest Game Of Thrones episode, and the ISP of some innocent node-owner receives a letter from the U.S. copyright mafia, then at the very least it would be a scary experience likely resulting in the node-owner taking their node offline. In order to provide some buffer we can tunnel all internet traffic through one or more servers or &amp;quot;exit nodes&amp;quot; owned by the mesh group.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We definitely want to hide source IPs of home Cable/DSL lines.&lt;br /&gt;
&lt;br /&gt;
= Organizational structure =&lt;br /&gt;
&lt;br /&gt;
== Formal organization || No centralized entity || Separation of organization and network ==&lt;br /&gt;
&lt;br /&gt;
The people involved in running the mesh could establish a formal organization, such as a 501c3 or a LLC, or they could simply have a formal or informal agreement between each-other, e.g. something like a group peering agreement.&lt;br /&gt;
&lt;br /&gt;
The third option is to have both: The network is its own thing and anyone can peer (possibly with the requirement of signing a peering agreement) but there is also a formal organization that provides and coordinates certain services, such as e.g. selling of pre-flashed firmwares, troubleshooting mesh problems, getting funds for extra internet bandwidth for the mesh, developing firmware, spreading the word, etc. In this case, the network and central organization should probably have separate names.&lt;br /&gt;
&lt;br /&gt;
== Non-profit || For profit ==&lt;br /&gt;
&lt;br /&gt;
If there is a central organization, it could be either a for-profit or a non-profit. There are many variations, but some of the most relevant are:&lt;br /&gt;
&lt;br /&gt;
=== 501c3 ===&lt;br /&gt;
&lt;br /&gt;
Positives: Tax-exempt status. Tax-deductibility of donations. Assurance that the organization will not e.g. be bought up Google.&lt;br /&gt;
&lt;br /&gt;
Negatives: Limited political activity (but EFF is a 501c3, so it's not too bad). Structure contains innate hierarchy in the separation of board of directors and members. Still have to pay e.g. sales tax even if the organization has lost money over the year.&lt;br /&gt;
&lt;br /&gt;
=== B-corp certified for-profit ===&lt;br /&gt;
&lt;br /&gt;
Positives: Possibly more options for how to structure organization and how to operate. Yearly losses can be deducted from taxes owed. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
Negatives: May seem less trustworthy to community. May be less trustworthy (can we ensure that the corporation can never be e.g. sold to Google?). No tax-deductible donations. No tax-exemption. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
== Membership / peering requirements ==&lt;br /&gt;
&lt;br /&gt;
If we have a central organization, who can be a member? If not, who can peer? &lt;br /&gt;
&lt;br /&gt;
=== Membership ===&lt;br /&gt;
&lt;br /&gt;
The minimum possible is that everyone can be a member just by applying online (possibly we could go even further and state that anyone who claims to be a member is a member). &lt;br /&gt;
&lt;br /&gt;
Going up from that we have options such as:&lt;br /&gt;
&lt;br /&gt;
*Your membership fee is hosting a node.&lt;br /&gt;
*Your membership signup fee is buying a node.&lt;br /&gt;
*Your membership fee is hosting a node and sharing internet.&lt;br /&gt;
*Your membership fee is a monthly dollar amount.&lt;br /&gt;
*Your membership requires some amount of work monthly or yearly.&lt;br /&gt;
&lt;br /&gt;
And of course combinations of the above.&lt;br /&gt;
&lt;br /&gt;
=== Peering requirements ===&lt;br /&gt;
&lt;br /&gt;
For both meshes with and without a centralized organization, there can be a peering agreement that you must sign to become part of the mesh. It could be that the agreement is only between you and the people you connect to directly, or it could be that the agreement is between you and the mesh (and all the people who are connected to the mesh).&lt;br /&gt;
&lt;br /&gt;
There is also the option to have no such agreement and simply have instructions for how to connect to the mesh and let everyone sort out how they want to use the mesh on their own.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We are currently leaning towards a 501c3 with the network being a separate thing.&lt;br /&gt;
&lt;br /&gt;
= Ownership of and access to infrastructure =&lt;br /&gt;
&lt;br /&gt;
== Centrally owned || Distributed ownership ==&lt;br /&gt;
&lt;br /&gt;
Is the hardware owned by the people who host the nodes or are they owned by the central organization. &lt;br /&gt;
&lt;br /&gt;
Who's responsibility is it to pay for new nodes if they break? &lt;br /&gt;
&lt;br /&gt;
Hybrid models are possible, e.g: People buy pre-flashed nodes from the local mesh organization and own their nodes, but they pay a small membership fee (or not), and basically get an unlimited warranty, where the mesh group will replace their router automatically if it stops working.&lt;br /&gt;
&lt;br /&gt;
== Management of nodes ==&lt;br /&gt;
&lt;br /&gt;
Who manages the nodes? In case of firmware updates, who has access to send them to the nodes? Do each individual node-owner have to approve each update? It could be default-approve but give them a notice and a time-frame to opt out of an update. Any decision of individuals to not accept updates from the mesh group could prove very problematic in case of major updates, e.g. changing of mesh routing protocol, but even if no such updates are to occur, the firmware will have to be very specifically designed around the limitation that updates to nodes are not guaranteed to ever occur, if we allow users to manage their own nodes.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We haven't discussed this very much. I think we should let people own the nodes that they host and let the central organization manage the nodes unless the node-owner wants to manage their own node. We will have to have a clear strategy for who has access to privately owned nodes at any given time, and contracts/agreements about what they are allowed to do to them. We will have to make it very clear to the node-owners what letting us manage the nodes means (that, if obused, this power can be used to monitor their unencrypted traffic and phish ) and how we monitor and prevent abuse from the people in charge (though this is really no different from a normal ISP) [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
:There is as well a bit of difference if nodes are just mesh nodes or if they are being used for private SSID as well.&lt;br /&gt;
&lt;br /&gt;
= Sensors / add-ons =&lt;br /&gt;
&lt;br /&gt;
Most routers provide a 3.3 volt serial port that can be used to attach microcontrollers and all manner of sensors. Examples:&lt;br /&gt;
&lt;br /&gt;
*Temperature, humiditiy, pressure&lt;br /&gt;
:Ultra-local weather stations.&lt;br /&gt;
*Seismic sensors &lt;br /&gt;
:See how an earthquake spreads.&lt;br /&gt;
*Air quality sensors &lt;br /&gt;
:How's the smog today?&lt;br /&gt;
*Bluetooth or ZigBee gateways&lt;br /&gt;
:Connect low-power devices to the mesh.&lt;br /&gt;
&lt;br /&gt;
= Captive portal / splash page =&lt;br /&gt;
&lt;br /&gt;
A splash page is a powerful way to tell people about the network and show them to e.g. a community portal, but it can be annoying and problematic for a lot of reasons. Here are some different solutions.&lt;br /&gt;
&lt;br /&gt;
== Full captive portal ==&lt;br /&gt;
&lt;br /&gt;
Blocking all traffic until the user clicks a button or logs in is super annoying and breaks a bunch of things, however, if the network has problems with abuse and wants all users to authenticate before use, then this could be necessary. &lt;br /&gt;
&lt;br /&gt;
A really big problem for the common user is that it doesn't work with SSL.&lt;br /&gt;
&lt;br /&gt;
== Block port 80 only ==&lt;br /&gt;
&lt;br /&gt;
This would only show a captive portal on port 80 until the user clicks a button to continue or only for the first connection to port 80.&lt;br /&gt;
&lt;br /&gt;
This is less annoying, but will still break many things and users may wonder why they've been surfing for a while (SSL sites) and then suddenly see the captive portal.&lt;br /&gt;
&lt;br /&gt;
== Block captive portal detection only ==&lt;br /&gt;
&lt;br /&gt;
Find out exactly how the captive portal detection mechanisms for different operating systems work and block this detection only, and only on the first attempt. This can be problematic, since e.g. iOS devices request a specific URL on http://www.apple.com and so required layer 7 inspection to match the packet. Another downside is that not all operating systems support captive portal detection. The following are known to support detection:&lt;br /&gt;
&lt;br /&gt;
*Android v?&lt;br /&gt;
*iOS 4.3 (maybe earlier)&lt;br /&gt;
*Mac OS 10.8 (maybe earlier)&lt;br /&gt;
*Windows 8 (maybe earlier)&lt;br /&gt;
&lt;br /&gt;
To our knowledge, Ubuntu and other popular GNU/Linux systems do not support detection.&lt;br /&gt;
&lt;br /&gt;
:In talking with some other mesh people I learned that intercepting only first request is not useful because it is almost always some background service which tries that (eg. autoupdate) so user never really sees anything.&lt;br /&gt;
:Displaying things in OS detected captive portal window might be bad because this window is a special browser window, so user cannot really browse a lot there (no bookmarks for example). On Mac OS X, furthermore, window is automatically closed by OS when it is detected that connectivity is not limited anymore.&lt;br /&gt;
&lt;br /&gt;
== No captive portal ==&lt;br /&gt;
&lt;br /&gt;
With no captive portal, many people will likely use the mesh and never learn about what it is. The SSID can still be a valid URL e.g. freepublicwifi.net and hopefully people who are curious will type it in.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I will figure out how feasibile it is to block captive portal detection only. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Network neutrality =&lt;br /&gt;
&lt;br /&gt;
To what degree do we support and allow the blocking, mangling and prioritization of traffic? &lt;br /&gt;
&lt;br /&gt;
At one extreme are things such as actively blocking certain types of traffic. This could be blocking bittorrent traffic, or netflix, or it could be disallowing any commercial use of the network at all.&lt;br /&gt;
&lt;br /&gt;
= Logging =&lt;br /&gt;
&lt;br /&gt;
To what degree does the mesh log or allow logging of traffic? If there are logs, are they centrally aggregated?&lt;br /&gt;
&lt;br /&gt;
= Encryption =&lt;br /&gt;
&lt;br /&gt;
Are links encrypted between nodes? We could decide to take drastic measure and only allow or only encourage point-to-point encrypted connections. We could only allow connections the internet using a VPN connection directly from the client to one of our exit nodes. These types of measures would drastically reduce the usability of the mesh, since they would require more than just connecting to a wifi access point.&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
Some free public wifi networks require authentication (e.g. BART wifi). This makes it easier to deal with abuse but also raises privacy concerns. Authentication can be annoying, though implemented correctly it will be a one-time setup for each device.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I feel like authentication would just make the network annoying and difficult to use. I say we just make it free and open. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Abuse =&lt;br /&gt;
&lt;br /&gt;
How does the mesh define and handle abuse? &lt;br /&gt;
&lt;br /&gt;
Some examples of abuse definitions:&lt;br /&gt;
&lt;br /&gt;
*Unintentionally running a DHCP server on the mesh.&lt;br /&gt;
*Using too much of the available bandwidth for too long.&lt;br /&gt;
*Using the mesh for illegal activities.&lt;br /&gt;
*Targeting other mesh users (e.g. phishing, password sniffing).&lt;br /&gt;
*Intentionally attempting to disrupt the functioning of the mesh.&lt;br /&gt;
&lt;br /&gt;
Some of these can be blocked automatically. Some can be detected, and could land people on a captive portal that explains what they did wrong and how to fix it. Dealing with intentional abuse can be tricky if there is no authentication.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We should block some things that definitely don't belong on the mesh, like rogue DHCP servers, and have an email address for contacting us about abuse. If there are valid use-cases, then moving all abusive MACs/IPs to a special VLAN with a captive portal and limited access could be a way to deal, but it may not be necessary at all. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Support =&lt;br /&gt;
&lt;br /&gt;
How much support will we provide and will it be provided by volunteers only or will we have paid support?&lt;br /&gt;
&lt;br /&gt;
= Naming =&lt;br /&gt;
&lt;br /&gt;
Decision: Still discussing. Several people seem to like a more generic and meaning name for the network, and less meaning less generic name for the organization.&lt;br /&gt;
&lt;br /&gt;
== Meaning vs. non-meaning ==&lt;br /&gt;
&lt;br /&gt;
Meaning example: RouteAround.net&lt;br /&gt;
&lt;br /&gt;
Non-meaning: Project Gourami&lt;br /&gt;
&lt;br /&gt;
== Generic vs. non-generic ==&lt;br /&gt;
&lt;br /&gt;
Generic example: Free Public Wifi&lt;br /&gt;
&lt;br /&gt;
Non-generic example: The People's Republic of Wifi&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5461</id>
		<title>Mesh/Decisions</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5461"/>
		<updated>2013-08-23T06:20:54Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Decision */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each new community mesh project faces a set of decisions. This page contains a discussion of some of these decisions.&lt;br /&gt;
&lt;br /&gt;
= Mesh router as primary access point =&lt;br /&gt;
&lt;br /&gt;
Adding a WPA2-PSK encrypted virtal access point to the router would allow node-owners to use the mesh router either as their primary private access point, or as a secondary access point in places where their existing access point doesn't reach. This could be a nice added feature, but would require some more firmware work.&lt;br /&gt;
&lt;br /&gt;
:The issue with that is that primary access points are often optimally in the center of the house, while mesh nodes should be on the edge of the house.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We're already been working on this. The web admin interface will be fairly minimal, allowing changing the ssid and password of the private access point, as well as manual tcp/udp port forwarding. The nat-pmp and upnp daemons will also be installed and the gui will provide access to disable/enable them.&lt;br /&gt;
&lt;br /&gt;
= Commercial || non-commercial =&lt;br /&gt;
&lt;br /&gt;
It may seem obvious that a community mesh project should should be non-commercial in nature, however, all societies are different and the cost and availability of hardware and skilled volunteer labour will vary quite a bit. In some places it may be possible to run a mesh based solely on donations and volunteer efforts. In other places it may be necessary to find sustainable income models. Especially in less developed countries it may be more viable to use the mesh as a way for locals to become small business owners that maintain the network and sell access to the community at affordable rates.&lt;br /&gt;
&lt;br /&gt;
Here are some options spanning the range of non-commercial to commercial:&lt;br /&gt;
&lt;br /&gt;
*Donations, volunteers and grants only.&lt;br /&gt;
*Sale of merchandise.&lt;br /&gt;
*Sale of pre-flashed routers with profit margin.&lt;br /&gt;
*Ads for local businesses on splash page.&lt;br /&gt;
*Pay to get higher bandwidth (freemium).&lt;br /&gt;
*Limited data per day for free. Pay to get more.&lt;br /&gt;
*Free for low-income individuals only.&lt;br /&gt;
*Free for private individuals and non-profits only.&lt;br /&gt;
*Free for node-owners only.&lt;br /&gt;
*Free for node-owners and they node-owners can sell access.&lt;br /&gt;
*Everyone has to pay.&lt;br /&gt;
&lt;br /&gt;
:What about paying in work? Time-banking?&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I think we should stop right before the freemium model [[User:Juul|Juul]] ([[User talk:Juul|talk]]).&lt;br /&gt;
&lt;br /&gt;
= Internet =&lt;br /&gt;
&lt;br /&gt;
== Internet connected mesh || LAN only ==&lt;br /&gt;
&lt;br /&gt;
One big decision is whether to provide internet access through the mesh. A non-internet-connected mesh would provide little popular appeal outside of disaster scenarios, and so would likely have to be designed specifically with disaster scenarios in mind, unless it is simply a platform for hackers and academics to use and learn from.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Our mesh will definitely be internet-connected.&lt;br /&gt;
&lt;br /&gt;
== Sharing of Internet by node-owners ==&lt;br /&gt;
&lt;br /&gt;
Do we let the node-owners share their internet connection with the mesh? If so, how do we prioritize the traffic? Do we let the node-owners decide how much of the bandwidth they share? Do we let them set a data usage cap?&lt;br /&gt;
&lt;br /&gt;
If the node-owners don't use the mesh router as their access point, then there is really no way we can tell how much bandwidth is being used by the node-owner. This means the limit on the mesh-node's internet usage will have to be a hard limit, instead of being able to take advantage of unused internet bandwidth.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We let the node-owners choose to share internet or not. We let them select a percentage of available bandwidth that the mesh can always use. Whether or not this is a hard limit will probably have to depend on whether or not they have another access point that they use (or if they ever use wired ethernet).&lt;br /&gt;
&lt;br /&gt;
== Connecting isolated mesh nodes over the internet ==&lt;br /&gt;
&lt;br /&gt;
It's possible to connect isolated segments of the mesh through the node-owner's internet connections. For layer2 mesh protocols at least, this requires a tunnel to one or more servers that act as mesh nodes on the internet. The mesh nodes could also attempt to directly connect to a few other mesh nodes, but that would require more complication such as NAT traversal.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
I have set up tunneldigger from wlan-slovenia which uses L2TP tunnels for this. Some work is still needed in dealing with MTU correctly.&lt;br /&gt;
&lt;br /&gt;
== Hiding node-owners source IP ==&lt;br /&gt;
&lt;br /&gt;
If someone uses internet provided by the mesh to e.g. download the newest Game Of Thrones episode, and the ISP of some innocent node-owner receives a letter from the U.S. copyright mafia, then at the very least it would be a scary experience likely resulting in the node-owner taking their node offline. In order to provide some buffer we can tunnel all internet traffic through one or more servers or &amp;quot;exit nodes&amp;quot; owned by the mesh group.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We definitely want to hide source IPs of home Cable/DSL lines.&lt;br /&gt;
&lt;br /&gt;
= Organizational structure =&lt;br /&gt;
&lt;br /&gt;
== Formal organization || No centralized entity || Separation of organization and network ==&lt;br /&gt;
&lt;br /&gt;
The people involved in running the mesh could establish a formal organization, such as a 501c3 or a LLC, or they could simply have a formal or informal agreement between each-other, e.g. something like a group peering agreement.&lt;br /&gt;
&lt;br /&gt;
The third option is to have both: The network is its own thing and anyone can peer (possibly with the requirement of signing a peering agreement) but there is also a formal organization that provides and coordinates certain services, such as e.g. selling of pre-flashed firmwares, troubleshooting mesh problems, getting funds for extra internet bandwidth for the mesh, developing firmware, spreading the word, etc. In this case, the network and central organization should probably have separate names.&lt;br /&gt;
&lt;br /&gt;
== Non-profit || For profit ==&lt;br /&gt;
&lt;br /&gt;
If there is a central organization, it could be either a for-profit or a non-profit. There are many variations, but some of the most relevant are:&lt;br /&gt;
&lt;br /&gt;
=== 501c3 ===&lt;br /&gt;
&lt;br /&gt;
Positives: Tax-exempt status. Tax-deductibility of donations. Assurance that the organization will not e.g. be bought up Google.&lt;br /&gt;
&lt;br /&gt;
Negatives: Limited political activity (but EFF is a 501c3, so it's not too bad). Structure contains innate hierarchy in the separation of board of directors and members. Still have to pay e.g. sales tax even if the organization has lost money over the year.&lt;br /&gt;
&lt;br /&gt;
=== B-corp certified for-profit ===&lt;br /&gt;
&lt;br /&gt;
Positives: Possibly more options for how to structure organization and how to operate. Yearly losses can be deducted from taxes owed. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
Negatives: May seem less trustworthy to community. May be less trustworthy (can we ensure that the corporation can never be e.g. sold to Google?). No tax-deductible donations. No tax-exemption. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
== Membership / peering requirements ==&lt;br /&gt;
&lt;br /&gt;
If we have a central organization, who can be a member? If not, who can peer? &lt;br /&gt;
&lt;br /&gt;
=== Membership ===&lt;br /&gt;
&lt;br /&gt;
The minimum possible is that everyone can be a member just by applying online (possibly we could go even further and state that anyone who claims to be a member is a member). &lt;br /&gt;
&lt;br /&gt;
Going up from that we have options such as:&lt;br /&gt;
&lt;br /&gt;
*Your membership fee is hosting a node.&lt;br /&gt;
*Your membership signup fee is buying a node.&lt;br /&gt;
*Your membership fee is hosting a node and sharing internet.&lt;br /&gt;
*Your membership fee is a monthly dollar amount.&lt;br /&gt;
*Your membership requires some amount of work monthly or yearly.&lt;br /&gt;
&lt;br /&gt;
And of course combinations of the above.&lt;br /&gt;
&lt;br /&gt;
=== Peering requirements ===&lt;br /&gt;
&lt;br /&gt;
For both meshes with and without a centralized organization, there can be a peering agreement that you must sign to become part of the mesh. It could be that the agreement is only between you and the people you connect to directly, or it could be that the agreement is between you and the mesh (and all the people who are connected to the mesh).&lt;br /&gt;
&lt;br /&gt;
There is also the option to have no such agreement and simply have instructions for how to connect to the mesh and let everyone sort out how they want to use the mesh on their own.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We are currently leaning towards a 501c3 with the network being a separate thing.&lt;br /&gt;
&lt;br /&gt;
= Ownership of and access to infrastructure =&lt;br /&gt;
&lt;br /&gt;
== Centrally owned || Distributed ownership ==&lt;br /&gt;
&lt;br /&gt;
Is the hardware owned by the people who host the nodes or are they owned by the central organization. &lt;br /&gt;
&lt;br /&gt;
Who's responsibility is it to pay for new nodes if they break? &lt;br /&gt;
&lt;br /&gt;
Hybrid models are possible, e.g: People buy pre-flashed nodes from the local mesh organization and own their nodes, but they pay a small membership fee (or not), and basically get an unlimited warranty, where the mesh group will replace their router automatically if it stops working.&lt;br /&gt;
&lt;br /&gt;
== Management of nodes ==&lt;br /&gt;
&lt;br /&gt;
Who manages the nodes? In case of firmware updates, who has access to send them to the nodes? Do each individual node-owner have to approve each update? It could be default-approve but give them a notice and a time-frame to opt out of an update. Any decision of individuals to not accept updates from the mesh group could prove very problematic in case of major updates, e.g. changing of mesh routing protocol, but even if no such updates are to occur, the firmware will have to be very specifically designed around the limitation that updates to nodes are not guaranteed to ever occur, if we allow users to manage their own nodes.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We haven't discussed this very much. I think we should let people own the nodes that they host and let the central organization manage the nodes unless the node-owner wants to manage their own node. We will have to have a clear strategy for who has access to privately owned nodes at any given time, and contracts/agreements about what they are allowed to do to them. We will have to make it very clear to the node-owners what letting us manage the nodes means (that, if obused, this power can be used to monitor their unencrypted traffic and phish ) and how we monitor and prevent abuse from the people in charge (though this is really no different from a normal ISP) [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
:There is as well a bit of difference if nodes are just mesh nodes or if they are being used for private SSID as well.&lt;br /&gt;
&lt;br /&gt;
= Sensors / add-ons =&lt;br /&gt;
&lt;br /&gt;
Most routers provide a 3.3 volt serial port that can be used to attach microcontrollers and all manner of sensors. Examples:&lt;br /&gt;
&lt;br /&gt;
*Temperature, humiditiy, pressure&lt;br /&gt;
:Ultra-local weather stations.&lt;br /&gt;
*Seismic sensors &lt;br /&gt;
:See how an earthquake spreads.&lt;br /&gt;
*Air quality sensors &lt;br /&gt;
:How's the smog today?&lt;br /&gt;
*Bluetooth or ZigBee gateways&lt;br /&gt;
:Connect low-power devices to the mesh.&lt;br /&gt;
&lt;br /&gt;
= Captive portal / splash page =&lt;br /&gt;
&lt;br /&gt;
A splash page is a powerful way to tell people about the network and show them to e.g. a community portal, but it can be annoying and problematic for a lot of reasons. Here are some different solutions.&lt;br /&gt;
&lt;br /&gt;
== Full captive portal ==&lt;br /&gt;
&lt;br /&gt;
Blocking all traffic until the user clicks a button or logs in is super annoying and breaks a bunch of things, however, if the network has problems with abuse and wants all users to authenticate before use, then this could be necessary. &lt;br /&gt;
&lt;br /&gt;
A really big problem for the common user is that it doesn't work with SSL.&lt;br /&gt;
&lt;br /&gt;
== Block port 80 only ==&lt;br /&gt;
&lt;br /&gt;
This would only show a captive portal on port 80 until the user clicks a button to continue or only for the first connection to port 80.&lt;br /&gt;
&lt;br /&gt;
This is less annoying, but will still break many things and users may wonder why they've been surfing for a while (SSL sites) and then suddenly see the captive portal.&lt;br /&gt;
&lt;br /&gt;
== Block captive portal detection only ==&lt;br /&gt;
&lt;br /&gt;
Find out exactly how the captive portal detection mechanisms for different operating systems work and block this detection only, and only on the first attempt. This can be problematic, since e.g. iOS devices request a specific URL on http://www.apple.com and so required layer 7 inspection to match the packet. Another downside is that not all operating systems support captive portal detection. The following are known to support detection:&lt;br /&gt;
&lt;br /&gt;
*Android v?&lt;br /&gt;
*iOS 4.3 (maybe earlier)&lt;br /&gt;
*Mac OS 10.8 (maybe earlier)&lt;br /&gt;
*Windows 8 (maybe earlier)&lt;br /&gt;
&lt;br /&gt;
To our knowledge, Ubuntu and other popular GNU/Linux systems do not support detection.&lt;br /&gt;
&lt;br /&gt;
== No captive portal ==&lt;br /&gt;
&lt;br /&gt;
With no captive portal, many people will likely use the mesh and never learn about what it is. The SSID can still be a valid URL e.g. freepublicwifi.net and hopefully people who are curious will type it in.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I will figure out how feasibile it is to block captive portal detection only. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Network neutrality =&lt;br /&gt;
&lt;br /&gt;
To what degree do we support and allow the blocking, mangling and prioritization of traffic? &lt;br /&gt;
&lt;br /&gt;
At one extreme are things such as actively blocking certain types of traffic. This could be blocking bittorrent traffic, or netflix, or it could be disallowing any commercial use of the network at all.&lt;br /&gt;
&lt;br /&gt;
= Logging =&lt;br /&gt;
&lt;br /&gt;
To what degree does the mesh log or allow logging of traffic? If there are logs, are they centrally aggregated?&lt;br /&gt;
&lt;br /&gt;
= Encryption =&lt;br /&gt;
&lt;br /&gt;
Are links encrypted between nodes? We could decide to take drastic measure and only allow or only encourage point-to-point encrypted connections. We could only allow connections the internet using a VPN connection directly from the client to one of our exit nodes. These types of measures would drastically reduce the usability of the mesh, since they would require more than just connecting to a wifi access point.&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
Some free public wifi networks require authentication (e.g. BART wifi). This makes it easier to deal with abuse but also raises privacy concerns. Authentication can be annoying, though implemented correctly it will be a one-time setup for each device.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I feel like authentication would just make the network annoying and difficult to use. I say we just make it free and open. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Abuse =&lt;br /&gt;
&lt;br /&gt;
How does the mesh define and handle abuse? &lt;br /&gt;
&lt;br /&gt;
Some examples of abuse definitions:&lt;br /&gt;
&lt;br /&gt;
*Unintentionally running a DHCP server on the mesh.&lt;br /&gt;
*Using too much of the available bandwidth for too long.&lt;br /&gt;
*Using the mesh for illegal activities.&lt;br /&gt;
*Targeting other mesh users (e.g. phishing, password sniffing).&lt;br /&gt;
*Intentionally attempting to disrupt the functioning of the mesh.&lt;br /&gt;
&lt;br /&gt;
Some of these can be blocked automatically. Some can be detected, and could land people on a captive portal that explains what they did wrong and how to fix it. Dealing with intentional abuse can be tricky if there is no authentication.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We should block some things that definitely don't belong on the mesh, like rogue DHCP servers, and have an email address for contacting us about abuse. If there are valid use-cases, then moving all abusive MACs/IPs to a special VLAN with a captive portal and limited access could be a way to deal, but it may not be necessary at all. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Support =&lt;br /&gt;
&lt;br /&gt;
How much support will we provide and will it be provided by volunteers only or will we have paid support?&lt;br /&gt;
&lt;br /&gt;
= Naming =&lt;br /&gt;
&lt;br /&gt;
Decision: Still discussing. Several people seem to like a more generic and meaning name for the network, and less meaning less generic name for the organization.&lt;br /&gt;
&lt;br /&gt;
== Meaning vs. non-meaning ==&lt;br /&gt;
&lt;br /&gt;
Meaning example: RouteAround.net&lt;br /&gt;
&lt;br /&gt;
Non-meaning: Project Gourami&lt;br /&gt;
&lt;br /&gt;
== Generic vs. non-generic ==&lt;br /&gt;
&lt;br /&gt;
Generic example: Free Public Wifi&lt;br /&gt;
&lt;br /&gt;
Non-generic example: The People's Republic of Wifi&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5460</id>
		<title>Mesh/Decisions</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5460"/>
		<updated>2013-08-23T06:16:47Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Commercial || non-commercial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each new community mesh project faces a set of decisions. This page contains a discussion of some of these decisions.&lt;br /&gt;
&lt;br /&gt;
= Mesh router as primary access point =&lt;br /&gt;
&lt;br /&gt;
Adding a WPA2-PSK encrypted virtal access point to the router would allow node-owners to use the mesh router either as their primary private access point, or as a secondary access point in places where their existing access point doesn't reach. This could be a nice added feature, but would require some more firmware work.&lt;br /&gt;
&lt;br /&gt;
:The issue with that is that primary access points are often optimally in the center of the house, while mesh nodes should be on the edge of the house.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We're already been working on this. The web admin interface will be fairly minimal, allowing changing the ssid and password of the private access point, as well as manual tcp/udp port forwarding. The nat-pmp and upnp daemons will also be installed and the gui will provide access to disable/enable them.&lt;br /&gt;
&lt;br /&gt;
= Commercial || non-commercial =&lt;br /&gt;
&lt;br /&gt;
It may seem obvious that a community mesh project should should be non-commercial in nature, however, all societies are different and the cost and availability of hardware and skilled volunteer labour will vary quite a bit. In some places it may be possible to run a mesh based solely on donations and volunteer efforts. In other places it may be necessary to find sustainable income models. Especially in less developed countries it may be more viable to use the mesh as a way for locals to become small business owners that maintain the network and sell access to the community at affordable rates.&lt;br /&gt;
&lt;br /&gt;
Here are some options spanning the range of non-commercial to commercial:&lt;br /&gt;
&lt;br /&gt;
*Donations, volunteers and grants only.&lt;br /&gt;
*Sale of merchandise.&lt;br /&gt;
*Sale of pre-flashed routers with profit margin.&lt;br /&gt;
*Ads for local businesses on splash page.&lt;br /&gt;
*Pay to get higher bandwidth (freemium).&lt;br /&gt;
*Limited data per day for free. Pay to get more.&lt;br /&gt;
*Free for low-income individuals only.&lt;br /&gt;
*Free for private individuals and non-profits only.&lt;br /&gt;
*Free for node-owners only.&lt;br /&gt;
*Free for node-owners and they node-owners can sell access.&lt;br /&gt;
*Everyone has to pay.&lt;br /&gt;
&lt;br /&gt;
:What about paying in work? Time-banking?&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I think we should stop right before the freemium model [[User:Juul|Juul]] ([[User talk:Juul|talk]]).&lt;br /&gt;
&lt;br /&gt;
= Internet =&lt;br /&gt;
&lt;br /&gt;
== Internet connected mesh || LAN only ==&lt;br /&gt;
&lt;br /&gt;
One big decision is whether to provide internet access through the mesh. A non-internet-connected mesh would provide little popular appeal outside of disaster scenarios, and so would likely have to be designed specifically with disaster scenarios in mind, unless it is simply a platform for hackers and academics to use and learn from.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Our mesh will definitely be internet-connected.&lt;br /&gt;
&lt;br /&gt;
== Sharing of Internet by node-owners ==&lt;br /&gt;
&lt;br /&gt;
Do we let the node-owners share their internet connection with the mesh? If so, how do we prioritize the traffic? Do we let the node-owners decide how much of the bandwidth they share? Do we let them set a data usage cap?&lt;br /&gt;
&lt;br /&gt;
If the node-owners don't use the mesh router as their access point, then there is really no way we can tell how much bandwidth is being used by the node-owner. This means the limit on the mesh-node's internet usage will have to be a hard limit, instead of being able to take advantage of unused internet bandwidth.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We let the node-owners choose to share internet or not. We let them select a percentage of available bandwidth that the mesh can always use. Whether or not this is a hard limit will probably have to depend on whether or not they have another access point that they use (or if they ever use wired ethernet).&lt;br /&gt;
&lt;br /&gt;
== Connecting isolated mesh nodes over the internet ==&lt;br /&gt;
&lt;br /&gt;
It's possible to connect isolated segments of the mesh through the node-owner's internet connections. For layer2 mesh protocols at least, this requires a tunnel to one or more servers that act as mesh nodes on the internet. The mesh nodes could also attempt to directly connect to a few other mesh nodes, but that would require more complication such as NAT traversal.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
I have set up tunneldigger from wlan-slovenia which uses L2TP tunnels for this. Some work is still needed in dealing with MTU correctly.&lt;br /&gt;
&lt;br /&gt;
== Hiding node-owners source IP ==&lt;br /&gt;
&lt;br /&gt;
If someone uses internet provided by the mesh to e.g. download the newest Game Of Thrones episode, and the ISP of some innocent node-owner receives a letter from the U.S. copyright mafia, then at the very least it would be a scary experience likely resulting in the node-owner taking their node offline. In order to provide some buffer we can tunnel all internet traffic through one or more servers or &amp;quot;exit nodes&amp;quot; owned by the mesh group.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We definitely want to hide source IPs of home Cable/DSL lines.&lt;br /&gt;
&lt;br /&gt;
= Organizational structure =&lt;br /&gt;
&lt;br /&gt;
== Formal organization || No centralized entity || Separation of organization and network ==&lt;br /&gt;
&lt;br /&gt;
The people involved in running the mesh could establish a formal organization, such as a 501c3 or a LLC, or they could simply have a formal or informal agreement between each-other, e.g. something like a group peering agreement.&lt;br /&gt;
&lt;br /&gt;
The third option is to have both: The network is its own thing and anyone can peer (possibly with the requirement of signing a peering agreement) but there is also a formal organization that provides and coordinates certain services, such as e.g. selling of pre-flashed firmwares, troubleshooting mesh problems, getting funds for extra internet bandwidth for the mesh, developing firmware, spreading the word, etc. In this case, the network and central organization should probably have separate names.&lt;br /&gt;
&lt;br /&gt;
== Non-profit || For profit ==&lt;br /&gt;
&lt;br /&gt;
If there is a central organization, it could be either a for-profit or a non-profit. There are many variations, but some of the most relevant are:&lt;br /&gt;
&lt;br /&gt;
=== 501c3 ===&lt;br /&gt;
&lt;br /&gt;
Positives: Tax-exempt status. Tax-deductibility of donations. Assurance that the organization will not e.g. be bought up Google.&lt;br /&gt;
&lt;br /&gt;
Negatives: Limited political activity (but EFF is a 501c3, so it's not too bad). Structure contains innate hierarchy in the separation of board of directors and members. Still have to pay e.g. sales tax even if the organization has lost money over the year.&lt;br /&gt;
&lt;br /&gt;
=== B-corp certified for-profit ===&lt;br /&gt;
&lt;br /&gt;
Positives: Possibly more options for how to structure organization and how to operate. Yearly losses can be deducted from taxes owed. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
Negatives: May seem less trustworthy to community. May be less trustworthy (can we ensure that the corporation can never be e.g. sold to Google?). No tax-deductible donations. No tax-exemption. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
== Membership / peering requirements ==&lt;br /&gt;
&lt;br /&gt;
If we have a central organization, who can be a member? If not, who can peer? &lt;br /&gt;
&lt;br /&gt;
=== Membership ===&lt;br /&gt;
&lt;br /&gt;
The minimum possible is that everyone can be a member just by applying online (possibly we could go even further and state that anyone who claims to be a member is a member). &lt;br /&gt;
&lt;br /&gt;
Going up from that we have options such as:&lt;br /&gt;
&lt;br /&gt;
*Your membership fee is hosting a node.&lt;br /&gt;
*Your membership signup fee is buying a node.&lt;br /&gt;
*Your membership fee is hosting a node and sharing internet.&lt;br /&gt;
*Your membership fee is a monthly dollar amount.&lt;br /&gt;
*Your membership requires some amount of work monthly or yearly.&lt;br /&gt;
&lt;br /&gt;
And of course combinations of the above.&lt;br /&gt;
&lt;br /&gt;
=== Peering requirements ===&lt;br /&gt;
&lt;br /&gt;
For both meshes with and without a centralized organization, there can be a peering agreement that you must sign to become part of the mesh. It could be that the agreement is only between you and the people you connect to directly, or it could be that the agreement is between you and the mesh (and all the people who are connected to the mesh).&lt;br /&gt;
&lt;br /&gt;
There is also the option to have no such agreement and simply have instructions for how to connect to the mesh and let everyone sort out how they want to use the mesh on their own.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We are currently leaning towards a 501c3 with the network being a separate thing.&lt;br /&gt;
&lt;br /&gt;
= Ownership of and access to infrastructure =&lt;br /&gt;
&lt;br /&gt;
== Centrally owned || Distributed ownership ==&lt;br /&gt;
&lt;br /&gt;
Is the hardware owned by the people who host the nodes or are they owned by the central organization. &lt;br /&gt;
&lt;br /&gt;
Who's responsibility is it to pay for new nodes if they break? &lt;br /&gt;
&lt;br /&gt;
Hybrid models are possible, e.g: People buy pre-flashed nodes from the local mesh organization and own their nodes, but they pay a small membership fee (or not), and basically get an unlimited warranty, where the mesh group will replace their router automatically if it stops working.&lt;br /&gt;
&lt;br /&gt;
== Management of nodes ==&lt;br /&gt;
&lt;br /&gt;
Who manages the nodes? In case of firmware updates, who has access to send them to the nodes? Do each individual node-owner have to approve each update? It could be default-approve but give them a notice and a time-frame to opt out of an update. Any decision of individuals to not accept updates from the mesh group could prove very problematic in case of major updates, e.g. changing of mesh routing protocol, but even if no such updates are to occur, the firmware will have to be very specifically designed around the limitation that updates to nodes are not guaranteed to ever occur, if we allow users to manage their own nodes.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We haven't discussed this very much. I think we should let people own the nodes that they host and let the central organization manage the nodes unless the node-owner wants to manage their own node. We will have to have a clear strategy for who has access to privately owned nodes at any given time, and contracts/agreements about what they are allowed to do to them. We will have to make it very clear to the node-owners what letting us manage the nodes means (that, if obused, this power can be used to monitor their unencrypted traffic and phish ) and how we monitor and prevent abuse from the people in charge (though this is really no different from a normal ISP) [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Sensors / add-ons =&lt;br /&gt;
&lt;br /&gt;
Most routers provide a 3.3 volt serial port that can be used to attach microcontrollers and all manner of sensors. Examples:&lt;br /&gt;
&lt;br /&gt;
*Temperature, humiditiy, pressure&lt;br /&gt;
:Ultra-local weather stations.&lt;br /&gt;
*Seismic sensors &lt;br /&gt;
:See how an earthquake spreads.&lt;br /&gt;
*Air quality sensors &lt;br /&gt;
:How's the smog today?&lt;br /&gt;
*Bluetooth or ZigBee gateways&lt;br /&gt;
:Connect low-power devices to the mesh.&lt;br /&gt;
&lt;br /&gt;
= Captive portal / splash page =&lt;br /&gt;
&lt;br /&gt;
A splash page is a powerful way to tell people about the network and show them to e.g. a community portal, but it can be annoying and problematic for a lot of reasons. Here are some different solutions.&lt;br /&gt;
&lt;br /&gt;
== Full captive portal ==&lt;br /&gt;
&lt;br /&gt;
Blocking all traffic until the user clicks a button or logs in is super annoying and breaks a bunch of things, however, if the network has problems with abuse and wants all users to authenticate before use, then this could be necessary. &lt;br /&gt;
&lt;br /&gt;
A really big problem for the common user is that it doesn't work with SSL.&lt;br /&gt;
&lt;br /&gt;
== Block port 80 only ==&lt;br /&gt;
&lt;br /&gt;
This would only show a captive portal on port 80 until the user clicks a button to continue or only for the first connection to port 80.&lt;br /&gt;
&lt;br /&gt;
This is less annoying, but will still break many things and users may wonder why they've been surfing for a while (SSL sites) and then suddenly see the captive portal.&lt;br /&gt;
&lt;br /&gt;
== Block captive portal detection only ==&lt;br /&gt;
&lt;br /&gt;
Find out exactly how the captive portal detection mechanisms for different operating systems work and block this detection only, and only on the first attempt. This can be problematic, since e.g. iOS devices request a specific URL on http://www.apple.com and so required layer 7 inspection to match the packet. Another downside is that not all operating systems support captive portal detection. The following are known to support detection:&lt;br /&gt;
&lt;br /&gt;
*Android v?&lt;br /&gt;
*iOS 4.3 (maybe earlier)&lt;br /&gt;
*Mac OS 10.8 (maybe earlier)&lt;br /&gt;
*Windows 8 (maybe earlier)&lt;br /&gt;
&lt;br /&gt;
To our knowledge, Ubuntu and other popular GNU/Linux systems do not support detection.&lt;br /&gt;
&lt;br /&gt;
== No captive portal ==&lt;br /&gt;
&lt;br /&gt;
With no captive portal, many people will likely use the mesh and never learn about what it is. The SSID can still be a valid URL e.g. freepublicwifi.net and hopefully people who are curious will type it in.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I will figure out how feasibile it is to block captive portal detection only. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Network neutrality =&lt;br /&gt;
&lt;br /&gt;
To what degree do we support and allow the blocking, mangling and prioritization of traffic? &lt;br /&gt;
&lt;br /&gt;
At one extreme are things such as actively blocking certain types of traffic. This could be blocking bittorrent traffic, or netflix, or it could be disallowing any commercial use of the network at all.&lt;br /&gt;
&lt;br /&gt;
= Logging =&lt;br /&gt;
&lt;br /&gt;
To what degree does the mesh log or allow logging of traffic? If there are logs, are they centrally aggregated?&lt;br /&gt;
&lt;br /&gt;
= Encryption =&lt;br /&gt;
&lt;br /&gt;
Are links encrypted between nodes? We could decide to take drastic measure and only allow or only encourage point-to-point encrypted connections. We could only allow connections the internet using a VPN connection directly from the client to one of our exit nodes. These types of measures would drastically reduce the usability of the mesh, since they would require more than just connecting to a wifi access point.&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
Some free public wifi networks require authentication (e.g. BART wifi). This makes it easier to deal with abuse but also raises privacy concerns. Authentication can be annoying, though implemented correctly it will be a one-time setup for each device.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I feel like authentication would just make the network annoying and difficult to use. I say we just make it free and open. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Abuse =&lt;br /&gt;
&lt;br /&gt;
How does the mesh define and handle abuse? &lt;br /&gt;
&lt;br /&gt;
Some examples of abuse definitions:&lt;br /&gt;
&lt;br /&gt;
*Unintentionally running a DHCP server on the mesh.&lt;br /&gt;
*Using too much of the available bandwidth for too long.&lt;br /&gt;
*Using the mesh for illegal activities.&lt;br /&gt;
*Targeting other mesh users (e.g. phishing, password sniffing).&lt;br /&gt;
*Intentionally attempting to disrupt the functioning of the mesh.&lt;br /&gt;
&lt;br /&gt;
Some of these can be blocked automatically. Some can be detected, and could land people on a captive portal that explains what they did wrong and how to fix it. Dealing with intentional abuse can be tricky if there is no authentication.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We should block some things that definitely don't belong on the mesh, like rogue DHCP servers, and have an email address for contacting us about abuse. If there are valid use-cases, then moving all abusive MACs/IPs to a special VLAN with a captive portal and limited access could be a way to deal, but it may not be necessary at all. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Support =&lt;br /&gt;
&lt;br /&gt;
How much support will we provide and will it be provided by volunteers only or will we have paid support?&lt;br /&gt;
&lt;br /&gt;
= Naming =&lt;br /&gt;
&lt;br /&gt;
Decision: Still discussing. Several people seem to like a more generic and meaning name for the network, and less meaning less generic name for the organization.&lt;br /&gt;
&lt;br /&gt;
== Meaning vs. non-meaning ==&lt;br /&gt;
&lt;br /&gt;
Meaning example: RouteAround.net&lt;br /&gt;
&lt;br /&gt;
Non-meaning: Project Gourami&lt;br /&gt;
&lt;br /&gt;
== Generic vs. non-generic ==&lt;br /&gt;
&lt;br /&gt;
Generic example: Free Public Wifi&lt;br /&gt;
&lt;br /&gt;
Non-generic example: The People's Republic of Wifi&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5459</id>
		<title>Mesh/Decisions</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Decisions&amp;diff=5459"/>
		<updated>2013-08-23T06:15:20Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Mesh router as primary access point */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each new community mesh project faces a set of decisions. This page contains a discussion of some of these decisions.&lt;br /&gt;
&lt;br /&gt;
= Mesh router as primary access point =&lt;br /&gt;
&lt;br /&gt;
Adding a WPA2-PSK encrypted virtal access point to the router would allow node-owners to use the mesh router either as their primary private access point, or as a secondary access point in places where their existing access point doesn't reach. This could be a nice added feature, but would require some more firmware work.&lt;br /&gt;
&lt;br /&gt;
:The issue with that is that primary access points are often optimally in the center of the house, while mesh nodes should be on the edge of the house.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We're already been working on this. The web admin interface will be fairly minimal, allowing changing the ssid and password of the private access point, as well as manual tcp/udp port forwarding. The nat-pmp and upnp daemons will also be installed and the gui will provide access to disable/enable them.&lt;br /&gt;
&lt;br /&gt;
= Commercial || non-commercial =&lt;br /&gt;
&lt;br /&gt;
It may seem obvious that a community mesh project should should be non-commercial in nature, however, all societies are different and the cost and availability of hardware and skilled volunteer labour will vary quite a bit. In some places it may be possible to run a mesh based solely on donations and volunteer efforts. In other places it may be necessary to find sustainable income models. Especially in less developed countries it may be more viable to use the mesh as a way for locals to become small business owners that maintain the network and sell access to the community at affordable rates.&lt;br /&gt;
&lt;br /&gt;
Here are some options spanning the range of non-commercial to commercial:&lt;br /&gt;
&lt;br /&gt;
*Donations, volunteers and grants only.&lt;br /&gt;
*Sale of merchandise.&lt;br /&gt;
*Sale of pre-flashed routers with profit margin.&lt;br /&gt;
*Ads for local businesses on splash page.&lt;br /&gt;
*Pay to get higher bandwidth (freemium).&lt;br /&gt;
*Limited data per day for free. Pay to get more.&lt;br /&gt;
*Free for low-income individuals only.&lt;br /&gt;
*Free for private individuals and non-profits only.&lt;br /&gt;
*Free for node-owners only.&lt;br /&gt;
*Free for node-owners and they node-owners can sell access.&lt;br /&gt;
*Everyone has to pay.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I think we should stop right before the freemium model [[User:Juul|Juul]] ([[User talk:Juul|talk]]).&lt;br /&gt;
&lt;br /&gt;
= Internet =&lt;br /&gt;
&lt;br /&gt;
== Internet connected mesh || LAN only ==&lt;br /&gt;
&lt;br /&gt;
One big decision is whether to provide internet access through the mesh. A non-internet-connected mesh would provide little popular appeal outside of disaster scenarios, and so would likely have to be designed specifically with disaster scenarios in mind, unless it is simply a platform for hackers and academics to use and learn from.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Our mesh will definitely be internet-connected.&lt;br /&gt;
&lt;br /&gt;
== Sharing of Internet by node-owners ==&lt;br /&gt;
&lt;br /&gt;
Do we let the node-owners share their internet connection with the mesh? If so, how do we prioritize the traffic? Do we let the node-owners decide how much of the bandwidth they share? Do we let them set a data usage cap?&lt;br /&gt;
&lt;br /&gt;
If the node-owners don't use the mesh router as their access point, then there is really no way we can tell how much bandwidth is being used by the node-owner. This means the limit on the mesh-node's internet usage will have to be a hard limit, instead of being able to take advantage of unused internet bandwidth.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We let the node-owners choose to share internet or not. We let them select a percentage of available bandwidth that the mesh can always use. Whether or not this is a hard limit will probably have to depend on whether or not they have another access point that they use (or if they ever use wired ethernet).&lt;br /&gt;
&lt;br /&gt;
== Connecting isolated mesh nodes over the internet ==&lt;br /&gt;
&lt;br /&gt;
It's possible to connect isolated segments of the mesh through the node-owner's internet connections. For layer2 mesh protocols at least, this requires a tunnel to one or more servers that act as mesh nodes on the internet. The mesh nodes could also attempt to directly connect to a few other mesh nodes, but that would require more complication such as NAT traversal.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
I have set up tunneldigger from wlan-slovenia which uses L2TP tunnels for this. Some work is still needed in dealing with MTU correctly.&lt;br /&gt;
&lt;br /&gt;
== Hiding node-owners source IP ==&lt;br /&gt;
&lt;br /&gt;
If someone uses internet provided by the mesh to e.g. download the newest Game Of Thrones episode, and the ISP of some innocent node-owner receives a letter from the U.S. copyright mafia, then at the very least it would be a scary experience likely resulting in the node-owner taking their node offline. In order to provide some buffer we can tunnel all internet traffic through one or more servers or &amp;quot;exit nodes&amp;quot; owned by the mesh group.&lt;br /&gt;
&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
We definitely want to hide source IPs of home Cable/DSL lines.&lt;br /&gt;
&lt;br /&gt;
= Organizational structure =&lt;br /&gt;
&lt;br /&gt;
== Formal organization || No centralized entity || Separation of organization and network ==&lt;br /&gt;
&lt;br /&gt;
The people involved in running the mesh could establish a formal organization, such as a 501c3 or a LLC, or they could simply have a formal or informal agreement between each-other, e.g. something like a group peering agreement.&lt;br /&gt;
&lt;br /&gt;
The third option is to have both: The network is its own thing and anyone can peer (possibly with the requirement of signing a peering agreement) but there is also a formal organization that provides and coordinates certain services, such as e.g. selling of pre-flashed firmwares, troubleshooting mesh problems, getting funds for extra internet bandwidth for the mesh, developing firmware, spreading the word, etc. In this case, the network and central organization should probably have separate names.&lt;br /&gt;
&lt;br /&gt;
== Non-profit || For profit ==&lt;br /&gt;
&lt;br /&gt;
If there is a central organization, it could be either a for-profit or a non-profit. There are many variations, but some of the most relevant are:&lt;br /&gt;
&lt;br /&gt;
=== 501c3 ===&lt;br /&gt;
&lt;br /&gt;
Positives: Tax-exempt status. Tax-deductibility of donations. Assurance that the organization will not e.g. be bought up Google.&lt;br /&gt;
&lt;br /&gt;
Negatives: Limited political activity (but EFF is a 501c3, so it's not too bad). Structure contains innate hierarchy in the separation of board of directors and members. Still have to pay e.g. sales tax even if the organization has lost money over the year.&lt;br /&gt;
&lt;br /&gt;
=== B-corp certified for-profit ===&lt;br /&gt;
&lt;br /&gt;
Positives: Possibly more options for how to structure organization and how to operate. Yearly losses can be deducted from taxes owed. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
Negatives: May seem less trustworthy to community. May be less trustworthy (can we ensure that the corporation can never be e.g. sold to Google?). No tax-deductible donations. No tax-exemption. Ability for members to be shareholders.&lt;br /&gt;
&lt;br /&gt;
== Membership / peering requirements ==&lt;br /&gt;
&lt;br /&gt;
If we have a central organization, who can be a member? If not, who can peer? &lt;br /&gt;
&lt;br /&gt;
=== Membership ===&lt;br /&gt;
&lt;br /&gt;
The minimum possible is that everyone can be a member just by applying online (possibly we could go even further and state that anyone who claims to be a member is a member). &lt;br /&gt;
&lt;br /&gt;
Going up from that we have options such as:&lt;br /&gt;
&lt;br /&gt;
*Your membership fee is hosting a node.&lt;br /&gt;
*Your membership signup fee is buying a node.&lt;br /&gt;
*Your membership fee is hosting a node and sharing internet.&lt;br /&gt;
*Your membership fee is a monthly dollar amount.&lt;br /&gt;
*Your membership requires some amount of work monthly or yearly.&lt;br /&gt;
&lt;br /&gt;
And of course combinations of the above.&lt;br /&gt;
&lt;br /&gt;
=== Peering requirements ===&lt;br /&gt;
&lt;br /&gt;
For both meshes with and without a centralized organization, there can be a peering agreement that you must sign to become part of the mesh. It could be that the agreement is only between you and the people you connect to directly, or it could be that the agreement is between you and the mesh (and all the people who are connected to the mesh).&lt;br /&gt;
&lt;br /&gt;
There is also the option to have no such agreement and simply have instructions for how to connect to the mesh and let everyone sort out how they want to use the mesh on their own.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We are currently leaning towards a 501c3 with the network being a separate thing.&lt;br /&gt;
&lt;br /&gt;
= Ownership of and access to infrastructure =&lt;br /&gt;
&lt;br /&gt;
== Centrally owned || Distributed ownership ==&lt;br /&gt;
&lt;br /&gt;
Is the hardware owned by the people who host the nodes or are they owned by the central organization. &lt;br /&gt;
&lt;br /&gt;
Who's responsibility is it to pay for new nodes if they break? &lt;br /&gt;
&lt;br /&gt;
Hybrid models are possible, e.g: People buy pre-flashed nodes from the local mesh organization and own their nodes, but they pay a small membership fee (or not), and basically get an unlimited warranty, where the mesh group will replace their router automatically if it stops working.&lt;br /&gt;
&lt;br /&gt;
== Management of nodes ==&lt;br /&gt;
&lt;br /&gt;
Who manages the nodes? In case of firmware updates, who has access to send them to the nodes? Do each individual node-owner have to approve each update? It could be default-approve but give them a notice and a time-frame to opt out of an update. Any decision of individuals to not accept updates from the mesh group could prove very problematic in case of major updates, e.g. changing of mesh routing protocol, but even if no such updates are to occur, the firmware will have to be very specifically designed around the limitation that updates to nodes are not guaranteed to ever occur, if we allow users to manage their own nodes.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We haven't discussed this very much. I think we should let people own the nodes that they host and let the central organization manage the nodes unless the node-owner wants to manage their own node. We will have to have a clear strategy for who has access to privately owned nodes at any given time, and contracts/agreements about what they are allowed to do to them. We will have to make it very clear to the node-owners what letting us manage the nodes means (that, if obused, this power can be used to monitor their unencrypted traffic and phish ) and how we monitor and prevent abuse from the people in charge (though this is really no different from a normal ISP) [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Sensors / add-ons =&lt;br /&gt;
&lt;br /&gt;
Most routers provide a 3.3 volt serial port that can be used to attach microcontrollers and all manner of sensors. Examples:&lt;br /&gt;
&lt;br /&gt;
*Temperature, humiditiy, pressure&lt;br /&gt;
:Ultra-local weather stations.&lt;br /&gt;
*Seismic sensors &lt;br /&gt;
:See how an earthquake spreads.&lt;br /&gt;
*Air quality sensors &lt;br /&gt;
:How's the smog today?&lt;br /&gt;
*Bluetooth or ZigBee gateways&lt;br /&gt;
:Connect low-power devices to the mesh.&lt;br /&gt;
&lt;br /&gt;
= Captive portal / splash page =&lt;br /&gt;
&lt;br /&gt;
A splash page is a powerful way to tell people about the network and show them to e.g. a community portal, but it can be annoying and problematic for a lot of reasons. Here are some different solutions.&lt;br /&gt;
&lt;br /&gt;
== Full captive portal ==&lt;br /&gt;
&lt;br /&gt;
Blocking all traffic until the user clicks a button or logs in is super annoying and breaks a bunch of things, however, if the network has problems with abuse and wants all users to authenticate before use, then this could be necessary. &lt;br /&gt;
&lt;br /&gt;
A really big problem for the common user is that it doesn't work with SSL.&lt;br /&gt;
&lt;br /&gt;
== Block port 80 only ==&lt;br /&gt;
&lt;br /&gt;
This would only show a captive portal on port 80 until the user clicks a button to continue or only for the first connection to port 80.&lt;br /&gt;
&lt;br /&gt;
This is less annoying, but will still break many things and users may wonder why they've been surfing for a while (SSL sites) and then suddenly see the captive portal.&lt;br /&gt;
&lt;br /&gt;
== Block captive portal detection only ==&lt;br /&gt;
&lt;br /&gt;
Find out exactly how the captive portal detection mechanisms for different operating systems work and block this detection only, and only on the first attempt. This can be problematic, since e.g. iOS devices request a specific URL on http://www.apple.com and so required layer 7 inspection to match the packet. Another downside is that not all operating systems support captive portal detection. The following are known to support detection:&lt;br /&gt;
&lt;br /&gt;
*Android v?&lt;br /&gt;
*iOS 4.3 (maybe earlier)&lt;br /&gt;
*Mac OS 10.8 (maybe earlier)&lt;br /&gt;
*Windows 8 (maybe earlier)&lt;br /&gt;
&lt;br /&gt;
To our knowledge, Ubuntu and other popular GNU/Linux systems do not support detection.&lt;br /&gt;
&lt;br /&gt;
== No captive portal ==&lt;br /&gt;
&lt;br /&gt;
With no captive portal, many people will likely use the mesh and never learn about what it is. The SSID can still be a valid URL e.g. freepublicwifi.net and hopefully people who are curious will type it in.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I will figure out how feasibile it is to block captive portal detection only. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Network neutrality =&lt;br /&gt;
&lt;br /&gt;
To what degree do we support and allow the blocking, mangling and prioritization of traffic? &lt;br /&gt;
&lt;br /&gt;
At one extreme are things such as actively blocking certain types of traffic. This could be blocking bittorrent traffic, or netflix, or it could be disallowing any commercial use of the network at all.&lt;br /&gt;
&lt;br /&gt;
= Logging =&lt;br /&gt;
&lt;br /&gt;
To what degree does the mesh log or allow logging of traffic? If there are logs, are they centrally aggregated?&lt;br /&gt;
&lt;br /&gt;
= Encryption =&lt;br /&gt;
&lt;br /&gt;
Are links encrypted between nodes? We could decide to take drastic measure and only allow or only encourage point-to-point encrypted connections. We could only allow connections the internet using a VPN connection directly from the client to one of our exit nodes. These types of measures would drastically reduce the usability of the mesh, since they would require more than just connecting to a wifi access point.&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
Some free public wifi networks require authentication (e.g. BART wifi). This makes it easier to deal with abuse but also raises privacy concerns. Authentication can be annoying, though implemented correctly it will be a one-time setup for each device.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
I feel like authentication would just make the network annoying and difficult to use. I say we just make it free and open. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Abuse =&lt;br /&gt;
&lt;br /&gt;
How does the mesh define and handle abuse? &lt;br /&gt;
&lt;br /&gt;
Some examples of abuse definitions:&lt;br /&gt;
&lt;br /&gt;
*Unintentionally running a DHCP server on the mesh.&lt;br /&gt;
*Using too much of the available bandwidth for too long.&lt;br /&gt;
*Using the mesh for illegal activities.&lt;br /&gt;
*Targeting other mesh users (e.g. phishing, password sniffing).&lt;br /&gt;
*Intentionally attempting to disrupt the functioning of the mesh.&lt;br /&gt;
&lt;br /&gt;
Some of these can be blocked automatically. Some can be detected, and could land people on a captive portal that explains what they did wrong and how to fix it. Dealing with intentional abuse can be tricky if there is no authentication.&lt;br /&gt;
&lt;br /&gt;
== Decision ==&lt;br /&gt;
&lt;br /&gt;
We should block some things that definitely don't belong on the mesh, like rogue DHCP servers, and have an email address for contacting us about abuse. If there are valid use-cases, then moving all abusive MACs/IPs to a special VLAN with a captive portal and limited access could be a way to deal, but it may not be necessary at all. [[User:Juul|Juul]] ([[User talk:Juul|talk]])&lt;br /&gt;
&lt;br /&gt;
= Support =&lt;br /&gt;
&lt;br /&gt;
How much support will we provide and will it be provided by volunteers only or will we have paid support?&lt;br /&gt;
&lt;br /&gt;
= Naming =&lt;br /&gt;
&lt;br /&gt;
Decision: Still discussing. Several people seem to like a more generic and meaning name for the network, and less meaning less generic name for the organization.&lt;br /&gt;
&lt;br /&gt;
== Meaning vs. non-meaning ==&lt;br /&gt;
&lt;br /&gt;
Meaning example: RouteAround.net&lt;br /&gt;
&lt;br /&gt;
Non-meaning: Project Gourami&lt;br /&gt;
&lt;br /&gt;
== Generic vs. non-generic ==&lt;br /&gt;
&lt;br /&gt;
Generic example: Free Public Wifi&lt;br /&gt;
&lt;br /&gt;
Non-generic example: The People's Republic of Wifi&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5458</id>
		<title>Mesh/Firmware/Splash page</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5458"/>
		<updated>2013-08-23T06:10:40Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Current in-progress solution for iOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some operating systems will attempt to detect whether you are behind a captive portal when you connect to a new network. This usually involves fetching a web page with known content from a web server controlled by the company behind the operating system. If a captive portal is detected, the operating system will pop up a dialog showing the web page from the captive portal. &lt;br /&gt;
&lt;br /&gt;
We will run a fake captive portal that causes our splash page to be displayed on any operating system supporting captive portal detection. The fake captive portal will _only_ interfere with captive portal detection traffic. All other traffic will go through unaltered. The fake captive portal will run on the [[network topology|exit nodes]] and so will only be active when the mesh is connected to the internet.&lt;br /&gt;
&lt;br /&gt;
If the mesh becomes disconnected from the internet, then all HTTP GET requests to the internet will receive 302 HTTP redirects to a community portal web app running on a server on the mesh that will inform the user that the internet is down. The redirection is accomplished with [https://github.com/sudomesh/internetisdownredirect internetisdownredirect]. If the node is not connected to any server running the community portal web app, then all HTTP GET requests will receive 302 HTTP redirects to a local web page telling the user that your mesh node has become disconnected from the rest of the mesh, and who to contact about it.&lt;br /&gt;
&lt;br /&gt;
Currently this page talks mostly about how to implement the fake captive portal.&lt;br /&gt;
&lt;br /&gt;
= Types of captive portal detection =&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
Expects HTTP 204 response from http://clients3.google.com/generate_204 &lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
expects zero-length response body from http://www.google.com/blank.html&lt;br /&gt;
&lt;br /&gt;
or something else.&lt;br /&gt;
&lt;br /&gt;
Captive portal detection method [http://www.igate.com/iblog/index.php/android-v4-2-2-updates/ appears to have changed in 4.2.2].&lt;br /&gt;
&lt;br /&gt;
The code that uses the HTTP 204 method is [https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/net/CaptivePortalTracker.java here]. This is the master branch, which I assume is latest stable or latest development, so I'm not sure what this &amp;quot;faster captive portal detection&amp;quot; in 4.2.2 is supposed to mean.&lt;br /&gt;
&lt;br /&gt;
== Mac OS == &lt;br /&gt;
&lt;br /&gt;
Request is made to &amp;quot;http://www.apple.com/library/test/success.html&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
Here is the sequence of events, as verified by [[User:Juul|Juul]] ([[User talk:Juul|talk]]) using an iPhone running iOS 5.0.1:&lt;br /&gt;
&lt;br /&gt;
First a DNS lookup is issued for www.apple.com. Next the following HTTP GET is issued to the resulting IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /library/test/success.html HTTP/1.0&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: CaptiveNetworkSupport-183 wispr&lt;br /&gt;
Connection: close&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The result that it expects is an HTTP 200 with this content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Success&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;Success&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it gets anything else, then it will do the following HTTP GET, again to the www.apple.com IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET / HTTP/1.1&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A405&lt;br /&gt;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br /&gt;
Accept-Language: en-us&lt;br /&gt;
Accept-Encoding: gzip, d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and present the response as the splash page.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
The captive portal detection is called NCSI (Network Connectivity Status Indicator). It works like so:&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of www.msftncsi.com followed by a GET request to the resulting IP with URL http://www.msftncsi.com/ncsi.txt. This file is expected to contain only the text &amp;quot;Microsoft NCSI&amp;quot; (no quotes).&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of dns.msftncsi.com. If the DNS lookup does not result in the IP 131.107.255.255, the internet connection is assumed to be non-functioning.&lt;br /&gt;
&lt;br /&gt;
So: To get a splash page displayed, the initial request to http://www.msftncsi.com/ncsi.txt should not return the expected text (unknown if blocking the connection outright is good enough), but the DNS &lt;br /&gt;
&lt;br /&gt;
More info [http://blog.superuser.com/2011/05/16/windows-7-network-awareness/ here].&lt;br /&gt;
&lt;br /&gt;
= Solutions =&lt;br /&gt;
&lt;br /&gt;
The filtering should happen at the exit nodes (the servers from which traffic flows between the mesh and the internet). This means that we are not limited by the processing power of the routers.&lt;br /&gt;
&lt;br /&gt;
== Current in-progress solution for iOS ==&lt;br /&gt;
&lt;br /&gt;
The exit nodes run a dnsmasq caching dns server. They have an entry for www.apple.com in their /etc/hosts file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
184.85.61.15    www.apple.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is to ensure that the IP for www.apple.com is always the same for all the entire network and is always known. This is not a good solution. Instead, the configuration that relies on the IP should be updated every time the IP for www.apple.com changes.&lt;br /&gt;
&lt;br /&gt;
:Apple is using Akamai and has many addresses. Moreover, it might be that multiple different companies share the same IP?&lt;br /&gt;
:What about IPv6?&lt;br /&gt;
&lt;br /&gt;
An iptables rule redirects all port 80 traffic for the www.apple.com IP to a different port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -t nat -A PREROUTING -i bat0 -p tcp -d 184.85.61.15 --dport 80 -j REDIRECT --to-port 3128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The squid proxy is run on port 3128 and set to run a program called rewrite.pl that sends alternate responses to specific GET requests.&lt;br /&gt;
&lt;br /&gt;
:Why not using internetisdownredirect to redirect?&lt;br /&gt;
&lt;br /&gt;
Squid 3.1 configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl mesh src 10.0.0.0/8&lt;br /&gt;
acl manager proto cache_object&lt;br /&gt;
acl localhost src 127.0.0.1/32 ::1&lt;br /&gt;
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1&lt;br /&gt;
acl Safe_ports port 80 &lt;br /&gt;
acl CONNECT method CONNECT&lt;br /&gt;
# Only allow cachemgr access from localhost&lt;br /&gt;
http_access allow manager localhost&lt;br /&gt;
http_access deny manager&lt;br /&gt;
http_access deny !Safe_ports&lt;br /&gt;
http_access allow localhost&lt;br /&gt;
http_access allow mesh&lt;br /&gt;
http_access deny all&lt;br /&gt;
http_port 3128 transparent&lt;br /&gt;
coredump_dir /var/spool/squid3&lt;br /&gt;
# program to run to re-write urls of incoming requests&lt;br /&gt;
url_rewrite_program /etc/squid3/rewrite.pl&lt;br /&gt;
# The number of redirector processes to spawn&lt;br /&gt;
url_rewrite_children 10&lt;br /&gt;
# Bypass rewrite if all rewrite processes are busy&lt;br /&gt;
url_rewrite_bypass on&lt;br /&gt;
# This is almost certainly not needed&lt;br /&gt;
refresh_pattern ^ftp:           1440    20%     10080&lt;br /&gt;
refresh_pattern ^gopher:        1440    0%      1440&lt;br /&gt;
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0&lt;br /&gt;
refresh_pattern .               0       20%     4320&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We should see if we can use the squid ''url_rewrite_access'' directive to ensure that the rewrite.pl program is only run for the specific queries that need rewriting.&lt;br /&gt;
&lt;br /&gt;
The rewrite.pl program simply replies to the captive portal probe queries with the replies from a local apache server. Here is the code of /etc/squid3/rewrite.pl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print $url . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For versions 3.4 of squid and above, the program should look like this instead (reference [http://www.squid-cache.org/Versions/v3/3.1/cfgman/url_rewrite_program.html v3.1 docs] and [http://www.squid-cache.org/Versions/v3/3.4/cfgman/url_rewrite_program.html v3.4 docs]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;OK rewrite-url=http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print &amp;quot;ERR\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An apache 2 with standard configuration is running and in /var/www/splash.html has the following file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta CHARSET=utf8mb4&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;peopleswifi.org&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Welcome to People's Wifi&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;&lt;br /&gt;
          Click anywhere to continue!&lt;br /&gt;
        &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last missing steps are to improve rewrite.pl to add firewall rules that bypass the squid proxy for the source IP after the user clicks past the splash screen. These should be flushed out after some period of time. Also, the matching for http://www.apple.com/ should only be activated for an IP for some minutes immediately after the request to http://www.apple.com/library/test/success.html such that requests to http://www.apple.com from non-captive-portal detecting devices will not be redirected.&lt;br /&gt;
&lt;br /&gt;
One concern is: What happens when the client roams to another mesh node and then stays there until their dhcp lease expires? They may get a new IP if batman-adv decides that another gateway is closer/better. If the client gets a new IP, will it try the captive portal detection again?&lt;br /&gt;
&lt;br /&gt;
:Will not clients have global IPs for whole mesh?&lt;br /&gt;
&lt;br /&gt;
== Proxy ==&lt;br /&gt;
&lt;br /&gt;
A proxy such as Polipo or Squid could be used.&lt;br /&gt;
&lt;br /&gt;
== iptables layer 7 ==&lt;br /&gt;
&lt;br /&gt;
Layer 7 filtering allows the use of regular expression matching of the beginning of the packet data. &lt;br /&gt;
&lt;br /&gt;
== ip-based optimization ==&lt;br /&gt;
&lt;br /&gt;
One of the problems with a proxy and with layer 7 filtering is that it's slow. It would be nice if we could filter only the traffic going to the servers used for captive portal detection (using proxy or layer 7). Unfortunately these servers have not one, but a range of IP addresses (at least for www.apple.com), but a DNS request from an exit node and any user on the mesh going through that same exit node should get the same response. Thus, we should be able to have a script that:&lt;br /&gt;
&lt;br /&gt;
# Periodically looks up the IP for the different servers&lt;br /&gt;
# Adds the result as an entry in /etc/hosts&lt;br /&gt;
# Updates iptables rules to direct traffic to those IP addresses through the proxy or layer 7 rules.&lt;br /&gt;
&lt;br /&gt;
It may be that we could run an actual caching DNS server, but that DNS server would need a hook to be called every time certain entries change.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5457</id>
		<title>Mesh/Firmware/Splash page</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5457"/>
		<updated>2013-08-23T06:08:15Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Current in-progress solution for iOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some operating systems will attempt to detect whether you are behind a captive portal when you connect to a new network. This usually involves fetching a web page with known content from a web server controlled by the company behind the operating system. If a captive portal is detected, the operating system will pop up a dialog showing the web page from the captive portal. &lt;br /&gt;
&lt;br /&gt;
We will run a fake captive portal that causes our splash page to be displayed on any operating system supporting captive portal detection. The fake captive portal will _only_ interfere with captive portal detection traffic. All other traffic will go through unaltered. The fake captive portal will run on the [[network topology|exit nodes]] and so will only be active when the mesh is connected to the internet.&lt;br /&gt;
&lt;br /&gt;
If the mesh becomes disconnected from the internet, then all HTTP GET requests to the internet will receive 302 HTTP redirects to a community portal web app running on a server on the mesh that will inform the user that the internet is down. The redirection is accomplished with [https://github.com/sudomesh/internetisdownredirect internetisdownredirect]. If the node is not connected to any server running the community portal web app, then all HTTP GET requests will receive 302 HTTP redirects to a local web page telling the user that your mesh node has become disconnected from the rest of the mesh, and who to contact about it.&lt;br /&gt;
&lt;br /&gt;
Currently this page talks mostly about how to implement the fake captive portal.&lt;br /&gt;
&lt;br /&gt;
= Types of captive portal detection =&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
Expects HTTP 204 response from http://clients3.google.com/generate_204 &lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
expects zero-length response body from http://www.google.com/blank.html&lt;br /&gt;
&lt;br /&gt;
or something else.&lt;br /&gt;
&lt;br /&gt;
Captive portal detection method [http://www.igate.com/iblog/index.php/android-v4-2-2-updates/ appears to have changed in 4.2.2].&lt;br /&gt;
&lt;br /&gt;
The code that uses the HTTP 204 method is [https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/net/CaptivePortalTracker.java here]. This is the master branch, which I assume is latest stable or latest development, so I'm not sure what this &amp;quot;faster captive portal detection&amp;quot; in 4.2.2 is supposed to mean.&lt;br /&gt;
&lt;br /&gt;
== Mac OS == &lt;br /&gt;
&lt;br /&gt;
Request is made to &amp;quot;http://www.apple.com/library/test/success.html&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
Here is the sequence of events, as verified by [[User:Juul|Juul]] ([[User talk:Juul|talk]]) using an iPhone running iOS 5.0.1:&lt;br /&gt;
&lt;br /&gt;
First a DNS lookup is issued for www.apple.com. Next the following HTTP GET is issued to the resulting IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /library/test/success.html HTTP/1.0&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: CaptiveNetworkSupport-183 wispr&lt;br /&gt;
Connection: close&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The result that it expects is an HTTP 200 with this content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Success&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;Success&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it gets anything else, then it will do the following HTTP GET, again to the www.apple.com IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET / HTTP/1.1&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A405&lt;br /&gt;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br /&gt;
Accept-Language: en-us&lt;br /&gt;
Accept-Encoding: gzip, d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and present the response as the splash page.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
The captive portal detection is called NCSI (Network Connectivity Status Indicator). It works like so:&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of www.msftncsi.com followed by a GET request to the resulting IP with URL http://www.msftncsi.com/ncsi.txt. This file is expected to contain only the text &amp;quot;Microsoft NCSI&amp;quot; (no quotes).&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of dns.msftncsi.com. If the DNS lookup does not result in the IP 131.107.255.255, the internet connection is assumed to be non-functioning.&lt;br /&gt;
&lt;br /&gt;
So: To get a splash page displayed, the initial request to http://www.msftncsi.com/ncsi.txt should not return the expected text (unknown if blocking the connection outright is good enough), but the DNS &lt;br /&gt;
&lt;br /&gt;
More info [http://blog.superuser.com/2011/05/16/windows-7-network-awareness/ here].&lt;br /&gt;
&lt;br /&gt;
= Solutions =&lt;br /&gt;
&lt;br /&gt;
The filtering should happen at the exit nodes (the servers from which traffic flows between the mesh and the internet). This means that we are not limited by the processing power of the routers.&lt;br /&gt;
&lt;br /&gt;
== Current in-progress solution for iOS ==&lt;br /&gt;
&lt;br /&gt;
The exit nodes run a dnsmasq caching dns server. They have an entry for www.apple.com in their /etc/hosts file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
184.85.61.15    www.apple.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is to ensure that the IP for www.apple.com is always the same for all the entire network and is always known. This is not a good solution. Instead, the configuration that relies on the IP should be updated every time the IP for www.apple.com changes.&lt;br /&gt;
&lt;br /&gt;
:Apple is using Akamai and has many addresses. Moreover, it might be that multiple different companies share the same IP?&lt;br /&gt;
:What about IPv6?&lt;br /&gt;
&lt;br /&gt;
An iptables rule redirects all port 80 traffic for the www.apple.com IP to a different port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -t nat -A PREROUTING -i bat0 -p tcp -d 184.85.61.15 --dport 80 -j REDIRECT --to-port 3128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The squid proxy is run on port 3128 and set to run a program called rewrite.pl that sends alternate responses to specific GET requests.&lt;br /&gt;
&lt;br /&gt;
Squid 3.1 configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl mesh src 10.0.0.0/8&lt;br /&gt;
acl manager proto cache_object&lt;br /&gt;
acl localhost src 127.0.0.1/32 ::1&lt;br /&gt;
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1&lt;br /&gt;
acl Safe_ports port 80 &lt;br /&gt;
acl CONNECT method CONNECT&lt;br /&gt;
# Only allow cachemgr access from localhost&lt;br /&gt;
http_access allow manager localhost&lt;br /&gt;
http_access deny manager&lt;br /&gt;
http_access deny !Safe_ports&lt;br /&gt;
http_access allow localhost&lt;br /&gt;
http_access allow mesh&lt;br /&gt;
http_access deny all&lt;br /&gt;
http_port 3128 transparent&lt;br /&gt;
coredump_dir /var/spool/squid3&lt;br /&gt;
# program to run to re-write urls of incoming requests&lt;br /&gt;
url_rewrite_program /etc/squid3/rewrite.pl&lt;br /&gt;
# The number of redirector processes to spawn&lt;br /&gt;
url_rewrite_children 10&lt;br /&gt;
# Bypass rewrite if all rewrite processes are busy&lt;br /&gt;
url_rewrite_bypass on&lt;br /&gt;
# This is almost certainly not needed&lt;br /&gt;
refresh_pattern ^ftp:           1440    20%     10080&lt;br /&gt;
refresh_pattern ^gopher:        1440    0%      1440&lt;br /&gt;
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0&lt;br /&gt;
refresh_pattern .               0       20%     4320&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We should see if we can use the squid ''url_rewrite_access'' directive to ensure that the rewrite.pl program is only run for the specific queries that need rewriting.&lt;br /&gt;
&lt;br /&gt;
The rewrite.pl program simply replies to the captive portal probe queries with the replies from a local apache server. Here is the code of /etc/squid3/rewrite.pl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print $url . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For versions 3.4 of squid and above, the program should look like this instead (reference [http://www.squid-cache.org/Versions/v3/3.1/cfgman/url_rewrite_program.html v3.1 docs] and [http://www.squid-cache.org/Versions/v3/3.4/cfgman/url_rewrite_program.html v3.4 docs]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;OK rewrite-url=http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print &amp;quot;ERR\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An apache 2 with standard configuration is running and in /var/www/splash.html has the following file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta CHARSET=utf8mb4&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;peopleswifi.org&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Welcome to People's Wifi&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;&lt;br /&gt;
          Click anywhere to continue!&lt;br /&gt;
        &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last missing steps are to improve rewrite.pl to add firewall rules that bypass the squid proxy for the source IP after the user clicks past the splash screen. These should be flushed out after some period of time. Also, the matching for http://www.apple.com/ should only be activated for an IP for some minutes immediately after the request to http://www.apple.com/library/test/success.html such that requests to http://www.apple.com from non-captive-portal detecting devices will not be redirected.&lt;br /&gt;
&lt;br /&gt;
One concern is: What happens when the client roams to another mesh node and then stays there until their dhcp lease expires? They may get a new IP if batman-adv decides that another gateway is closer/better. If the client gets a new IP, will it try the captive portal detection again?&lt;br /&gt;
&lt;br /&gt;
== Proxy ==&lt;br /&gt;
&lt;br /&gt;
A proxy such as Polipo or Squid could be used.&lt;br /&gt;
&lt;br /&gt;
== iptables layer 7 ==&lt;br /&gt;
&lt;br /&gt;
Layer 7 filtering allows the use of regular expression matching of the beginning of the packet data. &lt;br /&gt;
&lt;br /&gt;
== ip-based optimization ==&lt;br /&gt;
&lt;br /&gt;
One of the problems with a proxy and with layer 7 filtering is that it's slow. It would be nice if we could filter only the traffic going to the servers used for captive portal detection (using proxy or layer 7). Unfortunately these servers have not one, but a range of IP addresses (at least for www.apple.com), but a DNS request from an exit node and any user on the mesh going through that same exit node should get the same response. Thus, we should be able to have a script that:&lt;br /&gt;
&lt;br /&gt;
# Periodically looks up the IP for the different servers&lt;br /&gt;
# Adds the result as an entry in /etc/hosts&lt;br /&gt;
# Updates iptables rules to direct traffic to those IP addresses through the proxy or layer 7 rules.&lt;br /&gt;
&lt;br /&gt;
It may be that we could run an actual caching DNS server, but that DNS server would need a hook to be called every time certain entries change.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5456</id>
		<title>Mesh/Firmware/Splash page</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Splash_page&amp;diff=5456"/>
		<updated>2013-08-23T06:06:20Z</updated>

		<summary type="html">&lt;p&gt;Mitar: How Mac OS X check is made&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some operating systems will attempt to detect whether you are behind a captive portal when you connect to a new network. This usually involves fetching a web page with known content from a web server controlled by the company behind the operating system. If a captive portal is detected, the operating system will pop up a dialog showing the web page from the captive portal. &lt;br /&gt;
&lt;br /&gt;
We will run a fake captive portal that causes our splash page to be displayed on any operating system supporting captive portal detection. The fake captive portal will _only_ interfere with captive portal detection traffic. All other traffic will go through unaltered. The fake captive portal will run on the [[network topology|exit nodes]] and so will only be active when the mesh is connected to the internet.&lt;br /&gt;
&lt;br /&gt;
If the mesh becomes disconnected from the internet, then all HTTP GET requests to the internet will receive 302 HTTP redirects to a community portal web app running on a server on the mesh that will inform the user that the internet is down. The redirection is accomplished with [https://github.com/sudomesh/internetisdownredirect internetisdownredirect]. If the node is not connected to any server running the community portal web app, then all HTTP GET requests will receive 302 HTTP redirects to a local web page telling the user that your mesh node has become disconnected from the rest of the mesh, and who to contact about it.&lt;br /&gt;
&lt;br /&gt;
Currently this page talks mostly about how to implement the fake captive portal.&lt;br /&gt;
&lt;br /&gt;
= Types of captive portal detection =&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
Expects HTTP 204 response from http://clients3.google.com/generate_204 &lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
expects zero-length response body from http://www.google.com/blank.html&lt;br /&gt;
&lt;br /&gt;
or something else.&lt;br /&gt;
&lt;br /&gt;
Captive portal detection method [http://www.igate.com/iblog/index.php/android-v4-2-2-updates/ appears to have changed in 4.2.2].&lt;br /&gt;
&lt;br /&gt;
The code that uses the HTTP 204 method is [https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/net/CaptivePortalTracker.java here]. This is the master branch, which I assume is latest stable or latest development, so I'm not sure what this &amp;quot;faster captive portal detection&amp;quot; in 4.2.2 is supposed to mean.&lt;br /&gt;
&lt;br /&gt;
== Mac OS == &lt;br /&gt;
&lt;br /&gt;
Request is made to &amp;quot;http://www.apple.com/library/test/success.html&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
Here is the sequence of events, as verified by [[User:Juul|Juul]] ([[User talk:Juul|talk]]) using an iPhone running iOS 5.0.1:&lt;br /&gt;
&lt;br /&gt;
First a DNS lookup is issued for www.apple.com. Next the following HTTP GET is issued to the resulting IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /library/test/success.html HTTP/1.0&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: CaptiveNetworkSupport-183 wispr&lt;br /&gt;
Connection: close&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The result that it expects is an HTTP 200 with this content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Success&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;Success&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it gets anything else, then it will do the following HTTP GET, again to the www.apple.com IP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET / HTTP/1.1&lt;br /&gt;
Host: www.apple.com&lt;br /&gt;
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A405&lt;br /&gt;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br /&gt;
Accept-Language: en-us&lt;br /&gt;
Accept-Encoding: gzip, d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and present the response as the splash page.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
The captive portal detection is called NCSI (Network Connectivity Status Indicator). It works like so:&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of www.msftncsi.com followed by a GET request to the resulting IP with URL http://www.msftncsi.com/ncsi.txt. This file is expected to contain only the text &amp;quot;Microsoft NCSI&amp;quot; (no quotes).&lt;br /&gt;
&lt;br /&gt;
*A DNS lookup of dns.msftncsi.com. If the DNS lookup does not result in the IP 131.107.255.255, the internet connection is assumed to be non-functioning.&lt;br /&gt;
&lt;br /&gt;
So: To get a splash page displayed, the initial request to http://www.msftncsi.com/ncsi.txt should not return the expected text (unknown if blocking the connection outright is good enough), but the DNS &lt;br /&gt;
&lt;br /&gt;
More info [http://blog.superuser.com/2011/05/16/windows-7-network-awareness/ here].&lt;br /&gt;
&lt;br /&gt;
= Solutions =&lt;br /&gt;
&lt;br /&gt;
The filtering should happen at the exit nodes (the servers from which traffic flows between the mesh and the internet). This means that we are not limited by the processing power of the routers.&lt;br /&gt;
&lt;br /&gt;
== Current in-progress solution for iOS ==&lt;br /&gt;
&lt;br /&gt;
The exit nodes run a dnsmasq caching dns server. They have an entry for www.apple.com in their /etc/hosts file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
184.85.61.15    www.apple.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is to ensure that the IP for www.apple.com is always the same for all the entire network and is always known. This is not a good solution. Instead, the configuration that relies on the IP should be updated every time the IP for www.apple.com changes.&lt;br /&gt;
&lt;br /&gt;
An iptables rule redirects all port 80 traffic for the www.apple.com IP to a different port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -t nat -A PREROUTING -i bat0 -p tcp -d 184.85.61.15 --dport 80 -j REDIRECT --to-port 3128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The squid proxy is run on port 3128 and set to run a program called rewrite.pl that sends alternate responses to specific GET requests.&lt;br /&gt;
&lt;br /&gt;
Squid 3.1 configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl mesh src 10.0.0.0/8&lt;br /&gt;
acl manager proto cache_object&lt;br /&gt;
acl localhost src 127.0.0.1/32 ::1&lt;br /&gt;
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1&lt;br /&gt;
acl Safe_ports port 80 &lt;br /&gt;
acl CONNECT method CONNECT&lt;br /&gt;
# Only allow cachemgr access from localhost&lt;br /&gt;
http_access allow manager localhost&lt;br /&gt;
http_access deny manager&lt;br /&gt;
http_access deny !Safe_ports&lt;br /&gt;
http_access allow localhost&lt;br /&gt;
http_access allow mesh&lt;br /&gt;
http_access deny all&lt;br /&gt;
http_port 3128 transparent&lt;br /&gt;
coredump_dir /var/spool/squid3&lt;br /&gt;
# program to run to re-write urls of incoming requests&lt;br /&gt;
url_rewrite_program /etc/squid3/rewrite.pl&lt;br /&gt;
# The number of redirector processes to spawn&lt;br /&gt;
url_rewrite_children 10&lt;br /&gt;
# Bypass rewrite if all rewrite processes are busy&lt;br /&gt;
url_rewrite_bypass on&lt;br /&gt;
# This is almost certainly not needed&lt;br /&gt;
refresh_pattern ^ftp:           1440    20%     10080&lt;br /&gt;
refresh_pattern ^gopher:        1440    0%      1440&lt;br /&gt;
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0&lt;br /&gt;
refresh_pattern .               0       20%     4320&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We should see if we can use the squid ''url_rewrite_access'' directive to ensure that the rewrite.pl program is only run for the specific queries that need rewriting.&lt;br /&gt;
&lt;br /&gt;
The rewrite.pl program simply replies to the captive portal probe queries with the replies from a local apache server. Here is the code of /etc/squid3/rewrite.pl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print $url . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For versions 3.4 of squid and above, the program should look like this instead (reference [http://www.squid-cache.org/Versions/v3/3.1/cfgman/url_rewrite_program.html v3.1 docs] and [http://www.squid-cache.org/Versions/v3/3.4/cfgman/url_rewrite_program.html v3.4 docs]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
$splash_response = &amp;quot;OK rewrite-url=http://localhost/splash.html\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$|=1;&lt;br /&gt;
while (&amp;lt;&amp;gt;) {&lt;br /&gt;
    chomp;&lt;br /&gt;
    @line = split;&lt;br /&gt;
    $url = $line[0];&lt;br /&gt;
    if ($url =~ /^http:\/\/www\.apple\.com\/library\/test\/success\.html/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } elsif ($url =~ /^http:\/\/www\.apple\.com\/$/) {&lt;br /&gt;
&lt;br /&gt;
        print $splash_response;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        print &amp;quot;ERR\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An apache 2 with standard configuration is running and in /var/www/splash.html has the following file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta CHARSET=utf8mb4&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;peopleswifi.org&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Welcome to People's Wifi&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;&lt;br /&gt;
          Click anywhere to continue!&lt;br /&gt;
        &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last missing steps are to improve rewrite.pl to add firewall rules that bypass the squid proxy for the source IP after the user clicks past the splash screen. These should be flushed out after some period of time. Also, the matching for http://www.apple.com/ should only be activated for an IP for some minutes immediately after the request to http://www.apple.com/library/test/success.html such that requests to http://www.apple.com from non-captive-portal detecting devices will not be redirected.&lt;br /&gt;
&lt;br /&gt;
One concern is: What happens when the client roams to another mesh node and then stays there until their dhcp lease expires? They may get a new IP if batman-adv decides that another gateway is closer/better. If the client gets a new IP, will it try the captive portal detection again?&lt;br /&gt;
&lt;br /&gt;
== Proxy ==&lt;br /&gt;
&lt;br /&gt;
A proxy such as Polipo or Squid could be used.&lt;br /&gt;
&lt;br /&gt;
== iptables layer 7 ==&lt;br /&gt;
&lt;br /&gt;
Layer 7 filtering allows the use of regular expression matching of the beginning of the packet data. &lt;br /&gt;
&lt;br /&gt;
== ip-based optimization ==&lt;br /&gt;
&lt;br /&gt;
One of the problems with a proxy and with layer 7 filtering is that it's slow. It would be nice if we could filter only the traffic going to the servers used for captive portal detection (using proxy or layer 7). Unfortunately these servers have not one, but a range of IP addresses (at least for www.apple.com), but a DNS request from an exit node and any user on the mesh going through that same exit node should get the same response. Thus, we should be able to have a script that:&lt;br /&gt;
&lt;br /&gt;
# Periodically looks up the IP for the different servers&lt;br /&gt;
# Adds the result as an entry in /etc/hosts&lt;br /&gt;
# Updates iptables rules to direct traffic to those IP addresses through the proxy or layer 7 rules.&lt;br /&gt;
&lt;br /&gt;
It may be that we could run an actual caching DNS server, but that DNS server would need a hook to be called every time certain entries change.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Challenges&amp;diff=5455</id>
		<title>Mesh/Challenges</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Challenges&amp;diff=5455"/>
		<updated>2013-08-23T06:01:57Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Comment about trust&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Security'''&lt;br /&gt;
It's possible that malicious actors could install malicious software on mesh nodes they control such as [http://www.thoughtcrime.org/software/sslstrip/ sslstrip] via [https://github.com/RMerl/asuswrt-merlin/wiki/Entware Entware].  This would allow them to capture sensitive information from less savvy users.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Countermeasures might include regularly re-flashing nodes, not allowing nodes with changed root passwords, whitelisting applications?&lt;br /&gt;
&lt;br /&gt;
It is a feature, not a bug. People should use end-to-end encryption with [https://www.eff.org/https-everywhere HTTPS Everywhere] and not relay on security of the network. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 19:58, 9 August 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Hm. Yes, though some questions remain: Are we putting people in a situation where their lack of education about security (no fault of their own) and lack of p2p encryption in their software tools (definitely no fault of their own) will put them at risk? Certainly the risk is no greater than the risk of connecting to any other unknown public wifi access point. However, may people expect a higher level of security from an &amp;quot;official&amp;quot; organization? Second, how can we mitigate the security concerns? I suggest the following approaches:&lt;br /&gt;
&lt;br /&gt;
# Provide instructions on how to create secure tunnels to one of our exit nodes.&lt;br /&gt;
# Dedicate some resources to help develop better and easier tools for p2p crypto.&lt;br /&gt;
# Provide training for how to use p2p tools, both online and offline.&lt;br /&gt;
&lt;br /&gt;
[[User:Juul|Juul]] ([[User talk:Juul|talk]]) 02:38, 13 August 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
: Why would they trust our exit nodes? Why should they? And it is not necessary to teach them P2P crypto. Just end-to-end HTTPS is probably enough. So some browser extensions which assure that they use HTTPS and that they detect man-in-the-middle attacks.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5454</id>
		<title>Mesh/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5454"/>
		<updated>2013-08-23T05:59:34Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Web admin interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for the sudo mesh firmware.&lt;br /&gt;
&lt;br /&gt;
= Firmware generation features =&lt;br /&gt;
&lt;br /&gt;
It should be easy to generate a new firmware with the following custom config:&lt;br /&gt;
&lt;br /&gt;
*Location and ownership information.&lt;br /&gt;
:Contact info should be saved in a secure database but maybe not on the node itself?&lt;br /&gt;
*Randomly generated passwords set for wpa2, admin interface and ssh.&lt;br /&gt;
:The SSH password should be stored securely and a couple of stickers with the wpa2 and admin password should be printed for the user.&lt;br /&gt;
*Web interface&lt;br /&gt;
*ssh key generation&lt;br /&gt;
&lt;br /&gt;
[http://meshkit.freifunk.net/ Freifunk Meshkit] is pretty neat!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/sudomesh/openwrt-firmware Sudomesh Firmware Github Repo]&lt;br /&gt;
&lt;br /&gt;
Status:&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware should have =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Ranked from most to least important&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== InternetIsDownRedirect == &lt;br /&gt;
&lt;br /&gt;
When the node doesn't have internet access, it will redirect traffic to our mesh hosted [[Mesh/Firmware#Splash_page|Splash Page]].&lt;br /&gt;
&lt;br /&gt;
We need something hosted on the node that can check if it has access to the internet. There's a bit of an issue where certain OSes won't connect to APs that don't have internet access. [[User:Juul|Juul]] will look into building a hack that properly manages these requests and redirects them to our node-hosted site.&lt;br /&gt;
&lt;br /&gt;
InternetIsDownRedirect may also have to fake the expected captive portal detection responses? We need to figure out if android/iOS/Mac/Windows will connect to a wifi that does not have internet access.&lt;br /&gt;
&lt;br /&gt;
Status: Implemented except for OS-specific captive portal requests.&lt;br /&gt;
&lt;br /&gt;
== Splash page ==&lt;br /&gt;
&lt;br /&gt;
We can capture OS specific probes in order to specifically redirect captive portal requests without affecting any other network traffic.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
&lt;br /&gt;
* Brief info on the mesh&lt;br /&gt;
* Link to our website?&lt;br /&gt;
&lt;br /&gt;
Status: &lt;br /&gt;
&lt;br /&gt;
[[User:Juul|Juul]] is in the process of implementing. He needs help with:&lt;br /&gt;
* Finding out captive portal request protocols for different OSes. He's covered Iphone, but needs information on other hardware &lt;br /&gt;
* We need UX/UI designers!&lt;br /&gt;
* Co-located server ($$)&lt;br /&gt;
&lt;br /&gt;
== SSH server ==&lt;br /&gt;
&lt;br /&gt;
The SSH server should be contactable from any interface. It should initially allow root access using a random generated password that the mesh group has and that the node owner can get and change if they are so inclined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Status: Need Key generation feature. Otherwise Implemented in openwrt. See firmware generation above.&lt;br /&gt;
&lt;br /&gt;
== BATMAN-adv ==&lt;br /&gt;
&lt;br /&gt;
We'll use this as the mesh protocol.&lt;br /&gt;
&lt;br /&gt;
Status: Implemented&lt;br /&gt;
&lt;br /&gt;
== Multiple virtual network interfaces with their own SSIDs ==&lt;br /&gt;
&lt;br /&gt;
*One ad-hock mode, unencrypted interface for the mesh nodes, e.g. sudomesh-backchannel&lt;br /&gt;
*One access point mode, unencrypted interface, for non-mesh devices to connect to the mesh, e.g. sudomesh.&lt;br /&gt;
*One access point mode, private interface with WPA2, for the people who own the nodes. [optional]&lt;br /&gt;
&lt;br /&gt;
Traffic on the private interface should be completely separated from traffic on the non-private interfaces unless a client connected to the private interface requests an IP on the mesh.&lt;br /&gt;
&lt;br /&gt;
Maybe the last one is optional because some people may not need that feature (they already have another access point and they want to keep it), but then how do people administrate the router? &lt;br /&gt;
&lt;br /&gt;
In order to serve a secure web admin config to home users, we'll probably always serve 3 APs with one private WPA encrypted home link so that users can access their admin page.&lt;br /&gt;
&lt;br /&gt;
Status: Implemented&lt;br /&gt;
&lt;br /&gt;
== Web admin interface ==&lt;br /&gt;
&lt;br /&gt;
Development information should be put in [[Mesh/Firmware/Web_Admin_Development|Web Admin Dev]]. This section can remain a wish-list.&lt;br /&gt;
&lt;br /&gt;
A very simple one-page interface. It should do at least the following:&lt;br /&gt;
&lt;br /&gt;
*Set location, name, description.&lt;br /&gt;
:But do you want to know the location centrally as well so that you can display nodes on the map? Will people enter this information twice or will you pull this information from nodes and then display on the map? Same for name and description. I would suggest that information is stored only once. In your case on the node itself. So probably you can then pull this information through nodewatcher scripts on nodes and then display nodes the map. Just really should not require people to enter or maintain information on two places because it desyncs very fast. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people select how much bandwidth they share.&lt;br /&gt;
:They always share 100% when they're not using the connection themselves.&lt;br /&gt;
::This works if people are using their private SSIDs on the node. But if the node is connected to their existing home network you might not easily configure such sharing. But maybe there is a way to detect that host network is free and can limits can be increased. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:Do any ISPs have bandwidth caps around here? If so, let people specify how many MB to share per month.&lt;br /&gt;
:Maybe also a button for temporary increase limits (make them more restrictive) which are then after some time automatically restored.&lt;br /&gt;
*Let people change the admin password and the private wifi wpa2 password.&lt;br /&gt;
:Probably private SSID as well.&lt;br /&gt;
*Donate / &amp;quot;buy routers as presents for your friends&amp;quot;-button.&lt;br /&gt;
:One idea we had (but this is probably better for splash screen) is &amp;quot;adopt a node&amp;quot;. Where a neighbor who uses a node a lot and depends on the node can donate some money to keep it up, but can then give a nickname or avatar to the node. Or something. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Status: [[User:Maxb|Maxb]] is implementing. Git repo to come soon!&lt;br /&gt;
&lt;br /&gt;
== Watchdog script ==&lt;br /&gt;
&lt;br /&gt;
Node tests itself to see if it has connectivity, etc and resets itself if necessary.&lt;br /&gt;
&lt;br /&gt;
OpenWrt has a hardware watchdog - we're not totally sure if it works. Anyone interested in doing some field testing??&lt;br /&gt;
&lt;br /&gt;
Status: Needs people to hack on&lt;br /&gt;
&lt;br /&gt;
== QoS / bandwidth shaping ==&lt;br /&gt;
&lt;br /&gt;
To support letting node owners select how much bandwidth they share.&lt;br /&gt;
&lt;br /&gt;
Status: [[User:Juul|Juul]] is hacking on.&lt;br /&gt;
&lt;br /&gt;
== Internet VPN ==&lt;br /&gt;
&lt;br /&gt;
The firmware should tunnel all Internet traffic from the mesh through a VPN server, unless this feature is specifically disabled.&lt;br /&gt;
&lt;br /&gt;
This should not be a single VPN server, as that would be a single point of failure.&lt;br /&gt;
&lt;br /&gt;
I suggest to use [http://wlan-si.net/blog/2012/10/29/tunneldigger-the-new-vpn-solution/ TunnelDigger]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 21:50, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
[[Mesh/Network_topology|Network Topology]]&lt;br /&gt;
&lt;br /&gt;
Status: [[User:Juul|Juul]] is implementing.&lt;br /&gt;
&lt;br /&gt;
== Mesh VPN ==&lt;br /&gt;
&lt;br /&gt;
If the mesh does not see any other nodes (and maybe even if it does?), and it has internet, then it should connect to another node or two over VPN. The easy solution is to use the same VPN servers as for the internet.&lt;br /&gt;
&lt;br /&gt;
[[Mesh/Network_topology|Network Topology]]&lt;br /&gt;
&lt;br /&gt;
Status: Implemented&lt;br /&gt;
&lt;br /&gt;
== DHCP and batman-adv gateway mode ==&lt;br /&gt;
&lt;br /&gt;
Nodes with an internet connection should run DHCP and [http://www.open-mesh.org/projects/batman-adv/wiki/Gateways batman-adv gateway mode]. We want to detect if the node can connect to a relay in which case it should configure as a batman-adv gateway server node. Otherwise they should configure as batman-adv gateway clients.&lt;br /&gt;
&lt;br /&gt;
Staus: Needs hacking.&lt;br /&gt;
&lt;br /&gt;
== Location and status reporting ==&lt;br /&gt;
&lt;br /&gt;
Something that reports location and status when polled.&lt;br /&gt;
&lt;br /&gt;
We developed this format and easy to publish status data from nodes for our [http://dev.wlan-si.net/wiki/Nodewatcher/NodeTelemetryProvider nodewatcher]. OpenWrt packages are [https://github.com/wlanslovenija/firmware-packages-opkg/tree/master/util here]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:02, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Nice to have:&lt;br /&gt;
&lt;br /&gt;
*Status info: How many nodes is your node connected to. Is the internet link working.&lt;br /&gt;
*An &amp;quot;I don't know what my internet bandwidth is, test it for me&amp;quot;-function.&lt;br /&gt;
*Usage statistics (so people can see how many people they helped get internet!)&lt;br /&gt;
:This is the most important thing! [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:You should add as well graphs on how much bandwidth was consumed by the node. This is useful when hosts see that their Internet is slow and believe that it was because of the node. Then they can check and see if it is really node (which often is not) or maybe just ISP has problems. Important because people like to attribute issues they have to nodes they don't understand. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people put up a bit of info about their node / house / co-op, on a simple web page that people can access only if they're connected to that node. It could be shown as part of the splash page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Status: Waiting for nodewatcher project to finish&lt;br /&gt;
&lt;br /&gt;
== IPv6 support ==&lt;br /&gt;
&lt;br /&gt;
We should have IPv6 support, but I am ok with launching the mesh with only IPv4 and adding in IPv6 later. ([[User:Juul|Juul]] ([[User talk:Juul|talk]]))&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware could have =&lt;br /&gt;
&lt;br /&gt;
== DNS server ==&lt;br /&gt;
&lt;br /&gt;
Each node could run its own (caching) DNS server. Doing this would allow people to access the admin interface for their node by going to e.g. http://me.mesh/ from the private interface.&lt;br /&gt;
&lt;br /&gt;
== Caching web proxy ==&lt;br /&gt;
&lt;br /&gt;
We could use [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] to improve people's browsing experience. Not sure how much cpu and memory this would need. We may not be able to run it on the routers with less than 32 MB ram (e.g. the Bullet 2 HPs). &lt;br /&gt;
&lt;br /&gt;
== Block ads and tracking ==&lt;br /&gt;
&lt;br /&gt;
We could use e.g. [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] with the sources from both adblock plus and ghostery. If we implement this, it should be an optional (default off) feature that you can select on the splash page, with a &amp;quot;remember this&amp;quot; that remembers either using a cookie or using your MAC (but then we'd be logging people's MAC addresses :-S). The block should probably be time-limited (e.g. 30 days).&lt;br /&gt;
&lt;br /&gt;
= Compatible devices =&lt;br /&gt;
&lt;br /&gt;
We should have ready-made images for:&lt;br /&gt;
&lt;br /&gt;
*One really cheap indoor router (with 3G usb stick support?) like [http://wiki.openwrt.org/toh/tp-link/tl-wr703n TP-Link TL-WR703N]&lt;br /&gt;
*One nice high-speed indoor router (300 mbps 802.11n)&lt;br /&gt;
*Ubiquiti hardware. Most of the AirMAX stuff.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/MeshApps&amp;diff=5453</id>
		<title>Mesh/MeshApps</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/MeshApps&amp;diff=5453"/>
		<updated>2013-08-23T05:57:58Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Short List of Apps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What sort of local apps would we like to integrate with the mesh? Such applications need to function on decentralized platforms, and ideally &lt;br /&gt;
&lt;br /&gt;
=Short List of Apps=&lt;br /&gt;
*Bulletin Board / Hyperlocal Craigslist&lt;br /&gt;
*General Local Map (eg; http://tidepools.co)&lt;br /&gt;
**Food Mapping  (eg; http://ediblecities.org/)&lt;br /&gt;
**Community Asset Mapping (eg; [http://thepyre.org/wiki/Mycelia Mycelia])&lt;br /&gt;
*Local Wiki (eg; http://oaklandwiki.org)&lt;br /&gt;
*Communication (eg; chat room, decentralized Twitter)&lt;br /&gt;
*Sensor Data (eg; Temperature, Seismic activity, air pollution)&lt;br /&gt;
*Location-aware social network (eg; http://dev.wlan-si.net/wiki/PiplMesh)&lt;br /&gt;
&lt;br /&gt;
=Personas=&lt;br /&gt;
*Curator [ Individual who cares about data being right and available for the community ]&lt;br /&gt;
*Analyzer [ Wants to visualize data in context, overlays of data, how data changes ]&lt;br /&gt;
*Organizer/Activist [ wants to organize people around an issue, actionable outputs ]&lt;br /&gt;
*Consumer [ gets info from the system, but doesnâ€™t give back ]&lt;br /&gt;
*Broadcaster/Reporter [ radio, streams, news, users/organizations who push into the system a lot ]&lt;br /&gt;
&lt;br /&gt;
=Use Cases=&lt;br /&gt;
==Leisure, Treasure Hunt, Animal Spotting, History / Science Plotting , Art/Design/Drawing, Mapping Secret/Weird stuff, Expression, Emotion==&lt;br /&gt;
*Jordan is a 36-year old scientist and queer activist. Occasionally, he travels north to a 'radical fairy' retreat center on over 80 acres of land. He's undertaking a project to map out the diverse and undocumented biology and wildlife in this sacred area. For this, he would like a tool that would enable him to automatically map the coordinates, attach a picture, and include a comment about what it is, as well as the ability to add to social media (Facebook &amp;amp; Twitter).&lt;br /&gt;
&lt;br /&gt;
==Bulletin Board / Local Information sharing (jobs, events, etc) (people to people)==&lt;br /&gt;
*Martin is a 35-year old Latino man who runs a website for displaying new job postings and opportunities for diverse, underserved populations in Oakland (eg; youth, veterans, and formerly incarcerated). Martin would like to easily transpose this data onto a searchable map that he could populate daily with new opportunities and programs.&lt;br /&gt;
&lt;br /&gt;
==Sensors: hardware-based [inputs &amp;amp; outputs]==&lt;br /&gt;
*Naomi is a Midweatern 30-year old environmental activist concerned about the impact of fracking on the quality of water in her county. She's organizing a campaign to encourage fellow concerned homeowners to monitor changes and contaminants in air and water quality, seismic activity, radiation, and other potential environmental impacts of fracking.&lt;br /&gt;
&lt;br /&gt;
==Evidence Based Citizenship (crowdsourced data/reporting for an institution to solve, neighborhood to be aware of) (people to institutions)==&lt;br /&gt;
*Alyssa is a 35-year old African-American woman working for the city government. Passionate about diversifying and expanding civic participation, she's been participating with Open Oakland to make civic data more accessible. She's working on an educational campaign for creating short videos explaining civic issues and how local government works. &lt;br /&gt;
&lt;br /&gt;
==Political Crisis Readiness (people to people, against institutions)==&lt;br /&gt;
&lt;br /&gt;
=Contexts=&lt;br /&gt;
==Community Asset Mapping / Archiving==&lt;br /&gt;
*Kiara is a 34-year-old African-American community organizer and activist interested in mapping the various organizations addressing digital divide issues, as well as available resources such as public computers, free training and education, and free wifi spots.&lt;br /&gt;
*Molly is a 26 year old community organizer working on Oakland Wiki, a website editable by anyone and dedicated to everything Oakland. She recently announced the launch of an oral history project, the end product of which would ideally be mapped onto specific areas and landmarks.&lt;br /&gt;
&lt;br /&gt;
==Community Hub (communications / sensors / input + output APIs )==&lt;br /&gt;
*Ali is a 28-year old Iraqi-American and works to catalyze community organizations in the Middle East. He is currently collecting stories from hackerspaces in the form of comics, as well as a 'Sister Spaces' project to partner hackerspaces for sharing insights and infrastructure challenges.&lt;br /&gt;
*Luke is a 33-year-old Australian data and open government geek. Among the mappable projects he's working on with Open Oakland are storm drains (the Adopt-A-Drain project), crime data, vacant and blighted properties, and organizations and resources addressing the digital divide.&lt;br /&gt;
&lt;br /&gt;
==Organizing Tool (activists, security matters)==&lt;br /&gt;
*Mateo is a 32-year old Latino father living in the San Antonio neighborhood in Oakland, CA. He is interested in the capabilities of a mesh network for streaming Creative Commons-licensed content to his neighbors (possibly using an Asterisk server) and providing a means for connecting the community both digitally and physically through an online neighborhood bulletin board. He has a strong interest in reaching out to local businesses with an 'everybody wins' model of free wifi through a mesh, with a map-based splash page for communicating with others in the network.&lt;br /&gt;
&lt;br /&gt;
==Crisis Readiness==&lt;br /&gt;
*Jen is a 30-year-old Asian-American technologist and community organizer in East Oakland. Passionate about DIY education and grassroots community-building, she's interested in mapping DIY communities as well as available resources for crisis readiness (such as relief centers, tools, food, water and shelter).&lt;br /&gt;
*Alexis is a 29-year old African-American technologist interested in the potential for mesh networking to expand internet access in underserved areas and creating a resilient communications network for crisis readiness. She is especially passionate about issues surrounding access to technology, and would like to see underserved communities participating in putting themselves on the map.&lt;br /&gt;
&lt;br /&gt;
==Play, games, fun uses==&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Legal&amp;diff=5452</id>
		<title>Mesh/Legal</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Legal&amp;diff=5452"/>
		<updated>2013-08-23T05:56:54Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Added about peering agreement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Organization structure =&lt;br /&gt;
&lt;br /&gt;
The mesh organization will be a 501(c)3 but will not own the mesh routers. The mesh hardware will be owned by the community that makes up the mesh.&lt;br /&gt;
&lt;br /&gt;
= Exit nodes =&lt;br /&gt;
&lt;br /&gt;
The exit nodes will be owned by the 501(c)3.&lt;br /&gt;
&lt;br /&gt;
With regards to running exit nodes, Noisebridge, another 501(c)3, already runs a Tor exit node which should be legally similar to a mesh exit node. &lt;br /&gt;
&lt;br /&gt;
Some links of interest:&lt;br /&gt;
&lt;br /&gt;
*[https://www.noisebridge.net/wiki/Noisebridge_Tor NoiseTor wiki page]&lt;br /&gt;
*[http://tor.noisebridge.net/ NoiseTor website]&lt;br /&gt;
*[https://www.noisebridge.net/wiki/Tor_FAQ NoiseTor FAQ]&lt;br /&gt;
*[https://www.torproject.org/eff/tor-legal-faq.html Tor Project's Legal FAQ]&lt;br /&gt;
*[https://www.torproject.org/docs/faq-abuse.html.en Tor Project's Abuse FAQ]&lt;br /&gt;
*[https://www.torproject.org/eff/tor-dmca-response.html.en Tor Project's DMCA Response Template]&lt;br /&gt;
*[https://www.noisebridge.net/wiki/Noisebridge_Tor/FBI NoiseTor how to deal with the FBI]&lt;br /&gt;
*[https://www.torproject.org/eff/tor-legal-faq.html EFF's Tor legal FAQ]&lt;br /&gt;
*[https://trac.torproject.org/projects/tor/wiki/doc/GoodBadISPs EFF's list of Good ISPs]&lt;br /&gt;
&lt;br /&gt;
= Peering agreement =&lt;br /&gt;
&lt;br /&gt;
If nodes are not owned by an organization, then some other way of agreement of how nodes should be operated should be made. One approach is to see each node as being peered with others and create agreements about how the rules the traffic should go over those links. Another is to extend such agreement into a license and also add rules about how the nodes themselves should behave.&lt;br /&gt;
&lt;br /&gt;
*[http://interop.wlan-si.net/wiki/Legal/Licenses List of current existing agreements/licenses]&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Network_topology&amp;diff=5451</id>
		<title>Mesh/Network topology</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Network_topology&amp;diff=5451"/>
		<updated>2013-08-23T05:48:35Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Comments about exit nodes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= wifi topology =&lt;br /&gt;
&lt;br /&gt;
We use 2.4 ghz 802.11g or 802.11n wifi gear with omni or semi-directional antennas to provide connectivity to devices such as laptops and smartphones at street level and within buildings. We are currently using mostly Ubiquiti Picostation 2 HP and Ubiquiti Bullet 2 HP routers for the outdoors. For the indoors we will likely use TP-Link TL-WR703N routers.&lt;br /&gt;
&lt;br /&gt;
A high-speed wireless backbone for the mesh will be provided by 5 ghz 802.11n hardware, usually with point to point or point to multipoint connections mounted in high places such as on rooftops, flagpoles or antenna towers. We currently have a variety of Ubiquiti M5 routers such as airgrids, nanobridges, nanostations and a rocket.&lt;br /&gt;
&lt;br /&gt;
All of the outdoor gear will be Power over Ethernet (PoE), requiring only a single cable for network and power connectivity.&lt;br /&gt;
&lt;br /&gt;
= mesh topology =&lt;br /&gt;
&lt;br /&gt;
All routers run the batman-adv mesh routing protocol. This is a layer 2 protocol (operating at the ethernet layer). The street-level 2.4 ghz routers should ideally be able to function in the event that e.g. an earthquake takes out all of the point to point and point to multipoint rooftop nodes (more alignment sensitive) and the mesh should remain functional, though it could become segmented.&lt;br /&gt;
&lt;br /&gt;
The relays (see the internet connectivity section) also run batman-adv, so mesh traffic can flow from one part of the mesh, through the internet, through a relay, and into another part of the mesh if some of the mesh nodes are connected to the internet.&lt;br /&gt;
&lt;br /&gt;
= internet connectivity =&lt;br /&gt;
&lt;br /&gt;
There are four primary types of devices in the mesh:&lt;br /&gt;
&lt;br /&gt;
*Clients: E.g. smart phones or laptops connected to the mesh. &lt;br /&gt;
:These do not run the meshing protocol.&lt;br /&gt;
*Mesh nodes: Wifi routers running OpenWRT.&lt;br /&gt;
:Some are rooftop backbone nodes and some are street-level or in-home nodes.&lt;br /&gt;
*Relays: Professionally hosted servers that relay mesh traffic over the internet.&lt;br /&gt;
:These run the meshing protocol. Mesh nodes are connected with L2TP tunnels to them.&lt;br /&gt;
*Exit nodes: Co-located servers that appear as the source IP for packets from mesh to internet.&lt;br /&gt;
:Both relays and exit nodes serve as a layer of protection between people sharing their internet connections with the mesh.&lt;br /&gt;
&lt;br /&gt;
Some mesh routers will be hosted in homes that already have internet connections. If an internet connection is available, a mesh router will open an L2TP tunnel (using the tunneldigger software) to several relay nodes over the internet connection. A relay could be e.g. a VPS without a bandwidth cap. The relays all run batman-adv and function as part of the mesh through the L2TP tunnels to the mesh nodes. Each relay will have a connection to an exit nodes. The relays allow segments of the mesh that are not connected with wifi to be connected over the internet.&lt;br /&gt;
&lt;br /&gt;
Each relay is connected to one exit node (tunnel type not yet decided). It does NAT (IP Masquerading) on traffic coming from the mesh and headed for the internet. All traffic coming from the mesh and going to the wider internet goes through an exit node. The source IP of data coming from the mesh thus appears as the IP of one of the exit nodes. This provides a layer of protection such that e.g. abuse complaints will be sent to the mesh organization instead of the individuals who donate some of their internet bandwidth to the mesh.&lt;br /&gt;
:Until network has an AS, only one exit node should be made and multiple relay nodes should connect to that exit node (Tunneldigger software can be reused for that). Otherwise clients can have issues when routing protocol decides to move from one exit node to another. But it is true that batman-adv has some protection against that, so that once a client decides for a gateway, it should be more or less sticky, no?&lt;br /&gt;
:It is important that nodes are connecting to relays and relays to exit nodes and that no IPs of those connecting to relays and exit nodes is stored.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Generating&amp;diff=5382</id>
		<title>Mesh/Firmware/Generating</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware/Generating&amp;diff=5382"/>
		<updated>2013-08-14T02:00:48Z</updated>

		<summary type="html">&lt;p&gt;Mitar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= wlan slovenija =&lt;br /&gt;
&lt;br /&gt;
wlan slovenija has a firmware generator tool. Here are some links:&lt;br /&gt;
&lt;br /&gt;
*[https://github.com/wlanslovenija/nodewatcher/blob/master/generator/config_generator.py config_generator.py: the core code for the generator]&lt;br /&gt;
*[https://github.com/wlanslovenija/nodewatcher/blob/master/generator/build_image.py build_image.py: the command line tool that uses config_generator.py]&lt;br /&gt;
&lt;br /&gt;
Some relevant code from config_generator.py:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      buildString = 'make image FILES=&amp;quot;../files&amp;quot; PROFILE=&amp;quot;%s&amp;quot; PACKAGES=&amp;quot;policy-routing olsrd uhttpd tc nodewatcher-core nodewatcher-clients ntpclient hostapd -ppp -ppp-mod-pppoe -wpad-mini kmod-l2tp kmod-l2tp-ip kmod-l2tp-eth tunneldigger wireless-tools qos-scripts %s&amp;quot;' % (profile_map[self.portLayout], pkgs)&lt;br /&gt;
      os.chdir(path)&lt;br /&gt;
      os.system(buildString)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The whole ''nodewatcher'' system is in fact a web interface to the image generator (this is how it all started, historically, as a web interface + IP allocation, and then we added network monitoring, node telemetry and so on).&lt;br /&gt;
&lt;br /&gt;
*[http://nodes.wlan-si.net/ live version]&lt;br /&gt;
&lt;br /&gt;
= freifunk =&lt;br /&gt;
&lt;br /&gt;
Freifunk has a web app called meshkit for generating images.&lt;br /&gt;
&lt;br /&gt;
*[http://meshkit.freifunk.net/ live web app]&lt;br /&gt;
*[https://github.com/freifunk/meshkit source code]&lt;br /&gt;
&lt;br /&gt;
Meshkit takes a strange approach. From the readme file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Meshkit itself just writes a uci config file and stores it in&lt;br /&gt;
/etc/config/meshkwizard in the resulting firmware image. The actual&lt;br /&gt;
configuration is done by meshwizard, which uses community profiles&lt;br /&gt;
and the settings from meshkit to configure the device at first boot after&lt;br /&gt;
the device has been flashed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While I understand why community profiles would be a good idea, it seems odd that the configuration would happen on the device. Why not generate all of the required configuration before generating the image? That way you save a bit of space and an extra reboot of the device.&lt;br /&gt;
&lt;br /&gt;
After looking at the code, I am not inclined to use it. Lots of freifunk-specific stuff. Few comments. In the end, all it does that we really care about is take a few values from the web app, write some config files for openwrt and run &amp;quot;make image&amp;quot; with some parameters. It does have a system for queuing builds, which is nice. Honestly, I think we're going to be better off making our own system&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Challenges&amp;diff=5365</id>
		<title>Mesh/Challenges</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Challenges&amp;diff=5365"/>
		<updated>2013-08-10T02:58:17Z</updated>

		<summary type="html">&lt;p&gt;Mitar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Security'''&lt;br /&gt;
It's possible that malicious actors could install malicious software on mesh nodes they control such as [http://www.thoughtcrime.org/software/sslstrip/ sslstrip] via [https://github.com/RMerl/asuswrt-merlin/wiki/Entware Entware].  This would allow them to capture sensitive information from less savvy users.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Countermeasures might include regularly re-flashing nodes, not allowing nodes with changed root passwords, whitelisting applications?&lt;br /&gt;
&lt;br /&gt;
It is a feature, not a bug. People should use end-to-end encryption with [https://www.eff.org/https-everywhere HTTPS Everywhere] and not relay on security of the network. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 19:58, 9 August 2013 (PDT)&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5210</id>
		<title>Mesh/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5210"/>
		<updated>2013-07-25T05:21:19Z</updated>

		<summary type="html">&lt;p&gt;Mitar: /* Web admin interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for the sudo mesh firmware.&lt;br /&gt;
&lt;br /&gt;
= Firmware generation features =&lt;br /&gt;
&lt;br /&gt;
It should be easy to generate a new firmware with the following custom config:&lt;br /&gt;
&lt;br /&gt;
*Location and ownership information.&lt;br /&gt;
:Contact info should be saved in a secure database but maybe not on the node itself?&lt;br /&gt;
*Randomly generated passwords set for wpa2, admin interface and ssh.&lt;br /&gt;
:The SSH password should be stored securely and a couple of stickers with the wpa2 and admin password should be printed for the user.&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware should have =&lt;br /&gt;
&lt;br /&gt;
== Location and status reporting ==&lt;br /&gt;
&lt;br /&gt;
Something that reports location and status when polled.&lt;br /&gt;
&lt;br /&gt;
We developed this format and easy to publish status data from nodes for our [http://dev.wlan-si.net/wiki/Nodewatcher/NodeTelemetryProvider nodewatcher]. OpenWrt packages are [https://github.com/wlanslovenija/firmware-packages-opkg/tree/master/util here]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:02, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== SSH server ==&lt;br /&gt;
&lt;br /&gt;
The SSH server should be contactable from any interface. It should initially allow root access using a random generated password that the mesh group has and that the node owner can get and change if they are so inclined.&lt;br /&gt;
&lt;br /&gt;
== Watchdog script ==&lt;br /&gt;
&lt;br /&gt;
Node tests itself to see if it has connectivity, etc and resets itself if necessary.&lt;br /&gt;
&lt;br /&gt;
== BATMAN-adv ==&lt;br /&gt;
&lt;br /&gt;
We'll use this as the mesh protocol.&lt;br /&gt;
&lt;br /&gt;
== Multiple virtual network interfaces with their own SSIDs ==&lt;br /&gt;
&lt;br /&gt;
*One ad-hock mode, unencrypted interface for the mesh nodes, e.g. sudomesh-backchannel&lt;br /&gt;
*One access point mode, unencrypted interface, for non-mesh devices to connect to the mesh, e.g. sudomesh.&lt;br /&gt;
*One access point mode, private interface with WPA2, for the people who own the nodes. [optional]&lt;br /&gt;
&lt;br /&gt;
Traffic on the private interface should be completely separated from traffic on the non-private interfaces unless a client connected to the private interface requests an IP on the mesh.&lt;br /&gt;
&lt;br /&gt;
Maybe the last one is optional because some people may not need that feature (they already have another access point and they want to keep it), but then how do people administrate the router? &lt;br /&gt;
&lt;br /&gt;
== Web admin interface ==&lt;br /&gt;
&lt;br /&gt;
A very simple one-page interface. It should do at least the following:&lt;br /&gt;
&lt;br /&gt;
*Set location, name, description.&lt;br /&gt;
:But do you want to know the location centrally as well so that you can display nodes on the map? Will people enter this information twice or will you pull this information from nodes and then display on the map? Same for name and description. I would suggest that information is stored only once. In your case on the node itself. So probably you can then pull this information through nodewatcher scripts on nodes and then display nodes the map. Just really should not require people to enter or maintain information on two places because it desyncs very fast. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people select how much bandwidth they share.&lt;br /&gt;
:They always share 100% when they're not using the connection themselves.&lt;br /&gt;
::This works if people are using their private SSIDs on the node. But if the node is connected to their existing home network you might not easily configure such sharing. But maybe there is a way to detect that host network is free and can limits can be increased. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:Do any ISPs have bandwidth caps around here? If so, let people specify how many MB to share per month.&lt;br /&gt;
*Let people change the admin password and the private wifi wpa2 password.&lt;br /&gt;
:Probably private SSID as well.&lt;br /&gt;
*Donate / &amp;quot;buy routers as presents for your friends&amp;quot;-button.&lt;br /&gt;
:One idea we had (but this is probably better for splash screen) is &amp;quot;adopt a node&amp;quot;. Where a neighbor who uses a node a lot and depends on the node can donate some money to keep it up, but can then give a nickname or avatar to the node. Or something. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Nice to have:&lt;br /&gt;
&lt;br /&gt;
*Status info: How many nodes is your node connected to. Is the internet link working.&lt;br /&gt;
*An &amp;quot;I don't know what my internet bandwidth is, test it for me&amp;quot;-function.&lt;br /&gt;
*Usage statistics (so people can see how many people they helped get internet!)&lt;br /&gt;
:This is the most important thing! [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:You should add as well graphs on how much bandwidth was consumed by the node. This is useful when hosts see that their Internet is slow and believe that it was because of the node. Then they can check and see if it is really node (which often is not) or maybe just ISP has problems. Important because people like to attribute issues they have to nodes they don't understand. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people put up a bit of info about their node / house / co-op, on a simple web page that people can access only if they're connected to that node. It could be shown as part of the splash page.&lt;br /&gt;
&lt;br /&gt;
== QoS / bandwidth shaping ==&lt;br /&gt;
&lt;br /&gt;
To support letting node owners select how much bandwidth they share.&lt;br /&gt;
&lt;br /&gt;
== Splash page ==&lt;br /&gt;
&lt;br /&gt;
We should have a captive portal so people can learn about the mesh. We have also thought about letting local groups and businesses advertise with location-specific advertisements on the splash page. This could be a source of revenue for the mesh. This should also act as a list/portal for the local services running on the mesh.&lt;br /&gt;
&lt;br /&gt;
== Internet VPN ==&lt;br /&gt;
&lt;br /&gt;
The firmware should tunnel all Internet traffic from the mesh through a VPN server, unless this feature is specifically disabled.&lt;br /&gt;
&lt;br /&gt;
This should not be a single VPN server, as that would be a single point of failure.&lt;br /&gt;
&lt;br /&gt;
I suggest to use [http://wlan-si.net/blog/2012/10/29/tunneldigger-the-new-vpn-solution/ TunnelDigger]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 21:50, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Mesh VPN ==&lt;br /&gt;
&lt;br /&gt;
If the mesh does not see any other nodes (and maybe even if it does?), and it has internet, then it should connect to another node or two over VPN. The easy solution is to use the same VPN servers as for the internet.&lt;br /&gt;
&lt;br /&gt;
== DHCP and batman-adv gateway mode ==&lt;br /&gt;
&lt;br /&gt;
Nodes with an internet connection should run DHCP and [http://www.open-mesh.org/projects/batman-adv/wiki/Gateways batman-adv gateway mode].&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware could have =&lt;br /&gt;
&lt;br /&gt;
== DNS server ==&lt;br /&gt;
&lt;br /&gt;
Each node could run its own (caching) DNS server. Doing this would allow people to access the admin interface for their node by going to e.g. http://me.mesh/ from the private interface.&lt;br /&gt;
&lt;br /&gt;
== Caching web proxy ==&lt;br /&gt;
&lt;br /&gt;
We could use [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] to improve people's browsing experience. Not sure how much cpu and memory this would need. We may not be able to run it on the routers with less than 32 MB ram (e.g. the Bullet 2 HPs). &lt;br /&gt;
&lt;br /&gt;
== Block ads and tracking ==&lt;br /&gt;
&lt;br /&gt;
We could use e.g. [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] with the sources from both adblock plus and ghostery. If we implement this, it should be an optional (default off) feature that you can select on the splash page, with a &amp;quot;remember this&amp;quot; that remembers either using a cookie or using your MAC (but then we'd be tracking people's MAC addresses :-S). The block should probably be time-limited (e.g. 30 days).&lt;br /&gt;
&lt;br /&gt;
= Compatible devices =&lt;br /&gt;
&lt;br /&gt;
We should have ready-made images for:&lt;br /&gt;
&lt;br /&gt;
*One really cheap indoor router (with 3G usb stick support?) like [http://wiki.openwrt.org/toh/tp-link/tl-wr703n TP-Link TL-WR703N]&lt;br /&gt;
*One nice high-speed indoor router (300 mbps 802.11n)&lt;br /&gt;
*Ubiquiti hardware. Most of the AirMAX stuff.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5209</id>
		<title>Mesh/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5209"/>
		<updated>2013-07-25T05:20:37Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Some suggestions/comments for web interface&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for the sudo mesh firmware.&lt;br /&gt;
&lt;br /&gt;
= Firmware generation features =&lt;br /&gt;
&lt;br /&gt;
It should be easy to generate a new firmware with the following custom config:&lt;br /&gt;
&lt;br /&gt;
*Location and ownership information.&lt;br /&gt;
:Contact info should be saved in a secure database but maybe not on the node itself?&lt;br /&gt;
*Randomly generated passwords set for wpa2, admin interface and ssh.&lt;br /&gt;
:The SSH password should be stored securely and a couple of stickers with the wpa2 and admin password should be printed for the user.&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware should have =&lt;br /&gt;
&lt;br /&gt;
== Location and status reporting ==&lt;br /&gt;
&lt;br /&gt;
Something that reports location and status when polled.&lt;br /&gt;
&lt;br /&gt;
We developed this format and easy to publish status data from nodes for our [http://dev.wlan-si.net/wiki/Nodewatcher/NodeTelemetryProvider nodewatcher]. OpenWrt packages are [https://github.com/wlanslovenija/firmware-packages-opkg/tree/master/util here]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:02, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== SSH server ==&lt;br /&gt;
&lt;br /&gt;
The SSH server should be contactable from any interface. It should initially allow root access using a random generated password that the mesh group has and that the node owner can get and change if they are so inclined.&lt;br /&gt;
&lt;br /&gt;
== Watchdog script ==&lt;br /&gt;
&lt;br /&gt;
Node tests itself to see if it has connectivity, etc and resets itself if necessary.&lt;br /&gt;
&lt;br /&gt;
== BATMAN-adv ==&lt;br /&gt;
&lt;br /&gt;
We'll use this as the mesh protocol.&lt;br /&gt;
&lt;br /&gt;
== Multiple virtual network interfaces with their own SSIDs ==&lt;br /&gt;
&lt;br /&gt;
*One ad-hock mode, unencrypted interface for the mesh nodes, e.g. sudomesh-backchannel&lt;br /&gt;
*One access point mode, unencrypted interface, for non-mesh devices to connect to the mesh, e.g. sudomesh.&lt;br /&gt;
*One access point mode, private interface with WPA2, for the people who own the nodes. [optional]&lt;br /&gt;
&lt;br /&gt;
Traffic on the private interface should be completely separated from traffic on the non-private interfaces unless a client connected to the private interface requests an IP on the mesh.&lt;br /&gt;
&lt;br /&gt;
Maybe the last one is optional because some people may not need that feature (they already have another access point and they want to keep it), but then how do people administrate the router? &lt;br /&gt;
&lt;br /&gt;
== Web admin interface ==&lt;br /&gt;
&lt;br /&gt;
A very simple one-page interface. It should do at least the following:&lt;br /&gt;
&lt;br /&gt;
*Set location, name, description.&lt;br /&gt;
:But do you want to know the location centrally as well so that you can display nodes on the map? Will people enter this information twice or will you pull this information from nodes and then display on the map? Same for name and description. I would suggest that information is stored only once. In your case on the node itself. So probably you can then pull this information through nodewatcher scripts on nodes and then display nodes the map. Just really should not require people to enter or maintain information on two places because it desyncs very fast. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people select how much bandwidth they share.&lt;br /&gt;
:They always share 100% when they're not using the connection themselves.&lt;br /&gt;
::This works if people are using their private SSIDs on the node. But if the node is connected to their existing home network you might not easily configure such sharing. But maybe there is a way to detect that host network is free and can limits can be increased. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:Do any ISPs have bandwidth caps around here? If so, let people specify how many MB to share per month.&lt;br /&gt;
*Let people change the admin password and the private wifi wpa2 password.&lt;br /&gt;
:Probably private SSID as well.&lt;br /&gt;
*Donate / &amp;quot;buy routers as presents for your friends&amp;quot;-button.&lt;br /&gt;
:One idea we had (but this is probably better for splash screen) is &amp;quot;adopt a node&amp;quot;. Where a neighbor who uses a node a lot and depends on the node can donate some money to keep it up, but can then give a nickname or avatar to the node. Or something. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Nice to have:&lt;br /&gt;
&lt;br /&gt;
*Status info: How many nodes is your node connected to. Is the internet link working.&lt;br /&gt;
*An &amp;quot;I don't know what my internet bandwidth is, test it for me&amp;quot;-function.&lt;br /&gt;
*Usage statistics (so people can see how many people they helped get internet!)&lt;br /&gt;
:This is the most important thing! [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
:You should add as well graphs on how much bandwidth was consumed by the node. This is useful when hosts see that their Internet is slow and believe that it was because of the node. Then they can check and see if it is really node (which often is not) or maybe just ISP has problems. Important because people like to attribute issues to nodes they don't understand. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:20, 24 July 2013 (PDT)&lt;br /&gt;
*Let people put up a bit of info about their node / house / co-op, on a simple web page that people can access only if they're connected to that node. It could be shown as part of the splash page.&lt;br /&gt;
&lt;br /&gt;
== QoS / bandwidth shaping ==&lt;br /&gt;
&lt;br /&gt;
To support letting node owners select how much bandwidth they share.&lt;br /&gt;
&lt;br /&gt;
== Splash page ==&lt;br /&gt;
&lt;br /&gt;
We should have a captive portal so people can learn about the mesh. We have also thought about letting local groups and businesses advertise with location-specific advertisements on the splash page. This could be a source of revenue for the mesh. This should also act as a list/portal for the local services running on the mesh.&lt;br /&gt;
&lt;br /&gt;
== Internet VPN ==&lt;br /&gt;
&lt;br /&gt;
The firmware should tunnel all Internet traffic from the mesh through a VPN server, unless this feature is specifically disabled.&lt;br /&gt;
&lt;br /&gt;
This should not be a single VPN server, as that would be a single point of failure.&lt;br /&gt;
&lt;br /&gt;
I suggest to use [http://wlan-si.net/blog/2012/10/29/tunneldigger-the-new-vpn-solution/ TunnelDigger]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 21:50, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Mesh VPN ==&lt;br /&gt;
&lt;br /&gt;
If the mesh does not see any other nodes (and maybe even if it does?), and it has internet, then it should connect to another node or two over VPN. The easy solution is to use the same VPN servers as for the internet.&lt;br /&gt;
&lt;br /&gt;
== DHCP and batman-adv gateway mode ==&lt;br /&gt;
&lt;br /&gt;
Nodes with an internet connection should run DHCP and [http://www.open-mesh.org/projects/batman-adv/wiki/Gateways batman-adv gateway mode].&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware could have =&lt;br /&gt;
&lt;br /&gt;
== DNS server ==&lt;br /&gt;
&lt;br /&gt;
Each node could run its own (caching) DNS server. Doing this would allow people to access the admin interface for their node by going to e.g. http://me.mesh/ from the private interface.&lt;br /&gt;
&lt;br /&gt;
== Caching web proxy ==&lt;br /&gt;
&lt;br /&gt;
We could use [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] to improve people's browsing experience. Not sure how much cpu and memory this would need. We may not be able to run it on the routers with less than 32 MB ram (e.g. the Bullet 2 HPs). &lt;br /&gt;
&lt;br /&gt;
== Block ads and tracking ==&lt;br /&gt;
&lt;br /&gt;
We could use e.g. [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] with the sources from both adblock plus and ghostery. If we implement this, it should be an optional (default off) feature that you can select on the splash page, with a &amp;quot;remember this&amp;quot; that remembers either using a cookie or using your MAC (but then we'd be tracking people's MAC addresses :-S). The block should probably be time-limited (e.g. 30 days).&lt;br /&gt;
&lt;br /&gt;
= Compatible devices =&lt;br /&gt;
&lt;br /&gt;
We should have ready-made images for:&lt;br /&gt;
&lt;br /&gt;
*One really cheap indoor router (with 3G usb stick support?) like [http://wiki.openwrt.org/toh/tp-link/tl-wr703n TP-Link TL-WR703N]&lt;br /&gt;
*One nice high-speed indoor router (300 mbps 802.11n)&lt;br /&gt;
*Ubiquiti hardware. Most of the AirMAX stuff.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5096</id>
		<title>Mesh/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5096"/>
		<updated>2013-07-12T05:02:34Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Added nodewatcher status publishing.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for the sudo mesh firmware.&lt;br /&gt;
&lt;br /&gt;
= Firmware generation features =&lt;br /&gt;
&lt;br /&gt;
It should be easy to generate a new firmware with the following custom config:&lt;br /&gt;
&lt;br /&gt;
*Location and ownership information.&lt;br /&gt;
:Contact info should be saved in a secure database but maybe not on the node itself?&lt;br /&gt;
*Randomly generated passwords set for wpa2, admin interface and ssh.&lt;br /&gt;
:The SSH password should be stored securely and a couple of stickers with the wpa2 and admin password should be printed for the user.&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware should have =&lt;br /&gt;
&lt;br /&gt;
== Location and status reporting ==&lt;br /&gt;
&lt;br /&gt;
Something that reports location and status when polled.&lt;br /&gt;
&lt;br /&gt;
We developed this format and easy to publish status data from nodes for our [http://dev.wlan-si.net/wiki/Nodewatcher/NodeTelemetryProvider nodewatcher]. OpenWrt packages are [https://github.com/wlanslovenija/firmware-packages-opkg/tree/master/util here]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 22:02, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== SSH server ==&lt;br /&gt;
&lt;br /&gt;
The SSH server should be contactable from any interface. It should initially allow root access using a random generated password that the mesh group has and that the node owner can get and change if they are so inclined.&lt;br /&gt;
&lt;br /&gt;
== BATMAN-adv ==&lt;br /&gt;
&lt;br /&gt;
We'll use this as the mesh protocol.&lt;br /&gt;
&lt;br /&gt;
== Multiple virtual network interfaces with their own SSIDs ==&lt;br /&gt;
&lt;br /&gt;
*One ad-hock mode, unencrypted interface for the mesh nodes, e.g. sudomesh-backchannel&lt;br /&gt;
*One access point mode, unencrypted interface, for non-mesh devices to connect to the mesh, e.g. sudomesh.&lt;br /&gt;
*One access point mode, private interface with WPA2, for the people who own the nodes. [optional]&lt;br /&gt;
&lt;br /&gt;
Traffic on the private interface should be completely separated from traffic on the non-private interfaces unless a client connected to the private interface requests an IP on the mesh.&lt;br /&gt;
&lt;br /&gt;
Maybe the last one is optional because some people may not need that feature (they already have another access point and they want to keep it), but then how do people administrate the router? &lt;br /&gt;
&lt;br /&gt;
== Web admin interface ==&lt;br /&gt;
&lt;br /&gt;
A very simple one-page interface. It should do at least the following:&lt;br /&gt;
&lt;br /&gt;
*Set location, name, description.&lt;br /&gt;
*Let people select how much bandwidth they share.&lt;br /&gt;
:They always share 100% when they're not using the connection themselves.&lt;br /&gt;
:Do any ISPs have bandwidth caps around here? If so, let people specify how many MB to share per month.&lt;br /&gt;
*Let people change the admin password and the private wifi wpa2 password.&lt;br /&gt;
*Donate / &amp;quot;buy routers as presents for your friends&amp;quot;-button.&lt;br /&gt;
&lt;br /&gt;
Nice to have:&lt;br /&gt;
&lt;br /&gt;
*Status info: How many nodes is your node connected to. Is the internet link working.&lt;br /&gt;
*An &amp;quot;I don't know what my internet bandwidth is, test it for me&amp;quot;-function.&lt;br /&gt;
*Usage statistics (so people can see how many people they helped get internet!)&lt;br /&gt;
*Let people put up a bit of info about their node / house / co-op, on a simple web page that people can access only if they're connected to that node. It could be shown as part of the splash page.&lt;br /&gt;
&lt;br /&gt;
== QoS / bandwidth shaping ==&lt;br /&gt;
&lt;br /&gt;
To support letting node owners select how much bandwidth they share.&lt;br /&gt;
&lt;br /&gt;
== Splash page ==&lt;br /&gt;
&lt;br /&gt;
We should have a captive portal so people can learn about the mesh. We have also thought about letting local groups and businesses advertise with location-specific advertisements on the splash page. This could be a source of revenue for the mesh. This should also act as a list/portal for the local services running on the mesh.&lt;br /&gt;
&lt;br /&gt;
== Internet VPN ==&lt;br /&gt;
&lt;br /&gt;
The firmware should tunnel all Internet traffic from the mesh through a VPN server, unless this feature is specifically disabled.&lt;br /&gt;
&lt;br /&gt;
This should not be a single VPN server, as that would be a single point of failure.&lt;br /&gt;
&lt;br /&gt;
I suggest to use [http://wlan-si.net/blog/2012/10/29/tunneldigger-the-new-vpn-solution/ TunnelDigger]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 21:50, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Mesh VPN ==&lt;br /&gt;
&lt;br /&gt;
If the mesh does not see any other nodes (and maybe even if it does?), and it has internet, then it should connect to another node or two over VPN. The easy solution is to use the same VPN servers as for the internet.&lt;br /&gt;
&lt;br /&gt;
== DHCP and batman-adv gateway mode ==&lt;br /&gt;
&lt;br /&gt;
Nodes with an internet connection should run DHCP and [http://www.open-mesh.org/projects/batman-adv/wiki/Gateways batman-adv gateway mode].&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware could have =&lt;br /&gt;
&lt;br /&gt;
== DNS server ==&lt;br /&gt;
&lt;br /&gt;
Each node could run its own (caching) DNS server. Doing this would allow people to access the admin interface for their node by going to e.g. http://me.mesh/ from the private interface.&lt;br /&gt;
&lt;br /&gt;
== Caching web proxy ==&lt;br /&gt;
&lt;br /&gt;
We could use [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] to improve people's browsing experience. Not sure how much cpu and memory this would need. We may not be able to run it on the routers with less than 32 MB ram (e.g. the Bullet 2 HPs). &lt;br /&gt;
&lt;br /&gt;
== Block ads and tracking ==&lt;br /&gt;
&lt;br /&gt;
We could use e.g. [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] with the sources from both adblock plus and ghostery. If we implement this, it should be an optional (default off) feature that you can select on the splash page, with a &amp;quot;remember this&amp;quot; that remembers either using a cookie or using your MAC (but then we'd be tracking people's MAC addresses :-S). The block should probably be time-limited (e.g. 30 days).&lt;br /&gt;
&lt;br /&gt;
= Compatible devices =&lt;br /&gt;
&lt;br /&gt;
We should have ready-made images for:&lt;br /&gt;
&lt;br /&gt;
*One really cheap indoor router (with 3G usb stick support?) like [http://wiki.openwrt.org/toh/tp-link/tl-wr703n TP-Link TL-WR703N]&lt;br /&gt;
*One nice high-speed indoor router (300 mbps 802.11n)&lt;br /&gt;
*Ubiquiti hardware. Most of the AirMAX stuff.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5095</id>
		<title>Mesh/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Firmware&amp;diff=5095"/>
		<updated>2013-07-12T04:50:18Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Added TunnelDigger link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for the sudo mesh firmware.&lt;br /&gt;
&lt;br /&gt;
= Firmware generation features =&lt;br /&gt;
&lt;br /&gt;
It should be easy to generate a new firmware with the following custom config:&lt;br /&gt;
&lt;br /&gt;
*Location and ownership information.&lt;br /&gt;
:Contact info should be saved in a secure database but maybe not on the node itself?&lt;br /&gt;
*Randomly generated passwords set for wpa2, admin interface and ssh.&lt;br /&gt;
:The SSH password should be stored securely and a couple of stickers with the wpa2 and admin password should be printed for the user.&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware should have =&lt;br /&gt;
&lt;br /&gt;
== Location and status reporting ==&lt;br /&gt;
&lt;br /&gt;
Something that reports location and status when polled. &lt;br /&gt;
&lt;br /&gt;
== SSH server ==&lt;br /&gt;
&lt;br /&gt;
The SSH server should be contactable from any interface. It should initially allow root access using a random generated password that the mesh group has and that the node owner can get and change if they are so inclined.&lt;br /&gt;
&lt;br /&gt;
== BATMAN-adv ==&lt;br /&gt;
&lt;br /&gt;
We'll use this as the mesh protocol.&lt;br /&gt;
&lt;br /&gt;
== Multiple virtual network interfaces with their own SSIDs ==&lt;br /&gt;
&lt;br /&gt;
*One ad-hock mode, unencrypted interface for the mesh nodes, e.g. sudomesh-backchannel&lt;br /&gt;
*One access point mode, unencrypted interface, for non-mesh devices to connect to the mesh, e.g. sudomesh.&lt;br /&gt;
*One access point mode, private interface with WPA2, for the people who own the nodes. [optional]&lt;br /&gt;
&lt;br /&gt;
Traffic on the private interface should be completely separated from traffic on the non-private interfaces unless a client connected to the private interface requests an IP on the mesh.&lt;br /&gt;
&lt;br /&gt;
Maybe the last one is optional because some people may not need that feature (they already have another access point and they want to keep it), but then how do people administrate the router? &lt;br /&gt;
&lt;br /&gt;
== Web admin interface ==&lt;br /&gt;
&lt;br /&gt;
A very simple one-page interface. It should do at least the following:&lt;br /&gt;
&lt;br /&gt;
*Set location, name, description.&lt;br /&gt;
*Let people select how much bandwidth they share.&lt;br /&gt;
:They always share 100% when they're not using the connection themselves.&lt;br /&gt;
:Do any ISPs have bandwidth caps around here? If so, let people specify how many MB to share per month.&lt;br /&gt;
*Let people change the admin password and the private wifi wpa2 password.&lt;br /&gt;
*Donate / &amp;quot;buy routers as presents for your friends&amp;quot;-button.&lt;br /&gt;
&lt;br /&gt;
Nice to have:&lt;br /&gt;
&lt;br /&gt;
*Status info: How many nodes is your node connected to. Is the internet link working.&lt;br /&gt;
*An &amp;quot;I don't know what my internet bandwidth is, test it for me&amp;quot;-function.&lt;br /&gt;
*Usage statistics (so people can see how many people they helped get internet!)&lt;br /&gt;
*Let people put up a bit of info about their node / house / co-op, on a simple web page that people can access only if they're connected to that node. It could be shown as part of the splash page.&lt;br /&gt;
&lt;br /&gt;
== QoS / bandwidth shaping ==&lt;br /&gt;
&lt;br /&gt;
To support letting node owners select how much bandwidth they share.&lt;br /&gt;
&lt;br /&gt;
== Splash page ==&lt;br /&gt;
&lt;br /&gt;
We should have a captive portal so people can learn about the mesh. We have also thought about letting local groups and businesses advertise with location-specific advertisements on the splash page. This could be a source of revenue for the mesh. This should also act as a list/portal for the local services running on the mesh.&lt;br /&gt;
&lt;br /&gt;
== Internet VPN ==&lt;br /&gt;
&lt;br /&gt;
The firmware should tunnel all Internet traffic from the mesh through a VPN server, unless this feature is specifically disabled.&lt;br /&gt;
&lt;br /&gt;
This should not be a single VPN server, as that would be a single point of failure.&lt;br /&gt;
&lt;br /&gt;
I suggest to use [http://wlan-si.net/blog/2012/10/29/tunneldigger-the-new-vpn-solution/ TunnelDigger]. [[User:Mitar|Mitar]] ([[User talk:Mitar|talk]]) 21:50, 11 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Mesh VPN ==&lt;br /&gt;
&lt;br /&gt;
If the mesh does not see any other nodes (and maybe even if it does?), and it has internet, then it should connect to another node or two over VPN. The easy solution is to use the same VPN servers as for the internet.&lt;br /&gt;
&lt;br /&gt;
== DHCP and batman-adv gateway mode ==&lt;br /&gt;
&lt;br /&gt;
Nodes with an internet connection should run DHCP and [http://www.open-mesh.org/projects/batman-adv/wiki/Gateways batman-adv gateway mode].&lt;br /&gt;
&lt;br /&gt;
= Stuff the firmware could have =&lt;br /&gt;
&lt;br /&gt;
== DNS server ==&lt;br /&gt;
&lt;br /&gt;
Each node could run its own (caching) DNS server. Doing this would allow people to access the admin interface for their node by going to e.g. http://me.mesh/ from the private interface.&lt;br /&gt;
&lt;br /&gt;
== Caching web proxy ==&lt;br /&gt;
&lt;br /&gt;
We could use [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] to improve people's browsing experience. Not sure how much cpu and memory this would need. We may not be able to run it on the routers with less than 32 MB ram (e.g. the Bullet 2 HPs). &lt;br /&gt;
&lt;br /&gt;
== Block ads and tracking ==&lt;br /&gt;
&lt;br /&gt;
We could use e.g. [http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/ Polipo] with the sources from both adblock plus and ghostery. If we implement this, it should be an optional (default off) feature that you can select on the splash page, with a &amp;quot;remember this&amp;quot; that remembers either using a cookie or using your MAC (but then we'd be tracking people's MAC addresses :-S). The block should probably be time-limited (e.g. 30 days).&lt;br /&gt;
&lt;br /&gt;
= Compatible devices =&lt;br /&gt;
&lt;br /&gt;
We should have ready-made images for:&lt;br /&gt;
&lt;br /&gt;
*One really cheap indoor router (with 3G usb stick support?) like [http://wiki.openwrt.org/toh/tp-link/tl-wr703n TP-Link TL-WR703N]&lt;br /&gt;
*One nice high-speed indoor router (300 mbps 802.11n)&lt;br /&gt;
*Ubiquiti hardware. Most of the AirMAX stuff.&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=Mesh/Other_mesh_projects&amp;diff=5050</id>
		<title>Mesh/Other mesh projects</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=Mesh/Other_mesh_projects&amp;diff=5050"/>
		<updated>2013-07-04T20:10:33Z</updated>

		<summary type="html">&lt;p&gt;Mitar: Added Slovenia&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of this page is to list existing meshes, active mesh groups and failed community wireless groups so that we can learn from their failures and successes and possibly their source code and configuration parameters.&lt;br /&gt;
&lt;br /&gt;
Project meshnet has a [https://wiki.projectmeshnet.org/List_of_Mesh_Locals list of wireless mesh projects].&lt;br /&gt;
&lt;br /&gt;
Wikipedia has a [http://en.wikipedia.org/wiki/List_of_wireless_community_networks_by_region list of wireless community networks by region].&lt;br /&gt;
&lt;br /&gt;
= Active meshes =&lt;br /&gt;
&lt;br /&gt;
== [http://buenosaireslibre.org/ Buenos Aires Libre] - Argentina ==&lt;br /&gt;
&lt;br /&gt;
*Location: Buenos Aires, Argentina&lt;br /&gt;
*Size: 200 active nodes (but 720 total)&lt;br /&gt;
*Protocol: &lt;br /&gt;
*[http://mapa.buenosaireslibre.org/ Map]&lt;br /&gt;
*Status: Likely in decline.&lt;br /&gt;
:Few of total nodes active. General meeting still being held (probably yearly), yet no-one signed up for general meeting attendance three days before it was to be held.&lt;br /&gt;
&lt;br /&gt;
== [http://www.bogota-mesh.org/ Bogota Mesh] - Columbia ==&lt;br /&gt;
&lt;br /&gt;
*Location: Bogota, Columbia&lt;br /&gt;
*Size: 30 nodes. Not sure how many active.&lt;br /&gt;
*Protocol: B.A.T.M.A.N. (not sure if -adv or -exp or normal).&lt;br /&gt;
*[http://www.bogota-mesh.org/en/node/36 Map]&lt;br /&gt;
&lt;br /&gt;
== [http://ninux.org Ninux] - Italy ==&lt;br /&gt;
&lt;br /&gt;
*Location: Italy. Many cities.&lt;br /&gt;
*Size: About 200 nodes.&lt;br /&gt;
*Protocol: OLSR&lt;br /&gt;
*[http://map.ninux.org/ Map]&lt;br /&gt;
&lt;br /&gt;
== Freifunk - Germany ==&lt;br /&gt;
&lt;br /&gt;
*Location: Germany. Several cities.&lt;br /&gt;
*Size: Over 600 nodes in Berlin and over 400 nodes in Leipzig [http://www.olsr.org/?q=about according to the OSLR about page].&lt;br /&gt;
*Protocol: Mostly OLSR, but some cities use batman-adv.&lt;br /&gt;
*Map: [http://map.berlin.freifunk.net/ Berlin]&lt;br /&gt;
*Note: Not one big mesh, but several meshes in several cities.&lt;br /&gt;
&lt;br /&gt;
Freifunk is actually both an organization, a firmware and a whole set of meshes, some of them interlinked, mostly in Germany. We have a [[Mesh/Freifunk|whole page about the project]].&lt;br /&gt;
&lt;br /&gt;
== AWMN - Greece ==&lt;br /&gt;
&lt;br /&gt;
*Location: Athens, Greece&lt;br /&gt;
*Size: Over 2400 nodes (according to their map, mid-2013).&lt;br /&gt;
*Protocol: OLSR (according to [http://www.olsr.org/?q=about the OSLR about page].&lt;br /&gt;
*[http://wind.awmn.net/?page=nodes Map]]&lt;br /&gt;
&lt;br /&gt;
== Funkfeuer - Austria ==&lt;br /&gt;
&lt;br /&gt;
*Location: Austria. Several cities.&lt;br /&gt;
*Size: ?&lt;br /&gt;
*Map: [https://map.funkfeuer.at/wien/ Vienna]&lt;br /&gt;
&lt;br /&gt;
== wlan slovenija - Slovenia ==&lt;br /&gt;
&lt;br /&gt;
*Location: Slovenia&lt;br /&gt;
*Size: 200 active nodes&lt;br /&gt;
*Protocol: OLSR&lt;br /&gt;
*Map: [https://nodes.wlan-si.net/network/map/ Slovenia]&lt;br /&gt;
*[http://wlan-si.net/en/ Website]&lt;br /&gt;
*[http://dev.wlan-si.net/ Technology wiki]&lt;br /&gt;
&lt;br /&gt;
= Community Wireless Projects (not mesh) =&lt;br /&gt;
&lt;br /&gt;
== [http://www.myrtletown.net/wifi.php  myrtletown.net] - California ==&lt;br /&gt;
&lt;br /&gt;
*Location: Murtletown, California&lt;br /&gt;
*Size: 1 WRT54GS router with a 1 watt amplifier on a tall mast.&lt;br /&gt;
:Actually covers a good part of the tiny town!&lt;br /&gt;
*[http://www.myrtletown.net/pics/myrtletown_wifi_coverage_map_r2.jpg Map]&lt;br /&gt;
&lt;br /&gt;
= Planned Meshes =&lt;br /&gt;
&lt;br /&gt;
== [http://nightwing.lugro-mesh.org.ar/en/ LUGRo-Mesh] - Argentina ==&lt;br /&gt;
&lt;br /&gt;
*Location: Rosario, Argentina&lt;br /&gt;
*Size: 0 nodes so far&lt;br /&gt;
*Protocol: B.A.T.M.A.N. Experimental (bmx)&lt;br /&gt;
*Firmware: [http://nightwing.lugro-mesh.org.ar/en/ Nightwing] their own distro.&lt;br /&gt;
&lt;br /&gt;
= Active non-mesh community wireless projects =&lt;br /&gt;
&lt;br /&gt;
== Guifi - Spain ==&lt;br /&gt;
&lt;br /&gt;
*Location: Spain&lt;br /&gt;
*Size: Over 21,000 active nodes. Mostly in Barcelona.&lt;br /&gt;
*[http://guifi.net/en Website]&lt;br /&gt;
*Note: Not sure if this is a mesh, but it seems to be huge!&lt;br /&gt;
:Collaborating with [http://thefnf.org/ The Free Network Foundation] to establish guifi.us: ''A self-service and full-service network planning, provisioning, and funding tool''.&lt;br /&gt;
&lt;br /&gt;
= Inactive / failed local networks =&lt;br /&gt;
&lt;br /&gt;
== [http://en.wikipedia.org/wiki/Roofnet Roofnet] - Massachussets ==&lt;br /&gt;
&lt;br /&gt;
*Location: MIT and surrounding area, Massachussets.&lt;br /&gt;
*Protocol: [http://en.wikipedia.org/wiki/ExOR_%28wireless_network_protocol%29 ExOR]&lt;br /&gt;
*Status: Website spews errors and was lasted updated in 2006.&lt;br /&gt;
&lt;br /&gt;
Roofnet turned into Meraki which used to be awesome, but became less awesome and eventually was bought by Cisco.&lt;br /&gt;
&lt;br /&gt;
== [http://www.netequality.org/ NetEquality] - Portland ==&lt;br /&gt;
&lt;br /&gt;
*Location: Low-income housing communities in Portland.&lt;br /&gt;
*Protocol: Not a mesh.&lt;br /&gt;
*Status: May still be active, but front page lists a 2007 article as recent.&lt;br /&gt;
&lt;br /&gt;
== [http://en.wikipedia.org/wiki/Champaign-Urbana_Community_Wireless_Network CUWiN] - Illinois ==&lt;br /&gt;
&lt;br /&gt;
*Location: Champaign-Urbana, Illinois&lt;br /&gt;
*Status: Website down.&lt;br /&gt;
*Funding: Received ~$870,000 from 2003 to 2006&lt;br /&gt;
&lt;br /&gt;
=== Funding overview ===&lt;br /&gt;
&lt;br /&gt;
* December, 2003: Received a $200,000 grant from the [http://en.wikipedia.org/wiki/Open_Society_Institute Open Society Institute]&lt;br /&gt;
* July, 2004: Received a $50,000 grant from the [http://www.thresholdfoundation.org/ Threshold Foundation]&lt;br /&gt;
* December, 2005: Received $118,000 grant from the [http://en.wikipedia.org/wiki/Open_Society_Institute Open Society Institute]&lt;br /&gt;
* July, 2006: Received a $500,000 grant from the National Science Foundation&lt;br /&gt;
&lt;br /&gt;
== Archive.org's SFLAN - San Francisco ==&lt;br /&gt;
&lt;br /&gt;
*[http://archive.org/web/sflan.php Website]&lt;br /&gt;
*Note: Not 100% sure this is inactive.&lt;br /&gt;
&lt;br /&gt;
== NoCat - Sebastopol, CA == &lt;br /&gt;
&lt;br /&gt;
''NoCat's goal is to bring you Infinite Bandwidth Everywhere for Free.''&lt;br /&gt;
&lt;br /&gt;
*Last news article was posted in February 2006.&lt;br /&gt;
*Website went down some time in late 2012.&lt;br /&gt;
*[http://web.archive.org/web/20121110234219/http://nocat.net/ nocat.net on archive.org]&lt;br /&gt;
*Seems like it wasn't a mesh&lt;br /&gt;
&lt;br /&gt;
One of the main organizers, Rob Flickenger, wrote the O'Reilly book [http://shop.oreilly.com/product/9780596002046.do Building Wireless Community Networks] (published 2001). We should find him and ask him why it failed. His website is http://hackerfriendly.com&lt;/div&gt;</summary>
		<author><name>Mitar</name></author>
	</entry>
</feed>