]> git.ipfire.org Git - thirdparty/lldpd.git/blame - README.md
doc: rename OS X to macOS
[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
ac57139f 29 * macOS
2b35e2d0
VB
30 * NetBSD
31 * OpenBSD
f7f82e1e 32 * Solaris
2b35e2d0 33
032c0cf4
VB
34Windows is not supported but you can use
35[WinLLDPService](https://github.com/raspi/WinLLDPService/) as a
36transmit-only agent.
37
4b292b55
VB
38Installation
39------------
40
ba666663
VB
41For general instructions
42[see the website](http://vincentbernat.github.io/lldpd/installation.html).
43
44To compile lldpd from sources, use the following:
00402c76
VB
45
46 ./configure
47 make
48 sudo make install
52ac3f37 49
13dce469
VB
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,
00402c76
VB
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
ba666663
VB
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.
13dce469 58
2b35e2d0 59`lldpcli` lets one query information collected through the command
33aced7a 60line. If you don't want to run it as root, just install it setuid or
00402c76 61setgid `_lldpd`.
43c02e7b 62
ac57139f 63Installation (macOS)
e66b7f34
VB
64-----------------------
65
ac57139f 66The same procedure as above applies for macOS. However, there are
92f5db08 67simpler alternatives:
29e300e5 68
37e9556e 69 1. Use [Homebrew](https://brew.sh):
e66b7f34 70
92f5db08
VB
71 brew install lldpd
72 # Or, for the latest version:
73 brew install https://raw.github.com/vincentbernat/lldpd/master/osx/lldpd.rb
b708297c 74
ac57139f
VB
75 2. Build an macOS installer package which should work on the same
76 version of macOS:
92f5db08 77
462d8b6c 78 mkdir build && cd build
87bb9a1b 79 ../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
06987a24 80 --without-snmp
737afb35 81 make -C osx pkg
b708297c 82
ac57139f 83 If you want to compile for an older version of macOS, you need
462d8b6c
VB
84 to find the right SDK and issues commands like those:
85
86 SDK=/Developer/SDKs/MacOSX10.6.sdk
87 mkdir build && cd build
87bb9a1b 88 ../configure --prefix=/usr/local --localstatedir=/var --sysconfdir=/private/etc --with-embedded-libevent \
06987a24 89 --without-snmp \
462d8b6c
VB
90 CFLAGS="-mmacosx-version-min=10.6 -isysroot $SDK" \
91 LDFLAGS="-mmacosx-version-min=10.6 -isysroot $SDK"
737afb35 92 make -C osx pkg
462d8b6c 93
6b7d841c
VB
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 \
06987a24 100 --without-snmp \
6b7d841c
VB
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
92f5db08
VB
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`.
b708297c 111
8b0ca98e
VB
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
4b292b55
VB
134Usage
135-----
136
031118c4
VB
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
2b35e2d0 144can be queried with `lldpcli` or through SNMP.
43c02e7b 145
c167357d
VB
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
43c02e7b
VB
159For bonding, you need 2.6.24 (in previous version, PACKET_ORIGDEV
160affected only non multicast packets). See:
00402c76
VB
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
43c02e7b 164
c8851c73 165Otherwise, a packet received on a bond will be affected to all
c167357d
VB
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).
43c02e7b 169
0da01fd6 170On 2.6.27, we are able to receive packets on real interface for enslaved
21d89e7d 171devices. This allows one to get neighbor information on active/backup
43c02e7b
VB
172bonds. Without the 2.6.27, lldpd won't receive any information on
173inactive slaves. Here are the patchs (thanks to Joe Eykholt):
00402c76
VB
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
43c02e7b 178
63aebf55
VB
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
c167357d 185Some devices (notably Cisco IOS) send frames tagged with the native
50724a52
VB
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
5f7d1cd5
VB
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:
49697208 194
50724a52
VB
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:
5f7d1cd5
VB
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
50724a52
VB
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`.
f84199dd
VB
222 2. Put the interface in promiscuous mode with `ip link set
223 promisc on dev eth0`.
50724a52 224
f4da5f84
VB
225The last solution can be done directly by `lldpd` (on Linux only) by
226using the option `configure system interface promiscuous`.
227
50724a52 228On modern networks, the performance impact should be nonexistent.
5f7d1cd5 229
426ee11e
VB
230Development
231-----------
232
233During development, you may want to execute lldpd at its current
3bd5a878 234location instead of doing `make install`. The correct way to do this is
426ee11e
VB
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
3ca10086
VB
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
8cd1f2d0 255There is a general test suite with `make check`. It's also possible to
e0a84778
VB
256run integration tests. They need [py.test](http://pytest.org/latest/)
257and rely on Linux containers to be executed.
8cd1f2d0 258
76bae8b9
VB
259To enable code coverage, use:
260
261 ../configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
28d521e2
VB
262 --enable-sanitizers --enable-gcov --with-snmp \
263 CFLAGS="-O0 -g"
76bae8b9
VB
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
4b292b55
VB
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
e12c2365
VB
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.
4b292b55 282
2b35e2d0 283 2. `lldpcli` provides a convenient way to query `lldpd`. It also
4b292b55
VB
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
22f1ea46
VB
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
4b292b55
VB
301License
302-------
303
c882a2cf 304lldpd is distributed under the ISC license:
00402c76 305
51434125 306 > Permission to use, copy, modify, and/or distribute this software for any
00402c76
VB
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.
35f6f4fb
VB
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.