mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 08:15:19 +00:00 
			
		
		
		
	pimd: Fix WG/SGRpt & WG J/P processing
During processing of Join/Prune, for a S,G entry, current state is SGRpt, when only *,G is received, need to clear SGRpt and add/inherit the *,G OIF to S,G so it can forward traffic to downstream where *,G is received. Upon receiving SGRpt prune remove the inherited *,G OIF. Testing Done: Trigger SPT switchover, *,G path received SGRpt later data traffic stopped S,G ages out from LHR, sends only *,G join to upstream, verified S,G entry inherit the OIF. Upon receiving SGRpt deletes inherited oif and retains in SGRpt state. Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
This commit is contained in:
		
							parent
							
								
									36b1fa8631
								
							
						
					
					
						commit
						1f58d560da
					
				@ -1223,20 +1223,55 @@ pim_ifchannel_scan_forward_start (struct interface *new_ifp)
 | 
			
		||||
 * we get End of Message
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom)
 | 
			
		||||
pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t source_flags, uint8_t join)
 | 
			
		||||
{
 | 
			
		||||
  struct pim_ifchannel *child;
 | 
			
		||||
  struct listnode *ch_node;
 | 
			
		||||
 | 
			
		||||
  if (PIM_DEBUG_PIM_TRACE)
 | 
			
		||||
    zlog_debug ("%s: %s %s eom: %d", __PRETTY_FUNCTION__,
 | 
			
		||||
    zlog_debug ("%s: %s %s eom: %d join %u", __PRETTY_FUNCTION__,
 | 
			
		||||
                pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags),
 | 
			
		||||
                ch->sg_str, eom);
 | 
			
		||||
                ch->sg_str, eom, join);
 | 
			
		||||
  if (!ch->sources)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  for (ALL_LIST_ELEMENTS_RO (ch->sources, ch_node, child))
 | 
			
		||||
    {
 | 
			
		||||
      /* Only *,G Join received and no (SG-RPT) prune.
 | 
			
		||||
         Scan all S,G associated to G and if any SG-RPT
 | 
			
		||||
         remove the SG-RPT flag.
 | 
			
		||||
      */
 | 
			
		||||
      if (join && (source_flags & PIM_RPT_BIT_MASK) &&
 | 
			
		||||
          (source_flags & PIM_WILDCARD_BIT_MASK))
 | 
			
		||||
        {
 | 
			
		||||
          if (PIM_IF_FLAG_TEST_S_G_RPT(child->flags))
 | 
			
		||||
            {
 | 
			
		||||
              struct pim_upstream *up = child->upstream;
 | 
			
		||||
 | 
			
		||||
              PIM_IF_FLAG_UNSET_S_G_RPT(child->flags);
 | 
			
		||||
              if (up)
 | 
			
		||||
                {
 | 
			
		||||
                  if (PIM_DEBUG_TRACE)
 | 
			
		||||
                    zlog_debug ("%s: add inherit oif to up %s ", __PRETTY_FUNCTION__, up->sg_str);
 | 
			
		||||
                  pim_channel_add_oif (up->channel_oil, ch->interface, PIM_OIF_FLAG_PROTO_STAR);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      /* Received SG-RPT Prune delete oif from S,G */
 | 
			
		||||
      else if (join == 0 && (source_flags & PIM_RPT_BIT_MASK) &&
 | 
			
		||||
               !(source_flags & PIM_WILDCARD_BIT_MASK))
 | 
			
		||||
        {
 | 
			
		||||
          struct pim_upstream *up = child->upstream;
 | 
			
		||||
 | 
			
		||||
          PIM_IF_FLAG_SET_S_G_RPT(child->flags);
 | 
			
		||||
          if (up)
 | 
			
		||||
            {
 | 
			
		||||
              if (PIM_DEBUG_TRACE)
 | 
			
		||||
                zlog_debug ("%s: del inherit oif from up %s", __PRETTY_FUNCTION__, up->sg_str);
 | 
			
		||||
              pim_channel_del_oif (up->channel_oil, ch->interface, PIM_OIF_FLAG_PROTO_STAR);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (!PIM_IF_FLAG_TEST_S_G_RPT(child->flags))
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -151,7 +151,7 @@ void pim_ifchannel_update_my_assert_metric(struct pim_ifchannel *ch);
 | 
			
		||||
void pim_ifchannel_update_assert_tracking_desired(struct pim_ifchannel *ch);
 | 
			
		||||
 | 
			
		||||
void pim_ifchannel_scan_forward_start (struct interface *new_ifp);
 | 
			
		||||
void pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom);
 | 
			
		||||
void pim_ifchannel_set_star_g_join_state (struct pim_ifchannel *ch, int eom, uint8_t source_flags, uint8_t join);
 | 
			
		||||
 | 
			
		||||
int pim_ifchannel_compare (struct pim_ifchannel *ch1, struct pim_ifchannel *ch2);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -276,7 +276,7 @@ int pim_joinprune_recv(struct interface *ifp,
 | 
			
		||||
        {
 | 
			
		||||
          ch = pim_ifchannel_find (ifp, &sg);
 | 
			
		||||
	  if (ch)
 | 
			
		||||
	    pim_ifchannel_set_star_g_join_state (ch, 0);
 | 
			
		||||
	    pim_ifchannel_set_star_g_join_state (ch, 0, msg_source_flags, 1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -297,7 +297,7 @@ int pim_joinprune_recv(struct interface *ifp,
 | 
			
		||||
		 msg_source_flags);
 | 
			
		||||
    }
 | 
			
		||||
    if (ch)
 | 
			
		||||
      pim_ifchannel_set_star_g_join_state (ch, 1);
 | 
			
		||||
      pim_ifchannel_set_star_g_join_state (ch, 1, msg_source_flags, 0);
 | 
			
		||||
    ch = NULL;
 | 
			
		||||
  } /* scan groups */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user