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