Projecte

General

Perfil

Wiki » Historial » Versió 18

Axel Neumann, 27-08-2012 09:30

1 6 Axel Neumann
{{>toc}}
2 1 Pau Escrich
3
4 8 Axel Neumann
h1. BMX6
5 6 Axel Neumann
6
Bmx6 is a routing protocol for Linux based operating systems.
7 1 Pau Escrich
The following intro provides kind of tutorial to get started.
8
9 8 Axel Neumann
h2. Installation
10 6 Axel Neumann
11 8 Axel Neumann
h3. Requirements
12 7 Axel Neumann
13 6 Axel Neumann
The following tools are needed to obtain, compile, and install bmx6
14
* git (debian package: git-core)
15
* gcc
16
* make
17
18
19 8 Axel Neumann
h3. Downloading
20 6 Axel Neumann
21
Latest development sources are available from bmx6 git repository
22
<pre>
23
git clone git://qmp.cat/bmx6.git
24
cd bmx6
25
</pre>
26
27 8 Axel Neumann
h3. Compile and Install
28 6 Axel Neumann
29 7 Axel Neumann
To only compile the main bmx6 daemon (no bmx6 plugins)
30 6 Axel Neumann
<pre>
31
make
32
sudo make install
33
</pre>
34
35
36 8 Axel Neumann
h2. Usage (hello mesh)
37 6 Axel Neumann
38 3 Axel Neumann
39
In its most simple configuration, the only required parameter are the interfaces names that should be used for meshing.
40
The following example starts bmx6 on interface wlan0:
41
<pre>
42 15 Axel Neumann
root@mlc1001:~# bmx6 dev=eth1
43 3 Axel Neumann
</pre>
44
45
However, to let this simple command work as expected also check the following basic requirements:
46
47 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 @ ).
48 3 Axel Neumann
49 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.
50 3 Axel Neumann
51 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 @)
52 3 Axel Neumann
53 9 Axel Neumann
If everything went fine bmx6 is running now, searching for neighboring bmx6 daemons via the configured link, and coordinates with them to learn about existence-of and routes-to all other bmx6 nodes in the network.
54
 
55 4 Axel Neumann
To access 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.
56 9 Axel Neumann
57 4 Axel Neumann
In the following, a few example will be discussed:
58
<pre>
59 1 Pau Escrich
root@mlc1001:~# bmx6 -c status
60
version        compatibility codeVersion globalId                     primaryIp                       myLocalId uptime     cpu nodes 
61 18 Axel Neumann
BMX6-0.1-alpha 16            9           mlc1001.7A7422752001EC4AC4C8 fd66:66:66:0:a2cd:efff:fe10:101 24100101  0:00:40:37 0.1 4
62 1 Pau Escrich
</pre>
63
64 18 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).
65 5 Axel Neumann
66 9 Axel Neumann
Typical types of accessible information are: status, interfaces, links, originators, descriptions, tunnels
67
These required types can be combined. Also the above given example shows kind of shortcut. The long argument would be
68
@ bmx6 connect show=status @. So a more informative case using the long form would be:
69 1 Pau Escrich
<pre>
70 9 Axel Neumann
root@mlc1001:~# bmx6 connect show=status show=interfaces show=links show=originators show=tunnels
71 1 Pau Escrich
status:
72 18 Axel Neumann
version        compatibility codeVersion globalId                     primaryIp                       myLocalId uptime     cpu nodes
73
BMX6-0.1-alpha 16            9           mlc1001.7A7422752001EC4AC4C8 fd66:66:66:0:a2cd:efff:fe10:101 06100101  0:00:53:19 0.3 4
74 15 Axel Neumann
interfaces:
75 18 Axel Neumann
devName state type     rateMin rateMax llocalIp                    globalIp                           multicastIp primary
76
eth1    UP    ethernet 1000M   1000M   fe80::a2cd:efff:fe10:101/64 fd66:66:66:0:a2cd:efff:fe10:101/64 ff02::2     1
77 15 Axel Neumann
links:
78 18 Axel Neumann
globalId                     llocalIp                 viaDev rxRate txRate bestTxLink routes wantsOgms nbLocalId
79
mlc1000.0AE58311046412F248CD fe80::a2cd:efff:fe10:1   eth1   100    100    1          1      1         9B100001
80
mlc1002.91DCF042934B5913BB00 fe80::a2cd:efff:fe10:201 eth1   100    100    1          2      1         BB100201
81 15 Axel Neumann
originators:
82 18 Axel Neumann
globalId                     blocked primaryIp                       routes viaIp                    viaDev metric lastDesc lastRef
83
mlc1000.0AE58311046412F248CD 0       fd66:66:66:0:a2cd:efff:fe10:1   1      fe80::a2cd:efff:fe10:1   eth1   999M   3193     3 
84
mlc1001.7A7422752001EC4AC4C8 0       fd66:66:66:0:a2cd:efff:fe10:101 0      ::                       ---    128G   3197     0
85
mlc1002.91DCF042934B5913BB00 0       fd66:66:66:0:a2cd:efff:fe10:201 1      fe80::a2cd:efff:fe10:201 eth1   999M   3196     3 
86
mlc1003.09E796BC491D386248C3 0       fd66:66:66:0:a2cd:efff:fe10:301 1      fe80::a2cd:efff:fe10:201 eth1   576M   22       3 
87 1 Pau Escrich
</pre>
88
89 9 Axel Neumann
Only if relevant information for a requested type is available it will be shown.
90
In this example no tunnels are configured nor offered by other nodes and therefore no tunnel information is shown.
91 1 Pau Escrich
92 9 Axel Neumann
The loop argument can be prepended to the connect argument to continuously show the requested information.
93
Many of the long arguments are usable via a short notation, like l for loop, c for connect, s for show, d for debug.
94
And there is another shortcut summarizing my current favorite information types via debug level 8
95
The following commands do the same as above: @ bmx6 -lc status interfaces links originators tunnels @ or just @ bmx6 -lcd8 @.
96 1 Pau Escrich
97 18 Axel Neumann
Description of the provided info:
98 14 Axel Neumann
* interfaces: Followed by one line per configured interface
99
** dev: Interface name
100
** state and type: Whether the interface is UP or DOWN and its assumed link-layer type.
101
** rateMin and rateMax: Min- and maximum transmit rates assumed for this interface.
102
** llocalIp: IPv6 link-local address (used as source address for all outgoing protocol data).
103
** globalIp: Autoconfigured address used for sending network traffic via this interface and which is propagated to other nodes.
104
** multicastIp: Multicast IP (used as destination address for all bmx6 protocol traffic send via this interface).
105
** primary: Indicates whether the global ip of this interface is used as primary ip for this daemon.
106
* links: Followed by one line per detected neighboring bmx6 node.
107 16 Axel Neumann
** globalId: GlobalId of that neighbor (see: [[Wiki#Global-ID]] ).
108 14 Axel Neumann
** llocalIp: Link-local IP of the neighbor's interface building the other side of the link.
109
** viaDev: Interface of this node for the link.
110
** rxRate: Measured receive rate in percent for the link.
111
** txRate: Measured transmit rate in percent for the link.
112
** bestTxLink: Indicates whether this link is the best link to a neighboring nodes.
113
** routes: Indicates for how much routes to other nodes this link is used.
114 1 Pau Escrich
** wantsOgms: Indicates whether the neighboring node has requested (this node) to propagate originator messsages (OGMs) via this link.
115
** nbLocalId: Neighbors local ID.
116
* originators: Followed by one line per aware originator in the network (including itself).
117
** globalId: Global Id of that node (see: [[Wiki#Global-ID]] ).
118
** blocked: Indicates whether this node is currently blocked (see: [[Wiki#Blocked]] ).
119
** primaryIp: The primary IP of that node. 
120
** routes: Number of potential routes towards this node.
121
** viaIp: Next hops link-local IP of the best route towards this node.
122
** viaDev: Outgoing interface of the best route towards this node.
123
** metric: The end to end path metric to this node
124
** lastDesc: Seconds since the last description update was received (see: [[Widi#Description]] )
125
** lastRef: Seconds since this node was referenced by any neighboring node (like last sign of life)
126
127
128 18 Axel Neumann
Quick summary of provided info:
129
* Node mlc1001 uses one wired interface (eth1) which is up and actively used for meshing.
130
* Node mlc1001 got aware of 2 neighbors and 4 nodes (originators) including itself.
131
* The link qualities (rx and tx rate) to its neighbors are perfect (100%) and actively used (bestTxLink)
132
* 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)
133
* 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).
134
135
The following network topology may be deduced from this information
136
137
@ mlc1000 --- mlc1001 --- mlc1002 - - - mlc1003 @
138
139
This could be verified using traceroute6 towards the primary IP of the other nodes.
140
141
Towards mlc1000 with primary IP fd66:66:66:0:a2cd:efff:fe10:1 shows one hop:
142
<pre>
143
root@mlc1001:~# traceroute6 -n -q 1 fd66:66:66:0:a2cd:efff:fe10:1
144
traceroute to fd66:66:66:0:a2cd:efff:fe10:1 (fd66:66:66:0:a2cd:efff:fe10:1), 30 hops max, 80 byte packets
145
 1  fd66:66:66:0:a2cd:efff:fe10:1  0.324 ms
146
</pre>
147
148
Towards mlc1002 with primary IP fd66:66:66:0:a2cd:efff:fe10:201 shows one hop:
149
<pre>
150
root@mlc1001:~# traceroute6 -n -q 1 fd66:66:66:0:a2cd:efff:fe10:201
151
traceroute to fd66:66:66:0:a2cd:efff:fe10:201 (fd66:66:66:0:a2cd:efff:fe10:201), 30 hops max, 80 byte packets
152
 1  fd66:66:66:0:a2cd:efff:fe10:201  0.302 ms
153
</pre>
154
155
Towards mlc1003 with primary IP fd66:66:66:0:a2cd:efff:fe10:301 shows two hops:
156
<pre>
157
root@mlc1001:~# traceroute6 -n -q 1 fd66:66:66:0:a2cd:efff:fe10:301
158
traceroute to fd66:66:66:0:a2cd:efff:fe10:301 (fd66:66:66:0:a2cd:efff:fe10:301), 30 hops max, 80 byte packets
159
 1  fd66:66:66:0:a2cd:efff:fe10:201  0.313 ms
160
 2  fd66:66:66:0:a2cd:efff:fe10:301  0.429 ms
161
</pre>
162 10 Axel Neumann
163
164
165
166
h2. Concepts
167 1 Pau Escrich
168
h3. Global ID
169 17 Axel Neumann
170
Each bmx6 node creates during its initialization (booting) a global ID for itself. 
171
This ID is created as a concatenation of the node's hostname and a random value.
172
In the above given example with node hostname: "mlc1001" the globalID is: mlc1001.7A7422752001EC4AC4C8
173
When the bmx6 daemon restarts the hostname will remain. But the rand part will change.
174
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.
175
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.
176 1 Pau Escrich
177 13 Axel Neumann
h3. Unicast Host Network Announcements (UHNA)
178
179
h3. Tunnel Announcements
180
181
h3. Descriptions
182
183 10 Axel Neumann
h3. Blocked
184
185
Nodes may be blocked by other nodes.
186
187
The decision for blocking another node is done locally based on the detection of duplicate claimed unique resources.
188
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 reason for such events is the rebooting of a node. Once the bmx6 daemon restarts it appears as a new node 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).
189
190
191
192
193
194 1 Pau Escrich
195
196
197
198
199
200 8 Axel Neumann
h2. Bmx6 Plugins
201 1 Pau Escrich
202
203 8 Axel Neumann
h3. Config Plugin
204 1 Pau Escrich
205
206 8 Axel Neumann
h4. Requirements
207 1 Pau Escrich
208 8 Axel Neumann
uci libs are needed for the bmx6-config plugin.
209
To install it do:
210
<pre>
211
wget http://downloads.openwrt.org/sources/uci-0.7.5.tar.gz
212
tar xzvf uci-0.7.5.tar.gz
213
cd uci-0.7.5
214
make
215
sudo make install
216
</pre>
217 1 Pau Escrich
218 8 Axel Neumann
Depending on your system there happens to be an error during compilation.
219
Then edit cli.c and change line 465 to: @ char *argv[MAX_ARGS+2]; @
220
221
h4. Compile and Install
222
223
To compile the bmx6 daemon and bmx6 plugins
224
<pre>
225
make build_all
226
sudo make install_all
227
</pre>
228
229
230
h4. Usage
231
232
233
234
h3. Json Plugin
235
236
237
h4. Requirements
238
239
* json-c for bmx6_json plugin (debian package: libjson0 libjson0-dev)
240
241
242
json-c developer libs are needed!
243
For further reading check: http://json.org/ or https://github.com/jehiah/json-c
244
245
Note for debian sid:
246
The debian package libjson0-dev 0.10-1 seems to miss the file /usr/include/json/json_object_iterator.h
247
Manually copying it from the below mentioned json-c_0.10.orig.tar.gz archive helps.
248
249
250
To install manually (only if NOT installed via debian or other package management system):
251
<pre>
252
wget http://ftp.de.debian.org/debian/pool/main/j/json-c/json-c_0.10.orig.tar.gz
253
tar xzvf json-c_0.10.orig.tar.gz
254
cd json-c..
255
./configure ; make ; make install; ldconfig
256
</pre>
257
258
259
h4. Compile and Install
260
261
To compile the bmx6 daemon and bmx6 plugins
262
<pre>
263
make build_all
264
sudo make install_all
265
</pre>
266
267
268
h4. Usage
269
270
271
272
h3. SMS Plugin
273
274
275
276
h3. Quagga Plugin
277
278
279 3 Axel Neumann
280
281
*Misc*
282
283
284 2 Pau Escrich
[[Tunnel]]