diff options
author | Christian Hopps <chopps@labn.net> | 2022-01-19 12:42:03 +0100 |
---|---|---|
committer | Christian Hopps <chopps@labn.net> | 2022-06-02 22:37:16 +0200 |
commit | 97355a6d92759c712b018023f67d07c4726e8c14 (patch) | |
tree | 0bc5a4f8014ae3b57dd5676be3b0e2505c74e86e | |
parent | ospfd: api: remove unused api code/message creation (diff) | |
download | frr-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.h | 2 | ||||
-rw-r--r-- | ospfd/ospf_apiserver.c | 87 | ||||
-rw-r--r-- | ospfd/ospf_apiserver.h | 5 |
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 * ----------------------------------------------------------- |