]> git.proxmox.com Git - mirror_frr.git/blob - doc/user/pim.rst
*: Add camelCase JSON keys in addition to PascalCase
[mirror_frr.git] / doc / user / pim.rst
1 .. _pim:
2
3 ***
4 PIM
5 ***
6
7 PIM -- Protocol Independent Multicast
8
9 *pimd* supports pim-sm as well as igmp v2 and v3. pim is
10 vrf aware and can work within the context of vrf's in order to
11 do S,G mrouting. Additionally PIM can be used in the EVPN underlay
12 network for optimizing forwarding of overlay BUM traffic.
13
14 .. note::
15
16 On Linux for PIM-SM operation you *must* have kernel version 4.18 or greater.
17 To use PIM for EVPN BUM forwarding, kernels 5.0 or greater are required.
18 OpenBSD has no multicast support and FreeBSD, and NetBSD only
19 have support for SSM.
20
21 .. _starting-and-stopping-pimd:
22
23 Starting and Stopping pimd
24 ==========================
25
26 The default configuration file name of *pimd*'s is :file:`pimd.conf`. When
27 invoked *pimd* searches directory |INSTALL_PREFIX_ETC|. If
28 :file:`pimd.conf` is not there then next search current directory.
29
30 *pimd* requires zebra for proper operation. Additionally *pimd* depends on
31 routing properly setup and working in the network that it is working on.
32
33 ::
34
35 # zebra -d
36 # pimd -d
37
38
39 Please note that *zebra* must be invoked before *pimd*.
40
41 To stop *pimd* please use::
42
43 kill `cat /var/run/pimd.pid`
44
45 Certain signals have special meanings to *pimd*.
46
47 +---------+---------------------------------------------------------------------+
48 | Signal | Meaning |
49 +=========+=====================================================================+
50 | SIGUSR1 | Rotate the *pimd* logfile |
51 +---------+---------------------------------------------------------------------+
52 | SIGINT | *pimd* sweeps all installed PIM mroutes then terminates gracefully. |
53 | SIGTERM | |
54 +---------+---------------------------------------------------------------------+
55
56 *pimd* invocation options. Common options that can be specified
57 (:ref:`common-invocation-options`).
58
59 .. clicmd:: ip pim rp A.B.C.D A.B.C.D/M
60
61 In order to use pim, it is necessary to configure a RP for join messages to
62 be sent to. Currently the only methodology to do this is via static rp
63 commands. All routers in the pim network must agree on these values. The
64 first ip address is the RP's address and the second value is the matching
65 prefix of group ranges covered. This command is vrf aware, to configure for
66 a vrf, enter the vrf submode.
67
68 .. clicmd:: ip pim rp keep-alive-timer (1-65535)
69
70 Modify the time out value for a S,G flow from 1-65535 seconds at RP.
71 The normal keepalive period for the KAT(S,G) defaults to 210 seconds.
72 However, at the RP, the keepalive period must be at least the
73 Register_Suppression_Time, or the RP may time out the (S,G) state
74 before the next Null-Register arrives. Thus, the KAT(S,G) is set to
75 max(Keepalive_Period, RP_Keepalive_Period) when a Register-Stop is sent.
76 If choosing a value below 31 seconds be aware that some hardware platforms
77 cannot see data flowing in better than 30 second chunks. This command is
78 vrf aware, to configure for a vrf, enter the vrf submode.
79
80 .. clicmd:: ip pim register-accept-list PLIST
81
82 When pim receives a register packet the source of the packet will be compared
83 to the prefix-list specified, PLIST, and if a permit is received normal
84 processing continues. If a deny is returned for the source address of the
85 register packet a register stop message is sent to the source.
86
87 .. clicmd:: ip pim spt-switchover infinity-and-beyond [prefix-list PLIST]
88
89 On the last hop router if it is desired to not switch over to the SPT tree
90 configure this command. Optional parameter prefix-list can be use to control
91 which groups to switch or not switch. If a group is PERMIT as per the
92 PLIST, then the SPT switchover does not happen for it and if it is DENY,
93 then the SPT switchover happens.
94 This command is vrf aware, to configure for a vrf,
95 enter the vrf submode.
96
97 .. clicmd:: ip pim ecmp
98
99 If pim has the a choice of ECMP nexthops for a particular RPF, pim will
100 cause S,G flows to be spread out amongst the nexthops. If this command is
101 not specified then the first nexthop found will be used. This command is vrf
102 aware, to configure for a vrf, enter the vrf submode.
103
104 .. clicmd:: ip pim ecmp rebalance
105
106 If pim is using ECMP and an interface goes down, cause pim to rebalance all
107 S,G flows across the remaining nexthops. If this command is not configured
108 pim only modifies those S,G flows that were using the interface that went
109 down. This command is vrf aware, to configure for a vrf, enter the vrf
110 submode.
111
112 .. clicmd:: ip pim join-prune-interval (1-65535)
113
114 Modify the join/prune interval that pim uses to the new value. Time is
115 specified in seconds. This command is vrf aware, to configure for a vrf,
116 enter the vrf submode. The default time is 60 seconds. If you enter
117 a value smaller than 60 seconds be aware that this can and will affect
118 convergence at scale.
119
120 .. clicmd:: ip pim keep-alive-timer (1-65535)
121
122 Modify the time out value for a S,G flow from 1-65535 seconds. If choosing
123 a value below 31 seconds be aware that some hardware platforms cannot see data
124 flowing in better than 30 second chunks. This command is vrf aware, to
125 configure for a vrf, enter the vrf submode.
126
127 .. clicmd:: ip pim packets (1-255)
128
129 When processing packets from a neighbor process the number of packets
130 incoming at one time before moving on to the next task. The default value is
131 3 packets. This command is only useful at scale when you can possibly have
132 a large number of pim control packets flowing. This command is vrf aware, to
133 configure for a vrf, enter the vrf submode.
134
135 .. clicmd:: ip pim register-suppress-time (1-65535)
136
137 Modify the time that pim will register suppress a FHR will send register
138 notifications to the kernel. This command is vrf aware, to configure for a
139 vrf, enter the vrf submode.
140
141 .. clicmd:: ip pim send-v6-secondary
142
143 When sending pim hello packets tell pim to send any v6 secondary addresses
144 on the interface. This information is used to allow pim to use v6 nexthops
145 in it's decision for RPF lookup. This command is vrf aware, to configure for
146 a vrf, enter the vrf submode.
147
148 .. clicmd:: ip pim ssm prefix-list WORD
149
150 Specify a range of group addresses via a prefix-list that forces pim to
151 never do SM over. This command is vrf aware, to configure for a vrf, enter
152 the vrf submode.
153
154 .. clicmd:: ip multicast rpf-lookup-mode WORD
155
156 Modify how PIM does RPF lookups in the zebra routing table. You can use
157 these choices:
158
159 longer-prefix
160 Lookup the RPF in both tables using the longer prefix as a match
161
162 lower-distance
163 Lookup the RPF in both tables using the lower distance as a match
164
165 mrib-only
166 Lookup in the Multicast RIB only
167
168 mrib-then-urib
169 Lookup in the Multicast RIB then the Unicast Rib, returning first found.
170 This is the default value for lookup if this command is not entered
171
172 urib-only
173 Lookup in the Unicast Rib only.
174
175 .. clicmd:: ip igmp generate-query-once [version (2-3)]
176
177 Generate IGMP query (v2/v3) on user requirement. This will not depend on
178 the existing IGMP general query timer.If no version is provided in the cli,
179 it will be considered as default v2 query.This is a hidden command.
180
181 .. clicmd:: ip igmp watermark-warn (1-65535)
182
183 Configure watermark warning generation for an igmp group limit. Generates
184 warning once the configured group limit is reached while adding new groups.
185 'no' form of the command disables the warning generation. This command is
186 vrf aware. To configure per vrf, enter vrf submode.
187
188 .. _pim-interface-configuration:
189
190 PIM Interface Configuration
191 ===========================
192
193 PIM interface commands allow you to configure an interface as either a Receiver
194 or a interface that you would like to form pim neighbors on. If the interface
195 is in a vrf, enter the interface command with the vrf keyword at the end.
196
197 .. clicmd:: ip pim active-active
198
199 Turn on pim active-active configuration for a Vxlan interface. This
200 command will not do anything if you do not have the underlying ability
201 of a mlag implementation.
202
203 .. clicmd:: ip pim bsm
204
205 Tell pim that we would like to use this interface to process bootstrap
206 messages. This is enabled by default. 'no' form of this command is used to
207 restrict bsm messages on this interface.
208
209 .. clicmd:: ip pim unicast-bsm
210
211 Tell pim that we would like to allow interface to process unicast bootstrap
212 messages. This is enabled by default. 'no' form of this command is used to
213 restrict processing of unicast bsm messages on this interface.
214
215 .. clicmd:: ip pim drpriority (1-4294967295)
216
217 Set the DR Priority for the interface. This command is useful to allow the
218 user to influence what node becomes the DR for a lan segment.
219
220 .. clicmd:: ip pim hello (1-65535) (1-65535)
221
222 Set the pim hello and hold interval for a interface.
223
224 .. clicmd:: ip pim
225
226 Tell pim that we would like to use this interface to form pim neighbors
227 over. Please note that this command does not enable the reception of IGMP
228 reports on the interface. Refer to the next `ip igmp` command for IGMP
229 management.
230
231 .. clicmd:: ip pim use-source A.B.C.D
232
233 If you have multiple addresses configured on a particular interface
234 and would like pim to use a specific source address associated with
235 that interface.
236
237 .. clicmd:: ip igmp
238
239 Tell pim to receive IGMP reports and Query on this interface. The default
240 version is v3. This command is useful on a LHR.
241
242 .. clicmd:: ip igmp join A.B.C.D [A.B.C.D]
243
244 Join multicast group or source-group on an interface.
245
246 .. clicmd:: ip igmp query-interval (1-65535)
247
248 Set the IGMP query interval that PIM will use.
249
250 .. clicmd:: ip igmp query-max-response-time (1-65535)
251
252 Set the IGMP query response timeout value. If an report is not returned in
253 the specified time we will assume the S,G or \*,G has timed out.
254
255 .. clicmd:: ip igmp version (2-3)
256
257 Set the IGMP version used on this interface. The default value is 3.
258
259 .. clicmd:: ip multicast boundary oil WORD
260
261 Set a pim multicast boundary, based upon the WORD prefix-list. If a pim join
262 or IGMP report is received on this interface and the Group is denied by the
263 prefix-list, PIM will ignore the join or report.
264
265 .. clicmd:: ip igmp last-member-query-count (1-255)
266
267 Set the IGMP last member query count. The default value is 2. 'no' form of
268 this command is used to to configure back to the default value.
269
270 .. clicmd:: ip igmp last-member-query-interval (1-65535)
271
272 Set the IGMP last member query interval in deciseconds. The default value is
273 10 deciseconds. 'no' form of this command is used to to configure back to the
274 default value.
275
276 .. clicmd:: ip mroute INTERFACE A.B.C.D [A.B.C.D]
277
278 Set a static multicast route for a traffic coming on the current interface to
279 be forwarded on the given interface if the traffic matches the group address
280 and optionally the source address.
281
282
283 .. seealso::
284
285 :ref:`bfd-pim-peer-config`
286
287
288 .. _pim-multicast-rib:
289
290 PIM Multicast RIB
291 =================
292
293 In order to influence Multicast RPF lookup, it is possible to insert
294 into zebra routes for the Multicast RIB. These routes are only
295 used for RPF lookup and will not be used by zebra for insertion
296 into the kernel *or* for normal rib processing. As such it is
297 possible to create weird states with these commands. Use with
298 caution. Most of the time this will not be necessary.
299
300 .. clicmd:: ip mroute A.B.C.D/M A.B.C.D (1-255)
301
302 Insert into the Multicast Rib Route A.B.C.D/M with specified nexthop. The
303 distance can be specified as well if desired.
304
305 .. clicmd:: ip mroute A.B.C.D/M INTERFACE (1-255)
306
307 Insert into the Multicast Rib Route A.B.C.D/M using the specified INTERFACE.
308 The distance can be specified as well if desired.
309
310 .. _msdp-configuration:
311
312 Multicast Source Discovery Protocol (MSDP) Configuration
313 ========================================================
314
315 MSDP can be setup in different ways:
316
317 * MSDP meshed-group: where all peers are connected with each other creating
318 a fully meshed network. SAs (source active) messages are not forwarded in
319 this mode because the origin is able to send SAs to all members.
320
321 This setup is commonly used with anycast.
322
323 * MSDP peering: when there is one or more peers that are not fully meshed. SAs
324 may be forwarded depending on the result of filtering and RPF checks.
325
326 This setup is commonly consistent with BGP peerings (for RPF checks).
327
328 * MSDP default peer: there is only one peer and all SAs will be forwarded
329 there.
330
331 .. note::
332
333 MSDP default peer and SA filtering is not implemented.
334
335
336 Commands available for MSDP:
337
338 .. clicmd:: ip msdp timers (1-65535) (1-65535) [(1-65535)]
339
340 Configure global MSDP timers.
341
342 First value is the keep-alive interval. This configures the interval in
343 seconds between keep-alive messages. The default value is 60 seconds. It
344 should be less than the remote hold time.
345
346 Second value is the hold-time. This configures the interval in seconds before
347 closing a non responding connection. The default value is 75. This value
348 should be greater than the remote keep alive time.
349
350 Third value is the connection retry interval and it is optional. This
351 configures the interval between connection attempts. The default value
352 is 30 seconds.
353
354 .. clicmd:: ip msdp mesh-group WORD member A.B.C.D
355
356 Create or update a mesh group to include the specified MSDP peer.
357
358 .. clicmd:: ip msdp mesh-group WORD source A.B.C.D
359
360 Create or update a mesh group to set the source address used to connect to
361 peers.
362
363 .. clicmd:: ip msdp peer A.B.C.D source A.B.C.D
364
365 Create a regular MSDP session with peer using the specified source address.
366
367
368 .. _show-pim-information:
369
370 Show PIM Information
371 ====================
372
373 All PIM show commands are vrf aware and typically allow you to insert a
374 specified vrf command if information is desired about a specific vrf. If no
375 vrf is specified then the default vrf is assumed. Finally the special keyword
376 'all' allows you to look at all vrfs for the command. Naming a vrf 'all' will
377 cause great confusion.
378
379 .. clicmd:: show ip igmp interface
380
381 Display IGMP interface information.
382
383 .. clicmd:: show ip igmp [vrf NAME] join [json]
384
385 Display IGMP static join information for a specific vrf.
386 If "vrf all" is provided, it displays information for all the vrfs present.
387
388 .. clicmd:: show ip igmp groups
389
390 Display IGMP groups information.
391
392 .. clicmd:: show ip igmp groups retransmissions
393
394 Display IGMP group retransmission information.
395
396 .. clicmd:: show ip igmp sources
397
398 Display IGMP sources information.
399
400 .. clicmd:: show ip igmp sources retransmissions
401
402 Display IGMP source retransmission information.
403
404 .. clicmd:: show ip igmp statistics
405
406 Display IGMP statistics information.
407
408 .. clicmd:: show ip multicast
409
410 Display various information about the interfaces used in this pim instance.
411
412 .. clicmd:: show ip mroute [vrf NAME] [A.B.C.D [A.B.C.D]] [fill] [json]
413
414 Display information about installed into the kernel S,G mroutes. If
415 one address is specified we assume it is the Group we are interested
416 in displaying data on. If the second address is specified then it is
417 Source Group. The keyword `fill` says to fill in all assumed data
418 for test/data gathering purposes.
419
420 .. clicmd:: show ip mroute [vrf NAME] count [json]
421
422 Display information about installed into the kernel S,G mroutes and in
423 addition display data about packet flow for the mroutes for a specific
424 vrf.
425
426 .. clicmd:: show ip mroute vrf all count [json]
427
428 Display information about installed into the kernel S,G mroutes and in
429 addition display data about packet flow for the mroutes for all vrfs.
430
431 .. clicmd:: show ip mroute [vrf NAME] summary [json]
432
433 Display total number of S,G mroutes and number of S,G mroutes installed
434 into the kernel for a specific vrf.
435
436 .. clicmd:: show ip mroute vrf all summary [json]
437
438 Display total number of S,G mroutes and number of S,G mroutes
439 installed into the kernel for all vrfs.
440
441 .. clicmd:: show ip msdp mesh-group
442
443 Display the configured mesh-groups, the local address associated with each
444 mesh-group, the peer members included in each mesh-group, and their status.
445
446 .. clicmd:: show ip msdp peer
447
448 Display information about the MSDP peers. That includes the peer address,
449 the local address used to establish the connection to the peer, the
450 connection status, and the number of active sources.
451
452 .. clicmd:: show ip pim assert
453
454 Display information about asserts in the PIM system for S,G mroutes.
455
456 .. clicmd:: show ip pim assert-internal
457
458 Display internal assert state for S,G mroutes
459
460 .. clicmd:: show ip pim assert-metric
461
462 Display metric information about assert state for S,G mroutes
463
464 .. clicmd:: show ip pim assert-winner-metric
465
466 Display winner metric for assert state for S,G mroutes
467
468 .. clicmd:: show ip pim group-type
469
470 Display SSM group ranges.
471
472 .. clicmd:: show ip pim interface
473
474 Display information about interfaces PIM is using.
475
476 .. clicmd:: show ip pim mlag [vrf NAME|all] interface [detail|WORD] [json]
477
478 Display mlag interface information.
479
480 .. clicmd:: show ip pim join
481
482 Display information about PIM joins received. If one address is specified
483 then we assume it is the Group we are interested in displaying data on.
484 If the second address is specified then it is Source Group.
485
486 .. clicmd:: show ip pim local-membership
487
488 Display information about PIM interface local-membership.
489
490 .. clicmd:: show ip pim mlag summary [json]
491
492 Display mlag information state that PIM is keeping track of.
493
494 .. clicmd:: show ip pim neighbor
495
496 Display information about PIM neighbors.
497
498 .. clicmd:: show ip pim nexthop
499
500 Display information about pim nexthops that are being used.
501
502 .. clicmd:: show ip pim nexthop-lookup
503
504 Display information about a S,G pair and how the RPF would be chosen. This
505 is especially useful if there are ECMP's available from the RPF lookup.
506
507 .. clicmd:: show ip pim rp-info
508
509 Display information about RP's that are configured on this router.
510
511 .. clicmd:: show ip pim rpf
512
513 Display information about currently being used S,G's and their RPF lookup
514 information. Additionally display some statistics about what has been
515 happening on the router.
516
517 .. clicmd:: show ip pim secondary
518
519 Display information about an interface and all the secondary addresses
520 associated with it.
521
522 .. clicmd:: show ip pim state
523
524 Display information about known S,G's and incoming interface as well as the
525 OIL and how they were chosen.
526
527 .. clicmd:: show ip pim [vrf NAME] upstream [A.B.C.D [A.B.C.D]] [json]
528
529 Display upstream information about a S,G mroute. Allow the user to
530 specify sub Source and Groups that we are only interested in.
531
532 .. clicmd:: show ip pim upstream-join-desired
533
534 Display upstream information for S,G's and if we desire to
535 join the multicast tree
536
537 .. clicmd:: show ip pim upstream-rpf
538
539 Display upstream information for S,G's and the RPF data associated with them.
540
541 .. clicmd:: show ip pim [vrf NAME] mlag upstream [A.B.C.D [A.B.C.D]] [json]
542
543 Display upstream entries that are synced across MLAG switches.
544 Allow the user to specify sub Source and Groups address filters.
545
546 .. clicmd:: show ip pim mlag summary
547
548 Display PIM MLAG (multi-chassis link aggregation) session status and
549 control message statistics.
550
551 .. clicmd:: show ip pim bsr
552
553 Display current bsr, its uptime and last received bsm age.
554
555 .. clicmd:: show ip pim bsrp-info
556
557 Display group-to-rp mappings received from E-BSR.
558
559 .. clicmd:: show ip pim bsm-database
560
561 Display all fragments ofstored bootstrap message in user readable format.
562
563 .. clicmd:: mtrace A.B.C.D [A.B.C.D]
564
565 Display multicast traceroute towards source, optionally for particular group.
566
567 .. clicmd:: show ip multicast count [vrf NAME] [json]
568
569 Display multicast data packets count per interface for a vrf.
570
571 .. clicmd:: show ip multicast count vrf all [json]
572
573 Display multicast data packets count per interface for all vrf.
574
575
576 .. seealso::
577
578 :ref:`multicast-rib-commands`
579
580
581 PIM Debug Commands
582 ==================
583
584 The debugging subsystem for PIM behaves in accordance with how FRR handles
585 debugging. You can specify debugging at the enable CLI mode as well as the
586 configure CLI mode. If you specify debug commands in the configuration cli
587 mode, the debug commands can be persistent across restarts of the FRR pimd if
588 the config was written out.
589
590 .. clicmd:: debug igmp
591
592 This turns on debugging for IGMP protocol activity.
593
594 .. clicmd:: debug mtrace
595
596 This turns on debugging for mtrace protocol activity.
597
598 .. clicmd:: debug mroute
599
600 This turns on debugging for PIM interaction with kernel MFC cache.
601
602 .. clicmd:: debug pim events
603
604 This turns on debugging for PIM system events. Especially timers.
605
606 .. clicmd:: debug pim nht
607
608 This turns on debugging for PIM nexthop tracking. It will display
609 information about RPF lookups and information about when a nexthop changes.
610
611 .. clicmd:: debug pim packet-dump
612
613 This turns on an extraordinary amount of data. Each pim packet sent and
614 received is dumped for debugging purposes. This should be considered a
615 developer only command.
616
617 .. clicmd:: debug pim packets
618
619 This turns on information about packet generation for sending and about
620 packet handling from a received packet.
621
622 .. clicmd:: debug pim trace
623
624 This traces pim code and how it is running.
625
626 .. clicmd:: debug pim bsm
627
628 This turns on debugging for BSR message processing.
629
630 .. clicmd:: debug pim zebra
631
632 This gathers data about events from zebra that come up through the ZAPI.
633
634 PIM Clear Commands
635 ==================
636 Clear commands reset various variables.
637
638 .. clicmd:: clear ip interfaces
639
640 Reset interfaces.
641
642 .. clicmd:: clear ip igmp interfaces
643
644 Reset IGMP interfaces.
645
646 .. clicmd:: clear ip mroute
647
648 Reset multicast routes.
649
650 .. clicmd:: clear ip mroute [vrf NAME] count
651
652 When this command is issued, reset the counts of data shown for
653 packet count, byte count and wrong interface to 0 and start count
654 up from this spot.
655
656 .. clicmd:: clear ip pim interfaces
657
658 Reset PIM interfaces.
659
660 .. clicmd:: clear ip pim oil
661
662 Rescan PIM OIL (output interface list).
663
664 .. clicmd:: clear ip pim [vrf NAME] bsr-data
665
666 This command will clear the BSM scope data struct. This command also
667 removes the next hop tracking for the bsr and resets the upstreams
668 for the dynamically learnt RPs.
669
670 PIM EVPN configuration
671 ======================
672 To use PIM in the underlay for overlay BUM forwarding associate a multicast
673 group with the L2 VNI. The actual configuration is based on your distribution.
674 Here is an ifupdown2 example::
675
676 auto vx-10100
677 iface vx-10100
678 vxlan-id 10100
679 bridge-access 100
680 vxlan-local-tunnelip 27.0.0.11
681 vxlan-mcastgrp 239.1.1.100
682
683 .. note::
684
685 PIM will see the ``vxlan-mcastgrp`` configuration and auto configure state
686 to properly forward BUM traffic.
687
688 PIM also needs to be configured in the underlay to allow the BUM MDT to be
689 setup. This is existing PIM configuration:
690
691 - Enable pim on the underlay L3 interface via the "ip pim" command.
692 - Configure RPs for the BUM multicast group range.
693 - Ensure the PIM is enabled on the lo of the VTEPs and the RP.
694
695
696 Sample configuration
697 ====================
698
699 .. code-block:: frr
700
701 debug igmp
702 debug pim
703 debug pim zebra
704
705 ! You may want to enable ssmpingd for troubleshooting
706 ! See http://www.venaas.no/multicast/ssmping/
707 !
708 ip ssmpingd 1.1.1.1
709 ip ssmpingd 2.2.2.2
710
711 ! HINTS:
712 ! - Enable "ip pim ssm" on the interface directly attached to the
713 ! multicast source host (if this is the first-hop router)
714 ! - Enable "ip pim ssm" on pim-routers-facing interfaces
715 ! - Enable "ip igmp" on IGMPv3-hosts-facing interfaces
716 ! - In order to inject IGMPv3 local membership information in the
717 ! PIM protocol state, enable both "ip pim ssm" and "ip igmp" on
718 ! the same interface; otherwise PIM won't advertise
719 ! IGMPv3-learned membership to other PIM routers
720
721 interface eth0
722 ip pim ssm
723 ip igmp
724