diff options
Diffstat (limited to 'ospfd')
| -rw-r--r-- | ospfd/ospf_apiserver.c | 79 | ||||
| -rw-r--r-- | ospfd/ospf_dump.c | 45 | ||||
| -rw-r--r-- | ospfd/ospf_dump.h | 4 | ||||
| -rw-r--r-- | ospfd/ospf_lsa.c | 16 | ||||
| -rw-r--r-- | ospfd/ospf_lsa.h | 6 | ||||
| -rw-r--r-- | ospfd/ospf_lsdb.c | 8 | ||||
| -rw-r--r-- | ospfd/ospf_lsdb.h | 6 | ||||
| -rw-r--r-- | ospfd/ospf_opaque.c | 129 | ||||
| -rw-r--r-- | ospfd/ospf_te.c | 55 | 
9 files changed, 188 insertions, 160 deletions
diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c index fcc28c6f9f..6582db5390 100644 --- a/ospfd/ospf_apiserver.c +++ b/ospfd/ospf_apiserver.c @@ -234,26 +234,6 @@ static struct ospf_apiserver *lookup_apiserver_by_lsa(struct ospf_lsa *lsa)  	return found;  } -/* ----------------------------------------------------------- - * Following are functions to manage client connections. - * ----------------------------------------------------------- - */ -static int ospf_apiserver_new_lsa_hook(struct ospf_lsa *lsa) -{ -	if (IS_DEBUG_OSPF_EVENT) -		zlog_debug("API: Put LSA(%p)[%s] into reserve, total=%ld", -			   (void *)lsa, dump_lsa_key(lsa), lsa->lsdb->total); -	return 0; -} - -static int ospf_apiserver_del_lsa_hook(struct ospf_lsa *lsa) -{ -	if (IS_DEBUG_OSPF_EVENT) -		zlog_debug("API: Get LSA(%p)[%s] from reserve, total=%ld", -			   (void *)lsa, dump_lsa_key(lsa), lsa->lsdb->total); -	return 0; -} -  /* Allocate new connection structure. */  struct ospf_apiserver *ospf_apiserver_new(int fd_sync, int fd_async)  { @@ -270,12 +250,11 @@ struct ospf_apiserver *ospf_apiserver_new(int fd_sync, int fd_async)  	new->opaque_types = list_new();  	/* Initialize temporary strage for LSA instances to be refreshed. */ +	if (IS_DEBUG_OSPF_CLIENT_API) +		zlog_debug("API: Initiallize the reserve LSDB");  	memset(&new->reserve, 0, sizeof(struct ospf_lsdb));  	ospf_lsdb_init(&new->reserve); -	new->reserve.new_lsa_hook = ospf_apiserver_new_lsa_hook; /* debug */ -	new->reserve.del_lsa_hook = ospf_apiserver_del_lsa_hook; /* debug */ -  	new->out_sync_fifo = msg_fifo_new();  	new->out_async_fifo = msg_fifo_new();  	new->t_sync_read = NULL; @@ -363,6 +342,9 @@ void ospf_apiserver_free(struct ospf_apiserver *apiserv)  	msg_fifo_free(apiserv->out_async_fifo);  	/* Clear temporary strage for LSA instances to be refreshed. */ +	if (IS_DEBUG_OSPF_CLIENT_API) +		zlog_debug("API: Delete all LSAs from reserve LSDB, total=%ld", +			   apiserv->reserve.total);  	ospf_lsdb_delete_all(&apiserv->reserve);  	ospf_lsdb_cleanup(&apiserv->reserve); @@ -371,7 +353,7 @@ void ospf_apiserver_free(struct ospf_apiserver *apiserv)  	XFREE(MTYPE_APISERVER_MSGFILTER, apiserv->filter); -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		zlog_debug("API: Delete apiserv(%p), total#(%d)",  			   (void *)apiserv, apiserver_list->count); @@ -393,7 +375,7 @@ void ospf_apiserver_read(struct event *thread)  		event = OSPF_APISERVER_SYNC_READ;  		apiserv->t_sync_read = NULL; -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_CLIENT_API)  			zlog_debug("API: %s: Peer: %pI4/%u", __func__,  				   &apiserv->peer_sync.sin_addr,  				   ntohs(apiserv->peer_sync.sin_port)); @@ -403,7 +385,7 @@ void ospf_apiserver_read(struct event *thread)  		event = OSPF_APISERVER_ASYNC_READ;  		apiserv->t_async_read = NULL; -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_CLIENT_API)  			zlog_debug("API: %s: Peer: %pI4/%u", __func__,  				   &apiserv->peer_async.sin_addr,  				   ntohs(apiserv->peer_async.sin_port)); @@ -426,7 +408,7 @@ void ospf_apiserver_read(struct event *thread)  		return;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		msg_print(msg);  	/* Dispatch to corresponding message handler. */ @@ -457,7 +439,7 @@ void ospf_apiserver_sync_write(struct event *thread)  		goto out;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		zlog_debug("API: %s: Peer: %pI4/%u", __func__,  			   &apiserv->peer_sync.sin_addr,  			   ntohs(apiserv->peer_sync.sin_port)); @@ -469,7 +451,7 @@ void ospf_apiserver_sync_write(struct event *thread)  		return;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		msg_print(msg);  	rc = msg_write(fd, msg); @@ -517,7 +499,7 @@ void ospf_apiserver_async_write(struct event *thread)  		goto out;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		zlog_debug("API: %s: Peer: %pI4/%u", __func__,  			   &apiserv->peer_async.sin_addr,  			   ntohs(apiserv->peer_async.sin_port)); @@ -529,7 +511,7 @@ void ospf_apiserver_async_write(struct event *thread)  		return;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		msg_print(msg);  	rc = msg_write(fd, msg); @@ -639,7 +621,7 @@ void ospf_apiserver_accept(struct event *thread)  		return;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		zlog_debug("API: %s: New peer: %pI4/%u", __func__,  			   &peer_sync.sin_addr, ntohs(peer_sync.sin_port)); @@ -701,7 +683,7 @@ void ospf_apiserver_accept(struct event *thread)  			     apiserv);  #endif /* USE_ASYNC_READ */ -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		zlog_debug("API: New apiserv(%p), total#(%d)", (void *)apiserv,  			   apiserver_list->count);  } @@ -888,7 +870,7 @@ int ospf_apiserver_register_opaque_type(struct ospf_apiserver *apiserv,  	/* Add to list of registered opaque types */  	listnode_add(apiserv->opaque_types, regtype); -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_CLIENT_API)  		zlog_debug(  			"API: Add LSA-type(%d)/Opaque-type(%d) into apiserv(%p), total#(%d)",  			lsa_type, opaque_type, (void *)apiserv, @@ -919,7 +901,7 @@ int ospf_apiserver_unregister_opaque_type(struct ospf_apiserver *apiserv,  			listnode_delete(apiserv->opaque_types, regtype);  			XFREE(MTYPE_APISERVER, regtype); -			if (IS_DEBUG_OSPF_EVENT) +			if (IS_DEBUG_OSPF_CLIENT_API)  				zlog_debug(  					"API: Del LSA-type(%d)/Opaque-type(%d) from apiserv(%p), total#(%d)",  					lsa_type, opaque_type, (void *)apiserv, @@ -1553,7 +1535,7 @@ struct ospf_lsa *ospf_apiserver_opaque_lsa_new(struct ospf_area *area,  	options |= OSPF_OPTION_O; /* Don't forget to set option bit */ -	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { +	if (IS_DEBUG_OSPF_CLIENT_API) {  		zlog_debug("LSA[Type%d:%pI4]: Creating an Opaque-LSA instance",  			   protolsa->type, &protolsa->id);  	} @@ -1716,6 +1698,9 @@ int ospf_apiserver_handle_originate_request(struct ospf_apiserver *apiserv,  		 */  		new->lsdb = &apiserv->reserve;  		ospf_lsdb_add(&apiserv->reserve, new); +		if (IS_DEBUG_OSPF_CLIENT_API) +			zlog_debug("API: Add LSA(%p)[%s] into reserve LSDB, total=%ld", (void *)new, +				   dump_lsa_key(new), new->lsdb->total);  		/* Kick the scheduler function. */  		ospf_opaque_lsa_refresh_schedule(old); @@ -1878,7 +1863,7 @@ struct ospf_lsa *ospf_apiserver_lsa_refresher(struct ospf_lsa *lsa)  	ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);  	assert(ospf); -	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { +	if (IS_DEBUG_OSPF_CLIENT_API) {  		zlog_debug("LSA[Type%d:%pI4]: OSPF API Server LSA Refresher",  			   lsa->data->type, &lsa->data->id);  	} @@ -1909,6 +1894,9 @@ struct ospf_lsa *ospf_apiserver_lsa_refresher(struct ospf_lsa *lsa)  		}  	} else {  		/* This is a forcible refresh, requested by OSPF-API client. */ +		if (IS_DEBUG_OSPF_CLIENT_API) +			zlog_debug("API: Delete LSA(%p)[%s] from reserve LSDB, total=%ld", +				   (void *)new, dump_lsa_key(new), new->lsdb->total);  		ospf_lsdb_delete(&apiserv->reserve, new);  		new->lsdb = NULL;  	} @@ -2597,18 +2585,23 @@ static int apiserver_clients_lsa_change_notify(uint8_t msgtype,  int ospf_apiserver_lsa_update(struct ospf_lsa *lsa)  { +	if (IS_DEBUG_OSPF_CLIENT_API) +		zlog_debug("API: LSA Update Hook Type-%u Opaque-LSA: [opaque-type=%u, opaque-id=%x] Seq: 0x%x %s", +			   lsa->data->type, GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)), +			   GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr)), ntohl(lsa->data->ls_seqnum), +			   IS_LSA_MAXAGE(lsa) ? "MaxAged " : ""); -	/* Only notify this update if the LSA's age is smaller than -	   MAXAGE. Otherwise clients would see LSA updates with max age just -	   before they are deleted from the LSDB. LSA delete messages have -	   MAXAGE too but should not be filtered. */ -	if (IS_LSA_MAXAGE(lsa)) -		return 0;  	return apiserver_clients_lsa_change_notify(MSG_LSA_UPDATE_NOTIFY, lsa);  }  int ospf_apiserver_lsa_delete(struct ospf_lsa *lsa)  { +	if (IS_DEBUG_OSPF_CLIENT_API) +		zlog_debug("API: LSA Delete Hook Type-%u Opaque-LSA: [opaque-type=%u, opaque-id=%x] Seq: 0x%x %s", +			   lsa->data->type, GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)), +			   GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr)), ntohl(lsa->data->ls_seqnum), +			   IS_LSA_MAXAGE(lsa) ? "MaxAged " : ""); +  	return apiserver_clients_lsa_change_notify(MSG_LSA_DELETE_NOTIFY, lsa);  } diff --git a/ospfd/ospf_dump.c b/ospfd/ospf_dump.c index dbe6dd97d0..124b38219d 100644 --- a/ospfd/ospf_dump.c +++ b/ospfd/ospf_dump.c @@ -46,6 +46,7 @@ unsigned long conf_debug_ospf_ldp_sync;  unsigned long conf_debug_ospf_gr;  unsigned long conf_debug_ospf_bfd;  unsigned long conf_debug_ospf_client_api; +unsigned long conf_debug_ospf_opaque_lsa;  /* Enable debug option variables -- valid only session. */  unsigned long term_debug_ospf_packet[5] = {0, 0, 0, 0, 0}; @@ -64,6 +65,7 @@ unsigned long term_debug_ospf_ldp_sync;  unsigned long term_debug_ospf_gr;  unsigned long term_debug_ospf_bfd;  unsigned long term_debug_ospf_client_api; +unsigned long term_debug_ospf_opaque_lsa;  const char *ospf_redist_string(unsigned int route_type)  { @@ -1577,6 +1579,33 @@ DEFPY (debug_ospf_client_api,  	return CMD_SUCCESS;  } +DEFPY (debug_ospf_opaque_lsa, +       debug_ospf_opaque_lsa_cmd, +       "[no$no] debug ospf [(1-65535)$instance] opaque-lsa", +       NO_STR +       DEBUG_STR +       OSPF_STR +       "Instance ID\n" +       "OSPF Opaque LSA information\n") +{ +	if (instance && instance != ospf_instance) +		return CMD_NOT_MY_INSTANCE; + +	if (vty->node == CONFIG_NODE) { +		if (no) +			DEBUG_OFF(opaque_lsa, OPAQUE_LSA); +		else +			DEBUG_ON(opaque_lsa, OPAQUE_LSA); +	} else { +		if (no) +			TERM_DEBUG_OFF(opaque_lsa, OPAQUE_LSA); +		else +			TERM_DEBUG_ON(opaque_lsa, OPAQUE_LSA); +	} + +	return CMD_SUCCESS; +} +  DEFUN (no_debug_ospf,         no_debug_ospf_cmd,         "no debug ospf", @@ -1612,6 +1641,7 @@ DEFUN (no_debug_ospf,  		DEBUG_OFF(sr, SR);  		DEBUG_OFF(ti_lfa, TI_LFA);  		DEBUG_OFF(client_api, CLIENT_API); +		DEBUG_OFF(opaque_lsa, OPAQUE_LSA);  		/* BFD debugging is two parts: OSPF and library. */  		DEBUG_OFF(bfd, BFD_LIB); @@ -1649,6 +1679,7 @@ DEFUN (no_debug_ospf,  	TERM_DEBUG_OFF(ti_lfa, TI_LFA);  	TERM_DEBUG_OFF(bfd, BFD_LIB);  	TERM_DEBUG_OFF(client_api, CLIENT_API); +	TERM_DEBUG_OFF(opaque_lsa, OPAQUE_LSA);  	return CMD_SUCCESS;  } @@ -1774,10 +1805,14 @@ static int show_debugging_ospf_common(struct vty *vty)  		vty_out(vty,  			"  OSPF BFD integration library debugging is on\n"); -	/* Show debug status for LDP-SYNC. */ +	/* Show debug status for CLIENT-API. */  	if (IS_DEBUG_OSPF(client_api, CLIENT_API) == OSPF_DEBUG_CLIENT_API)  		vty_out(vty, "  OSPF client-api debugging is on\n"); +	/* Show debug status for OPAQUE-LSA. */ +	if (IS_DEBUG_OSPF(opaque_lsa, OPAQUE_LSA) == OSPF_DEBUG_OPAQUE_LSA) +		vty_out(vty, "  OSPF opaque-lsa debugging is on\n"); +  	return CMD_SUCCESS;  } @@ -1983,6 +2018,12 @@ static int config_write_debug(struct vty *vty)  		write = 1;  	} +	/* debug ospf opaque-lsa */ +	if (IS_CONF_DEBUG_OSPF(opaque_lsa, OPAQUE_LSA) == OSPF_DEBUG_OPAQUE_LSA) { +		vty_out(vty, "debug ospf%s opaque-lsa\n", str); +		write = 1; +	} +  	/* debug ospf default-information */  	if (IS_CONF_DEBUG_OSPF(defaultinfo, DEFAULTINFO) ==  	    OSPF_DEBUG_DEFAULTINFO) { @@ -2011,6 +2052,7 @@ void ospf_debug_init(void)  	install_element(ENABLE_NODE, &debug_ospf_default_info_cmd);  	install_element(ENABLE_NODE, &debug_ospf_ldp_sync_cmd);  	install_element(ENABLE_NODE, &debug_ospf_client_api_cmd); +	install_element(ENABLE_NODE, &debug_ospf_opaque_lsa_cmd);  	install_element(ENABLE_NODE, &no_debug_ospf_ism_cmd);  	install_element(ENABLE_NODE, &no_debug_ospf_nsm_cmd);  	install_element(ENABLE_NODE, &no_debug_ospf_lsa_cmd); @@ -2050,6 +2092,7 @@ void ospf_debug_init(void)  	install_element(CONFIG_NODE, &debug_ospf_default_info_cmd);  	install_element(CONFIG_NODE, &debug_ospf_ldp_sync_cmd);  	install_element(CONFIG_NODE, &debug_ospf_client_api_cmd); +	install_element(CONFIG_NODE, &debug_ospf_opaque_lsa_cmd);  	install_element(CONFIG_NODE, &no_debug_ospf_nsm_cmd);  	install_element(CONFIG_NODE, &no_debug_ospf_lsa_cmd);  	install_element(CONFIG_NODE, &no_debug_ospf_zebra_cmd); diff --git a/ospfd/ospf_dump.h b/ospfd/ospf_dump.h index 0d47be2565..7e36fb0430 100644 --- a/ospfd/ospf_dump.h +++ b/ospfd/ospf_dump.h @@ -55,6 +55,8 @@  #define OSPF_DEBUG_CLIENT_API 0x01 +#define OSPF_DEBUG_OPAQUE_LSA 0x01 +  /* Macro for setting debug option. */  #define CONF_DEBUG_PACKET_ON(a, b)	    conf_debug_ospf_packet[a] |= (b)  #define CONF_DEBUG_PACKET_OFF(a, b)	    conf_debug_ospf_packet[a] &= ~(b) @@ -106,6 +108,7 @@  #define IS_DEBUG_OSPF_LDP_SYNC IS_DEBUG_OSPF(ldp_sync, LDP_SYNC)  #define IS_DEBUG_OSPF_GR IS_DEBUG_OSPF(gr, GR)  #define IS_DEBUG_OSPF_CLIENT_API IS_DEBUG_OSPF(client_api, CLIENT_API) +#define IS_DEBUG_OSPF_OPAQUE_LSA IS_DEBUG_OSPF(opaque_lsa, OPAQUE_LSA)  #define IS_CONF_DEBUG_OSPF_PACKET(a, b)                                        \  	(conf_debug_ospf_packet[a] & OSPF_DEBUG_##b) @@ -131,6 +134,7 @@ extern unsigned long term_debug_ospf_ldp_sync;  extern unsigned long term_debug_ospf_gr;  extern unsigned long term_debug_ospf_bfd;  extern unsigned long term_debug_ospf_client_api; +extern unsigned long term_debug_ospf_opaque_lsa;  /* Message Strings. */  extern char *ospf_lsa_type_str[]; diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index ac53f3a19f..1d5c0be5c4 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -61,6 +61,12 @@ static struct ospf_lsa *  ospf_exnl_lsa_prepare_and_flood(struct ospf *ospf, struct external_info *ei,  				struct in_addr id); +/* + * LSA Update and Delete Hook LSAs. + */ +DEFINE_HOOK(ospf_lsa_update, (struct ospf_lsa *lsa), (lsa)); +DEFINE_HOOK(ospf_lsa_delete, (struct ospf_lsa *lsa), (lsa)); +  uint32_t get_metric(uint8_t *metric)  {  	uint32_t m; @@ -3146,6 +3152,11 @@ struct ospf_lsa *ospf_lsa_install(struct ospf *ospf, struct ospf_interface *oi,  			zlog_debug("LSA[%s]: Install LSA %p, MaxAge",  				   dump_lsa_key(new), lsa);  		ospf_lsa_maxage(ospf, lsa); +	} else { +		/* +		 * Invoke the LSA update hook. +		 */ +		hook_call(ospf_lsa_update, new);  	}  	return new; @@ -3364,6 +3375,11 @@ void ospf_lsa_maxage(struct ospf *ospf, struct ospf_lsa *lsa)  		zlog_debug("LSA[%s]: MaxAge LSA remover scheduled.",  			   dump_lsa_key(lsa)); +	/* +	 * Invoke the LSA delete hook. +	 */ +	hook_call(ospf_lsa_delete, lsa); +  	OSPF_TIMER_ON(ospf->t_maxage, ospf_maxage_lsa_remover,  		      ospf->maxage_delay);  } diff --git a/ospfd/ospf_lsa.h b/ospfd/ospf_lsa.h index 418675cb10..f58bbde07a 100644 --- a/ospfd/ospf_lsa.h +++ b/ospfd/ospf_lsa.h @@ -363,4 +363,10 @@ static inline bool ospf_check_indication_lsa(struct ospf_lsa *lsa)  	return false;  } + +/* + * LSA Update and Delete Hook LSAs. + */ +DECLARE_HOOK(ospf_lsa_update, (struct ospf_lsa *lsa), (lsa)); +DECLARE_HOOK(ospf_lsa_delete, (struct ospf_lsa *lsa), (lsa));  #endif /* _ZEBRA_OSPF_LSA_H */ diff --git a/ospfd/ospf_lsdb.c b/ospfd/ospf_lsdb.c index d1b3eb0d35..8e36940043 100644 --- a/ospfd/ospf_lsdb.c +++ b/ospfd/ospf_lsdb.c @@ -147,10 +147,6 @@ static void ospf_lsdb_delete_entry(struct ospf_lsdb *lsdb,  	rn->info = NULL;  	route_unlock_node(rn); -#ifdef MONITOR_LSDB_CHANGE -	if (lsdb->del_lsa_hook != NULL) -		(*lsdb->del_lsa_hook)(lsa); -#endif			       /* MONITOR_LSDB_CHANGE */  	ospf_lsa_unlock(&lsa); /* lsdb */  	return;  } @@ -187,10 +183,6 @@ void ospf_lsdb_add(struct ospf_lsdb *lsdb, struct ospf_lsa *lsa)  	    CHECK_FLAG(lsa->data->options, OSPF_OPTION_DC))  		lsa->area->fr_info.router_lsas_recv_dc_bit++; -#ifdef MONITOR_LSDB_CHANGE -	if (lsdb->new_lsa_hook != NULL) -		(*lsdb->new_lsa_hook)(lsa); -#endif /* MONITOR_LSDB_CHANGE */  	lsdb->type[lsa->data->type].checksum += ntohs(lsa->data->checksum);  	rn->info = ospf_lsa_lock(lsa); /* lsdb */  } diff --git a/ospfd/ospf_lsdb.h b/ospfd/ospf_lsdb.h index e5e3be8baa..e09c2937a5 100644 --- a/ospfd/ospf_lsdb.h +++ b/ospfd/ospf_lsdb.h @@ -19,12 +19,6 @@ struct ospf_lsdb {  		struct route_table *db;  	} type[OSPF_MAX_LSA];  	unsigned long total; -#define MONITOR_LSDB_CHANGE 1 /* XXX */ -#ifdef MONITOR_LSDB_CHANGE -	/* Hooks for callback functions to catch every add/del event. */ -	int (*new_lsa_hook)(struct ospf_lsa *); -	int (*del_lsa_hook)(struct ospf_lsa *); -#endif /* MONITOR_LSDB_CHANGE */  };  /* Macros. */ diff --git a/ospfd/ospf_opaque.c b/ospfd/ospf_opaque.c index d8b272d60b..0634178ca7 100644 --- a/ospfd/ospf_opaque.c +++ b/ospfd/ospf_opaque.c @@ -62,8 +62,13 @@ static void ospf_opaque_funclist_init(void);  static void ospf_opaque_funclist_term(void);  static void free_opaque_info_per_type_del(void *val);  static void free_opaque_info_per_id(void *val); -static int ospf_opaque_lsa_install_hook(struct ospf_lsa *lsa); + +/* + * OSPF Opaque specific hooks and state. + */ +static int ospf_opaque_lsa_update_hook(struct ospf_lsa *lsa);  static int ospf_opaque_lsa_delete_hook(struct ospf_lsa *lsa); +static bool ospf_opaque_lsa_hooks_registered;  void ospf_opaque_init(void)  { @@ -152,19 +157,19 @@ int ospf_opaque_type10_lsa_init(struct ospf_area *area)  	area->opaque_lsa_self = list_new();  	area->opaque_lsa_self->del = free_opaque_info_per_type_del;  	area->t_opaque_lsa_self = NULL; - -#ifdef MONITOR_LSDB_CHANGE -	area->lsdb->new_lsa_hook = ospf_opaque_lsa_install_hook; -	area->lsdb->del_lsa_hook = ospf_opaque_lsa_delete_hook; -#endif /* MONITOR_LSDB_CHANGE */ +	if (!ospf_opaque_lsa_hooks_registered) { +		hook_register(ospf_lsa_update, ospf_opaque_lsa_update_hook); +		hook_register(ospf_lsa_delete, ospf_opaque_lsa_delete_hook); +		ospf_opaque_lsa_hooks_registered = true; +	}  	return 0;  }  void ospf_opaque_type10_lsa_term(struct ospf_area *area)  { -#ifdef MONITOR_LSDB_CHANGE -	area->lsdb->new_lsa_hook = area->lsdb->del_lsa_hook = NULL; -#endif /* MONITOR_LSDB_CHANGE */ +	hook_unregister(ospf_lsa_update, ospf_opaque_lsa_update_hook); +	hook_unregister(ospf_lsa_delete, ospf_opaque_lsa_delete_hook); +	ospf_opaque_lsa_hooks_registered = false;  	EVENT_OFF(area->t_opaque_lsa_self);  	if (area->opaque_lsa_self != NULL) @@ -181,19 +186,11 @@ int ospf_opaque_type11_lsa_init(struct ospf *top)  	top->opaque_lsa_self->del = free_opaque_info_per_type_del;  	top->t_opaque_lsa_self = NULL; -#ifdef MONITOR_LSDB_CHANGE -	top->lsdb->new_lsa_hook = ospf_opaque_lsa_install_hook; -	top->lsdb->del_lsa_hook = ospf_opaque_lsa_delete_hook; -#endif /* MONITOR_LSDB_CHANGE */  	return 0;  }  void ospf_opaque_type11_lsa_term(struct ospf *top)  { -#ifdef MONITOR_LSDB_CHANGE -	top->lsdb->new_lsa_hook = top->lsdb->del_lsa_hook = NULL; -#endif /* MONITOR_LSDB_CHANGE */ -  	EVENT_OFF(top->t_opaque_lsa_self);  	if (top->opaque_lsa_self != NULL)  		list_delete(&top->opaque_lsa_self); @@ -297,7 +294,7 @@ static void ospf_opaque_del_functab(void *val)  {  	struct ospf_opaque_functab *functab = (struct ospf_opaque_functab *)val; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("%s: Opaque LSA functab list deletion callback type %u (%p)",  			   __func__, functab->opaque_type, functab); @@ -309,7 +306,7 @@ static void ospf_opaque_funclist_init(void)  {  	struct list *funclist; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("%s: Function list initialize", __func__);  	funclist = ospf_opaque_wildcard_funclist = list_new(); @@ -330,7 +327,7 @@ static void ospf_opaque_funclist_term(void)  {  	struct list *funclist; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("%s: Function list terminate", __func__);  	funclist = ospf_opaque_wildcard_funclist; @@ -408,7 +405,7 @@ int ospf_register_opaque_functab(  	for (ALL_LIST_ELEMENTS(funclist, node, nnode, functab))  		if (functab->opaque_type == opaque_type) { -			if (IS_DEBUG_OSPF_EVENT) +			if (IS_DEBUG_OSPF_OPAQUE_LSA)  				zlog_debug("%s: Opaque LSA functab found type %u, (%p)",  					   __func__, functab->opaque_type,  					   functab); @@ -419,7 +416,7 @@ int ospf_register_opaque_functab(  		new = XCALLOC(MTYPE_OSPF_OPAQUE_FUNCTAB,  			      sizeof(struct ospf_opaque_functab));  	else { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug("%s: Re-register Opaque LSA type %u, opaque type %u, (%p)",  				   __func__, lsa_type, opaque_type, functab);  		return 0; @@ -439,7 +436,7 @@ int ospf_register_opaque_functab(  	new->new_lsa_hook = new_lsa_hook;  	new->del_lsa_hook = del_lsa_hook; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("%s: Register Opaque LSA type %u, opaque type %u, (%p)",  			   __func__, lsa_type, opaque_type, new); @@ -458,7 +455,7 @@ void ospf_delete_opaque_functab(uint8_t lsa_type, uint8_t opaque_type)  	if ((funclist = ospf_get_opaque_funclist(lsa_type)) != NULL)  		for (ALL_LIST_ELEMENTS(funclist, node, nnode, functab)) {  			if (functab->opaque_type == opaque_type) { -				if (IS_DEBUG_OSPF_EVENT) +				if (IS_DEBUG_OSPF_OPAQUE_LSA)  					zlog_debug("%s: Delete Opaque functab LSA type %u, opaque type %u, (%p)",  						   __func__, lsa_type,  						   opaque_type, functab); @@ -608,7 +605,7 @@ register_opaque_info_per_type(struct ospf_opaque_functab *functab,  	oipt->id_list = list_new();  	oipt->id_list->del = free_opaque_info_per_id; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("%s: Register Opaque info-per-type LSA type %u, opaque type %u, (%p), Functab (%p)",  			   __func__, oipt->lsa_type, oipt->opaque_type, oipt,  			   oipt->functab); @@ -662,7 +659,7 @@ static void free_opaque_info_per_type(struct opaque_info_per_type *oipt,  	if (oipt->functab)  		ospf_opaque_functab_deref(oipt->functab); -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("%s: Free Opaque info-per-type LSA type %u, opaque type %u, (%p), Functab (%p)",  			   __func__, oipt->lsa_type, oipt->opaque_type, oipt,  			   oipt->functab); @@ -825,7 +822,7 @@ void ospf_opaque_type9_lsa_if_cleanup(struct ospf_interface *oi)  		 * is removed from the interface opaque info list.  		 */  		if (lsa->oi == oi) { -			if (IS_DEBUG_OSPF_EVENT) +			if (IS_DEBUG_OSPF_OPAQUE_LSA)  				zlog_debug("Delete Type-9 Opaque-LSA on interface delete: [opaque-type=%u, opaque-id=%x]",  					   GET_OPAQUE_TYPE(  						   ntohl(lsa->data->id.s_addr)), @@ -833,6 +830,12 @@ void ospf_opaque_type9_lsa_if_cleanup(struct ospf_interface *oi)  						   lsa->data->id.s_addr)));  			ospf_lsdb_delete(lsdb, lsa);  			lsa->data->ls_age = htons(OSPF_LSA_MAXAGE); + +			/* +			 * Invoke the delete hook directly since it bypasses the normal MAXAGE +			 * processing. +			 */ +			ospf_opaque_lsa_delete_hook(lsa);  			lsa->oi = NULL;  			ospf_lsa_discard(lsa);  		} @@ -859,7 +862,7 @@ DEFUN (capability_opaque,  	/* Turn on the "master switch" of opaque-lsa capability. */  	if (!CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug("Opaque capability: OFF -> ON");  		SET_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE); @@ -888,7 +891,7 @@ DEFUN (no_capability_opaque,  	/* Turn off the "master switch" of opaque-lsa capability. */  	if (CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug("Opaque capability: ON -> OFF");  		UNSET_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE); @@ -1151,7 +1154,7 @@ void ospf_opaque_nsm_change(struct ospf_neighbor *nbr, int old_state)  		if (CHECK_FLAG(nbr->options, OSPF_OPTION_O)) {  			if (!CHECK_FLAG(top->opaque,  					OPAQUE_OPERATION_READY_BIT)) { -				if (IS_DEBUG_OSPF_EVENT) +				if (IS_DEBUG_OSPF_OPAQUE_LSA)  					zlog_debug(  						"Opaque-LSA: Now get operational!"); @@ -1316,11 +1319,15 @@ void ospf_opaque_lsa_dump(struct stream *s, uint16_t length)  	return;  } -static int ospf_opaque_lsa_install_hook(struct ospf_lsa *lsa) +static int ospf_opaque_lsa_update_hook(struct ospf_lsa *lsa)  {  	struct list *funclist;  	int rc = -1; +	if (IS_DEBUG_OSPF_OPAQUE_LSA) +		zlog_debug("%s: LSA [Type %d: %pI4] Seq: 0x%x %sLSA Update Hook ", __func__, +			   lsa->data->type, &lsa->data->id, ntohl(lsa->data->ls_seqnum), +			   IS_LSA_MAXAGE(lsa) ? "MaxAged " : "");  	/*  	 * Some Opaque-LSA user may want to monitor every LSA installation  	 * into the LSDB, regardless with target LSA type. @@ -1351,6 +1358,10 @@ static int ospf_opaque_lsa_delete_hook(struct ospf_lsa *lsa)  	struct list *funclist;  	int rc = -1; +	if (IS_DEBUG_OSPF_OPAQUE_LSA) +		zlog_debug("%s: LSA [Type %d: %pI4] Seq: 0x%x %sLSA Delete Hook ", __func__, +			   lsa->data->type, &lsa->data->id, ntohl(lsa->data->ls_seqnum), +			   IS_LSA_MAXAGE(lsa) ? "MaxAged " : "");  	/*  	 * Some Opaque-LSA user may want to monitor every LSA deletion  	 * from the LSDB, regardless with target LSA type. @@ -1394,14 +1405,14 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)  	int delay = 0;  	if ((top = oi_to_top(oi)) == NULL || (area = oi->area) == NULL) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug("%s: Invalid argument?", __func__);  		return;  	}  	/* It may not a right time to schedule origination now. */  	if (!CHECK_FLAG(top->opaque, OPAQUE_OPERATION_READY_BIT)) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug("%s: Not operational.", __func__);  		return; /* This is not an error. */  	} @@ -1423,7 +1434,7 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)  	if (!list_isempty(ospf_opaque_type9_funclist)  	    && list_isempty(oi->opaque_lsa_self)  	    && oi->t_opaque_lsa_self == NULL) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Schedule Type-9 Opaque-LSA origination in %d ms later.",  				delay); @@ -1441,7 +1452,7 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)  		 * conditions prevent from scheduling the originate function  		 * again and again.  		 */ -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Schedule Type-10 Opaque-LSA origination in %d ms later.",  				delay); @@ -1459,7 +1470,7 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)  		 * conditions prevent from scheduling the originate function  		 * again and again.  		 */ -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Schedule Type-11 Opaque-LSA origination in %d ms later.",  				delay); @@ -1559,7 +1570,7 @@ static void ospf_opaque_type9_lsa_originate(struct event *t)  	oi = EVENT_ARG(t);  	oi->t_opaque_lsa_self = NULL; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("Timer[Type9-LSA]: Originate Opaque-LSAs for OI %s",  			   IF_NAME(oi)); @@ -1573,7 +1584,7 @@ static void ospf_opaque_type10_lsa_originate(struct event *t)  	area = EVENT_ARG(t);  	area->t_opaque_lsa_self = NULL; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"Timer[Type10-LSA]: Originate Opaque-LSAs for Area %pI4",  			&area->area_id); @@ -1588,7 +1599,7 @@ static void ospf_opaque_type11_lsa_originate(struct event *t)  	top = EVENT_ARG(t);  	top->t_opaque_lsa_self = NULL; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"Timer[Type11-LSA]: Originate AS-External Opaque-LSAs"); @@ -1643,12 +1654,10 @@ struct ospf_lsa *ospf_opaque_lsa_install(struct ospf_lsa *lsa, int rt_recalc)  		goto out;  	} -	if (IS_DEBUG_OSPF(lsa, LSA_INSTALL)) -		zlog_debug( -			"Install Type-%u Opaque-LSA: [opaque-type=%u, opaque-id=%x]", -			lsa->data->type, -			GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)), -			GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr))); +	if (IS_DEBUG_OSPF_OPAQUE_LSA) +		zlog_debug("%s: Install Type-%u Opaque-LSA: [opaque-type=%u, opaque-id=%x]", +			   __func__, lsa->data->type, GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)), +			   GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr)));  	/* Replace the existing lsa with the new one. */  	if ((oipt = lookup_opaque_info_by_type(lsa)) != NULL @@ -1722,7 +1731,7 @@ struct ospf_lsa *ospf_opaque_lsa_refresh(struct ospf_lsa *lsa)  		 * Anyway, this node still has a responsibility to flush this  		 * LSA from the routing domain.  		 */ -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug("LSA[Type%d:%pI4]: Flush stray Opaque-LSA",  				   lsa->data->type, &lsa->data->id); @@ -1841,7 +1850,7 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent,  	/* It may not a right time to schedule reorigination now. */  	if (!CHECK_FLAG(top->opaque, OPAQUE_OPERATION_READY_BIT)) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug("%s: Not operational.", __func__);  		goto out; /* This is not an error. */  	} @@ -1870,7 +1879,7 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent,  	}  	if (oipt->t_opaque_lsa_self != NULL) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Type-%u Opaque-LSA has already scheduled to RE-ORIGINATE: [opaque-type=%u]",  				lsa_type, @@ -1887,7 +1896,7 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent,  	 */  	delay = top->min_ls_interval; /* XXX */ -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"Schedule Type-%u Opaque-LSA to RE-ORIGINATE in %d ms later: [opaque-type=%u]",  			lsa_type, delay, @@ -1943,7 +1952,7 @@ static void ospf_opaque_type9_lsa_reoriginate_timer(struct event *t)  	if (!CHECK_FLAG(top->config, OSPF_OPAQUE_CAPABLE) ||  	    !OSPF_IF_PARAM(oi, opaque_capable) || !ospf_if_is_enable(oi) ||  	    ospf_nbr_count_opaque_capable(oi) == 0) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Suspend re-origination of Type-9 Opaque-LSAs (opaque-type=%u) for a while...",  				oipt->opaque_type); @@ -1952,7 +1961,7 @@ static void ospf_opaque_type9_lsa_reoriginate_timer(struct event *t)  		return;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"Timer[Type9-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for OI (%s)",  			oipt->opaque_type, IF_NAME(oi)); @@ -1992,7 +2001,7 @@ static void ospf_opaque_type10_lsa_reoriginate_timer(struct event *t)  	}  	if (n == 0 || !CHECK_FLAG(top->config, OSPF_OPAQUE_CAPABLE)) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Suspend re-origination of Type-10 Opaque-LSAs (opaque-type=%u) for a while...",  				oipt->opaque_type); @@ -2001,7 +2010,7 @@ static void ospf_opaque_type10_lsa_reoriginate_timer(struct event *t)  		return;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"Timer[Type10-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for Area %pI4",  			oipt->opaque_type, &area->area_id); @@ -2029,7 +2038,7 @@ static void ospf_opaque_type11_lsa_reoriginate_timer(struct event *t)  	}  	if (!CHECK_FLAG(top->config, OSPF_OPAQUE_CAPABLE)) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Suspend re-origination of Type-11 Opaque-LSAs (opaque-type=%u) for a while...",  				oipt->opaque_type); @@ -2038,7 +2047,7 @@ static void ospf_opaque_type11_lsa_reoriginate_timer(struct event *t)  		return;  	} -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"Timer[Type11-LSA]: Re-originate Opaque-LSAs (opaque-type=%u).",  			oipt->opaque_type); @@ -2067,7 +2076,7 @@ void ospf_opaque_lsa_refresh_schedule(struct ospf_lsa *lsa0)  	}  	if (oipi->t_opaque_lsa_self != NULL) { -		if (IS_DEBUG_OSPF_EVENT) +		if (IS_DEBUG_OSPF_OPAQUE_LSA)  			zlog_debug(  				"Type-%u Opaque-LSA has already scheduled to REFRESH: [opaque-type=%u, opaque-id=%x]",  				lsa->data->type, @@ -2098,7 +2107,7 @@ void ospf_opaque_lsa_refresh_schedule(struct ospf_lsa *lsa0)  	delay = ospf_lsa_refresh_delay(ospf, lsa); -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("Schedule Type-%u Opaque-LSA to REFRESH in %d msec later: [opaque-type=%u, opaque-id=%x]",  			   lsa->data->type, delay, GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)),  			   GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr))); @@ -2114,7 +2123,7 @@ static void ospf_opaque_lsa_refresh_timer(struct event *t)  	struct ospf_opaque_functab *functab;  	struct ospf_lsa *lsa; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug("Timer[Opaque-LSA]: (Opaque-LSA Refresh expire)");  	oipi = EVENT_ARG(t); @@ -2180,7 +2189,7 @@ void ospf_opaque_lsa_flush_schedule(struct ospf_lsa *lsa0)  	/* Dequeue listnode entry from the list. */  	listnode_delete(oipt->id_list, oipi); -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"Schedule Type-%u Opaque-LSA to FLUSH: [opaque-type=%u, opaque-id=%x]",  			lsa->data->type, @@ -2202,7 +2211,7 @@ void ospf_opaque_self_originated_lsa_received(struct ospf_neighbor *nbr,  	if ((top = oi_to_top(nbr->oi)) == NULL)  		return; -	if (IS_DEBUG_OSPF_EVENT) +	if (IS_DEBUG_OSPF_OPAQUE_LSA)  		zlog_debug(  			"LSA[Type%d:%pI4]: processing self-originated Opaque-LSA",  			lsa->data->type, &lsa->data->id); diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c index d57990e1a1..b6f432b1bb 100644 --- a/ospfd/ospf_te.c +++ b/ospfd/ospf_te.c @@ -3015,7 +3015,7 @@ static int ospf_te_delete_opaque_lsa(struct ls_ted *ted, struct ospf_lsa *lsa)  /**   * Update Traffic Engineering Database Elements that correspond to the received - * OSPF LSA. If LSA age is equal to MAX_AGE, call deletion function instead. + * OSPF LSA.   *   * @param lsa	OSPF Link State Advertisement   * @@ -3037,34 +3037,18 @@ static int ospf_mpls_te_lsa_update(struct ospf_lsa *lsa)  		return -1;  	} -	/* If LSA is MAX_AGE, remove corresponding Link State element */ -	if (IS_LSA_MAXAGE(lsa)) { -		switch (lsa->data->type) { -		case OSPF_ROUTER_LSA: -			rc = ospf_te_delete_router_lsa(OspfMplsTE.ted, lsa); -			break; -		case OSPF_OPAQUE_AREA_LSA: -		case OSPF_OPAQUE_AS_LSA: -			rc = ospf_te_delete_opaque_lsa(OspfMplsTE.ted, lsa); -			break; -		default: -			rc = 0; -			break; -		} -	} else { -		/* Parse LSA to Update corresponding Link State element */ -		switch (lsa->data->type) { -		case OSPF_ROUTER_LSA: -			rc = ospf_te_parse_router_lsa(OspfMplsTE.ted, lsa); -			break; -		case OSPF_OPAQUE_AREA_LSA: -		case OSPF_OPAQUE_AS_LSA: -			rc = ospf_te_parse_opaque_lsa(OspfMplsTE.ted, lsa); -			break; -		default: -			rc = 0; -			break; -		} +	/* Parse LSA to Update corresponding Link State element */ +	switch (lsa->data->type) { +	case OSPF_ROUTER_LSA: +		rc = ospf_te_parse_router_lsa(OspfMplsTE.ted, lsa); +		break; +	case OSPF_OPAQUE_AREA_LSA: +	case OSPF_OPAQUE_AS_LSA: +		rc = ospf_te_parse_opaque_lsa(OspfMplsTE.ted, lsa); +		break; +	default: +		rc = 0; +		break;  	}  	return rc; @@ -3096,19 +3080,6 @@ static int ospf_mpls_te_lsa_delete(struct ospf_lsa *lsa)  		return -1;  	} -	/* -	 * Process only self LSAs that reach MAX_AGE. Indeed, when the router -	 * need to update or refresh an LSA, it first removes the old LSA from -	 * the LSDB and then insert the new one. Thus, to avoid removing -	 * corresponding Link State element and loosing some parameters -	 * instead of just updating it, only self LSAs that reach MAX_AGE are -	 * processed here. Other LSAs are processed by ospf_mpls_te_lsa_update() -	 * and eventually removed when LSA age is MAX_AGE i.e. LSA is flushed -	 * by the originator. -	 */ -	if (!IS_LSA_SELF(lsa) || !IS_LSA_MAXAGE(lsa)) -		return 0; -  	/* Parse Link State information */  	switch (lsa->data->type) {  	case OSPF_ROUTER_LSA:  | 
