]> git.proxmox.com Git - mirror_frr.git/blob - pimd/TODO
Merge pull request #149 from pguibert6WIND/frr_6wind_stringify
[mirror_frr.git] / pimd / TODO
1 T1 DONE Implement debug command
2 test pim receive join
3
4 T2 DONE Implement debug command
5 test pim receive prune
6
7 T3 DONE Per-interface Downstream (S,G) state machine
8 (RFC 4601 4.5.3. Receiving (S,G) Join/Prune Messages)
9
10 T4 DONE Upstream (S,G) state machine
11 (RFC 4601 4.5.7. Sending (S,G) Join/Prune Messages)
12
13 T5 DONE Verify Data Packet Forwarding Rules
14 RFC 4601 4.2. Data Packet Forwarding Rules
15 RFC 4601 4.8.2. PIM-SSM-Only Routers
16
17 Additionally, the Packet forwarding rules of Section 4.2 can be
18 simplified in a PIM-SSM-only router:
19
20 iif is the incoming interface of the packet.
21 oiflist = NULL
22 if (iif == RPF_interface(S) AND UpstreamJPState(S,G) == Joined) {
23 oiflist = inherited_olist(S,G)
24 } else if (iif is in inherited_olist(S,G)) {
25 send Assert(S,G) on iif
26 }
27 oiflist = oiflist (-) iif
28 forward packet on all interfaces in oiflist
29
30 Macro:
31 inherited_olist(S,G) =
32 joins(S,G) (+) pim_include(S,G) (-) lost_assert(S,G)
33
34 T6 DONE Implement (S,G) Assert state machine (RFC 4601, section 4.6.1).
35 Changes in pim_ifchannel.ifassert_winner should trigger
36 pim_upstream_update_join_desired().
37 Depends on TODO T27.
38 Depends on TODO T33.
39 See also CAVEAT C7.
40 See also: RFC 4601 4.5.7. Sending (S,G) Join/Prune Messages
41 Transitions from Joined State
42 RPF'(S,G) changes due to an Assert
43
44 http://www.hep.ucl.ac.uk/~ytl/multi-cast/pim-dm_01.html:
45
46 The PIM Assert mechanism is used to shutoff duplicate flows onto
47 the same multiaccess network. Routers detect this condiction when
48 they receive an (S,G) packet via a multi-access interface that is
49 in the (S,G) OIL. This causes the routers to send Assert
50 Messages.
51
52 Note that neighbors will not accept Join/Prune or Assert messages
53 from a router unless they have first heard a Hello message from that
54 router. Thus, if a router needs to send a Join/Prune or Assert
55 message on an interface on which it has not yet sent a Hello message
56 with the currently configured IP address, then it MUST immediately
57 send the relevant Hello message without waiting for the Hello Timer
58 to expire, followed by the Join/Prune or Assert message.
59
60 T7 DONE Implement hello option: LAN Prune Delay
61
62 T8 DONE Implement J/P_Override_Interval(I)
63 Depends on TODO T7.
64 See pim_ifchannel.c, pim_ifchannel_prune(), jp_override_interval.
65
66 T9 DONE Detect change in IGMPv3 RPF interface/next-hop for S and update.
67 channel_oil vif index accordingly ?
68 Beware accidentaly adding looped MFC entries (IIF=OIF).
69
70 T10 DONE React to (S,G) join directed to another upstream address. See
71 also:
72
73 RFC 4601: 4.5.7. Sending (S,G) Join/Prune Messages
74
75 If a router wishes to propagate a Join(S,G) upstream, it must also
76 watch for messages on its upstream interface from other routers on
77 that subnet, and these may modify its behavior. If it sees a
78 Join(S,G) to the correct upstream neighbor, it should suppress its
79 own Join(S,G). If it sees a Prune(S,G), Prune(S,G,rpt), or
80 Prune(*,G) to the correct upstream neighbor towards S, it should
81 be prepared to override that prune by scheduling a Join(S,G) to be
82 sent almost immediately.
83
84 T11 DONE Review protocol modifications for SSM
85 (RFC 4601 4.8.1. Protocol Modifications for SSM Destination
86 Addresses)
87
88 T12 DONE Review updates of RPF entries.
89 FIXME pim_upstream.c send_join():
90 Currently only one upstream state is affected by detection of RPF change.
91 RPF change should affect all upstream states sharing the RPF cache.
92
93 T13 DONE Check that RFC macros using S,G,RPF_interface(S) are actually
94 implemented with this strategy:
95 rpf_ifch=find_ifch(up->rpf->interface).
96 See pim_rpf.c pim_rpf_find_rpf_addr() for a correct example.
97
98 $ grep -i macro pimd/*.c
99 pimd/pim_iface.c: RFC 4601: 4.1.6. State Summarization Macros
100 pimd/pim_ifchannel.c: RFC 4601: 4.6.5. Assert State Macros
101 pimd/pim_ifchannel.c: RFC 4601: 4.1.6. State Summarization Macros
102 pimd/pim_ifchannel.c: RFC 4601: 4.1.6. State Summarization Macros
103 pimd/pim_ifchannel.c: RFC 4601: 4.6.5. Assert State Macros
104 pimd/pim_ifchannel.c: Macro:
105 pimd/pim_rpf.c: RFC 4601: 4.1.6. State Summarization Macros
106
107 T14 DONE Send Assert(S,G) on iif as response to WRONGVIF kernel upcall.
108 See pim_mroute.c mroute_msg().
109
110 T15 DONE Interface command to statically join (S,G).
111 interface eth0
112 ip igmp join-group 239.1.1.1 source 1.1.1.1
113
114 T16 DONE RPF'(S,G) lookup is not working for S reachable with default route.
115 See "RPF'(S,G) not found" in pim_rpf_update() from pim_rpf.c.
116 Zebra daemon RIB is not reflecting changes in kernel routes
117 accurately?
118
119 T17 DONE Prevent CLI from creating bogus interfaces.
120 Example:
121 conf t
122 interface xxx
123
124 T18 Consider reliable pim solution (refresh reduction)
125 A Reliable Transport Mechanism for PIM
126 http://tools.ietf.org/wg/pim/draft-ietf-pim-port/
127 PORT=PIM-Over-Reliable-Transport
128
129 T19 DONE Fix self as neighbor
130 See mailing list post:
131 http://lists.gnu.org/archive/html/qpimd-users/2009-04/msg00000.html
132
133 T20 DONE Fix debug message: "pim_neighbor_update: internal error:
134 trying to replace same prefix list"
135 See mailing list post:
136 http://lists.gnu.org/archive/html/qpimd-users/2009-04/msg00000.html
137
138 T21 DONE Clean-up PIM/IGMP interface mismatch debugging
139 See option PIM_CHECK_RECV_IFINDEX_SANITY in pimd/Makefile.am
140 See mailing list post:
141 http://lists.nongnu.org/archive/html/qpimd-users/2009-04/msg00003.html
142
143 T22 DONE IGMP must be protected against adding looped MFC entries
144 created by both source and receiver attached to the same
145 interface.
146
147 T23 DONE libfrr crash after zclient_lookup_nexthop.
148 See mailing list post:
149 http://lists.nongnu.org/archive/html/qpimd-users/2009-04/msg00008.html
150
151 T24 DONE zserv may return recursive routes:
152 - nexthop type is set to ZEBRA_NEXTHOP_IPV4
153 - ifindex is not reported
154 - calls expecting ifindex (fib_lookup_if_vif_index) are disrupted
155 See also this mailing list post:
156 [PATCH 21/21] Link detect and recursive routes
157 http://www.gossamer-threads.com/lists/quagga/dev/17564
158
159 T25 DONE Zclient nexthop lookup missing OSPF route to 1.1.1.1/32
160 See also:
161 pim_zlookup.c zclient_lookup_nexthop misses OSPF 1.1.1.1/32
162 zebra/zebra_vty.c show_ip_route_addr_cmd hits OSPF 1.1.1.1/32
163
164 T26 DONE Zebra daemon is marking recursive static route as inactive.
165
166 FIXED: zebra daemon was incorrectly marking recursive routes
167 pointing to kernel routes as inactive:
168 zebra/zebra_rib.c nexthop_active_ipv4:
169 -- Original:
170 else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL))
171 -- Fixed:
172 else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL) ||
173 match->type == ZEBRA_ROUTE_KERNEL)
174
175 Old problem description:
176
177 This prevents rib_match_ipv4 from returning its nexthop:
178 client: pim_zlookup.c zclient_read_nexthop
179 server: zebra/zserv.c zsend_ipv4_nexthop_lookup_v2 -> rib_match_ipv4
180
181 Kernel route is injected into zebra in zebra_rib.c rib_add_ipv4
182 Examples:
183 rt_netlink.c:726: rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, src, index, table, metric, 0);
184 rt_netlink.c:864: rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, src, index, table, 0, 0);
185
186 This patch didn't fix the issue:
187 [PATCH 21/21] Link detect and recursive routes
188 http://www.gossamer-threads.com/lists/quagga/dev/17564
189
190 See the example below for the route 2.2.2.2.
191
192 bash# route add -host 1.1.1.1 gw 127.0.0.1
193 bash# route add -host 2.2.2.2 gw 1.1.1.1
194 bash# netstat -nvr
195 Kernel IP routing table
196 Destination Gateway Genmask Flags MSS Window irtt Iface
197 2.2.2.2 1.1.1.1 255.255.255.255 UGH 0 0 0 lo
198 1.1.1.1 127.0.0.1 255.255.255.255 UGH 0 0 0 lo
199 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
200 0.0.0.0 192.168.0.2 0.0.0.0 UG 0 0 0 eth0
201 bash#
202
203 zebra# sh ip route
204 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
205 I - ISIS, B - BGP, > - selected route, * - FIB route
206
207 K>* 0.0.0.0/0 via 192.168.0.2, eth0
208 K>* 1.1.1.1/32 via 127.0.0.1, lo
209 K * 2.2.2.2/32 via 1.1.1.1, lo inactive
210 C>* 127.0.0.0/8 is directly connected, lo
211 C>* 192.168.0.0/24 is directly connected, eth0
212
213 quagga-pimd-router# sh ip route 1.1.1.1
214 Address NextHop Interface Metric Preference
215 1.1.1.1 127.0.0.1 lo 0 0
216 quagga-pimd-router#
217 quagga-pimd-router# sh ip route 2.2.2.2
218 Address NextHop Interface Metric Preference
219 2.2.2.2 192.168.0.2 eth0 0 0
220 quagga-pimd-router#
221
222 T27 DONE Implement debug command
223 test pim receive assert
224 See also TODO T6: (S,G) Assert state machine.
225
226 T28 DONE Bad IPv4 address family=02 in Join/Prune dump
227 Reported by Andrew Lunn <andrew.lunn@ascom.ch>
228
229 # 58-byte pim v2 Join/Prune dump
230 # ------------------------------
231 # IPv4 address family=02 is wrong, correct IPv4 address family is 01
232 # See http://www.iana.org/assignments/address-family-numbers
233 #
234 c8XX YY03 : ip src 200.xx.yy.3
235 e000 000d : ip dst 224.0.0.13
236 9404 0000 : ip router alert option 148.4.0.0
237 2300 ab13 : pimv2,type=3 res=00 checksum=ab13
238 0200 : upstream family=02, encoding=00
239 c8XX YY08 : upstream 200.xx.yy.8
240 0001 00d2 : res=00 groups=01 holdtime=00d2
241 0200 0020 : group family=02, encoding=00, res=00, mask_len=20
242 ef01 0101 : group address 239.1.1.1
243 0001 0000 : joined=0001 pruned=0000
244 0200 0020 : source family=02, encoding=00, res=00, mask_len=20
245 0101 0101 : source address 1.1.1.1
246
247 T29 DONE Reset interface PIM-hello-sent counter when primary address changes
248 See pim_ifp->pim_ifstat_hello_sent
249
250 RFC 4601: 4.3.1. Sending Hello Messages
251
252 Thus, if a router needs to send a Join/Prune or Assert message on
253 an interface on which it has not yet sent a Hello message with the
254 currently configured IP address, then it MUST immediately send the
255 relevant Hello message without waiting for the Hello Timer to
256 expire, followed by the Join/Prune or Assert message.
257
258 T30 DONE Run interface DR election when primary address changes
259 Reported by Andrew Lunn <andrew.lunn@ascom.ch>
260 See pim_if_dr_election().
261
262 T31 If an interface changes one of its secondary IP addresses, a Hello
263 message with an updated Address_List option and a non-zero
264 HoldTime should be sent immediately.
265 See also detect_secondary_address_change
266 See also CAVEAT C15.
267 See also RFC 4601: 4.3.1. Sending Hello Messages
268
269 T32 FIXED Detection of interface primary address changes may fail when
270 there are multiple addresses.
271 See also CAVEAT C14.
272
273 pim_find_primary_addr() should return interface primary address
274 from connected list. Currently it returns the first address.
275
276 Zebra daemon "show int" is able to keep the primary address as
277 first address.
278
279 T33 DONE Implement debug command: test pim receive upcall
280 See also TODO T6: (S,G) Assert state machine.
281
282 T34 DONE assert_action_a1
283
284 T35 DONE Review macros depending on interface I.
285
286 See also: grep ,I\) pimd/*.c
287
288 For the case (S,G,I) check if I is either
289 1) interface attached to this per-interface S,G state (don't think so)
290 or
291 2) an arbitrary interface (most probably)
292
293 For the arbitrary interface case (2), consider representing
294 interface ifp as its primary address (struct in_addr ifaddr). The
295 benefit is in_addr does not need to be dereferenced, so it does
296 not demand protection against crashes.
297
298 T36 DONE React to zebra daemon link-detect up/down notification.
299 pim_ifp->primary_address is managed by detect_primary_address_change()
300 depending on to ifp->connected (managed by zebra_interface_address_read()).
301
302 T37 DONE Review list of variables which may affect pim_upstream.c
303 pim_upstream_evaluate_join_desired().
304 Call pim_upstream_update_join_desired() accordingly.
305
306 See the order of invokation:
307 pim_if_dr_election(ifp);
308 pim_if_update_join_desired(pim_ifp); /* depends on DR */
309 pim_if_update_could_assert(ifp); /* depends on DR */
310 pim_if_update_my_assert_metric(ifp); /* depends on could_assert */
311
312 join_desired depends on:
313 pim_ifp->primary_address
314 pim_ifp->pim_dr_addr
315 ch->ifassert_winner_metric
316 ch->ifassert_winner
317 ch->local_ifmembership
318 ch->ifjoin_state
319 ch->upstream->rpf.source_nexthop.mrib_metric_preference
320 ch->upstream->rpf.source_nexthop.mrib_route_metric
321 ch->upstream->rpf.source_nexthop.interface
322
323 T38 DONE Detect change in AssertTrackingDesired(S,G,I)
324
325 See the order of invokation:
326 dr_election: none
327 update_join_desired: depends on DR
328 update_tracking_desired: depends on DR, join_desired
329
330 AssertTrackingDesired(S,G,I) depends on:
331 pim_ifp->primary_address
332 pim_ifp->pim_dr_addr
333 ch->local_ifmembership
334 ch->ifassert_winner
335 ch->ifjoin_state
336 ch->upstream->rpf.source_nexthop.interface
337 PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(ch->upstream->flags)
338
339 T39 DONE AssertTrackingDesired: flags is not matching evaluation
340
341 # show ip pim assert-internal
342 CA: CouldAssert
343 ECA: Evaluate CouldAssert
344 ATD: AssertTrackingDesired
345 eATD: Evaluate AssertTrackingDesired
346
347 Interface Address Source Group CA eCA ATD eATD
348 eth0 192.168.1.100 1.1.1.1 239.1.1.1 no no no yes
349 #
350
351 T40 Lightweight MLDv2
352 http://tools.ietf.org/html/draft-ietf-mboned-lightweight-igmpv3-mldv2-05
353 http://www.ietf.org/internet-drafts/draft-ietf-mboned-lightweight-igmpv3-mldv2-05.txt
354 http://www.ietf.org/html.charters/mboned-charter.html
355
356 T41 DONE ssmping support
357
358 See also:
359 http://www.venaas.no/multicast/ssmping/
360 draft-ietf-mboned-ssmping-07
361 http://tools.ietf.org/html/draft-ietf-mboned-ssmping-07
362
363 Example:
364
365 debug ssmpingd
366
367 conf t
368 ip ssmpingd 1.1.1.1
369
370 show ip ssmpingd
371
372 T42 Static igmp join fails when loading config at boot time
373
374 ! Wrong behavior seen at boot time:
375 !
376 2010/02/22 08:59:00 PIM: igmp_source_forward_start: ignoring request for
377 looped MFC entry (S,G)=(3.3.3.3,239.3.3.3): igmp_sock=12 oif=eth0 vif_index=2
378
379 ! Correct behavior seen later:
380 !
381 2010/02/22 09:03:16 PIM: igmp_source_forward_start: ignoring request for
382 looped MFC entry (S,G)=(2.2.2.2,239.2.2.2): igmp_sock=17 oif=lo vif_index=1
383
384 ! To see the wrong message at boot:
385 !
386 debug igmp trace
387 !
388 interface lo
389 ip igmp
390 ip igmp join 239.2.2.2 2.2.2.2
391 ip igmp join 239.3.3.3 3.3.3.3
392 !
393
394 ! Interfaces indexes:
395 Interface Address ifi Vif PktsIn PktsOut BytesIn BytesOut
396 eth0 200.202.112.3 2 2 0 0 0 0
397 lo 127.0.0.1 1 1 0 0 0 0
398
399 T43 PIM Neighbor Reduction
400 https://datatracker.ietf.org/doc/draft-wijnands-pim-neighbor-reduction/
401
402 "In a transit LAN (no directly connected source or receiver), many
403 of the PIM procedures don't apply. (...) This proposal describes
404 a procedure to reduce the amount of neighbors established over a
405 transit LAN."
406
407 T44 Single Stream Multicast Fast Reroute (SMFR) Method
408 https://datatracker.ietf.org/doc/draft-liu-pim-single-stream-multicast-frr/
409
410 "This document proposes an IP multicast fast convergence method
411 based on differentiating primary and backup PIM join."
412
413 T45 RFC5384 - The Join Attribute Format
414 "This document describes a modification of the Join message that
415 allows a node to associate attributes with a particular tree."
416
417 T46 PIM Multi-Topology ID (MT-ID) Join-Attribute
418 http://tools.ietf.org/html/draft-cai-pim-mtid-00
419 Depends on T45.
420
421 "This draft introduces a new type of PIM Join Attribute used to
422 encode the identity of the topology PIM uses for RPF."
423
424 -x-