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