diff options
Diffstat (limited to 'eigrpd/eigrpd.c')
| -rw-r--r-- | eigrpd/eigrpd.c | 332 | 
1 files changed, 159 insertions, 173 deletions
diff --git a/eigrpd/eigrpd.c b/eigrpd/eigrpd.c index 2fa8296ce2..99d88b2d00 100644 --- a/eigrpd/eigrpd.c +++ b/eigrpd/eigrpd.c @@ -37,7 +37,7 @@  #include "memory.h"  #include "stream.h"  #include "log.h" -#include "sockunion.h"          /* for inet_aton () */ +#include "sockunion.h" /* for inet_aton () */  #include "zclient.h"  #include "plist.h"  #include "sockopt.h" @@ -91,232 +91,218 @@ extern struct in_addr router_id_zebra;   * This does not work for IPv6, and to make the code simpler, its   * stored and processed internerall as a 32bit number   */ -void -eigrp_router_id_update (struct eigrp *eigrp) +void eigrp_router_id_update(struct eigrp *eigrp)  { -  struct interface *ifp; -  struct listnode *node; -  u_int32_t router_id, router_id_old; +	struct interface *ifp; +	struct listnode *node; +	u_int32_t router_id, router_id_old; -  router_id_old = eigrp->router_id; +	router_id_old = eigrp->router_id; -  if (eigrp->router_id_static != 0) -    router_id = eigrp->router_id_static; +	if (eigrp->router_id_static != 0) +		router_id = eigrp->router_id_static; -  else if (eigrp->router_id != 0) -    router_id = eigrp->router_id; +	else if (eigrp->router_id != 0) +		router_id = eigrp->router_id; -  else -    router_id = router_id_zebra.s_addr; +	else +		router_id = router_id_zebra.s_addr; -  eigrp->router_id = router_id; -  if (router_id_old != router_id) -    { -      //      if (IS_DEBUG_EIGRP_EVENT) -      //        zlog_debug("Router-ID[NEW:%s]: Update", inet_ntoa(eigrp->router_id)); +	eigrp->router_id = router_id; +	if (router_id_old != router_id) { +		//      if (IS_DEBUG_EIGRP_EVENT) +		//        zlog_debug("Router-ID[NEW:%s]: Update", +		//        inet_ntoa(eigrp->router_id)); -      /* update eigrp_interface's */ -      for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) -        eigrp_if_update(ifp); -    } +		/* update eigrp_interface's */ +		for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) +			eigrp_if_update(ifp); +	}  } -void -eigrp_master_init () +void eigrp_master_init()  { -  struct timeval tv; +	struct timeval tv; -  memset(&eigrp_master, 0, sizeof(struct eigrp_master)); +	memset(&eigrp_master, 0, sizeof(struct eigrp_master)); -  eigrp_om = &eigrp_master; -  eigrp_om->eigrp = list_new(); +	eigrp_om = &eigrp_master; +	eigrp_om->eigrp = list_new(); -  monotime(&tv); -  eigrp_om->start_time = tv.tv_sec; +	monotime(&tv); +	eigrp_om->start_time = tv.tv_sec;  }  /* Allocate new eigrp structure. */ -static struct eigrp * -eigrp_new (const char *AS) +static struct eigrp *eigrp_new(const char *AS)  { -  struct eigrp *eigrp = XCALLOC(MTYPE_EIGRP_TOP, sizeof (struct eigrp)); -  int eigrp_socket; - -  /* init information relevant to peers */ -  eigrp->vrid = 0; -  eigrp->AS = atoi(AS); -  eigrp->router_id = 0L; -  eigrp->router_id_static = 0L; -  eigrp->sequence_number = 1; - -  /*Configure default K Values for EIGRP Process*/ -  eigrp->k_values[0] = EIGRP_K1_DEFAULT; -  eigrp->k_values[1] = EIGRP_K2_DEFAULT; -  eigrp->k_values[2] = EIGRP_K3_DEFAULT; -  eigrp->k_values[3] = EIGRP_K4_DEFAULT; -  eigrp->k_values[4] = EIGRP_K5_DEFAULT; -  eigrp->k_values[5] = EIGRP_K6_DEFAULT; - -  /* init internal data structures */ -  eigrp->eiflist = list_new(); -  eigrp->passive_interface_default = EIGRP_IF_ACTIVE; -  eigrp->networks = route_table_init(); - -  if ((eigrp_socket = eigrp_sock_init()) < 0) -    { -      zlog_err("eigrp_new: fatal error: eigrp_sock_init was unable to open " -               "a socket"); -      exit (1); -    } - -  eigrp->fd = eigrp_socket; -  eigrp->maxsndbuflen = getsockopt_so_sendbuf(eigrp->fd); - -  if ((eigrp->ibuf = stream_new(EIGRP_PACKET_MAX_LEN+1)) == NULL) -    { -      zlog_err("eigrp_new: fatal error: stream_new (%u) failed allocating ibuf", -               EIGRP_PACKET_MAX_LEN+1); -      exit(1); -    } - -  eigrp->t_read = NULL; -  thread_add_read(master, eigrp_read, eigrp, eigrp->fd, &eigrp->t_read); -  eigrp->oi_write_q = list_new(); - -  eigrp->topology_table = eigrp_topology_new(); - -  eigrp->neighbor_self = eigrp_nbr_new(NULL); -  eigrp->neighbor_self->src.s_addr = INADDR_ANY; - -  eigrp->variance = EIGRP_VARIANCE_DEFAULT; -  eigrp->max_paths = EIGRP_MAX_PATHS_DEFAULT; - -  eigrp->serno = 0; -  eigrp->serno_last_update = 0; -  eigrp->topology_changes_externalIPV4 = list_new (); -  eigrp->topology_changes_internalIPV4 = list_new (); - -  eigrp->list[EIGRP_FILTER_IN] = NULL; -  eigrp->list[EIGRP_FILTER_OUT] = NULL; - -  eigrp->prefix[EIGRP_FILTER_IN] = NULL; -  eigrp->prefix[EIGRP_FILTER_OUT] = NULL; - -  eigrp->routemap[EIGRP_FILTER_IN] = NULL; -  eigrp->routemap[EIGRP_FILTER_OUT] = NULL; - -  QOBJ_REG(eigrp, eigrp); -  return eigrp; +	struct eigrp *eigrp = XCALLOC(MTYPE_EIGRP_TOP, sizeof(struct eigrp)); +	int eigrp_socket; + +	/* init information relevant to peers */ +	eigrp->vrid = 0; +	eigrp->AS = atoi(AS); +	eigrp->router_id = 0L; +	eigrp->router_id_static = 0L; +	eigrp->sequence_number = 1; + +	/*Configure default K Values for EIGRP Process*/ +	eigrp->k_values[0] = EIGRP_K1_DEFAULT; +	eigrp->k_values[1] = EIGRP_K2_DEFAULT; +	eigrp->k_values[2] = EIGRP_K3_DEFAULT; +	eigrp->k_values[3] = EIGRP_K4_DEFAULT; +	eigrp->k_values[4] = EIGRP_K5_DEFAULT; +	eigrp->k_values[5] = EIGRP_K6_DEFAULT; + +	/* init internal data structures */ +	eigrp->eiflist = list_new(); +	eigrp->passive_interface_default = EIGRP_IF_ACTIVE; +	eigrp->networks = route_table_init(); + +	if ((eigrp_socket = eigrp_sock_init()) < 0) { +		zlog_err( +			"eigrp_new: fatal error: eigrp_sock_init was unable to open " +			"a socket"); +		exit(1); +	} + +	eigrp->fd = eigrp_socket; +	eigrp->maxsndbuflen = getsockopt_so_sendbuf(eigrp->fd); + +	if ((eigrp->ibuf = stream_new(EIGRP_PACKET_MAX_LEN + 1)) == NULL) { +		zlog_err( +			"eigrp_new: fatal error: stream_new (%u) failed allocating ibuf", +			EIGRP_PACKET_MAX_LEN + 1); +		exit(1); +	} + +	eigrp->t_read = NULL; +	thread_add_read(master, eigrp_read, eigrp, eigrp->fd, &eigrp->t_read); +	eigrp->oi_write_q = list_new(); + +	eigrp->topology_table = eigrp_topology_new(); + +	eigrp->neighbor_self = eigrp_nbr_new(NULL); +	eigrp->neighbor_self->src.s_addr = INADDR_ANY; + +	eigrp->variance = EIGRP_VARIANCE_DEFAULT; +	eigrp->max_paths = EIGRP_MAX_PATHS_DEFAULT; + +	eigrp->serno = 0; +	eigrp->serno_last_update = 0; +	eigrp->topology_changes_externalIPV4 = list_new(); +	eigrp->topology_changes_internalIPV4 = list_new(); + +	eigrp->list[EIGRP_FILTER_IN] = NULL; +	eigrp->list[EIGRP_FILTER_OUT] = NULL; + +	eigrp->prefix[EIGRP_FILTER_IN] = NULL; +	eigrp->prefix[EIGRP_FILTER_OUT] = NULL; + +	eigrp->routemap[EIGRP_FILTER_IN] = NULL; +	eigrp->routemap[EIGRP_FILTER_OUT] = NULL; + +	QOBJ_REG(eigrp, eigrp); +	return eigrp;  } -static void -eigrp_add (struct eigrp *eigrp) +static void eigrp_add(struct eigrp *eigrp)  { -  listnode_add(eigrp_om->eigrp, eigrp); +	listnode_add(eigrp_om->eigrp, eigrp);  } -static void -eigrp_delete (struct eigrp *eigrp) +static void eigrp_delete(struct eigrp *eigrp)  { -  listnode_delete(eigrp_om->eigrp, eigrp); +	listnode_delete(eigrp_om->eigrp, eigrp);  } -struct eigrp * -eigrp_get (const char *AS) +struct eigrp *eigrp_get(const char *AS)  { -  struct eigrp *eigrp; +	struct eigrp *eigrp; -  eigrp = eigrp_lookup(); -  if (eigrp == NULL) -    { -      eigrp = eigrp_new(AS); -      eigrp_add(eigrp); -    } +	eigrp = eigrp_lookup(); +	if (eigrp == NULL) { +		eigrp = eigrp_new(AS); +		eigrp_add(eigrp); +	} -  return eigrp; +	return eigrp;  }  /* Shut down the entire process */ -void -eigrp_terminate (void) +void eigrp_terminate(void)  { -  struct eigrp *eigrp; -  struct listnode *node, *nnode; +	struct eigrp *eigrp; +	struct listnode *node, *nnode; -  /* shutdown already in progress */ -  if (CHECK_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN)) -    return; +	/* shutdown already in progress */ +	if (CHECK_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN)) +		return; -  SET_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN); +	SET_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN); -  /* exit immediately if EIGRP not actually running */ -  if (listcount(eigrp_om->eigrp) == 0) -    exit(0); +	/* exit immediately if EIGRP not actually running */ +	if (listcount(eigrp_om->eigrp) == 0) +		exit(0); -  for (ALL_LIST_ELEMENTS(eigrp_om->eigrp, node, nnode, eigrp)) -    eigrp_finish(eigrp); +	for (ALL_LIST_ELEMENTS(eigrp_om->eigrp, node, nnode, eigrp)) +		eigrp_finish(eigrp);  } -void -eigrp_finish (struct eigrp *eigrp) +void eigrp_finish(struct eigrp *eigrp)  { -  eigrp_finish_final(eigrp); - -  /* eigrp being shut-down? If so, was this the last eigrp instance? */ -  if (CHECK_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN) -      && (listcount(eigrp_om->eigrp) == 0)) -    { -      if (zclient) -	{ -	  zclient_stop (zclient); -	  zclient_free (zclient); +	eigrp_finish_final(eigrp); + +	/* eigrp being shut-down? If so, was this the last eigrp instance? */ +	if (CHECK_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN) +	    && (listcount(eigrp_om->eigrp) == 0)) { +		if (zclient) { +			zclient_stop(zclient); +			zclient_free(zclient); +		} +		exit(0);  	} -      exit(0); -    } -  return; +	return;  }  /* Final cleanup of eigrp instance */ -void -eigrp_finish_final (struct eigrp *eigrp) +void eigrp_finish_final(struct eigrp *eigrp)  { -  struct eigrp_interface *ei; -  struct eigrp_neighbor *nbr; -  struct listnode *node, *nnode, *node2, *nnode2; - -  for (ALL_LIST_ELEMENTS (eigrp->eiflist, node, nnode, ei)) -    { -      for (ALL_LIST_ELEMENTS (ei->nbrs, node2, nnode2, nbr)) -        eigrp_nbr_delete (nbr); -      eigrp_if_free (ei, INTERFACE_DOWN_BY_FINAL); -    } +	struct eigrp_interface *ei; +	struct eigrp_neighbor *nbr; +	struct listnode *node, *nnode, *node2, *nnode2; + +	for (ALL_LIST_ELEMENTS(eigrp->eiflist, node, nnode, ei)) { +		for (ALL_LIST_ELEMENTS(ei->nbrs, node2, nnode2, nbr)) +			eigrp_nbr_delete(nbr); +		eigrp_if_free(ei, INTERFACE_DOWN_BY_FINAL); +	} -  THREAD_OFF (eigrp->t_write); -  THREAD_OFF (eigrp->t_read); -  close (eigrp->fd); +	THREAD_OFF(eigrp->t_write); +	THREAD_OFF(eigrp->t_read); +	close(eigrp->fd); -  list_delete(eigrp->eiflist); -  list_delete(eigrp->oi_write_q); -  list_delete(eigrp->topology_changes_externalIPV4); -  list_delete(eigrp->topology_changes_internalIPV4); +	list_delete(eigrp->eiflist); +	list_delete(eigrp->oi_write_q); +	list_delete(eigrp->topology_changes_externalIPV4); +	list_delete(eigrp->topology_changes_internalIPV4); -  eigrp_topology_cleanup(eigrp->topology_table); -  eigrp_topology_free(eigrp->topology_table); +	eigrp_topology_cleanup(eigrp->topology_table); +	eigrp_topology_free(eigrp->topology_table); -  eigrp_nbr_delete(eigrp->neighbor_self); +	eigrp_nbr_delete(eigrp->neighbor_self); -  eigrp_delete(eigrp); +	eigrp_delete(eigrp); -  XFREE(MTYPE_EIGRP_TOP,eigrp); +	XFREE(MTYPE_EIGRP_TOP, eigrp);  }  /*Look for existing eigrp process*/ -struct eigrp * -eigrp_lookup (void) +struct eigrp *eigrp_lookup(void)  { -  if (listcount(eigrp_om->eigrp) == 0) -    return NULL; +	if (listcount(eigrp_om->eigrp) == 0) +		return NULL; -  return listgetdata(listhead(eigrp_om->eigrp)); +	return listgetdata(listhead(eigrp_om->eigrp));  }  | 
