From c843c1ec1f8fd85581d6ad8968ae470cf35200f1 Mon Sep 17 00:00:00 2001 From: idismmxiv Date: Tue, 2 Feb 2016 05:53:00 -0800 Subject: [PATCH] Create MRT entry once PIM Register is received even if no joins exists. This makes it possible to send join towards S right after join is received from multicast listener without waiting for next PIM Register. Saves 0 - 60 seconds in such scenario. --- pim_proto.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pim_proto.c b/pim_proto.c index 182cbd06..eb01146c 100644 --- a/pim_proto.c +++ b/pim_proto.c @@ -696,6 +696,25 @@ int receive_pim_register(uint32_t reg_src, uint32_t reg_dst, char *msg, size_t l /* TODO: XXX: shouldn't it be inner_src=INADDR_ANY? Not in the spec. */ send_pim_register_stop(reg_dst, reg_src, inner_grp, inner_src); + /* Create mrtentry for forthcoming join requests. Once one occurs + * we know who is sending to this group and can send join to + * that immediately. Saves 0 - 60 seconds not to wait next + * PIM Register. + */ + mrtentry = find_route(inner_src, inner_grp, MRTF_SG, CREATE); + if (!mrtentry) + return TRUE; + + mrtentry->incoming = reg_vif_num; + SET_TIMER(mrtentry->timer, PIM_DATA_TIMEOUT); + mrtentry->flags &= ~MRTF_NEW; + change_interfaces(mrtentry, + mrtentry->incoming, + mrtentry->joined_oifs, + mrtentry->pruned_oifs, + mrtentry->leaves, + mrtentry->asserted_oifs, 0); + return TRUE; }