diff options
| -rw-r--r-- | eigrpd/eigrp_dump.c | 2 | ||||
| -rw-r--r-- | eigrpd/eigrp_fsm.c | 10 | ||||
| -rw-r--r-- | eigrpd/eigrp_interface.c | 3 | ||||
| -rw-r--r-- | eigrpd/eigrp_network.c | 15 | ||||
| -rw-r--r-- | eigrpd/eigrp_network.h | 1 | ||||
| -rw-r--r-- | eigrpd/eigrp_packet.c | 22 | ||||
| -rw-r--r-- | eigrpd/eigrp_reply.c | 3 | ||||
| -rw-r--r-- | eigrpd/eigrp_structs.h | 2 | ||||
| -rw-r--r-- | eigrpd/eigrp_topology.c | 23 | ||||
| -rw-r--r-- | eigrpd/eigrp_update.c | 13 | ||||
| -rw-r--r-- | eigrpd/eigrp_zebra.c | 5 | ||||
| -rw-r--r-- | eigrpd/eigrp_zebra.h | 1 | ||||
| -rw-r--r-- | eigrpd/eigrpd.c | 21 | 
13 files changed, 65 insertions, 56 deletions
diff --git a/eigrpd/eigrp_dump.c b/eigrpd/eigrp_dump.c index 231554a098..d59adc8234 100644 --- a/eigrpd/eigrp_dump.c +++ b/eigrpd/eigrp_dump.c @@ -228,7 +228,7 @@ void show_ip_eigrp_prefix_descriptor(struct vty *vty,  	vty_out(vty, "%-3c", (tn->state > 0) ? 'A' : 'P'); -	vty_out(vty, "%pFX, ", tn->destination); +	vty_out(vty, "%pFX, ", &tn->destination);  	vty_out(vty, "%u successors, ", (successors) ? successors->count : 0);  	vty_out(vty, "FD is %u, serno: %" PRIu64 " \n", tn->fdistance,  		tn->serno); diff --git a/eigrpd/eigrp_fsm.c b/eigrpd/eigrp_fsm.c index 6d8061e572..99b090eeb6 100644 --- a/eigrpd/eigrp_fsm.c +++ b/eigrpd/eigrp_fsm.c @@ -403,12 +403,10 @@ int eigrp_fsm_event(struct eigrp_fsm_action_message *msg)  {  	enum eigrp_fsm_events event = eigrp_get_fsm_event(msg); -	zlog_info( -		"EIGRP AS: %d State: %s Event: %s Network: %pI4 Packet Type: %s Reply RIJ Count: %d change: %s", -		msg->eigrp->AS, prefix_state2str(msg->prefix->state), -		fsm_state2str(event), &msg->prefix->destination->u.prefix4, -		packet_type2str(msg->packet_type), msg->prefix->rij->count, -		change2str(msg->change)); +	zlog_info("EIGRP AS: %d State: %s Event: %s Network: %pFX Packet Type: %s Reply RIJ Count: %d change: %s", +		  msg->eigrp->AS, prefix_state2str(msg->prefix->state), fsm_state2str(event), +		  &msg->prefix->destination, packet_type2str(msg->packet_type), +		  msg->prefix->rij->count, change2str(msg->change));  	(*(NSM[msg->prefix->state][event].func))(msg);  	return 1; diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c index 2e3beacae7..73caa72b6d 100644 --- a/eigrpd/eigrp_interface.c +++ b/eigrpd/eigrp_interface.c @@ -294,8 +294,7 @@ int eigrp_if_up(struct eigrp_interface *ei)  	if (pe == NULL) {  		pe = eigrp_prefix_descriptor_new();  		pe->serno = eigrp->serno; -		pe->destination = (struct prefix *)prefix_ipv4_new(); -		prefix_copy(pe->destination, &dest_addr); +		prefix_copy(&pe->destination, &dest_addr);  		pe->af = AF_INET;  		pe->nt = EIGRP_TOPOLOGY_TYPE_CONNECTED; diff --git a/eigrpd/eigrp_network.c b/eigrpd/eigrp_network.c index 910215cbcb..fc334cf97d 100644 --- a/eigrpd/eigrp_network.c +++ b/eigrpd/eigrp_network.c @@ -219,6 +219,21 @@ int eigrp_network_set(struct eigrp *eigrp, struct prefix *p)  	return 1;  } +static void eigrp_network_delete_all(struct eigrp *eigrp, struct route_table *table) +{ +	struct route_node *rn; + +	for (rn = route_top(table); rn; rn = route_next(rn)) { +		prefix_free((struct prefix **)&rn->info); +	} +} + +void eigrp_network_free(struct eigrp *eigrp, struct route_table *table) +{ +	eigrp_network_delete_all(eigrp, table); +	route_table_finish(table); +} +  /* Check whether interface matches given network   * returns: 1, true. 0, false   */ diff --git a/eigrpd/eigrp_network.h b/eigrpd/eigrp_network.h index ac5c47f6f9..1baf26b0c0 100644 --- a/eigrpd/eigrp_network.h +++ b/eigrpd/eigrp_network.h @@ -19,6 +19,7 @@ extern int eigrp_sock_init(struct vrf *vrf);  extern int eigrp_if_ipmulticast(struct eigrp *, struct prefix *, unsigned int);  extern int eigrp_network_set(struct eigrp *eigrp, struct prefix *p);  extern int eigrp_network_unset(struct eigrp *eigrp, struct prefix *p); +extern void eigrp_network_free(struct eigrp *eigrp, struct route_table *table);  extern void eigrp_hello_timer(struct event *thread);  extern void eigrp_if_update(struct interface *); diff --git a/eigrpd/eigrp_packet.c b/eigrpd/eigrp_packet.c index 189d9330cf..7560514cec 100644 --- a/eigrpd/eigrp_packet.c +++ b/eigrpd/eigrp_packet.c @@ -1129,7 +1129,7 @@ uint16_t eigrp_add_internalTLV_to_stream(struct stream *s,  	uint16_t length;  	stream_putw(s, EIGRP_TLV_IPv4_INT); -	switch (pe->destination->prefixlen) { +	switch (pe->destination.prefixlen) {  	case 0:  	case 1:  	case 2: @@ -1176,8 +1176,8 @@ uint16_t eigrp_add_internalTLV_to_stream(struct stream *s,  		stream_putw(s, length);  		break;  	default: -		flog_err(EC_LIB_DEVELOPMENT, "%s: Unexpected prefix length: %d", -			 __func__, pe->destination->prefixlen); +		flog_err(EC_LIB_DEVELOPMENT, "%s: Unexpected prefix length: %d", __func__, +			 pe->destination.prefixlen);  		return 0;  	}  	stream_putl(s, 0x00000000); @@ -1194,15 +1194,15 @@ uint16_t eigrp_add_internalTLV_to_stream(struct stream *s,  	stream_putc(s, pe->reported_metric.tag);  	stream_putc(s, pe->reported_metric.flags); -	stream_putc(s, pe->destination->prefixlen); +	stream_putc(s, pe->destination.prefixlen); -	stream_putc(s, (ntohl(pe->destination->u.prefix4.s_addr) >> 24) & 0xFF); -	if (pe->destination->prefixlen > 8) -		stream_putc(s, (ntohl(pe->destination->u.prefix4.s_addr) >> 16) & 0xFF); -	if (pe->destination->prefixlen > 16) -		stream_putc(s, (ntohl(pe->destination->u.prefix4.s_addr) >> 8) & 0xFF); -	if (pe->destination->prefixlen > 24) -		stream_putc(s, ntohl(pe->destination->u.prefix4.s_addr) & 0xFF); +	stream_putc(s, (ntohl(pe->destination.u.prefix4.s_addr) >> 24) & 0xFF); +	if (pe->destination.prefixlen > 8) +		stream_putc(s, (ntohl(pe->destination.u.prefix4.s_addr) >> 16) & 0xFF); +	if (pe->destination.prefixlen > 16) +		stream_putc(s, (ntohl(pe->destination.u.prefix4.s_addr) >> 8) & 0xFF); +	if (pe->destination.prefixlen > 24) +		stream_putc(s, ntohl(pe->destination.u.prefix4.s_addr) & 0xFF);  	return length;  } diff --git a/eigrpd/eigrp_reply.c b/eigrpd/eigrp_reply.c index aae89e832b..a444f3a5a9 100644 --- a/eigrpd/eigrp_reply.c +++ b/eigrpd/eigrp_reply.c @@ -61,8 +61,7 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr,  		      sizeof(struct eigrp_prefix_descriptor));  	memcpy(pe2, pe, sizeof(struct eigrp_prefix_descriptor)); -	if (eigrp_update_prefix_apply(eigrp, ei, EIGRP_FILTER_OUT, -				      pe2->destination)) { +	if (eigrp_update_prefix_apply(eigrp, ei, EIGRP_FILTER_OUT, &pe2->destination)) {  		zlog_info("REPLY SEND: Setting Metric to max");  		pe2->reported_metric.delay = EIGRP_MAX_METRIC;  	} diff --git a/eigrpd/eigrp_structs.h b/eigrpd/eigrp_structs.h index 93bcf07885..c24067bc33 100644 --- a/eigrpd/eigrp_structs.h +++ b/eigrpd/eigrp_structs.h @@ -447,7 +447,7 @@ struct eigrp_prefix_descriptor {  	uint8_t af;	 // address family  	uint8_t req_action; // required action -	struct prefix *destination; +	struct prefix destination;  	// If network type is REMOTE_EXTERNAL, pointer will have reference to  	// its external TLV diff --git a/eigrpd/eigrp_topology.c b/eigrpd/eigrp_topology.c index f17be8f4b7..e59dcacb7c 100644 --- a/eigrpd/eigrp_topology.c +++ b/eigrpd/eigrp_topology.c @@ -68,7 +68,6 @@ struct eigrp_prefix_descriptor *eigrp_prefix_descriptor_new(void)  	new->rij = list_new();  	new->entries->cmp = (int (*)(void *, void *))eigrp_route_descriptor_cmp;  	new->distance = new->fdistance = new->rdistance = EIGRP_MAX_METRIC; -	new->destination = NULL;  	return new;  } @@ -120,12 +119,11 @@ void eigrp_prefix_descriptor_add(struct route_table *topology,  {  	struct route_node *rn; -	rn = route_node_get(topology, pe->destination); +	rn = route_node_get(topology, &pe->destination);  	if (rn->info) {  		if (IS_DEBUG_EIGRP_EVENT) -			zlog_debug( -				"%s: %pFX Should we have found this entry in the topo table?", -				__func__, pe->destination); +			zlog_debug("%s: %pFX Should we have found this entry in the topo table?", +				   __func__, &pe->destination);  		route_unlock_node(rn);  	} @@ -147,8 +145,7 @@ void eigrp_route_descriptor_add(struct eigrp *eigrp,  		listnode_add_sort(node->entries, entry);  		entry->prefix = node; -		eigrp_zebra_route_add(eigrp, node->destination, -				      l, node->fdistance); +		eigrp_zebra_route_add(eigrp, &node->destination, l, node->fdistance);  	}  	list_delete(&l); @@ -168,7 +165,7 @@ void eigrp_prefix_descriptor_delete(struct eigrp *eigrp,  	if (!eigrp)  		return; -	rn = route_node_lookup(table, pe->destination); +	rn = route_node_lookup(table, &pe->destination);  	if (!rn)  		return; @@ -182,8 +179,7 @@ void eigrp_prefix_descriptor_delete(struct eigrp *eigrp,  		eigrp_route_descriptor_delete(eigrp, pe, ne);  	list_delete(&pe->entries);  	list_delete(&pe->rij); -	eigrp_zebra_route_delete(eigrp, pe->destination); -	prefix_free(&pe->destination); +	eigrp_zebra_route_delete(eigrp, &pe->destination);  	rn->info = NULL;  	route_unlock_node(rn); // Lookup above @@ -200,7 +196,7 @@ void eigrp_route_descriptor_delete(struct eigrp *eigrp,  {  	if (listnode_lookup(node->entries, entry) != NULL) {  		listnode_delete(node->entries, entry); -		eigrp_zebra_route_delete(eigrp, node->destination); +		eigrp_zebra_route_delete(eigrp, &node->destination);  		XFREE(MTYPE_EIGRP_ROUTE_DESCRIPTOR, entry);  	}  } @@ -462,14 +458,13 @@ void eigrp_update_routing_table(struct eigrp *eigrp,  	successors = eigrp_topology_get_successor_max(prefix, eigrp->max_paths);  	if (successors) { -		eigrp_zebra_route_add(eigrp, prefix->destination, successors, -				      prefix->fdistance); +		eigrp_zebra_route_add(eigrp, &prefix->destination, successors, prefix->fdistance);  		for (ALL_LIST_ELEMENTS_RO(successors, node, entry))  			entry->flags |= EIGRP_ROUTE_DESCRIPTOR_INTABLE_FLAG;  		list_delete(&successors);  	} else { -		eigrp_zebra_route_delete(eigrp, prefix->destination); +		eigrp_zebra_route_delete(eigrp, &prefix->destination);  		for (ALL_LIST_ELEMENTS_RO(prefix->entries, node, entry))  			entry->flags &= ~EIGRP_ROUTE_DESCRIPTOR_INTABLE_FLAG;  	} diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c index 6511db2feb..7348231c3b 100644 --- a/eigrpd/eigrp_update.c +++ b/eigrpd/eigrp_update.c @@ -128,8 +128,7 @@ static void eigrp_update_receive_GR_ask(struct eigrp *eigrp,  	/* iterate over all prefixes which weren't advertised by neighbor */  	for (ALL_LIST_ELEMENTS_RO(nbr_prefixes, node1, prefix)) { -		zlog_debug("GR receive: Neighbor not advertised %pFX", -			   prefix->destination); +		zlog_debug("GR receive: Neighbor not advertised %pFX", &prefix->destination);  		fsm_msg.metrics = prefix->reported_metric;  		/* set delay to MAX */ @@ -320,9 +319,7 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph,  				/*Here comes topology information save*/  				pe = eigrp_prefix_descriptor_new();  				pe->serno = eigrp->serno; -				pe->destination = -					(struct prefix *)prefix_ipv4_new(); -				prefix_copy(pe->destination, &dest_addr); +				prefix_copy(&pe->destination, &dest_addr);  				pe->af = AF_INET;  				pe->state = EIGRP_FSM_STATE_PASSIVE;  				pe->nt = EIGRP_TOPOLOGY_TYPE_REMOTE; @@ -566,7 +563,7 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)  				}  			}  			/* Get destination address from prefix */ -			dest_addr = pe->destination; +			dest_addr = &pe->destination;  			/* Check if any list fits */  			if (eigrp_update_prefix_apply( @@ -650,7 +647,7 @@ void eigrp_update_send(struct eigrp_interface *ei)  			has_tlv = 0;  		}  		/* Get destination address from prefix */ -		dest_addr = pe->destination; +		dest_addr = &pe->destination;  		if (eigrp_update_prefix_apply(eigrp, ei, EIGRP_FILTER_OUT,  					      dest_addr)) { @@ -798,7 +795,7 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr)  		/*  		 * Filtering  		 */ -		dest_addr = pe->destination; +		dest_addr = &pe->destination;  		if (eigrp_update_prefix_apply(eigrp, ei, EIGRP_FILTER_OUT,  					      dest_addr)) { diff --git a/eigrpd/eigrp_zebra.c b/eigrpd/eigrp_zebra.c index a0eff683db..5b0c64ffd0 100644 --- a/eigrpd/eigrp_zebra.c +++ b/eigrpd/eigrp_zebra.c @@ -105,6 +105,11 @@ void eigrp_zebra_init(void)  	zclient->zebra_connected = eigrp_zebra_connected;  } +void eigrp_zebra_stop(void) +{ +	zclient_stop(zclient); +	zclient_free(zclient); +}  /* Zebra route add and delete treatment. */  static int eigrp_zebra_read_route(ZAPI_CALLBACK_ARGS) diff --git a/eigrpd/eigrp_zebra.h b/eigrpd/eigrp_zebra.h index 927d562ab2..723e71b7f0 100644 --- a/eigrpd/eigrp_zebra.h +++ b/eigrpd/eigrp_zebra.h @@ -17,6 +17,7 @@  #include "vrf.h"  extern void eigrp_zebra_init(void); +extern void eigrp_zebra_stop(void);  extern void eigrp_zebra_route_add(struct eigrp *eigrp, struct prefix *p,  				  struct list *successors, uint32_t distance); diff --git a/eigrpd/eigrpd.c b/eigrpd/eigrpd.c index 9a4dd6f55f..981965f101 100644 --- a/eigrpd/eigrpd.c +++ b/eigrpd/eigrpd.c @@ -232,10 +232,15 @@ void eigrp_terminate(void)  	SET_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN); -	frr_each (eigrp_master_hash, &eigrp_om->eigrp, eigrp) +	while (eigrp_master_hash_count(&eigrp_om->eigrp)) { +		eigrp = eigrp_master_hash_first(&eigrp_om->eigrp);  		eigrp_finish(eigrp); +	}  	eigrp_master_hash_fini(&eigrp_om->eigrp); + +	eigrp_zebra_stop(); +  	frr_fini();  } @@ -243,16 +248,6 @@ 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) && -	    (eigrp_master_hash_count(&eigrp_om->eigrp) == 0)) { -		if (zclient) { -			zclient_stop(zclient); -			zclient_free(zclient); -		} -		exit(0); -	} -  	return;  } @@ -279,6 +274,7 @@ void eigrp_finish_final(struct eigrp *eigrp)  	list_delete(&eigrp->oi_write_q);  	eigrp_topology_free(eigrp, eigrp->topology_table); +	eigrp_network_free(eigrp, eigrp->networks);  	eigrp_nbr_delete(eigrp->neighbor_self); @@ -289,6 +285,9 @@ void eigrp_finish_final(struct eigrp *eigrp)  	stream_free(eigrp->ibuf);  	distribute_list_delete(&eigrp->distribute_ctx); + +	QOBJ_UNREG(eigrp); +  	XFREE(MTYPE_EIGRP_TOP, eigrp);  }  | 
