mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
ospfd: Replace LSDB callbacks with LSA Update/Delete hooks.
Replace the LSDB callbacks with LSA update and delete hooks using the the FRR hook mechanism. Remove redundant callbacks by placing the LSA update and delete hooks in a single place so that deletes don't need to be handled by the update hook. Simplify existing OSPF TE and OSPF API Server callbacks now that there is no ambiguity or redundancy. Also cleanup the debugging by separating out opaque-lsa debugging from the overloaded event debugging. Signed-off-by: Acee Lindem <acee@lindem.com>
This commit is contained in:
parent
cea55c9223
commit
b44258413f
|
@ -1284,76 +1284,67 @@ Debugging OSPF
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] client-api
|
.. clicmd:: debug ospf [(1-65535)] client-api
|
||||||
|
|
||||||
Show debug information for the OSPF opaque data client API.
|
Enable or disable debugging for the OSPF opaque data client API.
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] default-information
|
.. clicmd:: debug ospf [(1-65535)] default-information
|
||||||
|
|
||||||
Show debug information of default information
|
Enable or disable debugging of default information origination
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] packet (hello|dd|ls-request|ls-update|ls-ack|all) (send|recv) [detail]
|
.. clicmd:: debug ospf [(1-65535)] packet (hello|dd|ls-request|ls-update|ls-ack|all) (send|recv) [detail]
|
||||||
|
|
||||||
|
Enable or disable debugging for received and transmitted OSPF packets
|
||||||
Dump Packet for debugging
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] ism [status|events|timers]
|
.. clicmd:: debug ospf [(1-65535)] ism [status|events|timers]
|
||||||
|
|
||||||
|
Enable or disable debugging of Interface State Machine
|
||||||
|
|
||||||
Show debug information of Interface State Machine
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] nsm [status|events|timers]
|
.. clicmd:: debug ospf [(1-65535)] nsm [status|events|timers]
|
||||||
|
|
||||||
|
Enable or disable debugging of Neighbor State Machine transitions
|
||||||
|
|
||||||
Show debug information of Network State Machine
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] event
|
.. clicmd:: debug ospf [(1-65535)] event
|
||||||
|
|
||||||
|
Enable or disable debugging of OSPF events
|
||||||
Show debug information of OSPF event
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] nssa
|
.. clicmd:: debug ospf [(1-65535)] nssa
|
||||||
|
|
||||||
|
Enable or disable debugging about Not-So-Stubby-Areas (NSSAs)
|
||||||
Show debug information about Not So Stub Area
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] ldp-sync
|
.. clicmd:: debug ospf [(1-65535)] ldp-sync
|
||||||
|
|
||||||
Show debug information about LDP-Sync
|
Enable or disable debugging about LDP-Sync
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] lsa [aggregate|flooding|generate|install|refresh]
|
.. clicmd:: debug ospf [(1-65535)] lsa [aggregate|flooding|generate|install|refresh]
|
||||||
|
|
||||||
|
Enable or disable detail debuggin of Link State Advertisements (LSAs)
|
||||||
|
|
||||||
Show debug detail of Link State messages
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] sr
|
.. clicmd:: debug ospf [(1-65535)] sr
|
||||||
|
|
||||||
Show debug information about Segment Routing
|
Enable or disable debugging about Segment Routing
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] te
|
.. clicmd:: debug ospf [(1-65535)] te
|
||||||
|
|
||||||
|
Enable or disable debugging about MPLS Traffic Engineering LSA
|
||||||
Show debug information about Traffic Engineering LSA
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] ti-lfa
|
.. clicmd:: debug ospf [(1-65535)] ti-lfa
|
||||||
|
|
||||||
Show debug information about SR TI-LFA
|
Enable or disable debugging about SR TI-LFA
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] zebra [interface|redistribute]
|
.. clicmd:: debug ospf [(1-65535)] zebra [interface|redistribute]
|
||||||
|
|
||||||
|
Enable or disable debugging of ZEBRA API
|
||||||
|
|
||||||
Show debug information of ZEBRA API
|
|
||||||
|
|
||||||
.. clicmd:: debug ospf [(1-65535)] graceful-restart
|
.. clicmd:: debug ospf [(1-65535)] graceful-restart
|
||||||
|
|
||||||
|
Enable or disable debugying for OSPF Graceful Restart Helper
|
||||||
|
|
||||||
Enable/disable debug information for OSPF Graceful Restart Helper
|
.. clicmd:: debug ospf [(1-65535)] graceful-restart
|
||||||
|
|
||||||
|
Enable or disable debugging for OSPF Opaque LSA processing
|
||||||
|
|
||||||
.. clicmd:: show debugging ospf
|
.. clicmd:: show debugging ospf
|
||||||
|
|
||||||
|
Show enabled OSPF debugging options
|
||||||
|
|
||||||
Sample Configuration
|
Sample Configuration
|
||||||
====================
|
====================
|
||||||
|
|
|
@ -234,26 +234,6 @@ static struct ospf_apiserver *lookup_apiserver_by_lsa(struct ospf_lsa *lsa)
|
||||||
return found;
|
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. */
|
/* Allocate new connection structure. */
|
||||||
struct ospf_apiserver *ospf_apiserver_new(int fd_sync, int fd_async)
|
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();
|
new->opaque_types = list_new();
|
||||||
|
|
||||||
/* Initialize temporary strage for LSA instances to be refreshed. */
|
/* 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));
|
memset(&new->reserve, 0, sizeof(struct ospf_lsdb));
|
||||||
ospf_lsdb_init(&new->reserve);
|
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_sync_fifo = msg_fifo_new();
|
||||||
new->out_async_fifo = msg_fifo_new();
|
new->out_async_fifo = msg_fifo_new();
|
||||||
new->t_sync_read = NULL;
|
new->t_sync_read = NULL;
|
||||||
|
@ -363,6 +342,9 @@ void ospf_apiserver_free(struct ospf_apiserver *apiserv)
|
||||||
msg_fifo_free(apiserv->out_async_fifo);
|
msg_fifo_free(apiserv->out_async_fifo);
|
||||||
|
|
||||||
/* Clear temporary strage for LSA instances to be refreshed. */
|
/* 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_delete_all(&apiserv->reserve);
|
||||||
ospf_lsdb_cleanup(&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);
|
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)",
|
zlog_debug("API: Delete apiserv(%p), total#(%d)",
|
||||||
(void *)apiserv, apiserver_list->count);
|
(void *)apiserv, apiserver_list->count);
|
||||||
|
|
||||||
|
@ -393,7 +375,7 @@ void ospf_apiserver_read(struct event *thread)
|
||||||
event = OSPF_APISERVER_SYNC_READ;
|
event = OSPF_APISERVER_SYNC_READ;
|
||||||
apiserv->t_sync_read = NULL;
|
apiserv->t_sync_read = NULL;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
||||||
&apiserv->peer_sync.sin_addr,
|
&apiserv->peer_sync.sin_addr,
|
||||||
ntohs(apiserv->peer_sync.sin_port));
|
ntohs(apiserv->peer_sync.sin_port));
|
||||||
|
@ -403,7 +385,7 @@ void ospf_apiserver_read(struct event *thread)
|
||||||
event = OSPF_APISERVER_ASYNC_READ;
|
event = OSPF_APISERVER_ASYNC_READ;
|
||||||
apiserv->t_async_read = NULL;
|
apiserv->t_async_read = NULL;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
||||||
&apiserv->peer_async.sin_addr,
|
&apiserv->peer_async.sin_addr,
|
||||||
ntohs(apiserv->peer_async.sin_port));
|
ntohs(apiserv->peer_async.sin_port));
|
||||||
|
@ -426,7 +408,7 @@ void ospf_apiserver_read(struct event *thread)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
msg_print(msg);
|
msg_print(msg);
|
||||||
|
|
||||||
/* Dispatch to corresponding message handler. */
|
/* Dispatch to corresponding message handler. */
|
||||||
|
@ -457,7 +439,7 @@ void ospf_apiserver_sync_write(struct event *thread)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
||||||
&apiserv->peer_sync.sin_addr,
|
&apiserv->peer_sync.sin_addr,
|
||||||
ntohs(apiserv->peer_sync.sin_port));
|
ntohs(apiserv->peer_sync.sin_port));
|
||||||
|
@ -469,7 +451,7 @@ void ospf_apiserver_sync_write(struct event *thread)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
msg_print(msg);
|
msg_print(msg);
|
||||||
|
|
||||||
rc = msg_write(fd, msg);
|
rc = msg_write(fd, msg);
|
||||||
|
@ -517,7 +499,7 @@ void ospf_apiserver_async_write(struct event *thread)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
zlog_debug("API: %s: Peer: %pI4/%u", __func__,
|
||||||
&apiserv->peer_async.sin_addr,
|
&apiserv->peer_async.sin_addr,
|
||||||
ntohs(apiserv->peer_async.sin_port));
|
ntohs(apiserv->peer_async.sin_port));
|
||||||
|
@ -529,7 +511,7 @@ void ospf_apiserver_async_write(struct event *thread)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
msg_print(msg);
|
msg_print(msg);
|
||||||
|
|
||||||
rc = msg_write(fd, msg);
|
rc = msg_write(fd, msg);
|
||||||
|
@ -639,7 +621,7 @@ void ospf_apiserver_accept(struct event *thread)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
zlog_debug("API: %s: New peer: %pI4/%u", __func__,
|
zlog_debug("API: %s: New peer: %pI4/%u", __func__,
|
||||||
&peer_sync.sin_addr, ntohs(peer_sync.sin_port));
|
&peer_sync.sin_addr, ntohs(peer_sync.sin_port));
|
||||||
|
|
||||||
|
@ -701,7 +683,7 @@ void ospf_apiserver_accept(struct event *thread)
|
||||||
apiserv);
|
apiserv);
|
||||||
#endif /* USE_ASYNC_READ */
|
#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,
|
zlog_debug("API: New apiserv(%p), total#(%d)", (void *)apiserv,
|
||||||
apiserver_list->count);
|
apiserver_list->count);
|
||||||
}
|
}
|
||||||
|
@ -888,7 +870,7 @@ int ospf_apiserver_register_opaque_type(struct ospf_apiserver *apiserv,
|
||||||
/* Add to list of registered opaque types */
|
/* Add to list of registered opaque types */
|
||||||
listnode_add(apiserv->opaque_types, regtype);
|
listnode_add(apiserv->opaque_types, regtype);
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"API: Add LSA-type(%d)/Opaque-type(%d) into apiserv(%p), total#(%d)",
|
"API: Add LSA-type(%d)/Opaque-type(%d) into apiserv(%p), total#(%d)",
|
||||||
lsa_type, opaque_type, (void *)apiserv,
|
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);
|
listnode_delete(apiserv->opaque_types, regtype);
|
||||||
|
|
||||||
XFREE(MTYPE_APISERVER, regtype);
|
XFREE(MTYPE_APISERVER, regtype);
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_CLIENT_API)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"API: Del LSA-type(%d)/Opaque-type(%d) from apiserv(%p), total#(%d)",
|
"API: Del LSA-type(%d)/Opaque-type(%d) from apiserv(%p), total#(%d)",
|
||||||
lsa_type, opaque_type, (void *)apiserv,
|
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 */
|
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",
|
zlog_debug("LSA[Type%d:%pI4]: Creating an Opaque-LSA instance",
|
||||||
protolsa->type, &protolsa->id);
|
protolsa->type, &protolsa->id);
|
||||||
}
|
}
|
||||||
|
@ -1716,6 +1698,9 @@ int ospf_apiserver_handle_originate_request(struct ospf_apiserver *apiserv,
|
||||||
*/
|
*/
|
||||||
new->lsdb = &apiserv->reserve;
|
new->lsdb = &apiserv->reserve;
|
||||||
ospf_lsdb_add(&apiserv->reserve, new);
|
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. */
|
/* Kick the scheduler function. */
|
||||||
ospf_opaque_lsa_refresh_schedule(old);
|
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);
|
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
||||||
assert(ospf);
|
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",
|
zlog_debug("LSA[Type%d:%pI4]: OSPF API Server LSA Refresher",
|
||||||
lsa->data->type, &lsa->data->id);
|
lsa->data->type, &lsa->data->id);
|
||||||
}
|
}
|
||||||
|
@ -1909,6 +1894,9 @@ struct ospf_lsa *ospf_apiserver_lsa_refresher(struct ospf_lsa *lsa)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* This is a forcible refresh, requested by OSPF-API client. */
|
/* 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);
|
ospf_lsdb_delete(&apiserv->reserve, new);
|
||||||
new->lsdb = NULL;
|
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)
|
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);
|
return apiserver_clients_lsa_change_notify(MSG_LSA_UPDATE_NOTIFY, lsa);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ospf_apiserver_lsa_delete(struct ospf_lsa *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);
|
return apiserver_clients_lsa_change_notify(MSG_LSA_DELETE_NOTIFY, lsa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ unsigned long conf_debug_ospf_ldp_sync;
|
||||||
unsigned long conf_debug_ospf_gr;
|
unsigned long conf_debug_ospf_gr;
|
||||||
unsigned long conf_debug_ospf_bfd;
|
unsigned long conf_debug_ospf_bfd;
|
||||||
unsigned long conf_debug_ospf_client_api;
|
unsigned long conf_debug_ospf_client_api;
|
||||||
|
unsigned long conf_debug_ospf_opaque_lsa;
|
||||||
|
|
||||||
/* Enable debug option variables -- valid only session. */
|
/* Enable debug option variables -- valid only session. */
|
||||||
unsigned long term_debug_ospf_packet[5] = {0, 0, 0, 0, 0};
|
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_gr;
|
||||||
unsigned long term_debug_ospf_bfd;
|
unsigned long term_debug_ospf_bfd;
|
||||||
unsigned long term_debug_ospf_client_api;
|
unsigned long term_debug_ospf_client_api;
|
||||||
|
unsigned long term_debug_ospf_opaque_lsa;
|
||||||
|
|
||||||
const char *ospf_redist_string(unsigned int route_type)
|
const char *ospf_redist_string(unsigned int route_type)
|
||||||
{
|
{
|
||||||
|
@ -1577,6 +1579,33 @@ DEFPY (debug_ospf_client_api,
|
||||||
return CMD_SUCCESS;
|
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,
|
DEFUN (no_debug_ospf,
|
||||||
no_debug_ospf_cmd,
|
no_debug_ospf_cmd,
|
||||||
"no debug ospf",
|
"no debug ospf",
|
||||||
|
@ -1612,6 +1641,7 @@ DEFUN (no_debug_ospf,
|
||||||
DEBUG_OFF(sr, SR);
|
DEBUG_OFF(sr, SR);
|
||||||
DEBUG_OFF(ti_lfa, TI_LFA);
|
DEBUG_OFF(ti_lfa, TI_LFA);
|
||||||
DEBUG_OFF(client_api, CLIENT_API);
|
DEBUG_OFF(client_api, CLIENT_API);
|
||||||
|
DEBUG_OFF(opaque_lsa, OPAQUE_LSA);
|
||||||
|
|
||||||
/* BFD debugging is two parts: OSPF and library. */
|
/* BFD debugging is two parts: OSPF and library. */
|
||||||
DEBUG_OFF(bfd, BFD_LIB);
|
DEBUG_OFF(bfd, BFD_LIB);
|
||||||
|
@ -1649,6 +1679,7 @@ DEFUN (no_debug_ospf,
|
||||||
TERM_DEBUG_OFF(ti_lfa, TI_LFA);
|
TERM_DEBUG_OFF(ti_lfa, TI_LFA);
|
||||||
TERM_DEBUG_OFF(bfd, BFD_LIB);
|
TERM_DEBUG_OFF(bfd, BFD_LIB);
|
||||||
TERM_DEBUG_OFF(client_api, CLIENT_API);
|
TERM_DEBUG_OFF(client_api, CLIENT_API);
|
||||||
|
TERM_DEBUG_OFF(opaque_lsa, OPAQUE_LSA);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1774,10 +1805,14 @@ static int show_debugging_ospf_common(struct vty *vty)
|
||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
" OSPF BFD integration library debugging is on\n");
|
" 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)
|
if (IS_DEBUG_OSPF(client_api, CLIENT_API) == OSPF_DEBUG_CLIENT_API)
|
||||||
vty_out(vty, " OSPF client-api debugging is on\n");
|
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;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1983,6 +2018,12 @@ static int config_write_debug(struct vty *vty)
|
||||||
write = 1;
|
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 */
|
/* debug ospf default-information */
|
||||||
if (IS_CONF_DEBUG_OSPF(defaultinfo, DEFAULTINFO) ==
|
if (IS_CONF_DEBUG_OSPF(defaultinfo, DEFAULTINFO) ==
|
||||||
OSPF_DEBUG_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_default_info_cmd);
|
||||||
install_element(ENABLE_NODE, &debug_ospf_ldp_sync_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_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_ism_cmd);
|
||||||
install_element(ENABLE_NODE, &no_debug_ospf_nsm_cmd);
|
install_element(ENABLE_NODE, &no_debug_ospf_nsm_cmd);
|
||||||
install_element(ENABLE_NODE, &no_debug_ospf_lsa_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_default_info_cmd);
|
||||||
install_element(CONFIG_NODE, &debug_ospf_ldp_sync_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_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_nsm_cmd);
|
||||||
install_element(CONFIG_NODE, &no_debug_ospf_lsa_cmd);
|
install_element(CONFIG_NODE, &no_debug_ospf_lsa_cmd);
|
||||||
install_element(CONFIG_NODE, &no_debug_ospf_zebra_cmd);
|
install_element(CONFIG_NODE, &no_debug_ospf_zebra_cmd);
|
||||||
|
|
|
@ -55,6 +55,8 @@
|
||||||
|
|
||||||
#define OSPF_DEBUG_CLIENT_API 0x01
|
#define OSPF_DEBUG_CLIENT_API 0x01
|
||||||
|
|
||||||
|
#define OSPF_DEBUG_OPAQUE_LSA 0x01
|
||||||
|
|
||||||
/* Macro for setting debug option. */
|
/* Macro for setting debug option. */
|
||||||
#define CONF_DEBUG_PACKET_ON(a, b) conf_debug_ospf_packet[a] |= (b)
|
#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)
|
#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_LDP_SYNC IS_DEBUG_OSPF(ldp_sync, LDP_SYNC)
|
||||||
#define IS_DEBUG_OSPF_GR IS_DEBUG_OSPF(gr, GR)
|
#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_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) \
|
#define IS_CONF_DEBUG_OSPF_PACKET(a, b) \
|
||||||
(conf_debug_ospf_packet[a] & OSPF_DEBUG_##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_gr;
|
||||||
extern unsigned long term_debug_ospf_bfd;
|
extern unsigned long term_debug_ospf_bfd;
|
||||||
extern unsigned long term_debug_ospf_client_api;
|
extern unsigned long term_debug_ospf_client_api;
|
||||||
|
extern unsigned long term_debug_ospf_opaque_lsa;
|
||||||
|
|
||||||
/* Message Strings. */
|
/* Message Strings. */
|
||||||
extern char *ospf_lsa_type_str[];
|
extern char *ospf_lsa_type_str[];
|
||||||
|
|
|
@ -61,6 +61,12 @@ static struct ospf_lsa *
|
||||||
ospf_exnl_lsa_prepare_and_flood(struct ospf *ospf, struct external_info *ei,
|
ospf_exnl_lsa_prepare_and_flood(struct ospf *ospf, struct external_info *ei,
|
||||||
struct in_addr id);
|
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 get_metric(uint8_t *metric)
|
||||||
{
|
{
|
||||||
uint32_t m;
|
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",
|
zlog_debug("LSA[%s]: Install LSA %p, MaxAge",
|
||||||
dump_lsa_key(new), lsa);
|
dump_lsa_key(new), lsa);
|
||||||
ospf_lsa_maxage(ospf, lsa);
|
ospf_lsa_maxage(ospf, lsa);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Invoke the LSA update hook.
|
||||||
|
*/
|
||||||
|
hook_call(ospf_lsa_update, new);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 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.",
|
zlog_debug("LSA[%s]: MaxAge LSA remover scheduled.",
|
||||||
dump_lsa_key(lsa));
|
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_TIMER_ON(ospf->t_maxage, ospf_maxage_lsa_remover,
|
||||||
ospf->maxage_delay);
|
ospf->maxage_delay);
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,4 +363,10 @@ static inline bool ospf_check_indication_lsa(struct ospf_lsa *lsa)
|
||||||
|
|
||||||
return false;
|
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 */
|
#endif /* _ZEBRA_OSPF_LSA_H */
|
||||||
|
|
|
@ -147,10 +147,6 @@ static void ospf_lsdb_delete_entry(struct ospf_lsdb *lsdb,
|
||||||
|
|
||||||
rn->info = NULL;
|
rn->info = NULL;
|
||||||
route_unlock_node(rn);
|
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 */
|
ospf_lsa_unlock(&lsa); /* lsdb */
|
||||||
return;
|
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))
|
CHECK_FLAG(lsa->data->options, OSPF_OPTION_DC))
|
||||||
lsa->area->fr_info.router_lsas_recv_dc_bit++;
|
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);
|
lsdb->type[lsa->data->type].checksum += ntohs(lsa->data->checksum);
|
||||||
rn->info = ospf_lsa_lock(lsa); /* lsdb */
|
rn->info = ospf_lsa_lock(lsa); /* lsdb */
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,12 +19,6 @@ struct ospf_lsdb {
|
||||||
struct route_table *db;
|
struct route_table *db;
|
||||||
} type[OSPF_MAX_LSA];
|
} type[OSPF_MAX_LSA];
|
||||||
unsigned long total;
|
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. */
|
/* Macros. */
|
||||||
|
|
|
@ -62,8 +62,13 @@ static void ospf_opaque_funclist_init(void);
|
||||||
static void ospf_opaque_funclist_term(void);
|
static void ospf_opaque_funclist_term(void);
|
||||||
static void free_opaque_info_per_type_del(void *val);
|
static void free_opaque_info_per_type_del(void *val);
|
||||||
static void free_opaque_info_per_id(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 int ospf_opaque_lsa_delete_hook(struct ospf_lsa *lsa);
|
||||||
|
static bool ospf_opaque_lsa_hooks_registered;
|
||||||
|
|
||||||
void ospf_opaque_init(void)
|
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 = list_new();
|
||||||
area->opaque_lsa_self->del = free_opaque_info_per_type_del;
|
area->opaque_lsa_self->del = free_opaque_info_per_type_del;
|
||||||
area->t_opaque_lsa_self = NULL;
|
area->t_opaque_lsa_self = NULL;
|
||||||
|
if (!ospf_opaque_lsa_hooks_registered) {
|
||||||
#ifdef MONITOR_LSDB_CHANGE
|
hook_register(ospf_lsa_update, ospf_opaque_lsa_update_hook);
|
||||||
area->lsdb->new_lsa_hook = ospf_opaque_lsa_install_hook;
|
hook_register(ospf_lsa_delete, ospf_opaque_lsa_delete_hook);
|
||||||
area->lsdb->del_lsa_hook = ospf_opaque_lsa_delete_hook;
|
ospf_opaque_lsa_hooks_registered = true;
|
||||||
#endif /* MONITOR_LSDB_CHANGE */
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ospf_opaque_type10_lsa_term(struct ospf_area *area)
|
void ospf_opaque_type10_lsa_term(struct ospf_area *area)
|
||||||
{
|
{
|
||||||
#ifdef MONITOR_LSDB_CHANGE
|
hook_unregister(ospf_lsa_update, ospf_opaque_lsa_update_hook);
|
||||||
area->lsdb->new_lsa_hook = area->lsdb->del_lsa_hook = NULL;
|
hook_unregister(ospf_lsa_delete, ospf_opaque_lsa_delete_hook);
|
||||||
#endif /* MONITOR_LSDB_CHANGE */
|
ospf_opaque_lsa_hooks_registered = false;
|
||||||
|
|
||||||
EVENT_OFF(area->t_opaque_lsa_self);
|
EVENT_OFF(area->t_opaque_lsa_self);
|
||||||
if (area->opaque_lsa_self != NULL)
|
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->opaque_lsa_self->del = free_opaque_info_per_type_del;
|
||||||
top->t_opaque_lsa_self = NULL;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ospf_opaque_type11_lsa_term(struct ospf *top)
|
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);
|
EVENT_OFF(top->t_opaque_lsa_self);
|
||||||
if (top->opaque_lsa_self != NULL)
|
if (top->opaque_lsa_self != NULL)
|
||||||
list_delete(&top->opaque_lsa_self);
|
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;
|
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)",
|
zlog_debug("%s: Opaque LSA functab list deletion callback type %u (%p)",
|
||||||
__func__, functab->opaque_type, functab);
|
__func__, functab->opaque_type, functab);
|
||||||
|
|
||||||
|
@ -309,7 +306,7 @@ static void ospf_opaque_funclist_init(void)
|
||||||
{
|
{
|
||||||
struct list *funclist;
|
struct list *funclist;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug("%s: Function list initialize", __func__);
|
zlog_debug("%s: Function list initialize", __func__);
|
||||||
|
|
||||||
funclist = ospf_opaque_wildcard_funclist = list_new();
|
funclist = ospf_opaque_wildcard_funclist = list_new();
|
||||||
|
@ -330,7 +327,7 @@ static void ospf_opaque_funclist_term(void)
|
||||||
{
|
{
|
||||||
struct list *funclist;
|
struct list *funclist;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug("%s: Function list terminate", __func__);
|
zlog_debug("%s: Function list terminate", __func__);
|
||||||
|
|
||||||
funclist = ospf_opaque_wildcard_funclist;
|
funclist = ospf_opaque_wildcard_funclist;
|
||||||
|
@ -408,7 +405,7 @@ int ospf_register_opaque_functab(
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(funclist, node, nnode, functab))
|
for (ALL_LIST_ELEMENTS(funclist, node, nnode, functab))
|
||||||
if (functab->opaque_type == opaque_type) {
|
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)",
|
zlog_debug("%s: Opaque LSA functab found type %u, (%p)",
|
||||||
__func__, functab->opaque_type,
|
__func__, functab->opaque_type,
|
||||||
functab);
|
functab);
|
||||||
|
@ -419,7 +416,7 @@ int ospf_register_opaque_functab(
|
||||||
new = XCALLOC(MTYPE_OSPF_OPAQUE_FUNCTAB,
|
new = XCALLOC(MTYPE_OSPF_OPAQUE_FUNCTAB,
|
||||||
sizeof(struct ospf_opaque_functab));
|
sizeof(struct ospf_opaque_functab));
|
||||||
else {
|
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)",
|
zlog_debug("%s: Re-register Opaque LSA type %u, opaque type %u, (%p)",
|
||||||
__func__, lsa_type, opaque_type, functab);
|
__func__, lsa_type, opaque_type, functab);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -439,7 +436,7 @@ int ospf_register_opaque_functab(
|
||||||
new->new_lsa_hook = new_lsa_hook;
|
new->new_lsa_hook = new_lsa_hook;
|
||||||
new->del_lsa_hook = del_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)",
|
zlog_debug("%s: Register Opaque LSA type %u, opaque type %u, (%p)",
|
||||||
__func__, lsa_type, opaque_type, new);
|
__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)
|
if ((funclist = ospf_get_opaque_funclist(lsa_type)) != NULL)
|
||||||
for (ALL_LIST_ELEMENTS(funclist, node, nnode, functab)) {
|
for (ALL_LIST_ELEMENTS(funclist, node, nnode, functab)) {
|
||||||
if (functab->opaque_type == opaque_type) {
|
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)",
|
zlog_debug("%s: Delete Opaque functab LSA type %u, opaque type %u, (%p)",
|
||||||
__func__, lsa_type,
|
__func__, lsa_type,
|
||||||
opaque_type, functab);
|
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 = list_new();
|
||||||
oipt->id_list->del = free_opaque_info_per_id;
|
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)",
|
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,
|
__func__, oipt->lsa_type, oipt->opaque_type, oipt,
|
||||||
oipt->functab);
|
oipt->functab);
|
||||||
|
@ -662,7 +659,7 @@ static void free_opaque_info_per_type(struct opaque_info_per_type *oipt,
|
||||||
if (oipt->functab)
|
if (oipt->functab)
|
||||||
ospf_opaque_functab_deref(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)",
|
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,
|
__func__, oipt->lsa_type, oipt->opaque_type, oipt,
|
||||||
oipt->functab);
|
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.
|
* is removed from the interface opaque info list.
|
||||||
*/
|
*/
|
||||||
if (lsa->oi == oi) {
|
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]",
|
zlog_debug("Delete Type-9 Opaque-LSA on interface delete: [opaque-type=%u, opaque-id=%x]",
|
||||||
GET_OPAQUE_TYPE(
|
GET_OPAQUE_TYPE(
|
||||||
ntohl(lsa->data->id.s_addr)),
|
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)));
|
lsa->data->id.s_addr)));
|
||||||
ospf_lsdb_delete(lsdb, lsa);
|
ospf_lsdb_delete(lsdb, lsa);
|
||||||
lsa->data->ls_age = htons(OSPF_LSA_MAXAGE);
|
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;
|
lsa->oi = NULL;
|
||||||
ospf_lsa_discard(lsa);
|
ospf_lsa_discard(lsa);
|
||||||
}
|
}
|
||||||
|
@ -859,7 +862,7 @@ DEFUN (capability_opaque,
|
||||||
|
|
||||||
/* Turn on the "master switch" of opaque-lsa capability. */
|
/* Turn on the "master switch" of opaque-lsa capability. */
|
||||||
if (!CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) {
|
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");
|
zlog_debug("Opaque capability: OFF -> ON");
|
||||||
|
|
||||||
SET_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE);
|
SET_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE);
|
||||||
|
@ -888,7 +891,7 @@ DEFUN (no_capability_opaque,
|
||||||
|
|
||||||
/* Turn off the "master switch" of opaque-lsa capability. */
|
/* Turn off the "master switch" of opaque-lsa capability. */
|
||||||
if (CHECK_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE)) {
|
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");
|
zlog_debug("Opaque capability: ON -> OFF");
|
||||||
|
|
||||||
UNSET_FLAG(ospf->config, OSPF_OPAQUE_CAPABLE);
|
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(nbr->options, OSPF_OPTION_O)) {
|
||||||
if (!CHECK_FLAG(top->opaque,
|
if (!CHECK_FLAG(top->opaque,
|
||||||
OPAQUE_OPERATION_READY_BIT)) {
|
OPAQUE_OPERATION_READY_BIT)) {
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Opaque-LSA: Now get operational!");
|
"Opaque-LSA: Now get operational!");
|
||||||
|
|
||||||
|
@ -1316,11 +1319,15 @@ void ospf_opaque_lsa_dump(struct stream *s, uint16_t length)
|
||||||
return;
|
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;
|
struct list *funclist;
|
||||||
int rc = -1;
|
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
|
* Some Opaque-LSA user may want to monitor every LSA installation
|
||||||
* into the LSDB, regardless with target LSA type.
|
* 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;
|
struct list *funclist;
|
||||||
int rc = -1;
|
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
|
* Some Opaque-LSA user may want to monitor every LSA deletion
|
||||||
* from the LSDB, regardless with target LSA type.
|
* 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;
|
int delay = 0;
|
||||||
|
|
||||||
if ((top = oi_to_top(oi)) == NULL || (area = oi->area) == NULL) {
|
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__);
|
zlog_debug("%s: Invalid argument?", __func__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* It may not a right time to schedule origination now. */
|
/* It may not a right time to schedule origination now. */
|
||||||
if (!CHECK_FLAG(top->opaque, OPAQUE_OPERATION_READY_BIT)) {
|
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__);
|
zlog_debug("%s: Not operational.", __func__);
|
||||||
return; /* This is not an error. */
|
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)
|
if (!list_isempty(ospf_opaque_type9_funclist)
|
||||||
&& list_isempty(oi->opaque_lsa_self)
|
&& list_isempty(oi->opaque_lsa_self)
|
||||||
&& oi->t_opaque_lsa_self == NULL) {
|
&& oi->t_opaque_lsa_self == NULL) {
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Schedule Type-9 Opaque-LSA origination in %d ms later.",
|
"Schedule Type-9 Opaque-LSA origination in %d ms later.",
|
||||||
delay);
|
delay);
|
||||||
|
@ -1441,7 +1452,7 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)
|
||||||
* conditions prevent from scheduling the originate function
|
* conditions prevent from scheduling the originate function
|
||||||
* again and again.
|
* again and again.
|
||||||
*/
|
*/
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Schedule Type-10 Opaque-LSA origination in %d ms later.",
|
"Schedule Type-10 Opaque-LSA origination in %d ms later.",
|
||||||
delay);
|
delay);
|
||||||
|
@ -1459,7 +1470,7 @@ void ospf_opaque_lsa_originate_schedule(struct ospf_interface *oi, int *delay0)
|
||||||
* conditions prevent from scheduling the originate function
|
* conditions prevent from scheduling the originate function
|
||||||
* again and again.
|
* again and again.
|
||||||
*/
|
*/
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Schedule Type-11 Opaque-LSA origination in %d ms later.",
|
"Schedule Type-11 Opaque-LSA origination in %d ms later.",
|
||||||
delay);
|
delay);
|
||||||
|
@ -1559,7 +1570,7 @@ static void ospf_opaque_type9_lsa_originate(struct event *t)
|
||||||
oi = EVENT_ARG(t);
|
oi = EVENT_ARG(t);
|
||||||
oi->t_opaque_lsa_self = NULL;
|
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",
|
zlog_debug("Timer[Type9-LSA]: Originate Opaque-LSAs for OI %s",
|
||||||
IF_NAME(oi));
|
IF_NAME(oi));
|
||||||
|
|
||||||
|
@ -1573,7 +1584,7 @@ static void ospf_opaque_type10_lsa_originate(struct event *t)
|
||||||
area = EVENT_ARG(t);
|
area = EVENT_ARG(t);
|
||||||
area->t_opaque_lsa_self = NULL;
|
area->t_opaque_lsa_self = NULL;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Timer[Type10-LSA]: Originate Opaque-LSAs for Area %pI4",
|
"Timer[Type10-LSA]: Originate Opaque-LSAs for Area %pI4",
|
||||||
&area->area_id);
|
&area->area_id);
|
||||||
|
@ -1588,7 +1599,7 @@ static void ospf_opaque_type11_lsa_originate(struct event *t)
|
||||||
top = EVENT_ARG(t);
|
top = EVENT_ARG(t);
|
||||||
top->t_opaque_lsa_self = NULL;
|
top->t_opaque_lsa_self = NULL;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Timer[Type11-LSA]: Originate AS-External Opaque-LSAs");
|
"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;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF(lsa, LSA_INSTALL))
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug("%s: Install Type-%u Opaque-LSA: [opaque-type=%u, opaque-id=%x]",
|
||||||
"Install Type-%u Opaque-LSA: [opaque-type=%u, opaque-id=%x]",
|
__func__, lsa->data->type, GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)),
|
||||||
lsa->data->type,
|
GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr)));
|
||||||
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. */
|
/* Replace the existing lsa with the new one. */
|
||||||
if ((oipt = lookup_opaque_info_by_type(lsa)) != NULL
|
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
|
* Anyway, this node still has a responsibility to flush this
|
||||||
* LSA from the routing domain.
|
* 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",
|
zlog_debug("LSA[Type%d:%pI4]: Flush stray Opaque-LSA",
|
||||||
lsa->data->type, &lsa->data->id);
|
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. */
|
/* It may not a right time to schedule reorigination now. */
|
||||||
if (!CHECK_FLAG(top->opaque, OPAQUE_OPERATION_READY_BIT)) {
|
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__);
|
zlog_debug("%s: Not operational.", __func__);
|
||||||
goto out; /* This is not an error. */
|
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 (oipt->t_opaque_lsa_self != NULL) {
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Type-%u Opaque-LSA has already scheduled to RE-ORIGINATE: [opaque-type=%u]",
|
"Type-%u Opaque-LSA has already scheduled to RE-ORIGINATE: [opaque-type=%u]",
|
||||||
lsa_type,
|
lsa_type,
|
||||||
|
@ -1887,7 +1896,7 @@ void ospf_opaque_lsa_reoriginate_schedule(void *lsa_type_dependent,
|
||||||
*/
|
*/
|
||||||
delay = top->min_ls_interval; /* XXX */
|
delay = top->min_ls_interval; /* XXX */
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Schedule Type-%u Opaque-LSA to RE-ORIGINATE in %d ms later: [opaque-type=%u]",
|
"Schedule Type-%u Opaque-LSA to RE-ORIGINATE in %d ms later: [opaque-type=%u]",
|
||||||
lsa_type, delay,
|
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) ||
|
if (!CHECK_FLAG(top->config, OSPF_OPAQUE_CAPABLE) ||
|
||||||
!OSPF_IF_PARAM(oi, opaque_capable) || !ospf_if_is_enable(oi) ||
|
!OSPF_IF_PARAM(oi, opaque_capable) || !ospf_if_is_enable(oi) ||
|
||||||
ospf_nbr_count_opaque_capable(oi) == 0) {
|
ospf_nbr_count_opaque_capable(oi) == 0) {
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Suspend re-origination of Type-9 Opaque-LSAs (opaque-type=%u) for a while...",
|
"Suspend re-origination of Type-9 Opaque-LSAs (opaque-type=%u) for a while...",
|
||||||
oipt->opaque_type);
|
oipt->opaque_type);
|
||||||
|
@ -1952,7 +1961,7 @@ static void ospf_opaque_type9_lsa_reoriginate_timer(struct event *t)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Timer[Type9-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for OI (%s)",
|
"Timer[Type9-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for OI (%s)",
|
||||||
oipt->opaque_type, IF_NAME(oi));
|
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 (n == 0 || !CHECK_FLAG(top->config, OSPF_OPAQUE_CAPABLE)) {
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Suspend re-origination of Type-10 Opaque-LSAs (opaque-type=%u) for a while...",
|
"Suspend re-origination of Type-10 Opaque-LSAs (opaque-type=%u) for a while...",
|
||||||
oipt->opaque_type);
|
oipt->opaque_type);
|
||||||
|
@ -2001,7 +2010,7 @@ static void ospf_opaque_type10_lsa_reoriginate_timer(struct event *t)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Timer[Type10-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for Area %pI4",
|
"Timer[Type10-LSA]: Re-originate Opaque-LSAs (opaque-type=%u) for Area %pI4",
|
||||||
oipt->opaque_type, &area->area_id);
|
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 (!CHECK_FLAG(top->config, OSPF_OPAQUE_CAPABLE)) {
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Suspend re-origination of Type-11 Opaque-LSAs (opaque-type=%u) for a while...",
|
"Suspend re-origination of Type-11 Opaque-LSAs (opaque-type=%u) for a while...",
|
||||||
oipt->opaque_type);
|
oipt->opaque_type);
|
||||||
|
@ -2038,7 +2047,7 @@ static void ospf_opaque_type11_lsa_reoriginate_timer(struct event *t)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Timer[Type11-LSA]: Re-originate Opaque-LSAs (opaque-type=%u).",
|
"Timer[Type11-LSA]: Re-originate Opaque-LSAs (opaque-type=%u).",
|
||||||
oipt->opaque_type);
|
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 (oipi->t_opaque_lsa_self != NULL) {
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Type-%u Opaque-LSA has already scheduled to REFRESH: [opaque-type=%u, opaque-id=%x]",
|
"Type-%u Opaque-LSA has already scheduled to REFRESH: [opaque-type=%u, opaque-id=%x]",
|
||||||
lsa->data->type,
|
lsa->data->type,
|
||||||
|
@ -2098,7 +2107,7 @@ void ospf_opaque_lsa_refresh_schedule(struct ospf_lsa *lsa0)
|
||||||
|
|
||||||
delay = ospf_lsa_refresh_delay(ospf, lsa);
|
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]",
|
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)),
|
lsa->data->type, delay, GET_OPAQUE_TYPE(ntohl(lsa->data->id.s_addr)),
|
||||||
GET_OPAQUE_ID(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_opaque_functab *functab;
|
||||||
struct ospf_lsa *lsa;
|
struct ospf_lsa *lsa;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug("Timer[Opaque-LSA]: (Opaque-LSA Refresh expire)");
|
zlog_debug("Timer[Opaque-LSA]: (Opaque-LSA Refresh expire)");
|
||||||
|
|
||||||
oipi = EVENT_ARG(t);
|
oipi = EVENT_ARG(t);
|
||||||
|
@ -2180,7 +2189,7 @@ void ospf_opaque_lsa_flush_schedule(struct ospf_lsa *lsa0)
|
||||||
/* Dequeue listnode entry from the list. */
|
/* Dequeue listnode entry from the list. */
|
||||||
listnode_delete(oipt->id_list, oipi);
|
listnode_delete(oipt->id_list, oipi);
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Schedule Type-%u Opaque-LSA to FLUSH: [opaque-type=%u, opaque-id=%x]",
|
"Schedule Type-%u Opaque-LSA to FLUSH: [opaque-type=%u, opaque-id=%x]",
|
||||||
lsa->data->type,
|
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)
|
if ((top = oi_to_top(nbr->oi)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
if (IS_DEBUG_OSPF_OPAQUE_LSA)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"LSA[Type%d:%pI4]: processing self-originated Opaque-LSA",
|
"LSA[Type%d:%pI4]: processing self-originated Opaque-LSA",
|
||||||
lsa->data->type, &lsa->data->id);
|
lsa->data->type, &lsa->data->id);
|
||||||
|
|
|
@ -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
|
* 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
|
* @param lsa OSPF Link State Advertisement
|
||||||
*
|
*
|
||||||
|
@ -3037,34 +3037,18 @@ static int ospf_mpls_te_lsa_update(struct ospf_lsa *lsa)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If LSA is MAX_AGE, remove corresponding Link State element */
|
/* Parse LSA to Update corresponding Link State element */
|
||||||
if (IS_LSA_MAXAGE(lsa)) {
|
switch (lsa->data->type) {
|
||||||
switch (lsa->data->type) {
|
case OSPF_ROUTER_LSA:
|
||||||
case OSPF_ROUTER_LSA:
|
rc = ospf_te_parse_router_lsa(OspfMplsTE.ted, lsa);
|
||||||
rc = ospf_te_delete_router_lsa(OspfMplsTE.ted, lsa);
|
break;
|
||||||
break;
|
case OSPF_OPAQUE_AREA_LSA:
|
||||||
case OSPF_OPAQUE_AREA_LSA:
|
case OSPF_OPAQUE_AS_LSA:
|
||||||
case OSPF_OPAQUE_AS_LSA:
|
rc = ospf_te_parse_opaque_lsa(OspfMplsTE.ted, lsa);
|
||||||
rc = ospf_te_delete_opaque_lsa(OspfMplsTE.ted, lsa);
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
rc = 0;
|
||||||
rc = 0;
|
break;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -3096,19 +3080,6 @@ static int ospf_mpls_te_lsa_delete(struct ospf_lsa *lsa)
|
||||||
return -1;
|
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 */
|
/* Parse Link State information */
|
||||||
switch (lsa->data->type) {
|
switch (lsa->data->type) {
|
||||||
case OSPF_ROUTER_LSA:
|
case OSPF_ROUTER_LSA:
|
||||||
|
|
Loading…
Reference in a new issue