TODO 16 KB

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