Esempio n. 1
0
static void
ospf6_interface_state_change (u_char next_state, struct ospf6_interface *oi)
{
    u_char prev_state;

    prev_state = oi->state;
    oi->state = next_state;

    if (prev_state == next_state)
        return;

    /* log */
    if (IS_OSPF6_DEBUG_INTERFACE)
    {
        zlog_debug ("Interface state change %s: %s -> %s", oi->interface->name,
                    ospf6_interface_state_str[prev_state],
                    ospf6_interface_state_str[next_state]);
    }
    oi->state_change++;

    if ((prev_state == OSPF6_INTERFACE_DR ||
            prev_state == OSPF6_INTERFACE_BDR) &&
            (next_state != OSPF6_INTERFACE_DR &&
             next_state != OSPF6_INTERFACE_BDR))
        ospf6_sso (oi->interface->ifindex, &alldrouters6, IPV6_LEAVE_GROUP);
    if ((prev_state != OSPF6_INTERFACE_DR &&
            prev_state != OSPF6_INTERFACE_BDR) &&
            (next_state == OSPF6_INTERFACE_DR ||
             next_state == OSPF6_INTERFACE_BDR))
        ospf6_sso (oi->interface->ifindex, &alldrouters6, IPV6_JOIN_GROUP);

    OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
    if (next_state == OSPF6_INTERFACE_DOWN)
    {
        OSPF6_NETWORK_LSA_EXECUTE (oi);
        OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT (oi);
        OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
    }
    else if (prev_state == OSPF6_INTERFACE_DR ||
             next_state == OSPF6_INTERFACE_DR)
    {
        OSPF6_NETWORK_LSA_SCHEDULE (oi);
        OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
        OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
    }

#ifdef HAVE_SNMP
    /* Terminal state or regression */
    if ((next_state == OSPF6_INTERFACE_POINTTOPOINT) ||
            (next_state == OSPF6_INTERFACE_DROTHER) ||
            (next_state == OSPF6_INTERFACE_BDR) ||
            (next_state == OSPF6_INTERFACE_DR) ||
            (next_state < prev_state))
        ospf6TrapIfStateChange (oi);
#endif

}
Esempio n. 2
0
static void
ospf6_interface_state_change (u_char next_state, struct ospf6_interface *oi)
{
  u_char prev_state;

  prev_state = oi->state;
  oi->state = next_state;

  if (prev_state == next_state)
    return;

  /* log */
  if (IS_OSPF6_DEBUG_INTERFACE)
    {
      zlog_debug ("Interface state change %s: %s -> %s", oi->interface->name,
		  ospf6_interface_state_str[prev_state],
		  ospf6_interface_state_str[next_state]);
    }

  if ((prev_state == OSPF6_INTERFACE_DR ||
       prev_state == OSPF6_INTERFACE_BDR) &&
      (next_state != OSPF6_INTERFACE_DR &&
       next_state != OSPF6_INTERFACE_BDR))
    ospf6_leave_alldrouters (oi->interface->ifindex);
  if ((prev_state != OSPF6_INTERFACE_DR &&
       prev_state != OSPF6_INTERFACE_BDR) &&
      (next_state == OSPF6_INTERFACE_DR ||
       next_state == OSPF6_INTERFACE_BDR))
//    ospf6_join_alldrouters (oi->interface->ifindex);
      thread_add_event (master, rospf6_join_alldrouters_send, oi, 0);

  OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
  if (next_state == OSPF6_INTERFACE_DOWN)
    {
      OSPF6_NETWORK_LSA_EXECUTE (oi);
      OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT (oi);
      OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
    }
  else if (prev_state == OSPF6_INTERFACE_DR ||
           next_state == OSPF6_INTERFACE_DR)
    {
      OSPF6_NETWORK_LSA_SCHEDULE (oi);
      OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
      OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
    }
}
Esempio n. 3
0
static void
ospf6_interface_state_change (u_char next_state, struct ospf6_interface *oi)
{
  u_char prev_state;

  prev_state = oi->state;
  oi->state = next_state;

  if (prev_state == next_state)
    return;

  /* log */
  if (IS_OSPF6_DEBUG_INTERFACE)
    {
      zlog_debug ("Interface state change %s: %s -> %s", oi->interface->name,
		  ospf6_interface_state_str[prev_state],
		  ospf6_interface_state_str[next_state]);
    }

  if ((prev_state == OSPF6_INTERFACE_DR ||
       prev_state == OSPF6_INTERFACE_BDR) &&
      (next_state != OSPF6_INTERFACE_DR &&
       next_state != OSPF6_INTERFACE_BDR))
    ospf6_sso (oi->interface->ifindex, &alldrouters6, IPV6_LEAVE_GROUP);
  if ((prev_state != OSPF6_INTERFACE_DR &&
       prev_state != OSPF6_INTERFACE_BDR) &&
      (next_state == OSPF6_INTERFACE_DR ||
       next_state == OSPF6_INTERFACE_BDR))
    ospf6_sso (oi->interface->ifindex, &alldrouters6, IPV6_JOIN_GROUP);

  OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
  if (next_state == OSPF6_INTERFACE_DOWN)
    {
      OSPF6_NETWORK_LSA_EXECUTE (oi);
      OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT (oi);
      OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
    }
  else if (prev_state == OSPF6_INTERFACE_DR ||
           next_state == OSPF6_INTERFACE_DR)
    {
      OSPF6_NETWORK_LSA_SCHEDULE (oi);
      OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
      OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
    }
}