]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_zebra.c
*: Convert `struct event_master` to `struct event_loop`
[mirror_frr.git] / isisd / isis_zebra.c
index 0142e30b2be63aa647931e852bcc229c76fd6add..8a279558aa719d60ec3ec4796cc26dfea68004cd 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * IS-IS Rout(e)ing protocol - isis_zebra.c
  *
@@ -5,25 +6,11 @@
  *                           Tampere University of Technology
  *                           Institute of Communications Engineering
  * Copyright (C) 2013-2015   Christian Franke <chris@opensourcerouting.org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public Licenseas published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
 
-#include "thread.h"
+#include "event.h"
 #include "command.h"
 #include "memory.h"
 #include "log.h"
@@ -38,6 +25,7 @@
 #include "vrf.h"
 #include "libfrr.h"
 #include "bfd.h"
+#include "link_state.h"
 
 #include "isisd/isis_constants.h"
 #include "isisd/isis_common.h"
@@ -145,10 +133,11 @@ static int isis_zebra_if_address_del(ZAPI_CALLBACK_ARGS)
 static int isis_zebra_link_params(ZAPI_CALLBACK_ARGS)
 {
        struct interface *ifp;
+       bool changed = false;
 
-       ifp = zebra_interface_link_params_read(zclient->ibuf, vrf_id);
+       ifp = zebra_interface_link_params_read(zclient->ibuf, vrf_id, &changed);
 
-       if (ifp == NULL)
+       if (ifp == NULL || !changed)
                return 0;
 
        /* Update TE TLV */
@@ -746,6 +735,25 @@ static void isis_zebra_connected(struct zclient *zclient)
        bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, VRF_DEFAULT);
 }
 
+/**
+ * Register / unregister Link State ZAPI Opaque Message
+ *
+ * @param up   True to register, false to unregister
+ *
+ * @return     0 if success, -1 otherwise
+ */
+int isis_zebra_ls_register(bool up)
+{
+       int rc;
+
+       if (up)
+               rc = ls_register(zclient, true);
+       else
+               rc = ls_unregister(zclient, true);
+
+       return rc;
+}
+
 /*
  * opaque messages between processes
  */
@@ -753,6 +761,7 @@ static int isis_opaque_msg_handler(ZAPI_CALLBACK_ARGS)
 {
        struct stream *s;
        struct zapi_opaque_msg info;
+       struct zapi_opaque_reg_info dst;
        struct ldp_igp_sync_if_state state;
        struct ldp_igp_sync_announce announce;
        struct zapi_rlfa_response rlfa;
@@ -763,6 +772,13 @@ static int isis_opaque_msg_handler(ZAPI_CALLBACK_ARGS)
                return -1;
 
        switch (info.type) {
+       case LINK_STATE_SYNC:
+               STREAM_GETC(s, dst.proto);
+               STREAM_GETW(s, dst.instance);
+               STREAM_GETL(s, dst.session_id);
+               dst.type = LINK_STATE_SYNC;
+               ret = isis_te_sync_ted(dst);
+               break;
        case LDP_IGP_SYNC_IF_STATE_UPDATE:
                STREAM_GET(&state, s, sizeof(state));
                ret = isis_ldp_sync_state_update(state);
@@ -799,23 +815,31 @@ static int isis_zebra_client_close_notify(ZAPI_CALLBACK_ARGS)
        return ret;
 }
 
-void isis_zebra_init(struct thread_master *master, int instance)
+static zclient_handler *const isis_handlers[] = {
+       [ZEBRA_ROUTER_ID_UPDATE] = isis_router_id_update_zebra,
+       [ZEBRA_INTERFACE_ADDRESS_ADD] = isis_zebra_if_address_add,
+       [ZEBRA_INTERFACE_ADDRESS_DELETE] = isis_zebra_if_address_del,
+       [ZEBRA_INTERFACE_LINK_PARAMS] = isis_zebra_link_params,
+       [ZEBRA_REDISTRIBUTE_ROUTE_ADD] = isis_zebra_read,
+       [ZEBRA_REDISTRIBUTE_ROUTE_DEL] = isis_zebra_read,
+
+       [ZEBRA_OPAQUE_MESSAGE] = isis_opaque_msg_handler,
+
+       [ZEBRA_CLIENT_CLOSE_NOTIFY] = isis_zebra_client_close_notify,
+};
+
+void isis_zebra_init(struct event_loop *master, int instance)
 {
        /* Initialize asynchronous zclient. */
-       zclient = zclient_new(master, &zclient_options_default);
+       zclient = zclient_new(master, &zclient_options_default, isis_handlers,
+                             array_size(isis_handlers));
        zclient_init(zclient, PROTO_TYPE, 0, &isisd_privs);
        zclient->zebra_connected = isis_zebra_connected;
-       zclient->router_id_update = isis_router_id_update_zebra;
-       zclient->interface_address_add = isis_zebra_if_address_add;
-       zclient->interface_address_delete = isis_zebra_if_address_del;
-       zclient->interface_link_params = isis_zebra_link_params;
-       zclient->redistribute_route_add = isis_zebra_read;
-       zclient->redistribute_route_del = isis_zebra_read;
 
        /* Initialize special zclient for synchronous message exchanges. */
        struct zclient_options options = zclient_options_default;
        options.synchronous = true;
-       zclient_sync = zclient_new(master, &options);
+       zclient_sync = zclient_new(master, &options, NULL, 0);
        zclient_sync->sock = -1;
        zclient_sync->redist_default = ZEBRA_ROUTE_ISIS;
        zclient_sync->instance = instance;
@@ -825,10 +849,6 @@ void isis_zebra_init(struct thread_master *master, int instance)
         */
        zclient_sync->session_id = 1;
        zclient_sync->privs = &isisd_privs;
-
-       zclient->opaque_msg_handler = isis_opaque_msg_handler;
-
-       zclient->zebra_client_close_notify = isis_zebra_client_close_notify;
 }
 
 void isis_zebra_stop(void)