]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd: api: add new ISM and NSM sync requests
authorChristian Hopps <chopps@labn.net>
Wed, 19 Jan 2022 11:42:03 +0000 (06:42 -0500)
committerChristian Hopps <chopps@labn.net>
Thu, 2 Jun 2022 20:37:16 +0000 (16:37 -0400)
Signed-off-by: Christian Hopps <chopps@labn.net>
ospfd/ospf_api.h
ospfd/ospf_apiserver.c
ospfd/ospf_apiserver.h

index 7ff39dc123c14cd6ab2e5ddde0dc937881f8065d..50b0c21c771f9ae1478b40ade3a99eea278ca4a9 100644 (file)
@@ -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
index 6d61f53d6e1e6b36da6f004bca803fb3eb8e12b6..1d42d2c69ddf26939c7d82e3ace29fd80364993f 100644 (file)
@@ -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;
        }
 
index cb8c6d65732f9108a036bb3434312ef278f335fe..7d728ead93676233646094a7f15f13547fd1c939 100644 (file)
@@ -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
  * -----------------------------------------------------------