Project

General

Profile

Wiki » History » Version 58

Axel Neumann, 08/17/2013 03:24 PM

1 54 Pau Escrich
!bmx6.png!
2 1 Pau Escrich
3 1 Pau Escrich
Bmx6 is a routing protocol for Linux based operating systems.
4 6 Axel Neumann
The following intro provides kind of tutorial to get started.
5 6 Axel Neumann
6 56 Pau Escrich
{{>toc}}
7 1 Pau Escrich
8 8 Axel Neumann
h2. Installation
9 6 Axel Neumann
10 8 Axel Neumann
h3. Requirements
11 7 Axel Neumann
12 6 Axel Neumann
The following tools are needed to obtain, compile, and install bmx6
13 6 Axel Neumann
* git (debian package: git-core)
14 6 Axel Neumann
* gcc
15 6 Axel Neumann
* make
16 6 Axel Neumann
17 6 Axel Neumann
18 8 Axel Neumann
h3. Downloading
19 6 Axel Neumann
20 6 Axel Neumann
Latest development sources are available from bmx6 git repository
21 6 Axel Neumann
<pre>
22 6 Axel Neumann
git clone git://qmp.cat/bmx6.git
23 6 Axel Neumann
cd bmx6
24 6 Axel Neumann
</pre>
25 6 Axel Neumann
26 8 Axel Neumann
h3. Compile and Install
27 6 Axel Neumann
28 7 Axel Neumann
To only compile the main bmx6 daemon (no bmx6 plugins)
29 6 Axel Neumann
<pre>
30 6 Axel Neumann
make
31 6 Axel Neumann
sudo make install
32 6 Axel Neumann
</pre>
33 6 Axel Neumann
34 6 Axel Neumann
35 57 Pau Escrich
h2. Installing in OpenWRT 
36 57 Pau Escrich
37 57 Pau Escrich
Bmx6 is currently in the official routing feed of OpenWRT, so to install it from a existing system you can use opkg
38 57 Pau Escrich
39 57 Pau Escrich
    opkg install bmx6 bmx6-uci-config
40 57 Pau Escrich
41 57 Pau Escrich
h3. Compile it by adding a feed
42 57 Pau Escrich
43 57 Pau Escrich
If you are compiling your own OpenWRT, you can add the routing feed (already enabled by default) which can be found here
44 57 Pau Escrich
45 57 Pau Escrich
     https://github.com/openwrt-routing/packages
46 57 Pau Escrich
47 57 Pau Escrich
Then run "make menuconfig" and select the bmx6 package in _Networking -> Routing and redirection_
48 57 Pau Escrich
49 57 Pau Escrich
It is recommended to select also, at least, the uci plugin (bmx6-uci-config)
50 57 Pau Escrich
51 57 Pau Escrich
You can select "luci-app-bmx6" to have a nice web interface for manage and monitorize the routing daemon.
52 57 Pau Escrich
53 57 Pau Escrich
Finally type "make" to build the image.
54 57 Pau Escrich
55 57 Pau Escrich
56 8 Axel Neumann
h2. Usage (hello mesh)
57 6 Axel Neumann
58 19 Axel Neumann
h3. Starting
59 3 Axel Neumann
60 3 Axel Neumann
In its most simple configuration, the only required parameter are the interfaces names that should be used for meshing.
61 3 Axel Neumann
The following example starts bmx6 on interface wlan0:
62 3 Axel Neumann
<pre>
63 15 Axel Neumann
root@mlc1001:~# bmx6 dev=eth1
64 3 Axel Neumann
</pre>
65 3 Axel Neumann
66 3 Axel Neumann
However, to let this simple command work as expected also check the following basic requirements:
67 3 Axel Neumann
68 15 Axel Neumann
* bmx6 must be executed in root context (with super user permissions). If you are not already root, prepend all commands with sudo (eg: @ sudo bmx6 dev=eth1 @ ).
69 3 Axel Neumann
70 9 Axel Neumann
* NO IP address needs to be configured. By default bmx6 assumes IPv6 and autoconfigures an ULA based IPv6 address for each interface based on the MAC address of the device. Just, the interfaces must be UP. The linux ip command can do this for you (eg: @ ip link set wlan0 up @). Also, if you are using a wireless interface, the wireless interface settings must be set correctly so that link-layer connectivity is given with bmx6 daemons running on other nodes (computers). The good old iwconfig command may help to achieve that. For example @ iwconfig wlan0 mode ad-hoc ap 02:ca:ff:ee:ba:be channel 11 essid my-mesh-network @ is a typical configuration for a wireless mesh setup.
71 3 Axel Neumann
72 15 Axel Neumann
* Bmx6 (by default) works in daemon mode, thus sends itself to background and gives back a prompt. To let it run in foreground specify a debug level with the startup command like: @ bmx6 debug=0 dev=eth1 @ . Of course you may need to kill a previously started bmx6 daemon beforehand (@ killall bmx6 @)
73 1 Pau Escrich
74 19 Axel Neumann
If everything went fine bmx6 is running now, searching for neighboring bmx6 daemons via the configured interface (link), and coordinates with them to learn about existence-of and routes-to all other bmx6 nodes in the network.
75 1 Pau Escrich
76 19 Axel Neumann
77 19 Axel Neumann
78 19 Axel Neumann
79 19 Axel Neumann
80 19 Axel Neumann
h3. Accessing Protocol Events, Status, and Network Information
81 19 Axel Neumann
82 19 Axel Neumann
To access debug and status information of the bmx6 daemon which has just been started, a second bmx6 process can be launched in client mode (with the --connect or -c parameter) to connect to the main bmx6 daemon and retrieve the desired information.
83 19 Axel Neumann
84 19 Axel Neumann
In the following, a few example will be discussed
85 19 Axel Neumann
86 19 Axel Neumann
Continuous debug levels with different verbosity and scope are accessible with the --debug or -d parameter.
87 19 Axel Neumann
* Debug level 0 only reports critical events
88 19 Axel Neumann
* Debug level 3 reports relevant changes and 
89 19 Axel Neumann
* Debug level 4 reports everything.
90 19 Axel Neumann
* Debug level 12 dump in and outgoing protocol traffic
91 50 Pau Escrich
92 50 Pau Escrich
Eg.: @ bmx6 -cd3 @ connects a bmx6 client process to debug-level 3 of the main daemon and logs the output stdout until terminated with ctrl-c
93 19 Axel Neumann
94 19 Axel Neumann
95 19 Axel Neumann
96 19 Axel Neumann
Status, network, and statistic information are accessible with dedicated parameters:
97 19 Axel Neumann
* status
98 19 Axel Neumann
* interfaces
99 19 Axel Neumann
* links
100 19 Axel Neumann
* originators
101 21 Axel Neumann
* descriptions, plus optional sub-parameters for filtering
102 19 Axel Neumann
* tunnels
103 19 Axel Neumann
* traffic=DEV where DEV:= all or eth1, ....
104 19 Axel Neumann
105 19 Axel Neumann
106 18 Axel Neumann
<pre>
107 1 Pau Escrich
root@mlc1001:~# bmx6 -c status
108 1 Pau Escrich
version        compatibility codeVersion globalId                     primaryIp                       myLocalId uptime     cpu nodes 
109 1 Pau Escrich
BMX6-0.1-alpha 16            9           mlc1001.7A7422752001EC4AC4C8 fd66:66:66:0:a2cd:efff:fe10:101 24100101  0:00:40:37 0.1 4
110 1 Pau Escrich
</pre>
111 18 Axel Neumann
112 5 Axel Neumann
So apart from version, compatibility number, and code, the status reveals the daemon's global (see: [[Wiki#Global-ID]] ) and local ID, its primary (self-configured) IPv6 address, the time since when it is running (40 minutes), its current cpu consumption (0.1%) and the total number of 4 learned nodes in the network (including itself).
113 9 Axel Neumann
114 19 Axel Neumann
These desired types can be combined. Also the above given example shows kind of shortcut. The long argument would be
115 19 Axel Neumann
@ bmx6 connect show=status @. A more informative case using the long form would be:
116 1 Pau Escrich
<pre>
117 9 Axel Neumann
root@mlc1001:~# bmx6 connect show=status show=interfaces show=links show=originators show=tunnels
118 1 Pau Escrich
status:
119 18 Axel Neumann
version        compatibility codeVersion globalId                     primaryIp                       myLocalId uptime     cpu nodes
120 18 Axel Neumann
BMX6-0.1-alpha 16            9           mlc1001.7A7422752001EC4AC4C8 fd66:66:66:0:a2cd:efff:fe10:101 06100101  0:00:53:19 0.3 4
121 15 Axel Neumann
interfaces:
122 18 Axel Neumann
devName state type     rateMin rateMax llocalIp                    globalIp                           multicastIp primary
123 18 Axel Neumann
eth1    UP    ethernet 1000M   1000M   fe80::a2cd:efff:fe10:101/64 fd66:66:66:0:a2cd:efff:fe10:101/64 ff02::2     1
124 15 Axel Neumann
links:
125 18 Axel Neumann
globalId                     llocalIp                 viaDev rxRate txRate bestTxLink routes wantsOgms nbLocalId
126 18 Axel Neumann
mlc1000.0AE58311046412F248CD fe80::a2cd:efff:fe10:1   eth1   100    100    1          1      1         9B100001
127 18 Axel Neumann
mlc1002.91DCF042934B5913BB00 fe80::a2cd:efff:fe10:201 eth1   100    100    1          2      1         BB100201
128 15 Axel Neumann
originators:
129 18 Axel Neumann
globalId                     blocked primaryIp                       routes viaIp                    viaDev metric lastDesc lastRef
130 18 Axel Neumann
mlc1000.0AE58311046412F248CD 0       fd66:66:66:0:a2cd:efff:fe10:1   1      fe80::a2cd:efff:fe10:1   eth1   999M   3193     3 
131 18 Axel Neumann
mlc1001.7A7422752001EC4AC4C8 0       fd66:66:66:0:a2cd:efff:fe10:101 0      ::                       ---    128G   3197     0
132 18 Axel Neumann
mlc1002.91DCF042934B5913BB00 0       fd66:66:66:0:a2cd:efff:fe10:201 1      fe80::a2cd:efff:fe10:201 eth1   999M   3196     3 
133 18 Axel Neumann
mlc1003.09E796BC491D386248C3 0       fd66:66:66:0:a2cd:efff:fe10:301 1      fe80::a2cd:efff:fe10:201 eth1   576M   22       3 
134 1 Pau Escrich
</pre>
135 1 Pau Escrich
136 9 Axel Neumann
Only if relevant information for a requested type is available it will be shown.
137 9 Axel Neumann
In this example no tunnels are configured nor offered by other nodes and therefore no tunnel information is shown.
138 1 Pau Escrich
139 9 Axel Neumann
The loop argument can be prepended to the connect argument to continuously show the requested information.
140 9 Axel Neumann
Many of the long arguments are usable via a short notation, like l for loop, c for connect, s for show, d for debug.
141 9 Axel Neumann
And there is another shortcut summarizing my current favorite information types via debug level 8
142 9 Axel Neumann
The following commands do the same as above: @ bmx6 -lc status interfaces links originators tunnels @ or just @ bmx6 -lcd8 @.
143 1 Pau Escrich
144 18 Axel Neumann
Description of the provided info:
145 14 Axel Neumann
* interfaces: Followed by one line per configured interface
146 14 Axel Neumann
** dev: Interface name
147 14 Axel Neumann
** state and type: Whether the interface is UP or DOWN and its assumed link-layer type.
148 14 Axel Neumann
** rateMin and rateMax: Min- and maximum transmit rates assumed for this interface.
149 14 Axel Neumann
** llocalIp: IPv6 link-local address (used as source address for all outgoing protocol data).
150 14 Axel Neumann
** globalIp: Autoconfigured address used for sending network traffic via this interface and which is propagated to other nodes.
151 14 Axel Neumann
** multicastIp: Multicast IP (used as destination address for all bmx6 protocol traffic send via this interface).
152 14 Axel Neumann
** primary: Indicates whether the global ip of this interface is used as primary ip for this daemon.
153 14 Axel Neumann
* links: Followed by one line per detected neighboring bmx6 node.
154 16 Axel Neumann
** globalId: GlobalId of that neighbor (see: [[Wiki#Global-ID]] ).
155 14 Axel Neumann
** llocalIp: Link-local IP of the neighbor's interface building the other side of the link.
156 14 Axel Neumann
** viaDev: Interface of this node for the link.
157 14 Axel Neumann
** rxRate: Measured receive rate in percent for the link.
158 14 Axel Neumann
** txRate: Measured transmit rate in percent for the link.
159 14 Axel Neumann
** bestTxLink: Indicates whether this link is the best link to a neighboring nodes.
160 1 Pau Escrich
** routes: Indicates for how much routes to other nodes this link is used.
161 1 Pau Escrich
** wantsOgms: Indicates whether the neighboring node has requested (this node) to propagate originator messsages (OGMs) via this link.
162 1 Pau Escrich
** nbLocalId: Neighbors local ID.
163 1 Pau Escrich
* originators: Followed by one line per aware originator in the network (including itself).
164 1 Pau Escrich
** globalId: Global Id of that node (see: [[Wiki#Global-ID]] ).
165 30 Axel Neumann
** blocked: Indicates whether this node is currently blocked (see: [[Wiki#Blocked-Nodes]] ).
166 1 Pau Escrich
** primaryIp: The primary IP of that node. 
167 1 Pau Escrich
** routes: Number of potential routes towards this node.
168 1 Pau Escrich
** viaIp: Next hops link-local IP of the best route towards this node.
169 1 Pau Escrich
** viaDev: Outgoing interface of the best route towards this node.
170 1 Pau Escrich
** metric: The end to end path metric to this node
171 1 Pau Escrich
** lastDesc: Seconds since the last description update was received (see: [[Widi#Description]] )
172 18 Axel Neumann
** lastRef: Seconds since this node was referenced by any neighboring node (like last sign of life)
173 18 Axel Neumann
174 18 Axel Neumann
175 18 Axel Neumann
Quick summary of provided info:
176 18 Axel Neumann
* Node mlc1001 uses one wired interface (eth1) which is up and actively used for meshing.
177 18 Axel Neumann
* Node mlc1001 got aware of 2 neighbors and 4 nodes (originators) including itself.
178 18 Axel Neumann
* The link qualities (rx and tx rate) to its neighbors are perfect (100%) and actively used (bestTxLink)
179 1 Pau Escrich
* Routes to nodes mlc1000 and mlc1002 are via interface eth1 and directly to the neighbor's link-local address with a metric of 999M (nearly maximum tx/rx rate of the configured interface)
180 1 Pau Escrich
* Route to node mlc1003 is setup via interface eth1 and via the link-local address of neighbor mlc1002 (at least two hops to the destination node).
181 1 Pau Escrich
182 21 Axel Neumann
The following links of the total network topology can be guessed from this information (further links may exist):
183 1 Pau Escrich
@ mlc1000 --- mlc1001 --- mlc1002 - - - mlc1003 @
184 1 Pau Escrich
185 21 Axel Neumann
186 21 Axel Neumann
187 21 Axel Neumann
188 19 Axel Neumann
h3. Simple Ping Test
189 19 Axel Neumann
190 1 Pau Escrich
This could be verified using traceroute6 towards the primary IP of the other nodes.
191 18 Axel Neumann
192 19 Axel Neumann
To mlc1000's primary IP fd66:66:66:0:a2cd:efff:fe10:1 shows one hop:
193 18 Axel Neumann
<pre>
194 18 Axel Neumann
root@mlc1001:~# traceroute6 -n -q 1 fd66:66:66:0:a2cd:efff:fe10:1
195 18 Axel Neumann
traceroute to fd66:66:66:0:a2cd:efff:fe10:1 (fd66:66:66:0:a2cd:efff:fe10:1), 30 hops max, 80 byte packets
196 1 Pau Escrich
 1  fd66:66:66:0:a2cd:efff:fe10:1  0.324 ms
197 18 Axel Neumann
</pre>
198 18 Axel Neumann
199 19 Axel Neumann
To mlc1002's primary IP fd66:66:66:0:a2cd:efff:fe10:201 shows one hop:
200 18 Axel Neumann
<pre>
201 18 Axel Neumann
root@mlc1001:~# traceroute6 -n -q 1 fd66:66:66:0:a2cd:efff:fe10:201
202 18 Axel Neumann
traceroute to fd66:66:66:0:a2cd:efff:fe10:201 (fd66:66:66:0:a2cd:efff:fe10:201), 30 hops max, 80 byte packets
203 18 Axel Neumann
 1  fd66:66:66:0:a2cd:efff:fe10:201  0.302 ms
204 1 Pau Escrich
</pre>
205 1 Pau Escrich
206 19 Axel Neumann
To mlc1003's primary IP fd66:66:66:0:a2cd:efff:fe10:301 shows two hops:
207 1 Pau Escrich
<pre>
208 1 Pau Escrich
root@mlc1001:~# traceroute6 -n -q 1 fd66:66:66:0:a2cd:efff:fe10:301
209 18 Axel Neumann
traceroute to fd66:66:66:0:a2cd:efff:fe10:301 (fd66:66:66:0:a2cd:efff:fe10:301), 30 hops max, 80 byte packets
210 18 Axel Neumann
 1  fd66:66:66:0:a2cd:efff:fe10:201  0.313 ms
211 18 Axel Neumann
 2  fd66:66:66:0:a2cd:efff:fe10:301  0.429 ms
212 18 Axel Neumann
</pre>
213 19 Axel Neumann
214 1 Pau Escrich
215 1 Pau Escrich
h3. Dynamic Reconfiguration
216 1 Pau Escrich
217 1 Pau Escrich
Most bmx6 parameters can be applied not only at startup, but also dynamically to an already running main daemon, using the --connect command.
218 21 Axel Neumann
For example interfaces can be added, removed, or specified with more details:
219 21 Axel Neumann
The following example removes interface eth1 and adds eth2 with a max rate of 100 Mbits (overwriting the default assumption of 1000Mbits for ethernet interfaces).
220 21 Axel Neumann
<pre>
221 21 Axel Neumann
bmx6 -c dev=-eth1 dev=eth2 /rateMax=100000
222 21 Axel Neumann
bmx6 -cd8
223 21 Axel Neumann
</pre>
224 1 Pau Escrich
225 21 Axel Neumann
Checking new status of interfaces, links, and originator:
226 21 Axel Neumann
<pre>
227 21 Axel Neumann
root@mlc1001:~# bmx6 -cd8
228 21 Axel Neumann
status:
229 21 Axel Neumann
version        compatibility codeVersion globalId                     primaryIp                       myLocalId uptime     cpu nodes 
230 21 Axel Neumann
BMX6-0.1-alpha 16            9           mlc1001.7A7422752001EC4AC4C8 fd66:66:66:0:a2cd:efff:fe10:102 06100101  0:02:26:00 0.1 4 
231 21 Axel Neumann
interfaces:
232 21 Axel Neumann
devName state type     rateMin rateMax llocalIp                    globalIp                           multicastIp primary 
233 21 Axel Neumann
eth2    UP    ethernet 100M    100M    fe80::a2cd:efff:fe10:102/64 fd66:66:66:0:a2cd:efff:fe10:102/64 ff02::2     1       
234 21 Axel Neumann
links:
235 21 Axel Neumann
globalId                     llocalIp               viaDev rxRate txRate bestTxLink routes wantsOgms nbLocalId 
236 21 Axel Neumann
mlc1000.0AE58311046412F248CD fe80::a2cd:efff:fe10:2 eth2   89     88     1          3      1         9B100001  
237 21 Axel Neumann
originators:
238 21 Axel Neumann
globalId                     blocked primaryIp                       routes viaIp                  viaDev metric lastDesc lastRef 
239 21 Axel Neumann
mlc1000.0AE58311046412F248CD 0       fd66:66:66:0:a2cd:efff:fe10:1   1      fe80::a2cd:efff:fe10:2 eth2   81757K 18       0      
240 21 Axel Neumann
mlc1001.7A7422752001EC4AC4C8 0       fd66:66:66:0:a2cd:efff:fe10:102 0      ::                     ---    128G   80       0      
241 21 Axel Neumann
mlc1002.91DCF042934B5913BB00 0       fd66:66:66:0:a2cd:efff:fe10:201 1      fe80::a2cd:efff:fe10:2 eth2   83620K 14       4      
242 21 Axel Neumann
mlc1003.09E796BC491D386248C3 0       fd66:66:66:0:a2cd:efff:fe10:301 1      fe80::a2cd:efff:fe10:2 eth2   81488K 9        0
243 21 Axel Neumann
</pre>
244 1 Pau Escrich
245 21 Axel Neumann
It can be seen that:
246 21 Axel Neumann
* Interface eth1 has been replaced by eth2 with a lower rate.
247 21 Axel Neumann
* The primary IP of the node has changed (using the autoconfigured IP from eth2.
248 21 Axel Neumann
* The old links (via eth1) are removed and a single new link via eth2 to mlc1000 has been detected
249 21 Axel Neumann
* All routes are now going via eth2 and mlc1000's link-local IP fe80::a2cd:efff:fe10:2
250 1 Pau Escrich
251 21 Axel Neumann
252 21 Axel Neumann
253 21 Axel Neumann
254 21 Axel Neumann
255 1 Pau Escrich
h2. Concepts
256 17 Axel Neumann
257 17 Axel Neumann
h3. Global ID
258 17 Axel Neumann
259 17 Axel Neumann
Each bmx6 node creates during its initialization (booting) a global ID for itself. 
260 17 Axel Neumann
This ID is created as a concatenation of the node's hostname and a random value.
261 17 Axel Neumann
In the above given example with node hostname: "mlc1001" the globalID is: mlc1001.7A7422752001EC4AC4C8
262 1 Pau Escrich
When the bmx6 daemon restarts the hostname will remain. But the rand part will change.
263 1 Pau Escrich
As a consequence, the restarted node will appear as a new node to other nodes in the mesh while the old Global ID is still present in their node table.
264 1 Pau Escrich
Since both node IDs are announcing the same resources (eg the same primary IP), the ID that appears later will be blocked until the state maintained for the first ID expires.
265 1 Pau Escrich
266 26 Axel Neumann
267 26 Axel Neumann
268 21 Axel Neumann
h3. Descriptions
269 21 Axel Neumann
270 22 Axel Neumann
Instead of propagating individual routing updates for each announced network and interface address, each bmx6 daemon summarizes this and other node specific attributes into a single node-specific description. A specific description is propagated only once to all other nodes. Subsequent routing updates are referencing to the corresponding description with it's hash.
271 23 Axel Neumann
If a node is reconfigured, for example because its interfaces change or a new network shall be announced, than also the node's description changes.
272 23 Axel Neumann
Other nodes are becoming aware of the changed attributes of a reconfigured node by receiving a corresponding description update.
273 23 Axel Neumann
Subsequent references to this node will use the hash of the new description.
274 23 Axel Neumann
275 23 Axel Neumann
Because the description is designed very generic it can be easily used to piggyback other non-routing specific data. For example the bmx6-sms plugin is taking advantage of this option by adding arbitrary short messages data to the node's description.
276 23 Axel Neumann
277 25 Axel Neumann
Currently there is a limit for the total size of a description of 1400 bytes. While this is more than sufficient for quite a number of interfaces and announced networks per node, it is critical few when considering a gateway node with BGP route exchange that is announcing 100eds of networks.
278 23 Axel Neumann
279 30 Axel Neumann
h3. Blocked Nodes
280 26 Axel Neumann
281 29 Axel Neumann
Nodes may be blocked by other nodes.
282 29 Axel Neumann
When a node is blocked no routing updates (OGMs) of the blocked node are propagated by the blocking node.
283 29 Axel Neumann
The decision for blocking another node is done locally based on the detection of more than one node announcing the same unique resource.
284 29 Axel Neumann
This happens if two nodes are declaring themselves as the owner of a unique resource. Then one of those two nodes (usually the latter) is blocked to avoid the propagation of conflicting state. Duplicate address usage is the most common reason for such events which happens if two nodes are using (and announcing) the same primary IPs. Another typical scenario leading to such events is the rebooting of a node. Once a bmx6 daemon restarts it appears as a new node (with a new global ID) to the network but announcing the same address as the previous process. Since the resources allocated by the previous resources are still in the database of other nodes in the mesh they will block the new process until this information expires (by default after 100 seconds).
285 26 Axel Neumann
286 1 Pau Escrich
287 29 Axel Neumann
288 29 Axel Neumann
289 29 Axel Neumann
h2. Unicast Host Network Announcements (UHNA)
290 29 Axel Neumann
291 26 Axel Neumann
A Host Network Announcements (HNA) describes the advertisement of IP addresses and networks by a node to other nodes in the mesh.
292 29 Axel Neumann
Typically (but not with BMX6), several nodes can announce the same or overlapping HNAs at the same time.
293 29 Axel Neumann
Announced networks do overlap if they are equal or one being a subset of another (eg. 10.1.1.0/24 is a subset and overlapped by 10.1.0.0/16).
294 26 Axel Neumann
Packets with a destination address matching an announced networks will be routed toward any node that originated a corresponding HNA.
295 26 Axel Neumann
Therefore these HNA types may also be called anycast HNA.
296 26 Axel Neumann
297 30 Axel Neumann
In bmx6, HNAs have an unicast nature (UHNAs) because each network can only be announced once and announced networks MUST NOT overlap (See also [[Wiki#Blocked-Nodes]]).
298 26 Axel Neumann
This way it can be ensured that the destination of an UHNA routed packet is exactly known.
299 26 Axel Neumann
300 26 Axel Neumann
In a sense the origination and propagation (by intermediate nodes) of UHNA announcements can be thought of a promise that guarantees:
301 26 Axel Neumann
1. All packets with a destination address matching an announced UHNA network will be routed exactly to the node (with the global ID) that originated the UHNA and
302 26 Axel Neumann
2. each node on the forwarding path towards the originator of the UHNA is supporting this promise.
303 26 Axel Neumann
304 26 Axel Neumann
By default, Bmx6 only announces primary and non-primary interface addresses via UHNAs.
305 1 Pau Escrich
The auto address configuration ensures that interface addresses are unique.
306 26 Axel Neumann
307 1 Pau Escrich
Using UHNAs for the announcements of networks requires a strict coordination to ensure that no network is announced twice.
308 1 Pau Escrich
309 1 Pau Escrich
Technically, multiple UHNAs, each wrapped into a single message, are aggregated into a UHNA frame and attached to the description of a node.
310 1 Pau Escrich
311 32 Axel Neumann
If Bmx6 is configured in IPv6 mode only IPv6 UHNAs can be announced and in IPv4 mode only IPv4 UHNAs
312 32 Axel Neumann
313 32 Axel Neumann
314 31 Axel Neumann
h3. UHNA Configuration
315 30 Axel Neumann
316 30 Axel Neumann
The announcement of UHNAs can be configured with the --unicastHna or -u parameter followed by a network specification in ip/prefixlen notation.
317 30 Axel Neumann
By default all interface addresses are announced via UHNAs. However, this can be disabled by setting the --dev subparameter /announce or /a to 0.
318 30 Axel Neumann
319 30 Axel Neumann
The following example reconfigures an already running bmx6 daemon (in IPv6 mode) to UHNA announce the network fd00:ffff:ffff:ffff::/64 and fd01:ffff:ffff::/48.
320 30 Axel Neumann
By omitting the --connect / -c parameter, the same could be configured as startup parameter for bmx6.
321 30 Axel Neumann
<pre>
322 30 Axel Neumann
bmx6 -c u=fd00:ffff:ffff:ffff::/64 u=fd01:ffff:ffff::/48
323 30 Axel Neumann
</pre>
324 30 Axel Neumann
325 30 Axel Neumann
An already active announcement can be removed by preceeding the network with the '-' char:
326 30 Axel Neumann
<pre>
327 30 Axel Neumann
bmx6 -c u=-fd00:ffff:ffff:ffff::/64
328 30 Axel Neumann
</pre>
329 30 Axel Neumann
330 30 Axel Neumann
Before bmx6 accepts a dynamically configured UHNA announcement it checks if this UHNA is not overlapping with an already existing UHNA announcement form another node.
331 30 Axel Neumann
If this is the case the configuration will fail.
332 30 Axel Neumann
To check if a chain of dynamic commands would be accepted by a bmx6 daemon without actually applying it, the --test command may follow the --connect /-c command.
333 30 Axel Neumann
334 30 Axel Neumann
335 26 Axel Neumann
336 29 Axel Neumann
h2. Tunnel Announcements
337 26 Axel Neumann
338 27 Axel Neumann
339 27 Axel Neumann
Tunnel announcements offer an alternative mechanism to propagate routes. 
340 32 Axel Neumann
Tunnel announcements are currently only implemented for Bmx6-IPv6 mode. However, in IPv6 mode IPv6 and IPv4 networks can be announced.
341 1 Pau Escrich
In contrast to UHNAs, using tunnel announcements, the same or overlapping networks can be announced from different nodes.
342 27 Axel Neumann
Tunnel announcements are an offer from the originating node to other nodes. Other nodes can take the offer or not.
343 29 Axel Neumann
For example several nodes in a network may offer to share their DSL connection by doing a default-route (0.0.0.0/0 or ::/0) tunnel announcement.
344 1 Pau Escrich
Other nodes looking for a route to the internet (a default route) can choose between the multiple offers by establishing a tunnel to one specific of the offering nodes.
345 1 Pau Escrich
Therefore an unidirectional (onw-way) tunnel is established from the searching to the offering node.
346 46 Axel Neumann
At the searching node, the remote (outer) tunnel address is configured with an UHNA address (usually the primary address) of the offering node.
347 46 Axel Neumann
The networks advertised with the tunnel announcements are configured at the client side as routes via (into) the unidirectional tunnel.
348 1 Pau Escrich
349 1 Pau Escrich
This way, each node can make an individual choice between networks offered via tunnel announcements.
350 1 Pau Escrich
The automatic selection can be specified via a policy description that considers parameters such as advertised bandwidth, path metric, trust in specific GW nodes, hysteresis, ... .
351 29 Axel Neumann
Since an UHNA address is used as the outer (remote) tunnel address, the client end of the tunnel can be sure that all packets routed into the tunnel will indeed end up at the intended GW node (see [[Wiki#Unicast-Host-Network-Announcements-UHNA]]).
352 1 Pau Escrich
353 26 Axel Neumann
Using tunnel announcements for offering GW services to networks requires NO coordination with other nodes since its up to the client node to select an appropriate GW.
354 29 Axel Neumann
355 1 Pau Escrich
Technically, multiple tunnel announcements, each wrapped into a single tun6in6-net message, are aggregated into a tun4in6 or tun6in6-net frame and attached to the description of a node.
356 1 Pau Escrich
357 32 Axel Neumann
Tunnel announcements are also used for redistributing routes from other routing protocols (see [[Wiki#Quagga-Plugin]]) into a bmx6 zone. 
358 1 Pau Escrich
Therefore, each announcements message is decorated with a route-type field indicating the routing protocol that exported the route for being redistributed.
359 31 Axel Neumann
360 31 Axel Neumann
361 33 Axel Neumann
h3. Tunnel Configuration and Debugging
362 31 Axel Neumann
363 34 Axel Neumann
In general, a specific tunnel configuration is described from two perspectives:
364 32 Axel Neumann
* Gateway (GW) nodes or just GWs are offering GW services to networks via the advertizement of tunnel announcements and the provisioning of tunnel-end-points.
365 31 Axel Neumann
* GW-client nodes (or just GW-clients) that are searching for GWs with tunnel endpoints and routing services to networks.
366 1 Pau Escrich
367 34 Axel Neumann
A node can (and usually is) operating in both modes (as GW and as GW-client). 
368 34 Axel Neumann
But regarding a specific network each node is operating either in GW or in GW-client mode!
369 1 Pau Escrich
370 34 Axel Neumann
371 58 Axel Neumann
Remark: Since master commit f2fd75072f7dc4738069be6c69625419b9cc7767 the syntax for configuring tunnels has changed.
372 58 Axel Neumann
In the following the new syntax is explained. 
373 58 Axel Neumann
For the old syntax please use the build-in --help and --verboseHelp of the binary you are using
374 58 Axel Neumann
375 58 Axel Neumann
376 1 Pau Escrich
h4. Gateway Nodes
377 1 Pau Escrich
378 58 Axel Neumann
The advertisement of a tunnel endpoint to a network can be configured with the --tunIn=<arbitrary name>  and /network=<network> argument and an optional bandwidth specification (given as bits per second) using the /bandwidth or /b sub parameter.
379 58 Axel Neumann
Announcement can be removed by preceeding the name argument with a '-' char. 
380 33 Axel Neumann
The configuration can be done during daemon startup or dynamically (using --connect / -c parameter). 
381 1 Pau Escrich
382 1 Pau Escrich
The following command dynamically configures the advertisement of the following routes:
383 33 Axel Neumann
* An IPv4 default route 0.0.0.0/0 with a bandwidth of 32 Mbps.
384 58 Axel Neumann
* A more specific route to 10.10.0.0/16 with a bandwidth of 10 Mbps (could be a local v4 Network).
385 33 Axel Neumann
* An IPv6 route to the [RFC 4291] designated 2000::/3 global unicast address space with a bandwidth of 16 Mbps.
386 58 Axel Neumann
* A more specific route to the 2012:1234::/32 IPv6 space at 10 Mbps (could be a local v6 Network).
387 32 Axel Neumann
388 1 Pau Escrich
<pre>
389 58 Axel Neumann
bmx6 -c tunIn=def4Offer /n=0.0.0.0/0 /b=32000000  tunIn=local4 /n=10.10.0.0/16 /b=10000000  tunIn=def6Offer /n=2000::/3 /b=16000000  tunIn=local6 /n=2012:1234::/32 /b=10000000
390 1 Pau Escrich
</pre>
391 1 Pau Escrich
392 34 Axel Neumann
One aspect that must be considered when configuring GW nodes is that tunnels are unidirectional from the GW client to the GW.
393 34 Axel Neumann
But clients usually also need a route back from the GW to the client to allow a bidirectional communication.
394 1 Pau Escrich
395 34 Axel Neumann
One (however not recommended) option would be that GW clients are using their primary address as source address for all packets routed into the GW tunnel because a route from the GW to the GW-client via the client's primary address already exist. However, by default, the client's primary address is an autoconfigured ULA address which is not routable outside the bmx6 network. Also the primary address is either an IPv4 or an IPv6 address and can only be used to route to a corresponding destination network.
396 1 Pau Escrich
397 34 Axel Neumann
The recommended procedure to let clients use addresses that are routable outside of the bmx6 cloud is that also GW client nodes advertize a host-address via UHNA or tunnel announcements. In the latter (recommended) case, the client node also appears as a GW node to its private address space used for communication with other remote networks. To support this recommended case, the GW node must also be configured as a GW client searching for tunnel announcements from it's potential GW-client nodes to their (rather small) private (but outside routable) address space. The details for such configuration are described in the following section. 
398 34 Axel Neumann
However, for completeness a simple configuration for the GW-node to search for back routes to clients is given here. The following commands essentially configures a GW node to:
399 45 Axel Neumann
* use the IP addresses 10.254.10.1 and 2012:1234:5678:90ab::1 for tunnel traffic
400 46 Axel Neumann
* search and automatically configure back-wards tunnel to nodes that advertise an IPv4 prefix with a minimum length of 24 and are within the range of 10.254.0.0/16
401 45 Axel Neumann
* search and automatically configure back-wards tunnel to nodes that advertise an IPv6 prefix with a minimum length of 64 and are within the range of 2012:1234:5678::/48
402 1 Pau Escrich
403 34 Axel Neumann
<pre>
404 46 Axel Neumann
bmx6 -c tun4Address=10.254.10.1/32 tun6Address=2012:1234:5678:1::1/64 
405 46 Axel Neumann
bmx6 -c tunOut=v4Nodes /network=10.254.0.0/16 /minPrefixLen=24
406 46 Axel Neumann
bmx6 -c tunOut=v6Nodes /network=2012:1234:5678::/48 /minPrefixLen=64
407 34 Axel Neumann
</pre>
408 34 Axel Neumann
409 46 Axel Neumann
For more information please see [[Wiki#Gateway-Client-Nodes]].
410 34 Axel Neumann
411 34 Axel Neumann
412 34 Axel Neumann
413 1 Pau Escrich
h4. Gateway-Client Nodes
414 33 Axel Neumann
415 1 Pau Escrich
The configuration of GW clients can be simple but also, depending on the preferences of a desired GW-selection policy, very complex.
416 1 Pau Escrich
417 1 Pau Escrich
A general requirement for GW clients is the configuration of source addresses for all outgoing tunnels.
418 1 Pau Escrich
At least one network address must be configured for IPv6 and/or IPv4 tunnels using the the --tun4Address and/or --tun6Address parameters.
419 46 Axel Neumann
The specified network address will automatically be advertized as tunnel announcements, allowing the GW client to be reachable via the given addresses.
420 1 Pau Escrich
Thereby, each GW client node is also a GW node to its own (usually small) tunnel address space.
421 1 Pau Escrich
The selection of this address should be coordinated with GW administrators since (depending on the GW connection to other networks) only specific addresses are routable and considered to be originated from the bmx6 cloud.
422 1 Pau Escrich
423 46 Axel Neumann
In the following simple example a GW-client node is:
424 46 Axel Neumann
* specifying its own tunnel addresses for IPv4 and IPv6
425 46 Axel Neumann
* searching for any other kind of offered IPv4 and v6 tunnels
426 1 Pau Escrich
427 46 Axel Neumann
<pre>
428 46 Axel Neumann
bmx6 -c tun4Address=10.254.10.123/32 tun6Address=2012:1234:5678:123::1/64 
429 46 Axel Neumann
bmx6 -c tunOut=v4Default /network=0.0.0.0/0 tunOut=v6Default /network=::/0
430 46 Axel Neumann
</pre>
431 46 Axel Neumann
432 46 Axel Neumann
433 46 Axel Neumann
The disadvantage of the above configured tunnel selection policy is that offered tunnels are selected based on the path metric in the bmx6 cloud, ignoring the prefix-length of announced tunnels (routes that are more specific than others).
434 46 Axel Neumann
435 46 Axel Neumann
Imagine the following address assignment policy for the IPv4. The general idea can be straight translated to IPv6.
436 46 Axel Neumann
* Most nodes in the mesh cloud announce their private address ranges with a prefix length equal or larger than 24 and somewhere in the range of 10.254.0.0/16. Announcements of this type should always be preferred, even if any of the following announced types has a better end-to-end metric.
437 46 Axel Neumann
438 46 Axel Neumann
* Some BGP GW nodes are connected to other mesh clouds/areas of the same overall community network. These clouds are operating in a different IPv4 range (than 10.254.0.0/16) but always somewhere in the range of 10.0.0.0/8. Route announcements of this type should be preferred over the announcement of a default route. 
439 46 Axel Neumann
440 46 Axel Neumann
* Some DSL GW nodes are offering to share their DSL line and are announcing a default route (0.0.0.0/0). Only default route announcements from two well known GWs (with hostname pepe and paula) are acceptible. To mitigate the effects of GW switching if both GWs show a similar end-to-end metric a GW switch should only happen if the other GW is at least 30% better.
441 46 Axel Neumann
442 46 Axel Neumann
The following configuration configures a GW client respectively:
443 46 Axel Neumann
444 46 Axel Neumann
<pre>
445 46 Axel Neumann
bmx6 -c tun4Address=10.254.10.123/32
446 46 Axel Neumann
bmx6 -c tunOut=v4Nodes /network=10.254.0.0/16 /minPrefixLen=24 /ipMetric=2001
447 46 Axel Neumann
bmx6 -c tunOut=v4Clouds /network=10.0.0.0/8 /maxPrefixLen=16 bgp=1 /ipMetric=2002
448 46 Axel Neumann
bmx6 -c tunOut=-v4Default # revert the above configured v4 tunnel search
449 46 Axel Neumann
bmx6 -c tunOut=v4DefaultPepe  /network=0.0.0.0/0 /maxPrefixLen=0 /name=pepe  /hysteresis=30 /ipMetric=2003
450 46 Axel Neumann
bmx6 -c tunOut=v4DefaultPaula /network=0.0.0.0/0 /maxPrefixLen=0 /name=paula /hysteresis=30 /ipMetric=2003
451 46 Axel Neumann
</pre>
452 1 Pau Escrich
453 33 Axel Neumann
454 33 Axel Neumann
h4. Tunnel Status Information
455 33 Axel Neumann
456 36 Axel Neumann
Tunnel status information can be accessed with the --tunnels parameters.
457 29 Axel Neumann
458 10 Axel Neumann
459 1 Pau Escrich
460 1 Pau Escrich
461 1 Pau Escrich
h2. Bmx6 Plugins
462 1 Pau Escrich
463 36 Axel Neumann
h3. Compile and Install
464 1 Pau Escrich
465 36 Axel Neumann
To compile and install bmx6 daemon and all bmx6 plugins simply do:
466 36 Axel Neumann
<pre>
467 36 Axel Neumann
make build_all
468 36 Axel Neumann
sudo make install_all
469 36 Axel Neumann
</pre>
470 1 Pau Escrich
471 36 Axel Neumann
However. specific requirements may need to be fulfilled for some plugins in order to compile correctly.
472 36 Axel Neumann
These requirements are described in the corresponding plugin section.
473 32 Axel Neumann
474 32 Axel Neumann
475 1 Pau Escrich
476 36 Axel Neumann
h2. Config Plugin
477 1 Pau Escrich
478 8 Axel Neumann
479 36 Axel Neumann
h3. Requirements
480 1 Pau Escrich
481 8 Axel Neumann
uci libs are needed for the bmx6-config plugin.
482 8 Axel Neumann
To install it do:
483 1 Pau Escrich
<pre>
484 8 Axel Neumann
wget http://downloads.openwrt.org/sources/uci-0.7.5.tar.gz
485 8 Axel Neumann
tar xzvf uci-0.7.5.tar.gz
486 8 Axel Neumann
cd uci-0.7.5
487 1 Pau Escrich
make
488 8 Axel Neumann
sudo make install
489 8 Axel Neumann
</pre>
490 1 Pau Escrich
491 8 Axel Neumann
Depending on your system there happens to be an error during compilation.
492 8 Axel Neumann
Then edit cli.c and change line 465 to: @ char *argv[MAX_ARGS+2]; @
493 8 Axel Neumann
494 36 Axel Neumann
h3. Compile and Install
495 8 Axel Neumann
496 8 Axel Neumann
<pre>
497 36 Axel Neumann
make -C lib/bmx6_uci_config/ 
498 36 Axel Neumann
sudo make -C lib/bmx6_uci_config/ install
499 8 Axel Neumann
</pre>
500 8 Axel Neumann
501 8 Axel Neumann
502 36 Axel Neumann
h3. Usage
503 8 Axel Neumann
504 8 Axel Neumann
505 8 Axel Neumann
506 36 Axel Neumann
h2. Json Plugin
507 8 Axel Neumann
508 8 Axel Neumann
509 36 Axel Neumann
h3. Requirements
510 1 Pau Escrich
511 8 Axel Neumann
* json-c for bmx6_json plugin (debian package: libjson0 libjson0-dev)
512 1 Pau Escrich
513 8 Axel Neumann
514 1 Pau Escrich
json-c developer libs are needed!
515 8 Axel Neumann
For further reading check: http://json.org/ or https://github.com/jehiah/json-c
516 8 Axel Neumann
517 8 Axel Neumann
Note for debian sid:
518 8 Axel Neumann
The debian package libjson0-dev 0.10-1 seems to miss the file /usr/include/json/json_object_iterator.h
519 8 Axel Neumann
Manually copying it from the below mentioned json-c_0.10.orig.tar.gz archive helps.
520 8 Axel Neumann
521 8 Axel Neumann
522 8 Axel Neumann
To install manually (only if NOT installed via debian or other package management system):
523 8 Axel Neumann
<pre>
524 8 Axel Neumann
wget http://ftp.de.debian.org/debian/pool/main/j/json-c/json-c_0.10.orig.tar.gz
525 8 Axel Neumann
tar xzvf json-c_0.10.orig.tar.gz
526 1 Pau Escrich
cd json-c..
527 8 Axel Neumann
./configure ; make ; make install; ldconfig
528 8 Axel Neumann
</pre>
529 8 Axel Neumann
530 8 Axel Neumann
531 36 Axel Neumann
h3. Compile and Install
532 8 Axel Neumann
533 36 Axel Neumann
To compile and install only the  bmx6 json plugins:
534 1 Pau Escrich
<pre>
535 36 Axel Neumann
make -C lib/bmx6_json/ 
536 36 Axel Neumann
sudo make -C lib/bmx6_json/ install
537 8 Axel Neumann
</pre>
538 8 Axel Neumann
539 8 Axel Neumann
540 36 Axel Neumann
h3. Usage
541 3 Axel Neumann
542 35 Axel Neumann
543 35 Axel Neumann
544 36 Axel Neumann
h2. SMS Plugin
545 35 Axel Neumann
546 47 Pau Escrich
This plug-in uses routing packets to transmit any information from one node to the
547 47 Pau Escrich
whole network. The good point is that propagation works even if there is no continuous data-
548 47 Pau Escrich
path. Even though the WiFi network is under bad conditions (because the Wireless noise,
549 47 Pau Escrich
distance between nodes, etc...), the data will be propagated. However in the current implemen-
550 48 Simó Albert i Beltran
tation, there exist a maximum size limit of 240 Bytes for each file.
551 47 Pau Escrich
552 47 Pau Escrich
The API of the sms plug-in is very simple. It simply clones the content of one or more files
553 47 Pau Escrich
given by one node to all other nodes. All other nodes can do the same. Once started, each
554 48 Simó Albert i Beltran
node will have two directories:/var/run/bmx6/sms/rcvdSms and /var/run/bmx6/sms/sendSms. Files
555 48 Simó Albert i Beltran
put into the sendSms folder will be cloned to all other nodes inside rcvdSms folder.
556 47 Pau Escrich
QMP is using this feature for several things. The positioning Map information is transmitted
557 47 Pau Escrich
using it. There is a chat in web interface which uses it too. And in the future we are planning
558 47 Pau Escrich
to use it for more purposes like statistics, captive portal, MAC filter rules, etc...
559 35 Axel Neumann
560 35 Axel Neumann
561 36 Axel Neumann
h2. Quagga Plugin
562 35 Axel Neumann
563 35 Axel Neumann
The bmx6 quagga plugin can be used to exchange routes with a quagga/zebra daemon.
564 35 Axel Neumann
Both, export and redistribution of routes is supported.
565 35 Axel Neumann
566 35 Axel Neumann
567 36 Axel Neumann
h3. Requirements, Compile, and Install
568 35 Axel Neumann
569 41 Axel Neumann
h4. Quagga
570 1 Pau Escrich
571 41 Axel Neumann
Quagga version 0.99.21 must be patched for bmx6 support.
572 41 Axel Neumann
573 41 Axel Neumann
The bmx6 directory lib/bmx6_quagga/patches/ contains patches to enable quagga for bmx6 support.
574 41 Axel Neumann
The following example provides instructions for obtaining, patching, compiling, and installing quagga:
575 41 Axel Neumann
576 41 Axel Neumann
<pre>
577 41 Axel Neumann
wget http://download.savannah.gnu.org/releases/quagga/quagga-0.99.21.tar.gz
578 41 Axel Neumann
tar xzvf quagga-0.99.21.tar.gz
579 41 Axel Neumann
cd quagga-0.99.21
580 41 Axel Neumann
patch -p1 < ../bmx6/lib/bmx6_quagga/patches/quagga-0.99.21.tar.diff
581 41 Axel Neumann
./configure
582 41 Axel Neumann
make
583 41 Axel Neumann
sudo make install
584 41 Axel Neumann
</pre>
585 41 Axel Neumann
586 41 Axel Neumann
For further instructions to obtain, patch, compile, and install quagga please have a look at:
587 1 Pau Escrich
the file lib/bmx6_quagga/patches/README in the bmx6 sources.
588 1 Pau Escrich
589 41 Axel Neumann
h4. Bmx6
590 41 Axel Neumann
591 35 Axel Neumann
To compile and install the bmx6 part of the quagga plugin simply do:
592 35 Axel Neumann
<pre>
593 36 Axel Neumann
make -C lib/bmx6_quagga/ 
594 36 Axel Neumann
sudo make -C lib/bmx6_quagga/ install
595 2 Pau Escrich
</pre>
596 1 Pau Escrich
597 36 Axel Neumann
598 37 Axel Neumann
h3. Usage
599 38 Axel Neumann
600 38 Axel Neumann
To use the bmx6 quagga plugin it must be loaded during bmx6 daemon startup with the @ plugin=bmx6_quagga.so @ argument. 
601 38 Axel Neumann
Alternatively a plugin section can be defined in the bmx6 config file like this:
602 38 Axel Neumann
<pre>
603 38 Axel Neumann
config 'plugin'
604 38 Axel Neumann
        option 'plugin' 'bmx6_quagga.so'
605 38 Axel Neumann
</pre>
606 38 Axel Neumann
607 38 Axel Neumann
Once the plugin is successfully loaded, the bmx6 daemon will try to connect with the zebra process (via the ZAPI socket) 
608 38 Axel Neumann
and new parameters for exchanging routes with quagga/zebra daemon are enabled.
609 38 Axel Neumann
610 38 Axel Neumann
A quick documentation of the quagga-related parameters is available via the --help and --verboseHelp option.
611 38 Axel Neumann
If the quagga-enabled daemon is already running @ bmc6 -c verboseHelp /r=1 @ will print all currently supported parameters.
612 1 Pau Escrich
613 1 Pau Escrich
614 39 Axel Neumann
615 39 Axel Neumann
616 41 Axel Neumann
h3. Redistributing routes (from quagga/zebra to bmx6)
617 39 Axel Neumann
618 39 Axel Neumann
Redistribution of routes is configurable with the --redistribute parameter.
619 38 Axel Neumann
Similar to the --tunOutNet parameter,  --redistribute must be given with an arbitrary name for referencing to a specific redistribution directive and further sub-criterias.
620 38 Axel Neumann
621 38 Axel Neumann
Further mandatory sub-parameters are /bandwidth and at least one (to-be redistributed route type).
622 38 Axel Neumann
The following route types exist:
623 38 Axel Neumann
<pre>
624 38 Axel Neumann
  /system <VAL>                          def: 0       range: [ 0 , 1 ]
625 38 Axel Neumann
  /kernel <VAL>                          def: 0       range: [ 0 , 1 ]
626 38 Axel Neumann
  /connect <VAL>                         def: 0       range: [ 0 , 1 ]
627 38 Axel Neumann
  /rip <VAL>                             def: 0       range: [ 0 , 1 ]
628 38 Axel Neumann
  /ripng <VAL>                           def: 0       range: [ 0 , 1 ]
629 38 Axel Neumann
  /ospf <VAL>                            def: 0       range: [ 0 , 1 ]
630 38 Axel Neumann
  /ospf6 <VAL>                           def: 0       range: [ 0 , 1 ]
631 38 Axel Neumann
  /isis <VAL>                            def: 0       range: [ 0 , 1 ]
632 38 Axel Neumann
  /bgp <VAL>                             def: 0       range: [ 0 , 1 ]
633 38 Axel Neumann
  /babel <VAL>                           def: 0       range: [ 0 , 1 ]
634 38 Axel Neumann
  /hsls <VAL>                            def: 0       range: [ 0 , 1 ]
635 38 Axel Neumann
  /olsr <VAL>                            def: 0       range: [ 0 , 1 ]
636 38 Axel Neumann
  /batman <VAL>                          def: 0       range: [ 0 , 1 ]
637 38 Axel Neumann
</pre>
638 38 Axel Neumann
639 1 Pau Escrich
Only quagga/zebra routes types that are explicitly specified will be redistributed to the bmx6 network.
640 38 Axel Neumann
In addition, one usually wants to filter out networks from being redistributed based on their prefix.
641 38 Axel Neumann
Therefore the sub parameters /network, /minPrefixLen, and /maxPrefixLen can be used in the same way as for the --tunOutNet parameter.
642 38 Axel Neumann
643 41 Axel Neumann
h4. Route Aggregation
644 40 Axel Neumann
645 1 Pau Escrich
By default, maximum aggregation of to-be redistributed routes is enabled.
646 40 Axel Neumann
This means that to-be redistributed neighboring and overlapping networks with the same route type and bandwidth are aggregated if possible.
647 40 Axel Neumann
The extend of aggregation can be controlled with the /aggregatePrefixLen sub-parameter.
648 40 Axel Neumann
The given value limits the aggregation to a minimum prefix length.
649 40 Axel Neumann
The default of 0 defines maximum aggregation whenever possible which may not be wanted.
650 40 Axel Neumann
651 45 Axel Neumann
For example the GW node may be configured to redistribute the following routes:
652 40 Axel Neumann
653 45 Axel Neumann
* 10.254.20.1/32
654 45 Axel Neumann
* 10.254.20.0/24
655 45 Axel Neumann
* 10.254.21.0/24
656 45 Axel Neumann
* 10.254.22.0/24
657 40 Axel Neumann
* 0.0.0.0/0
658 40 Axel Neumann
659 40 Axel Neumann
The following bmx6 configuration would aggregate all 5 routes into a single 0.0.0.0/0 tunnel announcement since 0.0.0.0/0 is overlapping any other more-specific route:
660 40 Axel Neumann
<pre>
661 40 Axel Neumann
redistribute=ipv4 /bandwidth=10000000 /kernel=1 /aggregatePrefixLen=0
662 40 Axel Neumann
</pre>
663 40 Axel Neumann
664 40 Axel Neumann
This aggregation may be too generic since GW-client nodes are usually looking for more specific routes to specific destination.
665 40 Axel Neumann
The following configuration would aggregate only routes with a prefix-len larger than 16:
666 40 Axel Neumann
667 40 Axel Neumann
<pre>
668 40 Axel Neumann
redistribute=ipv4 /bandwidth=10000000 /kernel=1 /aggregatePrefixLen=16
669 40 Axel Neumann
</pre>
670 40 Axel Neumann
671 40 Axel Neumann
Resulting in the following aggregations:
672 45 Axel Neumann
* 10.254.20.1/32: Aggregated (sub-network of 10.254.20.0/24)! NOT announced!
673 45 Axel Neumann
* 10.254.20.0/24: Aggregated with 10.254.21.0/24! Announced as 10.254.20.0/23 
674 45 Axel Neumann
* 10.254.21.0/24: Aggregated with 10.254.20.0/24! Announced as 10.254.20.0/23 
675 45 Axel Neumann
* 10.254.22.0/24: Not aggregatable into larger network! Announced as is!
676 40 Axel Neumann
* 0.0.0.0/0:      Not aggregated (prefix-len smaller than /aggregatePrefixLen=16)! Announced as is!
677 40 Axel Neumann
678 38 Axel Neumann
679 38 Axel Neumann
680 41 Axel Neumann
h3. Exporting routes (from bmx6 to quagga/zebra)
681 42 Axel Neumann
682 42 Axel Neumann
683 42 Axel Neumann
For exporting routes received as bmx6 tunnel announcements, the /exportDistance can be used as a subparameter of the --tunOut parameter.
684 42 Axel Neumann
The default value of /exportDistance is 256 which is considered as infinit or disabled.
685 42 Axel Neumann
Any lower configured value will export the corresponding outgoing tunnel (once it becomes active) with the given distance to quagga/zebra.
686 42 Axel Neumann
687 42 Axel Neumann
A GW node usually only wants to export bmx6 routes that were announced by other (non-GW) bmx6 nodes in the mesh.
688 42 Axel Neumann
689 43 Axel Neumann
In the following example there are 3 other bmx6 nodes, each tunnel announcing a private /32 network.
690 1 Pau Escrich
691 43 Axel Neumann
The given parametrization configures a GW node to search, establish related tunnels, and export all tunnel announcements for other bmx6 daemons that have a prefix-length smaller that /27 and fall into the network range of 10.254.0.0/16:
692 43 Axel Neumann
693 1 Pau Escrich
<pre>
694 43 Axel Neumann
plugin=bmx6_quagga.so tunOut=privV4Nets /network=10.254.0.0/16 /minPrefixLen=27 /exportDistance=0
695 43 Axel Neumann
</pre>
696 43 Axel Neumann
697 43 Axel Neumann
Checking the export from the quagga perspective show the following:
698 43 Axel Neumann
<pre>
699 43 Axel Neumann
root@mlc1001:~# telnet localhost zebra
700 43 Axel Neumann
Trying ::1...
701 43 Axel Neumann
Trying 127.0.0.1...
702 43 Axel Neumann
Connected to localhost.
703 43 Axel Neumann
Escape character is '^]'.
704 43 Axel Neumann
705 43 Axel Neumann
Hello, this is Quagga (version 0.99.21).
706 43 Axel Neumann
Copyright 1996-2005 Kunihiro Ishiguro, et al.
707 43 Axel Neumann
708 43 Axel Neumann
User Access Verification
709 43 Axel Neumann
Password:
710 43 Axel Neumann
711 43 Axel Neumann
Router> show ip route
712 43 Axel Neumann
Codes: K - kernel route, C - connected, S - static, R - RIP,
713 43 Axel Neumann
       O - OSPF, I - IS-IS, B - BGP, H - HSLS, o - OLSR,
714 43 Axel Neumann
       b - BATMAN, x - BMX6, A - Babel,
715 43 Axel Neumann
       > - selected route, * - FIB route
716 43 Axel Neumann
717 43 Axel Neumann
K>* 0.0.0.0/0 via 10.0.0.1, eth0
718 43 Axel Neumann
C>* 10.0.0.0/11 is directly connected, eth0
719 43 Axel Neumann
x>* 10.254.10.0/32 [0/1024] is directly connected, bmx6_out0000, 00:03:24
720 43 Axel Neumann
C * 10.254.10.1/32 is directly connected, bmx6_out0003
721 43 Axel Neumann
C * 10.254.10.1/32 is directly connected, bmx6_out0002
722 43 Axel Neumann
C * 10.254.10.1/32 is directly connected, bmx6_out0001
723 43 Axel Neumann
C * 10.254.10.1/32 is directly connected, bmx6_out0000
724 43 Axel Neumann
C>* 10.254.10.1/32 is directly connected, bmx6_in0000
725 43 Axel Neumann
x>* 10.254.10.2/32 [0/1024] is directly connected, bmx6_out0001, 00:03:24
726 43 Axel Neumann
x>* 10.254.10.3/32 [0/1024] is directly connected, bmx6_out0002, 00:03:24
727 43 Axel Neumann
x>* 10.254.10.4/32 [0/1024] is directly connected, bmx6_out0003, 00:03:24
728 43 Axel Neumann
C>* 127.0.0.0/8 is directly connected, lo
729 42 Axel Neumann
</pre>