Annotation of embedaddon/quagga/pimd/TODO, revision 1.1
1.1 ! misho 1: # $QuaggaId: $Format:%an, %ai, %h$ $
! 2:
! 3: T1 DONE Implement debug command
! 4: test pim receive join
! 5:
! 6: T2 DONE Implement debug command
! 7: test pim receive prune
! 8:
! 9: T3 DONE Per-interface Downstream (S,G) state machine
! 10: (RFC 4601 4.5.3. Receiving (S,G) Join/Prune Messages)
! 11:
! 12: T4 DONE Upstream (S,G) state machine
! 13: (RFC 4601 4.5.7. Sending (S,G) Join/Prune Messages)
! 14:
! 15: T5 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:
! 36: T6 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:
! 62: T7 DONE Implement hello option: LAN Prune Delay
! 63:
! 64: T8 DONE Implement J/P_Override_Interval(I)
! 65: Depends on TODO T7.
! 66: See pim_ifchannel.c, pim_ifchannel_prune(), jp_override_interval.
! 67:
! 68: T9 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:
! 72: T10 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:
! 86: T11 DONE Review protocol modifications for SSM
! 87: (RFC 4601 4.8.1. Protocol Modifications for SSM Destination
! 88: Addresses)
! 89:
! 90: T12 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:
! 95: T13 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:
! 109: T14 DONE Send Assert(S,G) on iif as response to WRONGVIF kernel upcall.
! 110: See pim_mroute.c mroute_msg().
! 111:
! 112: T15 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:
! 116: T16 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:
! 121: T17 DONE Prevent CLI from creating bogus interfaces.
! 122: Example:
! 123: conf t
! 124: interface xxx
! 125:
! 126: T18 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:
! 131: T19 DONE Fix self as neighbor
! 132: See mailing list post:
! 133: http://lists.gnu.org/archive/html/qpimd-users/2009-04/msg00000.html
! 134:
! 135: T20 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:
! 140: T21 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:
! 145: T22 DONE IGMP must be protected against adding looped MFC entries
! 146: created by both source and receiver attached to the same
! 147: interface.
! 148:
! 149: T23 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:
! 153: T24 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:
! 161: T25 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:
! 166: T26 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:
! 194: bash# route add -host 1.1.1.1 gw 127.0.0.1
! 195: bash# route add -host 2.2.2.2 gw 1.1.1.1
! 196: bash# netstat -nvr
! 197: Kernel IP routing table
! 198: Destination Gateway Genmask Flags MSS Window irtt Iface
! 199: 2.2.2.2 1.1.1.1 255.255.255.255 UGH 0 0 0 lo
! 200: 1.1.1.1 127.0.0.1 255.255.255.255 UGH 0 0 0 lo
! 201: 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
! 202: 0.0.0.0 192.168.0.2 0.0.0.0 UG 0 0 0 eth0
! 203: bash#
! 204:
! 205: zebra# sh ip route
! 206: Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
! 207: I - ISIS, B - BGP, > - selected route, * - FIB route
! 208:
! 209: K>* 0.0.0.0/0 via 192.168.0.2, eth0
! 210: K>* 1.1.1.1/32 via 127.0.0.1, lo
! 211: K * 2.2.2.2/32 via 1.1.1.1, lo inactive
! 212: C>* 127.0.0.0/8 is directly connected, lo
! 213: C>* 192.168.0.0/24 is directly connected, eth0
! 214:
! 215: quagga-pimd-router# sh ip route 1.1.1.1
! 216: Address NextHop Interface Metric Preference
! 217: 1.1.1.1 127.0.0.1 lo 0 0
! 218: quagga-pimd-router#
! 219: quagga-pimd-router# sh ip route 2.2.2.2
! 220: Address NextHop Interface Metric Preference
! 221: 2.2.2.2 192.168.0.2 eth0 0 0
! 222: quagga-pimd-router#
! 223:
! 224: T27 DONE Implement debug command
! 225: test pim receive assert
! 226: See also TODO T6: (S,G) Assert state machine.
! 227:
! 228: T28 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:
! 249: T29 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:
! 260: T30 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:
! 264: T31 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.
! 267: See also detect_secondary_address_change
! 268: See also CAVEAT C15.
! 269: See also RFC 4601: 4.3.1. Sending Hello Messages
! 270:
! 271: T32 FIXED Detection of interface primary address changes may fail when
! 272: there are multiple addresses.
! 273: 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:
! 281: T33 DONE Implement debug command: test pim receive upcall
! 282: See also TODO T6: (S,G) Assert state machine.
! 283:
! 284: T34 DONE assert_action_a1
! 285:
! 286: T35 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:
! 300: T36 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:
! 304: T37 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:
! 325: T38 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:
! 341: T39 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:
! 353: T40 Lightweight MLDv2
! 354: http://tools.ietf.org/html/draft-ietf-mboned-lightweight-igmpv3-mldv2-05
! 355: 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:
! 358: T41 DONE ssmping support
! 359:
! 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
! 364:
! 365: Example:
! 366:
! 367: debug ssmpingd
! 368:
! 369: conf t
! 370: ip ssmpingd 1.1.1.1
! 371:
! 372: show ip ssmpingd
! 373:
! 374: T42 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
! 400:
! 401: T43 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:
! 409: T44 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:
! 415: T45 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:
! 419: T46 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."
! 425:
! 426: -x-
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>