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>