-# $QuaggaId: $Format:%an, %ai, %h$ $
-
-T1 DONE Implement debug command
- test pim receive join
-
-T2 DONE Implement debug command
- test pim receive prune
-
-T3 DONE Per-interface Downstream (S,G) state machine
- (RFC 4601 4.5.3. Receiving (S,G) Join/Prune Messages)
-
-T4 DONE Upstream (S,G) state machine
- (RFC 4601 4.5.7. Sending (S,G) Join/Prune Messages)
-
-T5 DONE Verify Data Packet Forwarding Rules
- RFC 4601 4.2. Data Packet Forwarding Rules
- RFC 4601 4.8.2. PIM-SSM-Only Routers
-
- Additionally, the Packet forwarding rules of Section 4.2 can be
- simplified in a PIM-SSM-only router:
-
- iif is the incoming interface of the packet.
- oiflist = NULL
- if (iif == RPF_interface(S) AND UpstreamJPState(S,G) == Joined) {
- oiflist = inherited_olist(S,G)
- } else if (iif is in inherited_olist(S,G)) {
- send Assert(S,G) on iif
- }
- oiflist = oiflist (-) iif
- forward packet on all interfaces in oiflist
-
- Macro:
- inherited_olist(S,G) =
- joins(S,G) (+) pim_include(S,G) (-) lost_assert(S,G)
-
-T6 DONE Implement (S,G) Assert state machine (RFC 4601, section 4.6.1).
- Changes in pim_ifchannel.ifassert_winner should trigger
- pim_upstream_update_join_desired().
- Depends on TODO T27.
- Depends on TODO T33.
- See also CAVEAT C7.
- See also: RFC 4601 4.5.7. Sending (S,G) Join/Prune Messages
- Transitions from Joined State
- RPF'(S,G) changes due to an Assert
-
- http://www.hep.ucl.ac.uk/~ytl/multi-cast/pim-dm_01.html:
-
- The PIM Assert mechanism is used to shutoff duplicate flows onto
- the same multiaccess network. Routers detect this condiction when
- they receive an (S,G) packet via a multi-access interface that is
- in the (S,G) OIL. This causes the routers to send Assert
- Messages.
-
- Note that neighbors will not accept Join/Prune or Assert messages
- from a router unless they have first heard a Hello message from that
- router. Thus, if a router needs to send a Join/Prune or Assert
- message on an interface on which it has not yet sent a Hello message
- with the currently configured IP address, then it MUST immediately
- send the relevant Hello message without waiting for the Hello Timer
- to expire, followed by the Join/Prune or Assert message.
-
-T7 DONE Implement hello option: LAN Prune Delay
-
-T8 DONE Implement J/P_Override_Interval(I)
- Depends on TODO T7.
- See pim_ifchannel.c, pim_ifchannel_prune(), jp_override_interval.
-
-T9 DONE Detect change in IGMPv3 RPF interface/next-hop for S and update.
- channel_oil vif index accordingly ?
- Beware accidentaly adding looped MFC entries (IIF=OIF).
-
-T10 DONE React to (S,G) join directed to another upstream address. See
- also:
-
- RFC 4601: 4.5.7. Sending (S,G) Join/Prune Messages
-
- If a router wishes to propagate a Join(S,G) upstream, it must also
- watch for messages on its upstream interface from other routers on
- that subnet, and these may modify its behavior. If it sees a
- Join(S,G) to the correct upstream neighbor, it should suppress its
- own Join(S,G). If it sees a Prune(S,G), Prune(S,G,rpt), or
- Prune(*,G) to the correct upstream neighbor towards S, it should
- be prepared to override that prune by scheduling a Join(S,G) to be
- sent almost immediately.
-
-T11 DONE Review protocol modifications for SSM
- (RFC 4601 4.8.1. Protocol Modifications for SSM Destination
- Addresses)
-
-T12 DONE Review updates of RPF entries.
- FIXME pim_upstream.c send_join():
- Currently only one upstream state is affected by detection of RPF change.
- RPF change should affect all upstream states sharing the RPF cache.
-
-T13 DONE Check that RFC macros using S,G,RPF_interface(S) are actually
- implemented with this strategy:
- rpf_ifch=find_ifch(up->rpf->interface).
- See pim_rpf.c pim_rpf_find_rpf_addr() for a correct example.
-
- $ grep -i macro pimd/*.c
- pimd/pim_iface.c: RFC 4601: 4.1.6. State Summarization Macros
- pimd/pim_ifchannel.c: RFC 4601: 4.6.5. Assert State Macros
- pimd/pim_ifchannel.c: RFC 4601: 4.1.6. State Summarization Macros
- pimd/pim_ifchannel.c: RFC 4601: 4.1.6. State Summarization Macros
- pimd/pim_ifchannel.c: RFC 4601: 4.6.5. Assert State Macros
- pimd/pim_ifchannel.c: Macro:
- pimd/pim_rpf.c: RFC 4601: 4.1.6. State Summarization Macros
-
-T14 DONE Send Assert(S,G) on iif as response to WRONGVIF kernel upcall.
- See pim_mroute.c mroute_msg().
-
-T15 DONE Interface command to statically join (S,G).
- interface eth0
- ip igmp join-group 239.1.1.1 source 1.1.1.1
-
-T16 DONE RPF'(S,G) lookup is not working for S reachable with default route.
- See "RPF'(S,G) not found" in pim_rpf_update() from pim_rpf.c.
- Zebra daemon RIB is not reflecting changes in kernel routes
- accurately?
-
-T17 DONE Prevent CLI from creating bogus interfaces.
- Example:
- conf t
- interface xxx
-
-T18 Consider reliable pim solution (refresh reduction)
+T1 Consider reliable pim solution (refresh reduction)
A Reliable Transport Mechanism for PIM
http://tools.ietf.org/wg/pim/draft-ietf-pim-port/
PORT=PIM-Over-Reliable-Transport
-T19 DONE Fix self as neighbor
- See mailing list post:
- http://lists.gnu.org/archive/html/qpimd-users/2009-04/msg00000.html
-
-T20 DONE Fix debug message: "pim_neighbor_update: internal error:
- trying to replace same prefix list"
- See mailing list post:
- http://lists.gnu.org/archive/html/qpimd-users/2009-04/msg00000.html
-
-T21 DONE Clean-up PIM/IGMP interface mismatch debugging
- See option PIM_CHECK_RECV_IFINDEX_SANITY in pimd/Makefile.am
- See mailing list post:
- http://lists.nongnu.org/archive/html/qpimd-users/2009-04/msg00003.html
-
-T22 DONE IGMP must be protected against adding looped MFC entries
- created by both source and receiver attached to the same
- interface.
-
-T23 DONE libzebra crash after zclient_lookup_nexthop.
- See mailing list post:
- http://lists.nongnu.org/archive/html/qpimd-users/2009-04/msg00008.html
-
-T24 DONE zserv may return recursive routes:
- - nexthop type is set to ZEBRA_NEXTHOP_IPV4
- - ifindex is not reported
- - calls expecting ifindex (fib_lookup_if_vif_index) are disrupted
- See also this mailing list post:
- [PATCH 21/21] Link detect and recursive routes
- http://www.gossamer-threads.com/lists/quagga/dev/17564
-
-T25 DONE Zclient nexthop lookup missing OSPF route to 1.1.1.1/32
- See also:
- pim_zlookup.c zclient_lookup_nexthop misses OSPF 1.1.1.1/32
- zebra/zebra_vty.c show_ip_route_addr_cmd hits OSPF 1.1.1.1/32
-
-T26 DONE Zebra daemon is marking recursive static route as inactive.
-
- FIXED: zebra daemon was incorrectly marking recursive routes
- pointing to kernel routes as inactive:
- zebra/zebra_rib.c nexthop_active_ipv4:
- -- Original:
- else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL))
- -- Fixed:
- else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL) ||
- match->type == ZEBRA_ROUTE_KERNEL)
-
- Old problem description:
-
- This prevents rib_match_ipv4 from returning its nexthop:
- client: pim_zlookup.c zclient_read_nexthop
- server: zebra/zserv.c zsend_ipv4_nexthop_lookup_v2 -> rib_match_ipv4
-
- Kernel route is injected into zebra in zebra_rib.c rib_add_ipv4
- Examples:
- rt_netlink.c:726: rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, src, index, table, metric, 0);
- rt_netlink.c:864: rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, src, index, table, 0, 0);
-
- This patch didn't fix the issue:
- [PATCH 21/21] Link detect and recursive routes
- http://www.gossamer-threads.com/lists/quagga/dev/17564
-
- See the example below for the route 2.2.2.2.
-
-bash# route add -host 1.1.1.1 gw 127.0.0.1
-bash# route add -host 2.2.2.2 gw 1.1.1.1
-bash# netstat -nvr
-Kernel IP routing table
-Destination Gateway Genmask Flags MSS Window irtt Iface
-2.2.2.2 1.1.1.1 255.255.255.255 UGH 0 0 0 lo
-1.1.1.1 127.0.0.1 255.255.255.255 UGH 0 0 0 lo
-192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-0.0.0.0 192.168.0.2 0.0.0.0 UG 0 0 0 eth0
-bash#
-
-zebra# sh ip route
-Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
- I - ISIS, B - BGP, > - selected route, * - FIB route
-
-K>* 0.0.0.0/0 via 192.168.0.2, eth0
-K>* 1.1.1.1/32 via 127.0.0.1, lo
-K * 2.2.2.2/32 via 1.1.1.1, lo inactive
-C>* 127.0.0.0/8 is directly connected, lo
-C>* 192.168.0.0/24 is directly connected, eth0
-
-quagga-pimd-router# sh ip route 1.1.1.1
-Address NextHop Interface Metric Preference
-1.1.1.1 127.0.0.1 lo 0 0
-quagga-pimd-router#
-quagga-pimd-router# sh ip route 2.2.2.2
-Address NextHop Interface Metric Preference
-2.2.2.2 192.168.0.2 eth0 0 0
-quagga-pimd-router#
-
-T27 DONE Implement debug command
- test pim receive assert
- See also TODO T6: (S,G) Assert state machine.
-
-T28 DONE Bad IPv4 address family=02 in Join/Prune dump
- Reported by Andrew Lunn <andrew.lunn@ascom.ch>
-
- # 58-byte pim v2 Join/Prune dump
- # ------------------------------
- # IPv4 address family=02 is wrong, correct IPv4 address family is 01
- # See http://www.iana.org/assignments/address-family-numbers
- #
- c8XX YY03 : ip src 200.xx.yy.3
- e000 000d : ip dst 224.0.0.13
- 9404 0000 : ip router alert option 148.4.0.0
- 2300 ab13 : pimv2,type=3 res=00 checksum=ab13
- 0200 : upstream family=02, encoding=00
- c8XX YY08 : upstream 200.xx.yy.8
- 0001 00d2 : res=00 groups=01 holdtime=00d2
- 0200 0020 : group family=02, encoding=00, res=00, mask_len=20
- ef01 0101 : group address 239.1.1.1
- 0001 0000 : joined=0001 pruned=0000
- 0200 0020 : source family=02, encoding=00, res=00, mask_len=20
- 0101 0101 : source address 1.1.1.1
-
-T29 DONE Reset interface PIM-hello-sent counter when primary address changes
- See pim_ifp->pim_ifstat_hello_sent
-
- RFC 4601: 4.3.1. Sending Hello Messages
-
- Thus, if a router needs to send a Join/Prune or Assert message on
- an interface on which it has not yet sent a Hello message with the
- currently configured IP address, then it MUST immediately send the
- relevant Hello message without waiting for the Hello Timer to
- expire, followed by the Join/Prune or Assert message.
-
-T30 DONE Run interface DR election when primary address changes
- Reported by Andrew Lunn <andrew.lunn@ascom.ch>
- See pim_if_dr_election().
-
-T31 If an interface changes one of its secondary IP addresses, a Hello
+T2 If an interface changes one of its secondary IP addresses, a Hello
message with an updated Address_List option and a non-zero
HoldTime should be sent immediately.
See also detect_secondary_address_change
See also CAVEAT C15.
See also RFC 4601: 4.3.1. Sending Hello Messages
-T32 FIXED Detection of interface primary address changes may fail when
- there are multiple addresses.
- See also CAVEAT C14.
-
- pim_find_primary_addr() should return interface primary address
- from connected list. Currently it returns the first address.
-
- Zebra daemon "show int" is able to keep the primary address as
- first address.
-
-T33 DONE Implement debug command: test pim receive upcall
- See also TODO T6: (S,G) Assert state machine.
-
-T34 DONE assert_action_a1
-
-T35 DONE Review macros depending on interface I.
-
- See also: grep ,I\) pimd/*.c
-
- For the case (S,G,I) check if I is either
- 1) interface attached to this per-interface S,G state (don't think so)
- or
- 2) an arbitrary interface (most probably)
-
- For the arbitrary interface case (2), consider representing
- interface ifp as its primary address (struct in_addr ifaddr). The
- benefit is in_addr does not need to be dereferenced, so it does
- not demand protection against crashes.
-
-T36 DONE React to zebra daemon link-detect up/down notification.
- pim_ifp->primary_address is managed by detect_primary_address_change()
- depending on to ifp->connected (managed by zebra_interface_address_read()).
-
-T37 DONE Review list of variables which may affect pim_upstream.c
- pim_upstream_evaluate_join_desired().
- Call pim_upstream_update_join_desired() accordingly.
-
- See the order of invokation:
- pim_if_dr_election(ifp);
- pim_if_update_join_desired(pim_ifp); /* depends on DR */
- pim_if_update_could_assert(ifp); /* depends on DR */
- pim_if_update_my_assert_metric(ifp); /* depends on could_assert */
-
- join_desired depends on:
- pim_ifp->primary_address
- pim_ifp->pim_dr_addr
- ch->ifassert_winner_metric
- ch->ifassert_winner
- ch->local_ifmembership
- ch->ifjoin_state
- ch->upstream->rpf.source_nexthop.mrib_metric_preference
- ch->upstream->rpf.source_nexthop.mrib_route_metric
- ch->upstream->rpf.source_nexthop.interface
-
-T38 DONE Detect change in AssertTrackingDesired(S,G,I)
-
- See the order of invokation:
- dr_election: none
- update_join_desired: depends on DR
- update_tracking_desired: depends on DR, join_desired
-
- AssertTrackingDesired(S,G,I) depends on:
- pim_ifp->primary_address
- pim_ifp->pim_dr_addr
- ch->local_ifmembership
- ch->ifassert_winner
- ch->ifjoin_state
- ch->upstream->rpf.source_nexthop.interface
- PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(ch->upstream->flags)
-
-T39 DONE AssertTrackingDesired: flags is not matching evaluation
-
- # show ip pim assert-internal
- CA: CouldAssert
- ECA: Evaluate CouldAssert
- ATD: AssertTrackingDesired
- eATD: Evaluate AssertTrackingDesired
-
- Interface Address Source Group CA eCA ATD eATD
- eth0 192.168.1.100 1.1.1.1 239.1.1.1 no no no yes
- #
-
-T40 Lightweight MLDv2
+T3 Lightweight MLDv2
http://tools.ietf.org/html/draft-ietf-mboned-lightweight-igmpv3-mldv2-05
http://www.ietf.org/internet-drafts/draft-ietf-mboned-lightweight-igmpv3-mldv2-05.txt
http://www.ietf.org/html.charters/mboned-charter.html
-T41 DONE ssmping support
-
- See also:
- http://www.venaas.no/multicast/ssmping/
- draft-ietf-mboned-ssmping-07
- http://tools.ietf.org/html/draft-ietf-mboned-ssmping-07
-
- Example:
-
- debug ssmpingd
-
- conf t
- ip ssmpingd 1.1.1.1
-
- show ip ssmpingd
-
-T42 Static igmp join fails when loading config at boot time
+T4 Static igmp join fails when loading config at boot time
! Wrong behavior seen at boot time:
!
eth0 200.202.112.3 2 2 0 0 0 0
lo 127.0.0.1 1 1 0 0 0 0
-T43 PIM Neighbor Reduction
+T5 PIM Neighbor Reduction
https://datatracker.ietf.org/doc/draft-wijnands-pim-neighbor-reduction/
"In a transit LAN (no directly connected source or receiver), many
a procedure to reduce the amount of neighbors established over a
transit LAN."
-T44 Single Stream Multicast Fast Reroute (SMFR) Method
+T6 Single Stream Multicast Fast Reroute (SMFR) Method
https://datatracker.ietf.org/doc/draft-liu-pim-single-stream-multicast-frr/
"This document proposes an IP multicast fast convergence method
based on differentiating primary and backup PIM join."
-T45 RFC5384 - The Join Attribute Format
+T7 RFC5384 - The Join Attribute Format
"This document describes a modification of the Join message that
allows a node to associate attributes with a particular tree."
-T46 PIM Multi-Topology ID (MT-ID) Join-Attribute
+T8 PIM Multi-Topology ID (MT-ID) Join-Attribute
http://tools.ietf.org/html/draft-cai-pim-mtid-00
- Depends on T45.
+ Depends on T7.
"This draft introduces a new type of PIM Join Attribute used to
encode the identity of the topology PIM uses for RPF."