Annotation of embedaddon/quagga/pimd/TODO, revision 1.1.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>