diff options
Diffstat (limited to 'eigrpd/eigrp_neighbor.c')
| -rw-r--r-- | eigrpd/eigrp_neighbor.c | 435 | 
1 files changed, 207 insertions, 228 deletions
diff --git a/eigrpd/eigrp_neighbor.c b/eigrpd/eigrp_neighbor.c index bf3fc216c0..d5fc6a2996 100644 --- a/eigrpd/eigrp_neighbor.c +++ b/eigrpd/eigrp_neighbor.c @@ -54,21 +54,20 @@  #include "eigrpd/eigrp_topology.h"  #include "eigrpd/eigrp_memory.h" -struct eigrp_neighbor * -eigrp_nbr_new (struct eigrp_interface *ei) +struct eigrp_neighbor *eigrp_nbr_new(struct eigrp_interface *ei)  { -  struct eigrp_neighbor *nbr; +	struct eigrp_neighbor *nbr; -  /* Allcate new neighbor. */ -  nbr = XCALLOC (MTYPE_EIGRP_NEIGHBOR, sizeof (struct eigrp_neighbor)); +	/* Allcate new neighbor. */ +	nbr = XCALLOC(MTYPE_EIGRP_NEIGHBOR, sizeof(struct eigrp_neighbor)); -  /* Relate neighbor to the interface. */ -  nbr->ei = ei; +	/* Relate neighbor to the interface. */ +	nbr->ei = ei; -  /* Set default values. */ -  eigrp_nbr_state_set (nbr, EIGRP_NEIGHBOR_DOWN); +	/* Set default values. */ +	eigrp_nbr_state_set(nbr, EIGRP_NEIGHBOR_DOWN); -  return nbr; +	return nbr;  }  /** @@ -78,41 +77,39 @@ eigrp_nbr_new (struct eigrp_interface *ei)   * @par   * Create a new neighbor structure and initalize it.   */ -static struct eigrp_neighbor * -eigrp_nbr_add (struct eigrp_interface *ei, struct eigrp_header *eigrph, -              struct ip *iph) +static struct eigrp_neighbor *eigrp_nbr_add(struct eigrp_interface *ei, +					    struct eigrp_header *eigrph, +					    struct ip *iph)  { -  struct eigrp_neighbor *nbr; +	struct eigrp_neighbor *nbr; -  nbr = eigrp_nbr_new (ei); -  nbr->src = iph->ip_src; +	nbr = eigrp_nbr_new(ei); +	nbr->src = iph->ip_src; -  //  if (IS_DEBUG_EIGRP_EVENT) -  //    zlog_debug("NSM[%s:%s]: start", IF_NAME (nbr->oi), -  //               inet_ntoa (nbr->router_id)); +	//  if (IS_DEBUG_EIGRP_EVENT) +	//    zlog_debug("NSM[%s:%s]: start", IF_NAME (nbr->oi), +	//               inet_ntoa (nbr->router_id)); -  return nbr; +	return nbr;  } -struct eigrp_neighbor * -eigrp_nbr_get (struct eigrp_interface *ei, struct eigrp_header *eigrph, -              struct ip *iph) +struct eigrp_neighbor *eigrp_nbr_get(struct eigrp_interface *ei, +				     struct eigrp_header *eigrph, +				     struct ip *iph)  { -  struct eigrp_neighbor *nbr; -  struct listnode *node, *nnode; +	struct eigrp_neighbor *nbr; +	struct listnode *node, *nnode; -  for (ALL_LIST_ELEMENTS (ei->nbrs, node, nnode, nbr)) -    { -      if (iph->ip_src.s_addr == nbr->src.s_addr) -        { -          return nbr; -        } -    } +	for (ALL_LIST_ELEMENTS(ei->nbrs, node, nnode, nbr)) { +		if (iph->ip_src.s_addr == nbr->src.s_addr) { +			return nbr; +		} +	} -  nbr = eigrp_nbr_add (ei, eigrph, iph); -  listnode_add (ei->nbrs, nbr); +	nbr = eigrp_nbr_add(ei, eigrph, iph); +	listnode_add(ei->nbrs, nbr); -  return nbr; +	return nbr;  }  /** @@ -127,21 +124,19 @@ eigrp_nbr_get (struct eigrp_interface *ei, struct eigrp_header *eigrph,   * Function is used for neighbor lookup by address   * in specified interface.   */ -struct eigrp_neighbor * -eigrp_nbr_lookup_by_addr (struct eigrp_interface *ei, struct in_addr *addr) +struct eigrp_neighbor *eigrp_nbr_lookup_by_addr(struct eigrp_interface *ei, +						struct in_addr *addr)  { -  struct eigrp_neighbor *nbr; -  struct listnode *node, *nnode; - -  for (ALL_LIST_ELEMENTS (ei->nbrs, node, nnode, nbr)) -      { -        if (addr->s_addr == nbr->src.s_addr) -          { -            return nbr; -          } -      } - -  return NULL; +	struct eigrp_neighbor *nbr; +	struct listnode *node, *nnode; + +	for (ALL_LIST_ELEMENTS(ei->nbrs, node, nnode, nbr)) { +		if (addr->s_addr == nbr->src.s_addr) { +			return nbr; +		} +	} + +	return NULL;  }  /** @@ -156,188 +151,173 @@ eigrp_nbr_lookup_by_addr (struct eigrp_interface *ei, struct in_addr *addr)   * Function is used for neighbor lookup by address   * in whole EIGRP process.   */ -struct eigrp_neighbor * -eigrp_nbr_lookup_by_addr_process (struct eigrp *eigrp, struct in_addr nbr_addr) +struct eigrp_neighbor *eigrp_nbr_lookup_by_addr_process(struct eigrp *eigrp, +							struct in_addr nbr_addr)  { -  struct eigrp_interface *ei; -  struct listnode *node, *node2, *nnode2; -  struct eigrp_neighbor *nbr; - -  /* iterate over all eigrp interfaces */ -  for (ALL_LIST_ELEMENTS_RO (eigrp->eiflist, node, ei)) -    { -      /* iterate over all neighbors on eigrp interface */ -      for (ALL_LIST_ELEMENTS (ei->nbrs, node2, nnode2, nbr)) -        { -          /* compare if neighbor address is same as arg address */ -          if (nbr->src.s_addr == nbr_addr.s_addr) -            { -              return nbr; -            } -        } -    } - -  return NULL; +	struct eigrp_interface *ei; +	struct listnode *node, *node2, *nnode2; +	struct eigrp_neighbor *nbr; + +	/* iterate over all eigrp interfaces */ +	for (ALL_LIST_ELEMENTS_RO(eigrp->eiflist, node, ei)) { +		/* iterate over all neighbors on eigrp interface */ +		for (ALL_LIST_ELEMENTS(ei->nbrs, node2, nnode2, nbr)) { +			/* compare if neighbor address is same as arg address */ +			if (nbr->src.s_addr == nbr_addr.s_addr) { +				return nbr; +			} +		} +	} + +	return NULL;  }  /* Delete specified EIGRP neighbor from interface. */ -void -eigrp_nbr_delete (struct eigrp_neighbor *nbr) +void eigrp_nbr_delete(struct eigrp_neighbor *nbr)  { -  eigrp_nbr_state_set(nbr, EIGRP_NEIGHBOR_DOWN); -  if (nbr->ei) -    eigrp_topology_neighbor_down(nbr->ei->eigrp, nbr); - -  /* Cancel all events. *//* Thread lookup cost would be negligible. */ -  thread_cancel_event (master, nbr); -  eigrp_fifo_free (nbr->multicast_queue); -  eigrp_fifo_free (nbr->retrans_queue); -  THREAD_OFF (nbr->t_holddown); - -  if (nbr->ei) -    listnode_delete (nbr->ei->nbrs,nbr); -  XFREE (MTYPE_EIGRP_NEIGHBOR, nbr); +	eigrp_nbr_state_set(nbr, EIGRP_NEIGHBOR_DOWN); +	if (nbr->ei) +		eigrp_topology_neighbor_down(nbr->ei->eigrp, nbr); + +	/* Cancel all events. */ /* Thread lookup cost would be negligible. */ +	thread_cancel_event(master, nbr); +	eigrp_fifo_free(nbr->multicast_queue); +	eigrp_fifo_free(nbr->retrans_queue); +	THREAD_OFF(nbr->t_holddown); + +	if (nbr->ei) +		listnode_delete(nbr->ei->nbrs, nbr); +	XFREE(MTYPE_EIGRP_NEIGHBOR, nbr);  } -int -holddown_timer_expired (struct thread *thread) +int holddown_timer_expired(struct thread *thread)  { -  struct eigrp_neighbor *nbr; +	struct eigrp_neighbor *nbr; -  nbr = THREAD_ARG (thread); +	nbr = THREAD_ARG(thread); -  zlog_info ("Neighbor %s (%s) is down: holding time expired", -             inet_ntoa(nbr->src), ifindex2ifname(nbr->ei->ifp->ifindex, VRF_DEFAULT)); -  nbr->state = EIGRP_NEIGHBOR_DOWN; -  eigrp_nbr_delete (nbr); +	zlog_info("Neighbor %s (%s) is down: holding time expired", +		  inet_ntoa(nbr->src), +		  ifindex2ifname(nbr->ei->ifp->ifindex, VRF_DEFAULT)); +	nbr->state = EIGRP_NEIGHBOR_DOWN; +	eigrp_nbr_delete(nbr); -  return 0; +	return 0;  } -u_char -eigrp_nbr_state_get (struct eigrp_neighbor *nbr) +u_char eigrp_nbr_state_get(struct eigrp_neighbor *nbr)  { -  return(nbr->state); +	return (nbr->state);  } -void -eigrp_nbr_state_set (struct eigrp_neighbor *nbr, u_char state) +void eigrp_nbr_state_set(struct eigrp_neighbor *nbr, u_char state)  { -  nbr->state = state; - -  if (eigrp_nbr_state_get(nbr) == EIGRP_NEIGHBOR_DOWN) -    { -      // reset all the seq/ack counters -      nbr->recv_sequence_number = 0; -      nbr->init_sequence_number = 0; -      nbr->retrans_counter = 0; - -      // Kvalues -      nbr->K1 = EIGRP_K1_DEFAULT; -      nbr->K2 = EIGRP_K2_DEFAULT; -      nbr->K3 = EIGRP_K3_DEFAULT; -      nbr->K4 = EIGRP_K4_DEFAULT; -      nbr->K5 = EIGRP_K5_DEFAULT; -      nbr->K6 = EIGRP_K6_DEFAULT; - -      // hold time.. -      nbr->v_holddown = EIGRP_HOLD_INTERVAL_DEFAULT; -      THREAD_OFF(nbr->t_holddown); - -      /* out with the old */ -      if (nbr->multicast_queue) -        eigrp_fifo_free (nbr->multicast_queue); -      if (nbr->retrans_queue) -        eigrp_fifo_free (nbr->retrans_queue); - -      /* in with the new */ -      nbr->retrans_queue = eigrp_fifo_new (); -      nbr->multicast_queue = eigrp_fifo_new (); - -      nbr->crypt_seqnum = 0; -    } +	nbr->state = state; + +	if (eigrp_nbr_state_get(nbr) == EIGRP_NEIGHBOR_DOWN) { +		// reset all the seq/ack counters +		nbr->recv_sequence_number = 0; +		nbr->init_sequence_number = 0; +		nbr->retrans_counter = 0; + +		// Kvalues +		nbr->K1 = EIGRP_K1_DEFAULT; +		nbr->K2 = EIGRP_K2_DEFAULT; +		nbr->K3 = EIGRP_K3_DEFAULT; +		nbr->K4 = EIGRP_K4_DEFAULT; +		nbr->K5 = EIGRP_K5_DEFAULT; +		nbr->K6 = EIGRP_K6_DEFAULT; + +		// hold time.. +		nbr->v_holddown = EIGRP_HOLD_INTERVAL_DEFAULT; +		THREAD_OFF(nbr->t_holddown); + +		/* out with the old */ +		if (nbr->multicast_queue) +			eigrp_fifo_free(nbr->multicast_queue); +		if (nbr->retrans_queue) +			eigrp_fifo_free(nbr->retrans_queue); + +		/* in with the new */ +		nbr->retrans_queue = eigrp_fifo_new(); +		nbr->multicast_queue = eigrp_fifo_new(); + +		nbr->crypt_seqnum = 0; +	}  } -const char * -eigrp_nbr_state_str (struct eigrp_neighbor *nbr) +const char *eigrp_nbr_state_str(struct eigrp_neighbor *nbr)  { -  const char *state; -  switch (nbr->state) -    { -    case EIGRP_NEIGHBOR_DOWN: -      state = "Down"; -      break; -    case EIGRP_NEIGHBOR_PENDING: -      state = "Waiting for Init"; -      break; -    case EIGRP_NEIGHBOR_UP: -      state = "Up"; -      break; -    default: -      state = "Unknown"; -      break; -    } - -  return(state); +	const char *state; +	switch (nbr->state) { +	case EIGRP_NEIGHBOR_DOWN: +		state = "Down"; +		break; +	case EIGRP_NEIGHBOR_PENDING: +		state = "Waiting for Init"; +		break; +	case EIGRP_NEIGHBOR_UP: +		state = "Up"; +		break; +	default: +		state = "Unknown"; +		break; +	} + +	return (state);  } -void -eigrp_nbr_state_update (struct eigrp_neighbor *nbr) +void eigrp_nbr_state_update(struct eigrp_neighbor *nbr)  { -  switch (nbr->state) -    { -    case EIGRP_NEIGHBOR_DOWN: -      { -        /*Start Hold Down Timer for neighbor*/ -        //     THREAD_OFF(nbr->t_holddown); -        //     THREAD_TIMER_ON(master, nbr->t_holddown, holddown_timer_expired, -        //     nbr, nbr->v_holddown); -        break; -      } -    case EIGRP_NEIGHBOR_PENDING: -      { -        /*Reset Hold Down Timer for neighbor*/ -        THREAD_OFF(nbr->t_holddown); -        thread_add_timer(master, holddown_timer_expired, nbr, -                         nbr->v_holddown, &nbr->t_holddown); -        break; -      } -    case EIGRP_NEIGHBOR_UP: -      { -        /*Reset Hold Down Timer for neighbor*/ -        THREAD_OFF(nbr->t_holddown); -        thread_add_timer(master, holddown_timer_expired, nbr, -                         nbr->v_holddown, &nbr->t_holddown); -        break; -      } -    } +	switch (nbr->state) { +	case EIGRP_NEIGHBOR_DOWN: { +		/*Start Hold Down Timer for neighbor*/ +		//     THREAD_OFF(nbr->t_holddown); +		//     THREAD_TIMER_ON(master, nbr->t_holddown, +		//     holddown_timer_expired, +		//     nbr, nbr->v_holddown); +		break; +	} +	case EIGRP_NEIGHBOR_PENDING: { +		/*Reset Hold Down Timer for neighbor*/ +		THREAD_OFF(nbr->t_holddown); +		thread_add_timer(master, holddown_timer_expired, nbr, +				 nbr->v_holddown, &nbr->t_holddown); +		break; +	} +	case EIGRP_NEIGHBOR_UP: { +		/*Reset Hold Down Timer for neighbor*/ +		THREAD_OFF(nbr->t_holddown); +		thread_add_timer(master, holddown_timer_expired, nbr, +				 nbr->v_holddown, &nbr->t_holddown); +		break; +	} +	}  } -int eigrp_nbr_count_get(void){ -  struct eigrp_interface *iface; -  struct listnode *node, *node2, *nnode2; -  struct eigrp_neighbor *nbr; -  struct eigrp *eigrp = eigrp_lookup(); -  u_int32_t counter; - -  if (eigrp == NULL) -    { -      zlog_debug("EIGRP Routing Process not enabled"); -      return 0; -    } - -  counter=0; -  for (ALL_LIST_ELEMENTS_RO(eigrp->eiflist, node, iface)) -    { -      for (ALL_LIST_ELEMENTS(iface->nbrs, node2, nnode2, nbr)) -        { -          if (nbr->state == EIGRP_NEIGHBOR_UP){ -            counter++; -          } -        } -    } -  return counter; +int eigrp_nbr_count_get(void) +{ +	struct eigrp_interface *iface; +	struct listnode *node, *node2, *nnode2; +	struct eigrp_neighbor *nbr; +	struct eigrp *eigrp = eigrp_lookup(); +	u_int32_t counter; + +	if (eigrp == NULL) { +		zlog_debug("EIGRP Routing Process not enabled"); +		return 0; +	} + +	counter = 0; +	for (ALL_LIST_ELEMENTS_RO(eigrp->eiflist, node, iface)) { +		for (ALL_LIST_ELEMENTS(iface->nbrs, node2, nnode2, nbr)) { +			if (nbr->state == EIGRP_NEIGHBOR_UP) { +				counter++; +			} +		} +	} +	return counter;  }  /** @@ -354,27 +334,26 @@ int eigrp_nbr_count_get(void){   */  void eigrp_nbr_hard_restart(struct eigrp_neighbor *nbr, struct vty *vty)  { -  if(nbr == NULL) -    { -      zlog_err("Nbr Hard restart: Neighbor not specified."); -      return; -    } - -  zlog_debug ("Neighbor %s (%s) is down: manually cleared", -              inet_ntoa (nbr->src), -              ifindex2ifname (nbr->ei->ifp->ifindex, VRF_DEFAULT)); -  if(vty != NULL) -    { -      vty_time_print (vty, 0); -      vty_out (vty, "Neighbor %s (%s) is down: manually cleared\n", -               inet_ntoa (nbr->src), -               ifindex2ifname(nbr->ei->ifp->ifindex, VRF_DEFAULT)); -    } - -  /* send Hello with Peer Termination TLV */ -  eigrp_hello_send(nbr->ei, EIGRP_HELLO_GRACEFUL_SHUTDOWN_NBR, &(nbr->src)); -  /* set neighbor to DOWN */ -  nbr->state = EIGRP_NEIGHBOR_DOWN; -  /* delete neighbor */ -  eigrp_nbr_delete (nbr); +	if (nbr == NULL) { +		zlog_err("Nbr Hard restart: Neighbor not specified."); +		return; +	} + +	zlog_debug("Neighbor %s (%s) is down: manually cleared", +		   inet_ntoa(nbr->src), +		   ifindex2ifname(nbr->ei->ifp->ifindex, VRF_DEFAULT)); +	if (vty != NULL) { +		vty_time_print(vty, 0); +		vty_out(vty, "Neighbor %s (%s) is down: manually cleared\n", +			inet_ntoa(nbr->src), +			ifindex2ifname(nbr->ei->ifp->ifindex, VRF_DEFAULT)); +	} + +	/* send Hello with Peer Termination TLV */ +	eigrp_hello_send(nbr->ei, EIGRP_HELLO_GRACEFUL_SHUTDOWN_NBR, +			 &(nbr->src)); +	/* set neighbor to DOWN */ +	nbr->state = EIGRP_NEIGHBOR_DOWN; +	/* delete neighbor */ +	eigrp_nbr_delete(nbr);  }  | 
