]> git.ipfire.org Git - thirdparty/lldpd.git/blame - README.md
tests/integration: reduce the number of emulated neighbor
[thirdparty/lldpd.git] / README.md
CommitLineData
43c02e7b 1lldpd: implementation of IEEE 802.1ab (LLDP)
00402c76 2============================================
43c02e7b 3
ce05de54
VB
4[![Build Status](https://secure.travis-ci.org/vincentbernat/lldpd.png?branch=master)](http://travis-ci.org/vincentbernat/lldpd)
5
bf74bdaf 6 http://vincentbernat.github.com/lldpd/
f0c42642 7
4b292b55
VB
8Features
9--------
10
43c02e7b
VB
11LLDP (Link Layer Discovery Protocol) is an industry standard protocol
12designed to supplant proprietary Link-Layer protocols such as
13Extreme's EDP (Extreme Discovery Protocol) and CDP (Cisco Discovery
14Protocol). The goal of LLDP is to provide an inter-vendor compatible
15mechanism to deliver Link-Layer notifications to adjacent network
16devices.
17
18lldpd implements both reception and sending. It also implements an
19SNMP subagent for net-snmp to get local and remote LLDP
f7f82e1e 20information. The LLDP-MIB is partially implemented but the most useful
b193e97e 21tables are here. lldpd also partially implements LLDP-MED.
43c02e7b 22
f7f82e1e 23lldpd supports bridge, vlan and bonding.
c0cdd011 24
2b35e2d0
VB
25The following OS are supported:
26
27 * FreeBSD
28 * GNU/Linux
b9d81025 29 * OS X
2b35e2d0
VB
30 * NetBSD
31 * OpenBSD
f7f82e1e 32 * Solaris
2b35e2d0 33
4b292b55
VB
34Installation
35------------
36
ba666663
VB
37For general instructions
38[see the website](http://vincentbernat.github.io/lldpd/installation.html).
39
40To compile lldpd from sources, use the following:
00402c76
VB
41
42 ./configure
43 make
44 sudo make install
52ac3f37 45
13dce469
VB
46lldpd uses privilege separation to increase its security. Two
47processes, one running as root and doing minimal stuff and the other
48running as an unprivileged user into a chroot doing most of the stuff,
00402c76
VB
49are cooperating. You need to create a user called `_lldpd` in a group
50`_lldpd` (this can be change with `./configure`). You also need to
ba666663
VB
51create an empty directory `/usr/local/var/run/lldpd` (it needs to be
52owned by root, not `_lldpd`!). If you get fuzzy timestamps from
53syslog, copy `/etc/locatime` into the chroot.
13dce469 54
2b35e2d0 55`lldpcli` lets one query information collected through the command
33aced7a 56line. If you don't want to run it as root, just install it setuid or
00402c76 57setgid `_lldpd`.
43c02e7b 58
b9d81025 59Installation (OS X)
e66b7f34
VB
60-----------------------
61
b9d81025 62The same procedure as above applies for OS X. However, there are
92f5db08 63simpler alternatives:
29e300e5 64
92f5db08 65 1. Use [Homebrew](http://mxcl.github.io/homebrew/):
e66b7f34 66
92f5db08
VB
67 brew install lldpd
68 # Or, for the latest version:
69 brew install https://raw.github.com/vincentbernat/lldpd/master/osx/lldpd.rb
b708297c 70
b9d81025 71 2. Build an OS X installer package which should work on the same
737afb35 72 version of OS X:
92f5db08 73
462d8b6c 74 mkdir build && cd build
87bb9a1b 75 ../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
2cbd5b62 76 --without-json --without-snmp
737afb35 77 make -C osx pkg
b708297c 78
b9d81025 79 If you want to compile for an older version of OS X, you need
462d8b6c
VB
80 to find the right SDK and issues commands like those:
81
82 SDK=/Developer/SDKs/MacOSX10.6.sdk
83 mkdir build && cd build
87bb9a1b 84 ../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
db04d99f 85 --without-json --without-snmp \
462d8b6c
VB
86 CFLAGS="-mmacosx-version-min=10.6 -isysroot $SDK" \
87 LDFLAGS="-mmacosx-version-min=10.6 -isysroot $SDK"
737afb35 88 make -C osx pkg
462d8b6c 89
6b7d841c
VB
90 With recent SDK, you don't need to specify an alternate SDK. They
91 are organized in a way that should enable compatibility with older
92 versions of OSX:
93
94 mkdir build && cd build
95 ../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
96 --without-json --without-snmp \
97 CFLAGS="-mmacosx-version-min=10.9" \
98 LDFLAGS="-mmacosx-version-min=10.9"
99 make -C osx pkg
100
101 You can check with `otool -l` that you got what you expected in
102 term of supported versions.
103
92f5db08
VB
104If you don't follow the above procedures, you will have to create the
105user/group `_lldpd`. Have a look at how this is done in
106`osx/scripts/postinstall`.
b708297c 107
8b0ca98e
VB
108Installation (Android)
109----------------------
110
111You need to download [Android NDK][]. Once unpacked, you can generate
112a toolchain using the following command:
113
114 ./build/tools/make-standalone-toolchain.sh \
115 --platform=android-9 \
116 --arch=arm \
117 --install-dir=../android-toolchain
118 export TOOLCHAIN=$PWD/../android-toolchain
119
120Then, you can build `lldpd` with the following commands:
121
122 mkdir build && cd build
123 export PATH=$PATH:$TOOLCHAIN/bin
124 ../configure \
125 --host=arm-linux-androideabi \
126 --with-sysroot=$TOOLCHAIN/sysroot
127
128[Android NDK]: http://developer.android.com/tools/sdk/ndk/index.html
129
4b292b55
VB
130Usage
131-----
132
031118c4
VB
133lldpd also implements CDP (Cisco Discovery Protocol), FDP (Foundry
134Discovery Protocol), SONMP (Nortel Discovery Protocol) and EDP
135(Extreme Discovery Protocol). However, recent versions of IOS should
136support LLDP and most Extreme stuff support LLDP. When a EDP, CDP or
137SONMP frame is received on a given interface, lldpd starts sending
138EDP, CDP, FDP or SONMP frame on this interface. Informations collected
139through EDP/CDP/FDP/SONMP are integrated with other informations and
2b35e2d0 140can be queried with `lldpcli` or through SNMP.
43c02e7b 141
c167357d
VB
142More information:
143 * http://en.wikipedia.org/wiki/Link_Layer_Discovery_Protocol
144 * http://standards.ieee.org/getieee802/download/802.1AB-2005.pdf
145 * http://wiki.wireshark.org/LinkLayerDiscoveryProtocol
146
147Compatibility with older kernels
148--------------------------------
149
150If you have a kernel older than Linux 2.6.39, you need to compile
151lldpd with `--enable-oldies` to enable some compatibility functions:
152otherwise, lldpd will only rely on Netlink to receive bridge, bond and
153VLAN information.
154
43c02e7b
VB
155For bonding, you need 2.6.24 (in previous version, PACKET_ORIGDEV
156affected only non multicast packets). See:
00402c76
VB
157
158 * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=80feaacb8a6400a9540a961b6743c69a5896b937
159 * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=8032b46489e50ef8f3992159abd0349b5b8e476c
43c02e7b 160
c8851c73 161Otherwise, a packet received on a bond will be affected to all
c167357d
VB
162interfaces of the bond. In this case, lldpd will affect a received
163randomly to one of the interface (so a neighbor may be affected to the
164wrong interface).
43c02e7b 165
0da01fd6 166On 2.6.27, we are able to receive packets on real interface for enslaved
21d89e7d 167devices. This allows one to get neighbor information on active/backup
43c02e7b
VB
168bonds. Without the 2.6.27, lldpd won't receive any information on
169inactive slaves. Here are the patchs (thanks to Joe Eykholt):
00402c76
VB
170
171 * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0d7a3681232f545c6a59f77e60f7667673ef0e93
172 * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=cc9bd5cebc0825e0fabc0186ab85806a0891104f
173 * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f982307f22db96201e41540295f24e8dcc10c78f
43c02e7b 174
63aebf55
VB
175On FreeBSD, only a recent 9 kernel (9.1 or more recent) will allow to
176send LLDP frames on enslaved devices. See this bug report for more
177information:
178
179 * http://www.freebsd.org/cgi/query-pr.cgi?pr=138620
180
c167357d 181Some devices (notably Cisco IOS) send frames tagged with the native
50724a52
VB
182VLAN while they should send them untagged. If your network card does
183not support accelerated VLAN, you will receive those frames as long as
184the corresponding interface exists (see below). However, if your
185network card handles VLAN encapsulation/decapsulation (check with
5f7d1cd5
VB
186`ethtool -k`), you need a recent kernel to be able to receive those
187frames without listening on all available VLAN. Starting from Linux
1882.6.27, lldpd is able to capture VLAN frames when VLAN acceleration is
189supported by the network card. Here is the patch:
49697208 190
50724a52
VB
191 * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=bc1d0411b804ad190cdadabac48a10067f17b9e6
192
193On some other versions, frames are sent on VLAN 1. If this is not the
194native VLAN and if your network card support accelerated VLAN, you
195need to subscribe to this VLAN as well. The Linux kernel does not
196provide any interface for this. The easiest way is to create the VLAN
197for each port:
5f7d1cd5
VB
198
199 ip link add link eth0 name eth0.1 type vlan id 1
200 ip link set up dev eth0.1
201
202You can check both cases using tcpdump:
203
204 tcpdump -epni eth0 ether host 01:80:c2:00:00:0e
205 tcpdump -eni eth0 ether host 01:80:c2:00:00:0e
206
207If the first command does not display received LLDP packets but the
208second one does, LLDP packets are likely encapsulated into a VLAN:
209
210 10:54:06.431154 f0:29:29:1d:7c:01 > 01:80:c2:00:00:0e, ethertype 802.1Q (0x8100), length 363: vlan 1, p 7, ethertype LLDP, LLDP, name SW-APP-D07.VTY, length 345
211
50724a52
VB
212In this case, just create VLAN 1 will fix the situation. There are
213other solutions:
214
215 1. Disable VLAN acceleration on the receive side (`ethtool -K eth0
216 rxvlan off`) but this may or may not work. Check if there are
217 similar properties that could apply with `ethtool -k eth0`.
f84199dd
VB
218 2. Put the interface in promiscuous mode with `ip link set
219 promisc on dev eth0`.
50724a52 220
f4da5f84
VB
221The last solution can be done directly by `lldpd` (on Linux only) by
222using the option `configure system interface promiscuous`.
223
50724a52 224On modern networks, the performance impact should be nonexistent.
5f7d1cd5 225
426ee11e
VB
226Development
227-----------
228
229During development, you may want to execute lldpd at its current
3bd5a878 230location instead of doing `make install`. The correct way to do this is
426ee11e
VB
231to issue the following command:
232
233 sudo libtool execute src/daemon/lldpd -L $PWD/src/client/lldpcli -d
234
235You can append any further arguments. If lldpd is unable to find
236`lldpcli` it will start in an unconfigured mode and won't send or
237accept LLDP frames.
238
3ca10086
VB
239You can use [afl](http://lcamtuf.coredump.cx/afl/) to test some
240aspects of lldpd. To test frame decoding, you can do something like
241that:
242
243 export AFL_USE_ASAN=1 # only on 32bit arch
244 ./configure CC=afl-gcc
245 make clean check
246 cd tests
247 mkdir inputs
248 mv *.pcap inputs
249 afl-fuzz -i inputs -o outputs ./decode @@
250
8cd1f2d0 251There is a general test suite with `make check`. It's also possible to
e0a84778
VB
252run integration tests. They need [py.test](http://pytest.org/latest/)
253and rely on Linux containers to be executed.
8cd1f2d0 254
4b292b55
VB
255Embedding
256---------
257
258To embed lldpd into an existing system, there are two point of entries:
259
260 1. If your system does not use standard Linux interface, you can
261 support additional interfaces by implementing the appropriate
e12c2365
VB
262 `struct lldpd_ops`. You can look at
263 `src/daemon/interfaces-linux.c` for examples. Also, have a look at
264 `interfaces_update()` which is responsible for discovering and
265 registering interfaces.
4b292b55 266
2b35e2d0 267 2. `lldpcli` provides a convenient way to query `lldpd`. It also
4b292b55
VB
268 comes with various outputs, including XML which allows one to
269 parse its output for integration and automation purpose. Another
270 way is to use SNMP support. A third way is to write your own
271 controller using `liblldpctl.so`. Its API is described in
272 `src/lib/lldpctl.h`. The custom binary protocol between
273 `liblldpctl.so` and `lldpd` is not stable. Therefore, the library
274 should always be shipped with `lldpd`. On the other hand, programs
275 using `liblldpctl.so` can rely on the classic ABI rules.
276
22f1ea46
VB
277Troubleshooting
278---------------
279
280You can use `tcpdump` to look after the packets received and send by
281`lldpd`. To look after LLDPU, use:
282
283 tcpdump -s0 -vv -pni eth0 ether dst 01:80:c2:00:00:0e
284
4b292b55
VB
285License
286-------
287
c882a2cf 288lldpd is distributed under the ISC license:
00402c76 289
51434125 290 > Permission to use, copy, modify, and/or distribute this software for any
00402c76
VB
291 > purpose with or without fee is hereby granted, provided that the above
292 > copyright notice and this permission notice appear in all copies.
293 >
294 > THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
295 > WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
296 > MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
297 > ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
298 > WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
299 > ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
300 > OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
35f6f4fb
VB
301
302Also, `lldpcli` will be linked to GNU Readline (which is GPL licensed)
303if available. To avoid this, use `--without-readline` as a configure
304option.