]>
Commit | Line | Data |
---|---|---|
4535bb2c PG |
1 | .. _ldp: |
2 | ||
3 | *** | |
4 | LDP | |
5 | *** | |
6 | ||
7 | The *ldpd* daemon is a standardised protocol that permits exchanging MPLS label | |
8 | information between MPLS devices. The LDP protocol creates peering between | |
9 | devices, so as to exchange that label information. This information is stored in | |
10 | MPLS table of *zebra*, and it injects that MPLS information in the underlying | |
11 | system (Linux kernel or OpenBSD system for instance). | |
12 | *ldpd* provides necessary options to create a Layer 2 VPN across MPLS network. | |
13 | For instance, it is possible to interconnect several sites that share the same | |
14 | broadcast domain. | |
15 | ||
16 | FRR implements LDP as described in :rfc:`5036`; other LDP standard are the | |
17 | following ones: :rfc:`6720`, :rfc:`6667`, :rfc:`5919`, :rfc:`5561`, :rfc:`7552`, | |
18 | :rfc:`4447`. | |
19 | Because MPLS is already available, FRR also supports :rfc:`3031`. | |
20 | ||
21 | Running Ldpd | |
22 | ============ | |
23 | ||
24 | The *ldpd* daemon can be invoked with any of the common | |
25 | options (:ref:`common-invocation-options`). | |
26 | ||
27 | The *zebra* daemon must be running before *ldpd* is invoked. | |
28 | ||
29 | Configuration of *ldpd* is done in its configuration file | |
30 | :file:`ldpd.conf`. | |
31 | ||
32 | ||
33 | .. _understanding-ldp: | |
34 | ||
35 | Understanding LDP principles | |
36 | ============================ | |
37 | ||
38 | Let's first introduce some definitions that permit understand better the LDP | |
39 | protocol: | |
40 | ||
41 | - `LSR` : Labeled Switch Router. Networking devices handling labels used to | |
42 | forward traffic between and through them. | |
43 | ||
44 | - `LER` : Labeled Edge Router. A Labeled edge router is located at the edge of | |
45 | an MPLS network, generally between an IP network and an MPLS network. | |
46 | ||
47 | ||
48 | ``LDP`` aims at sharing label information across devices. It tries to establish | |
49 | peering with remote LDP capable devices, first by discovering using UDP port 646 | |
50 | , then by peering using TCP port 646. Once the TCP session is established, the | |
51 | label information is shared, through label advertisements. | |
52 | ||
53 | There are different methods to send label advertisement modes. The | |
54 | implementation actually supports the following : Liberal Label Retention + | |
55 | Downstream Unsolicited + Independent Control. | |
56 | The other advertising modes are depicted below, and compared with the current | |
57 | implementation. | |
58 | ||
59 | - Liberal label retention versus conservative mode | |
60 | In liberal mode, every label sent by every LSR is stored in the MPLS table. | |
61 | In conservative mode, only the label that was sent by the best next hop | |
62 | (determined by the IGP metric) for that particular FEC is stored in the MPLS | |
63 | table. | |
64 | ||
65 | - Independent LSP Control versus ordered LSP Control | |
66 | MPLS has two ways of binding labels to FEC’s; either through ordered LSP | |
67 | control, or independent LSP control. | |
68 | Ordered LSP control only binds a label to a FEC if it is the egress LSR, or | |
69 | the router received a label binding for a FEC from the next hop router. In | |
70 | this mode, an MPLS router will create a label binding for each FEC and | |
71 | distribute it to its neighbors so long as he has a entry in the RIB for the | |
72 | destination. | |
73 | In the other mode, label bindings are made without any dependencies on another | |
74 | router advertising a label for a particular FEC. Each router makes it own | |
75 | independent decision to create a label for each FEC. | |
76 | By default IOS uses Independent LSP Control, while Juniper implements the | |
77 | Ordered Control. Both modes are interoperable, the difference is that Ordered | |
78 | Control prevent blackholing during the LDP convergence process, at cost of | |
79 | slowing down the convergence itself | |
80 | ||
81 | - unsolicited downstream versus downstream on demand | |
82 | Downstream on demand label distribution is where an LSR must explicitly | |
83 | request that a label be sent from its downstream router for a particular FEC. | |
84 | Unsolicited label distribution is where a label is sent from the downstream | |
85 | router without the original router requesting it. | |
86 | ||
87 | .. _configuring-ldpd: | |
88 | ||
89 | .. _ldp-configuration: | |
90 | ||
91 | LDP Configuration | |
92 | =================== | |
93 | ||
94 | .. index:: [no] mpls ldp | |
95 | .. clicmd:: [no] mpls ldp | |
96 | ||
97 | Enable or disable LDP daemon | |
98 | ||
99 | .. index:: [no] router-id A.B.C.D | |
100 | .. clicmd:: [no] router-id A.B.C.D | |
101 | ||
102 | The following command located under MPLS router node configures the MPLS | |
103 | router-id of the local device. | |
104 | ||
105 | .. index:: [no] address-family [ipv4 | ipv6] | |
106 | .. clicmd:: [no] address-family [ipv4 | ipv6] | |
107 | ||
108 | Configure LDP for IPv4 or IPv6 address-family. Located under MPLS route node, | |
109 | this subnode permits configuring the LDP neighbors. | |
110 | ||
111 | .. index:: [no] interface IFACE | |
112 | .. clicmd:: [no] interface IFACE | |
113 | ||
114 | Located under MPLS address-family node, use this command to enable or disable | |
115 | LDP discovery per interface. IFACE stands for the interface name where LDP is | |
116 | enabled. By default it is disabled. Once this command executed, the | |
117 | address-family interface node is configured. | |
118 | ||
119 | .. index:: [no] discovery transport-address A.B.C.D | A:B::C:D | |
120 | .. clicmd:: [no] discovery transport-address A.B.C.D | A:B::C:D | |
121 | ||
122 | Located under mpls address-family interface node, use this command to set | |
123 | the IPv4 or IPv6 transport-address used by the LDP protocol to talk on this | |
124 | interface. | |
125 | ||
126 | .. index:: [no] neighbor A.B.C.D password PASSWORD | |
127 | .. clicmd:: [no] neighbor A.B.C.D password PASSWORD | |
128 | ||
129 | The following command located under MPLS router node configures the router | |
130 | of a LDP device. This device, if found, will have to comply with the | |
131 | configured password. PASSWORD is a clear text password wit its digest sent | |
132 | through the network. | |
133 | ||
134 | .. index:: [no] neighbor A.B.C.D holdtime HOLDTIME | |
135 | .. clicmd:: [no] neighbor A.B.C.D holdtime HOLDTIME | |
136 | ||
137 | The following command located under MPLS router node configures the holdtime | |
138 | value in seconds of the LDP neighbor ID. Configuring it triggers a keepalive | |
139 | mechanism. That value can be configured between 15 and 65535 seconds. After | |
140 | this time of non response, the LDP established session will be considered as | |
141 | set to down. By default, no holdtime is configured for the LDP devices. | |
142 | ||
143 | .. index:: [no] discovery hello holdtime HOLDTIME | |
144 | .. clicmd:: [no] discovery hello holdtime HOLDTIME | |
145 | ||
146 | .. index:: [no] discovery hello interval INTERVAL | |
147 | .. clicmd:: [no] discovery hello interval INTERVAL | |
148 | ||
149 | INTERVAL value ranges from 1 to 65535 seconds. Default value is 5 seconds. | |
150 | This is the value between each hello timer message sent. | |
151 | HOLDTIME value ranges from 1 to 65535 seconds. Default value is 15 seconds. | |
152 | That value is added as a TLV in the LDP messages. | |
153 | ||
154 | .. _show-ldp-information: | |
155 | ||
156 | Show LDP Information | |
157 | ==================== | |
158 | ||
159 | These commands dump various parts of *ldpd*. | |
160 | ||
161 | .. index:: show mpls ldp neighbor [A.B.C.D] | |
162 | .. clicmd:: show mpls ldp neighbor [A.B.C.D] | |
163 | ||
164 | This command dumps the various neighbors discovered. Below example shows that | |
165 | local machine has an operation neighbor with ID set to 1.1.1.1. | |
166 | ||
167 | :: | |
168 | ||
169 | west-vm# show mpls ldp neighbor | |
170 | AF ID State Remote Address Uptime | |
171 | ipv4 1.1.1.1 OPERATIONAL 1.1.1.1 00:01:37 | |
172 | west-vm# | |
173 | ||
174 | .. index:: show mpls ldp neighbor [A.B.C.D] capabilities | |
175 | .. clicmd:: show mpls ldp neighbor [A.B.C.D] capabilities | |
176 | ||
177 | .. index:: show mpls ldp neighbor [A.B.C.D] detail | |
178 | .. clicmd:: show mpls ldp neighbor [A.B.C.D] detail | |
179 | ||
180 | Above commands dump other neighbor information. | |
181 | ||
182 | .. index:: show mpls ldp discovery [detail] | |
183 | .. clicmd:: show mpls ldp discovery [detail] | |
184 | ||
185 | .. index:: show mpls ldp ipv4 discovery [detail] | |
186 | .. clicmd:: show mpls ldp ipv4 discovery [detail] | |
187 | ||
188 | .. index:: show mpls ldp ipv6 discovery [detail] | |
189 | .. clicmd:: show mpls ldp ipv6 discovery [detail] | |
190 | ||
191 | Above commands dump discovery information. | |
192 | ||
193 | .. index:: show mpls ldp ipv4 interface | |
194 | .. clicmd:: show mpls ldp ipv4 interface | |
195 | ||
196 | .. index:: show mpls ldp ipv6 interface | |
197 | .. clicmd:: show mpls ldp ipv6 interface | |
198 | ||
199 | Above command dumps the IPv4 or IPv6 interface per where LDP is enabled. | |
200 | Below output illustrates what is dumped for IPv4. | |
201 | ||
202 | :: | |
203 | ||
204 | west-vm# show mpls ldp ipv4 interface | |
205 | AF Interface State Uptime Hello Timers ac | |
206 | ipv4 eth1 ACTIVE 00:08:35 5/15 0 | |
207 | ipv4 eth3 ACTIVE 00:08:35 5/15 1 | |
208 | ||
209 | ||
210 | .. index:: show mpls ldp ipv4|ipv6 binding | |
211 | .. clicmd:: show mpls ldp ipv4|ipv6 binding | |
212 | ||
213 | Above command dumps the binding obtained through MPLS exchanges with LDP. | |
214 | ||
215 | :: | |
216 | ||
217 | west-vm# show mpls ldp ipv4 binding | |
218 | AF Destination Nexthop Local Label Remote Label In Use | |
219 | ipv4 1.1.1.1/32 1.1.1.1 16 imp-null yes | |
220 | ipv4 2.2.2.2/32 1.1.1.1 imp-null 16 no | |
221 | ipv4 10.0.2.0/24 1.1.1.1 imp-null imp-null no | |
222 | ipv4 10.115.0.0/24 1.1.1.1 imp-null 17 no | |
223 | ipv4 10.135.0.0/24 1.1.1.1 imp-null imp-null no | |
224 | ipv4 10.200.0.0/24 1.1.1.1 17 imp-null yes | |
225 | west-vm# | |
226 | ||
227 | LDP debugging commands | |
228 | ======================== | |
229 | ||
230 | .. index:: | |
231 | simple: debug mpls ldp KIND | |
232 | simple: no debug mpls ldp KIND | |
233 | ||
234 | .. clicmd:: [no] debug mpls ldp KIND | |
235 | ||
236 | Enable or disable debugging messages of a given kind. ``KIND`` can | |
237 | be one of: | |
238 | ||
239 | - ``discovery`` | |
240 | - ``errors`` | |
241 | - ``event`` | |
242 | - ``labels`` | |
243 | - ``messages`` | |
244 | - ``zebra`` | |
245 | ||
246 | LDP Example Configuration | |
247 | ========================= | |
248 | ||
249 | Below configuration gives a typical MPLS configuration of a device located in a | |
250 | MPLS backbone. LDP is enabled on two interfaces and will attempt to peer with | |
251 | two neighbors with router-id set to either 1.1.1.1 or 3.3.3.3. | |
252 | ||
253 | .. code-block:: frr | |
254 | ||
255 | mpls ldp | |
256 | router-id 2.2.2.2 | |
257 | neighbor 1.1.1.1 password test | |
258 | neighbor 3.3.3.3 password test | |
259 | ! | |
260 | address-family ipv4 | |
261 | discovery transport-address 2.2.2.2 | |
262 | ! | |
263 | interface eth1 | |
264 | ! | |
265 | interface eth3 | |
266 | ! | |
267 | exit-address-family | |
268 | ! | |
269 | ||
270 | ||
271 | Deploying LDP across a backbone generally is done in a full mesh configuration | |
272 | topology. LDP is typically deployed with an IGP like OSPF, that helps discover | |
273 | the remote IPs. Below example is an OSPF configuration extract that goes with | |
274 | LDP configuration | |
275 | ||
276 | .. code-block:: frr | |
277 | ||
278 | router ospf | |
279 | ospf router-id 2.2.2.2 | |
280 | network 0.0.0.0/0 area 0 | |
281 | ! | |
282 | ||
283 | ||
284 | Below output shows the routing entry on the LER side. The OSPF routing entry | |
285 | (10.200.0.0) is associated with Label entry (17), and shows that MPLS push action | |
286 | that traffic to that destination will be applied. | |
287 | ||
288 | :: | |
289 | ||
290 | north-vm# show ip route | |
291 | Codes: K - kernel route, C - connected, S - static, R - RIP, | |
292 | O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, | |
293 | T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, | |
294 | F - PBR, | |
295 | > - selected route, * - FIB route | |
296 | ||
297 | O>* 1.1.1.1/32 [110/120] via 10.115.0.1, eth2, label 16, 00:00:15 | |
298 | O>* 2.2.2.2/32 [110/20] via 10.115.0.1, eth2, label implicit-null, 00:00:15 | |
299 | O 3.3.3.3/32 [110/10] via 0.0.0.0, loopback1 onlink, 00:01:19 | |
300 | C>* 3.3.3.3/32 is directly connected, loopback1, 00:01:29 | |
301 | O>* 10.0.2.0/24 [110/11] via 10.115.0.1, eth2, label implicit-null, 00:00:15 | |
302 | O 10.100.0.0/24 [110/10] is directly connected, eth1, 00:00:32 | |
303 | C>* 10.100.0.0/24 is directly connected, eth1, 00:00:32 | |
304 | O 10.115.0.0/24 [110/10] is directly connected, eth2, 00:00:25 | |
305 | C>* 10.115.0.0/24 is directly connected, eth2, 00:00:32 | |
306 | O>* 10.135.0.0/24 [110/110] via 10.115.0.1, eth2, label implicit-null, 00:00:15 | |
307 | O>* 10.200.0.0/24 [110/210] via 10.115.0.1, eth2, label 17, 00:00:15 | |
308 | north-vm# | |
309 |