mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-28 11:50:21 +00:00
pimd: Cleanup TODO file
The TODO file had become a dumping ground of changes made to the protocol. That when we modified the underlying code we would need to update the TODO file again due to it's nature. There is no point in keeping the list of items that we've done as that commit messages will indicate the new features. So pull out all the Finished work and rework the Todo numbers used. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
4e8b02f4df
commit
95d962bf1d
372
pimd/TODO
372
pimd/TODO
@ -1,375 +1,21 @@
|
||||
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 libfrr 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_ALLOW_RECURSION))
|
||||
-- Fixed:
|
||||
else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_ALLOW_RECURSION) ||
|
||||
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:
|
||||
!
|
||||
@ -396,7 +42,7 @@ T42 Static igmp join fails when loading config 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
|
||||
@ -404,19 +50,19 @@ T43 PIM Neighbor Reduction
|
||||
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."
|
||||
|
Loading…
Reference in New Issue
Block a user