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