summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Hopps <chopps@labn.net>2022-01-19 12:42:03 +0100
committerChristian Hopps <chopps@labn.net>2022-06-02 22:37:16 +0200
commit97355a6d92759c712b018023f67d07c4726e8c14 (patch)
tree0bc5a4f8014ae3b57dd5676be3b0e2505c74e86e
parentospfd: api: remove unused api code/message creation (diff)
downloadfrr-97355a6d92759c712b018023f67d07c4726e8c14.tar.xz
frr-97355a6d92759c712b018023f67d07c4726e8c14.zip
ospfd: api: add new ISM and NSM sync requests
Signed-off-by: Christian Hopps <chopps@labn.net>
-rw-r--r--ospfd/ospf_api.h2
-rw-r--r--ospfd/ospf_apiserver.c87
-rw-r--r--ospfd/ospf_apiserver.h5
3 files changed, 90 insertions, 4 deletions
diff --git a/ospfd/ospf_api.h b/ospfd/ospf_api.h
index 7ff39dc12..50b0c21c7 100644
--- a/ospfd/ospf_api.h
+++ b/ospfd/ospf_api.h
@@ -116,6 +116,8 @@ extern void msg_fifo_free(struct msg_fifo *fifo);
#define MSG_ORIGINATE_REQUEST 5
#define MSG_DELETE_REQUEST 6
#define MSG_SYNC_REACHABLE 7
+#define MSG_SYNC_ISM 8
+#define MSG_SYNC_NSM 9
/* Messages from OSPF daemon. */
#define MSG_REPLY 10
diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c
index 6d61f53d6..1d42d2c69 100644
--- a/ospfd/ospf_apiserver.c
+++ b/ospfd/ospf_apiserver.c
@@ -803,6 +803,12 @@ int ospf_apiserver_handle_msg(struct ospf_apiserver *apiserv, struct msg *msg)
case MSG_SYNC_REACHABLE:
rc = ospf_apiserver_handle_sync_reachable(apiserv, msg);
break;
+ case MSG_SYNC_ISM:
+ rc = ospf_apiserver_handle_sync_ism(apiserv, msg);
+ break;
+ case MSG_SYNC_NSM:
+ rc = ospf_apiserver_handle_sync_nsm(apiserv, msg);
+ break;
default:
zlog_warn("ospf_apiserver_handle_msg: Unknown message type: %d",
msg->hdr.msgtype);
@@ -1347,8 +1353,9 @@ int ospf_apiserver_handle_sync_lsdb(struct ospf_apiserver *apiserv,
return rc;
}
-/* -----------------------------------------------------------
- * Followings are functions for Reachability synchronization.
+/*
+ * -----------------------------------------------------------
+ * Followings are functions for synchronization.
* -----------------------------------------------------------
*/
@@ -1391,15 +1398,86 @@ int ospf_apiserver_handle_sync_reachable(struct ospf_apiserver *apiserv,
XFREE(MTYPE_OSPF_APISERVER, abuf);
out:
- zlog_info("ospf_apiserver_handle_sync_reachable: rc %d", rc);
/* Send a reply back to client with return code */
_rc = ospf_apiserver_send_reply(apiserv, seqnum, rc);
- zlog_info("ospf_apiserver_handle_sync_reachable: _rc %d", _rc);
rc = rc ? rc : _rc;
apiserv->reachable_sync = !rc;
return rc;
}
+int ospf_apiserver_handle_sync_ism(struct ospf_apiserver *apiserv,
+ struct msg *msg)
+{
+ struct ospf *ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
+ struct listnode *anode, *inode;
+ struct ospf_area *area;
+ struct ospf_interface *oi;
+ struct msg *m;
+ uint32_t seqnum = msg_get_seq(msg);
+ int _rc, rc = 0;
+
+ /* walk all areas */
+ for (ALL_LIST_ELEMENTS_RO(ospf->areas, anode, area)) {
+ /* walk all interfaces */
+ for (ALL_LIST_ELEMENTS_RO(area->oiflist, inode, oi)) {
+ m = new_msg_ism_change(seqnum, oi->address->u.prefix4,
+ area->area_id, oi->state);
+ rc = ospf_apiserver_send_msg(apiserv, m);
+ msg_free(m);
+ if (rc)
+ break;
+ }
+ if (rc)
+ break;
+ }
+ /* Send a reply back to client with return code */
+ _rc = ospf_apiserver_send_reply(apiserv, seqnum, rc);
+ return rc ? rc : _rc;
+}
+
+
+int ospf_apiserver_handle_sync_nsm(struct ospf_apiserver *apiserv,
+ struct msg *msg)
+{
+ struct ospf *ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
+ struct listnode *anode, *inode;
+ struct ospf_area *area;
+ struct ospf_interface *oi;
+ struct ospf_neighbor *nbr;
+ struct route_node *rn;
+ struct msg *m;
+ uint32_t seqnum = msg_get_seq(msg);
+ int _rc, rc = 0;
+
+ /* walk all areas */
+ for (ALL_LIST_ELEMENTS_RO(ospf->areas, anode, area)) {
+ /* walk all interfaces */
+ for (ALL_LIST_ELEMENTS_RO(area->oiflist, inode, oi)) {
+ /* walk all neighbors */
+ for (rn = route_top(oi->nbrs); rn;
+ rn = route_next(rn)) {
+ nbr = rn->info;
+ if (!nbr)
+ continue;
+ m = new_msg_nsm_change(
+ seqnum, oi->address->u.prefix4,
+ nbr->src, nbr->router_id, nbr->state);
+ rc = ospf_apiserver_send_msg(apiserv, m);
+ msg_free(m);
+ if (rc)
+ break;
+ }
+ if (rc)
+ break;
+ }
+ if (rc)
+ break;
+ }
+ /* Send a reply back to client with return code */
+ _rc = ospf_apiserver_send_reply(apiserv, seqnum, rc);
+ return rc ? rc : _rc;
+}
+
/* -----------------------------------------------------------
* Following are functions to originate or update LSA
@@ -2088,6 +2166,7 @@ int ospf_apiserver_del_if(struct interface *ifp)
if (!oi) {
/* This interface is known to Zebra but not to OSPF daemon
anymore. No need to tell clients about it */
+ zlog_warn("ifp name=%s not known to OSPFd", ifp->name);
return 0;
}
diff --git a/ospfd/ospf_apiserver.h b/ospfd/ospf_apiserver.h
index cb8c6d657..7d728ead9 100644
--- a/ospfd/ospf_apiserver.h
+++ b/ospfd/ospf_apiserver.h
@@ -153,9 +153,14 @@ extern int ospf_apiserver_handle_sync_lsdb(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_sync_reachable(struct ospf_apiserver *apiserv,
struct msg *msg);
+extern int ospf_apiserver_handle_sync_ism(struct ospf_apiserver *apiserv,
+ struct msg *msg);
+extern int ospf_apiserver_handle_sync_nsm(struct ospf_apiserver *apiserv,
+ struct msg *msg);
extern void ospf_apiserver_notify_reachable(struct route_table *ort,
struct route_table *nrt);
+
/* -----------------------------------------------------------
* Following are functions for LSA origination/deletion
* -----------------------------------------------------------