예제 #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

}
예제 #2
0
int
interface_down (struct thread *thread)
{
  struct ospf6_interface *oi;
  struct listnode *node, *nnode;
  struct ospf6_neighbor *on;

  oi = (struct ospf6_interface *) THREAD_ARG (thread);
  assert (oi && oi->interface);

  if (IS_OSPF6_DEBUG_INTERFACE)
    zlog_debug ("Interface Event %s: [InterfaceDown]",
		oi->interface->name);

  /* Leave AllSPFRouters */
  if (oi->state > OSPF6_INTERFACE_DOWN)
    ospf6_sso (oi->interface->ifindex, &allspfrouters6, IPV6_LEAVE_GROUP);

  ospf6_interface_state_change (OSPF6_INTERFACE_DOWN, oi);

  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
    ospf6_neighbor_delete (on);
  
  list_delete_all_node (oi->neighbor_list);

  return 0;
}
예제 #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);
    }
}
예제 #4
0
/* Interface State Machine */
int
interface_up (struct thread *thread)
{
  struct ospf6_interface *oi;

  oi = (struct ospf6_interface *) THREAD_ARG (thread);
  assert (oi && oi->interface);

  if (IS_OSPF6_DEBUG_INTERFACE)
    zlog_debug ("Interface Event %s: [InterfaceUp]",
		oi->interface->name);

  /* check physical interface is up */
  if (! if_is_up (oi->interface))
    {
      if (IS_OSPF6_DEBUG_INTERFACE)
        zlog_debug ("Interface %s is down, can't execute [InterfaceUp]",
		    oi->interface->name);
      return 0;
    }

  /* if already enabled, do nothing */
  if (oi->state > OSPF6_INTERFACE_DOWN)
    {
      if (IS_OSPF6_DEBUG_INTERFACE)
        zlog_debug ("Interface %s already enabled",
		    oi->interface->name);
      return 0;
    }

  /* Join AllSPFRouters */
  ospf6_sso (oi->interface->ifindex, &allspfrouters6, IPV6_JOIN_GROUP);

  /* Update interface route */
  ospf6_interface_connected_route_update (oi->interface);

  /* Schedule Hello */
  if (! CHECK_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE))
    thread_add_event (master, ospf6_hello_send, oi, 0);

  /* decide next interface state */
  if (if_is_pointopoint (oi->interface))
    ospf6_interface_state_change (OSPF6_INTERFACE_POINTTOPOINT, oi);
  else if (oi->priority == 0)
    ospf6_interface_state_change (OSPF6_INTERFACE_DROTHER, oi);
  else
    {
      ospf6_interface_state_change (OSPF6_INTERFACE_WAITING, oi);
      thread_add_timer (master, wait_timer, oi, oi->dead_interval);
    }

  return 0;
}