]>
Commit | Line | Data |
---|---|---|
12e41d03 DL |
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 | ||
55c72803 | 147 | T23 DONE libfrr crash after zclient_lookup_nexthop. |
12e41d03 DL |
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- |