forked from Mirror/frr
Merge pull request #18046 from LabNConsulting/aceelindem/ospf-lsa-add-delete-hook
ospfd: Replace LSDB callbacks with LSA Update/Delete hooks.
This commit is contained in:
commit
fbff0436d3
|
@ -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