]> git.proxmox.com Git - mirror_frr.git/blobdiff - ripngd/ripngd.c
Merge pull request #13284 from isabelladeleon12/fix_adv_high_metrics_ut_warning
[mirror_frr.git] / ripngd / ripngd.c
index e7d292869782042f547156c47bc87754216ba34a..2f6409a70d31d6ddf5cb55dadc91161bafe46a5b 100644 (file)
@@ -1,21 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /* RIPng daemon
  * Copyright (C) 1998, 1999 Kunihiro Ishiguro
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * GNU Zebra 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>
@@ -23,7 +8,7 @@
 #include "prefix.h"
 #include "filter.h"
 #include "log.h"
-#include "thread.h"
+#include "frrevent.h"
 #include "memory.h"
 #include "if.h"
 #include "stream.h"
@@ -61,7 +46,7 @@ void ripng_output_process(struct interface *, struct sockaddr_in6 *, int);
 static void ripng_instance_enable(struct ripng *ripng, struct vrf *vrf,
                                  int sock);
 static void ripng_instance_disable(struct ripng *ripng);
-static void ripng_triggered_update(struct thread *);
+static void ripng_triggered_update(struct event *);
 static void ripng_if_rmap_update(struct if_rmap_ctx *ctx,
                                 struct if_rmap *if_rmap);
 
@@ -423,15 +408,15 @@ static int ripng_lladdr_check(struct interface *ifp, struct in6_addr *addr)
 }
 
 /* RIPng route garbage collect timer. */
-static void ripng_garbage_collect(struct thread *t)
+static void ripng_garbage_collect(struct event *t)
 {
        struct ripng_info *rinfo;
        struct agg_node *rp;
 
-       rinfo = THREAD_ARG(t);
+       rinfo = EVENT_ARG(t);
 
        /* Off timeout timer. */
-       RIPNG_TIMER_OFF(rinfo->t_timeout);
+       EVENT_OFF(rinfo->t_timeout);
 
        /* Get route_node pointer. */
        rp = rinfo->rp;
@@ -518,14 +503,14 @@ struct ripng_info *ripng_ecmp_replace(struct ripng *ripng,
        /* Re-use the first entry, and delete the others. */
        for (ALL_LIST_ELEMENTS(list, node, nextnode, tmp_rinfo))
                if (tmp_rinfo != rinfo) {
-                       RIPNG_TIMER_OFF(tmp_rinfo->t_timeout);
-                       RIPNG_TIMER_OFF(tmp_rinfo->t_garbage_collect);
+                       EVENT_OFF(tmp_rinfo->t_timeout);
+                       EVENT_OFF(tmp_rinfo->t_garbage_collect);
                        list_delete_node(list, node);
                        ripng_info_free(tmp_rinfo);
                }
 
-       RIPNG_TIMER_OFF(rinfo->t_timeout);
-       RIPNG_TIMER_OFF(rinfo->t_garbage_collect);
+       EVENT_OFF(rinfo->t_timeout);
+       EVENT_OFF(rinfo->t_garbage_collect);
        memcpy(rinfo, rinfo_new, sizeof(struct ripng_info));
 
        if (ripng_route_rte(rinfo)) {
@@ -557,7 +542,7 @@ struct ripng_info *ripng_ecmp_delete(struct ripng *ripng,
        struct agg_node *rp = rinfo->rp;
        struct list *list = (struct list *)rp->info;
 
-       RIPNG_TIMER_OFF(rinfo->t_timeout);
+       EVENT_OFF(rinfo->t_timeout);
 
        if (rinfo->metric != RIPNG_METRIC_INFINITY)
                ripng_aggregate_decrement(rp, rinfo);
@@ -565,7 +550,7 @@ struct ripng_info *ripng_ecmp_delete(struct ripng *ripng,
        if (listcount(list) > 1) {
                /* Some other ECMP entries still exist. Just delete this entry.
                 */
-               RIPNG_TIMER_OFF(rinfo->t_garbage_collect);
+               EVENT_OFF(rinfo->t_garbage_collect);
                listnode_delete(list, rinfo);
                if (ripng_route_rte(rinfo)
                    && CHECK_FLAG(rinfo->flags, RIPNG_RTF_FIB))
@@ -600,9 +585,9 @@ struct ripng_info *ripng_ecmp_delete(struct ripng *ripng,
 }
 
 /* Timeout RIPng routes. */
-static void ripng_timeout(struct thread *t)
+static void ripng_timeout(struct event *t)
 {
-       struct ripng_info *rinfo = THREAD_ARG(t);
+       struct ripng_info *rinfo = EVENT_ARG(t);
        struct ripng *ripng = ripng_info_get_instance(rinfo);
 
        ripng_ecmp_delete(ripng, rinfo);
@@ -611,9 +596,9 @@ static void ripng_timeout(struct thread *t)
 static void ripng_timeout_update(struct ripng *ripng, struct ripng_info *rinfo)
 {
        if (rinfo->metric != RIPNG_METRIC_INFINITY) {
-               RIPNG_TIMER_OFF(rinfo->t_timeout);
-               thread_add_timer(master, ripng_timeout, rinfo,
-                                ripng->timeout_time, &rinfo->t_timeout);
+               EVENT_OFF(rinfo->t_timeout);
+               event_add_timer(master, ripng_timeout, rinfo,
+                               ripng->timeout_time, &rinfo->t_timeout);
        }
 }
 
@@ -892,18 +877,18 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
                 * but
                 * highly recommended".
                 */
-               if (!ripng->ecmp && !same && rinfo->metric == rte->metric
-                   && rinfo->t_timeout
-                   && (thread_timer_remain_second(rinfo->t_timeout)
-                       < (ripng->timeout_time / 2))) {
+               if (!ripng->ecmp && !same && rinfo->metric == rte->metric &&
+                   rinfo->t_timeout &&
+                   (event_timer_remain_second(rinfo->t_timeout) <
+                    (ripng->timeout_time / 2))) {
                        ripng_ecmp_replace(ripng, &newinfo);
                }
                /* Next, compare the metrics.  If the datagram is from the same
                   router as the existing route, and the new metric is different
                   than the old one; or, if the new metric is lower than the old
                   one; do the following actions: */
-               else if ((same && rinfo->metric != rte->metric)
-                        || rte->metric < rinfo->metric) {
+               else if ((same && rinfo->metric != rte->metric) ||
+                        rte->metric < rinfo->metric) {
                        if (listcount(list) == 1) {
                                if (newinfo.metric != RIPNG_METRIC_INFINITY)
                                        ripng_ecmp_replace(ripng, &newinfo);
@@ -1022,7 +1007,7 @@ void ripng_redistribute_delete(struct ripng *ripng, int type, int sub_type,
                                RIPNG_TIMER_ON(rinfo->t_garbage_collect,
                                               ripng_garbage_collect,
                                               ripng->garbage_time);
-                               RIPNG_TIMER_OFF(rinfo->t_timeout);
+                               EVENT_OFF(rinfo->t_timeout);
 
                                /* Aggregate count decrement. */
                                ripng_aggregate_decrement(rp, rinfo);
@@ -1061,7 +1046,7 @@ void ripng_redistribute_withdraw(struct ripng *ripng, int type)
                                RIPNG_TIMER_ON(rinfo->t_garbage_collect,
                                               ripng_garbage_collect,
                                               ripng->garbage_time);
-                               RIPNG_TIMER_OFF(rinfo->t_timeout);
+                               EVENT_OFF(rinfo->t_timeout);
 
                                /* Aggregate count decrement. */
                                ripng_aggregate_decrement(rp, rinfo);
@@ -1297,9 +1282,9 @@ static void ripng_request_process(struct ripng_packet *packet, int size,
 }
 
 /* First entry point of reading RIPng packet. */
-static void ripng_read(struct thread *thread)
+static void ripng_read(struct event *thread)
 {
-       struct ripng *ripng = THREAD_ARG(thread);
+       struct ripng *ripng = EVENT_ARG(thread);
        int len;
        int sock;
        struct sockaddr_in6 from;
@@ -1314,7 +1299,7 @@ static void ripng_read(struct thread *thread)
 
        /* Fetch thread data and set read pointer to empty for event
           managing.  `sock' sould be same as ripng->sock. */
-       sock = THREAD_FD(thread);
+       sock = EVENT_FD(thread);
 
        /* Add myself to the next event. */
        ripng_event(ripng, RIPNG_READ, sock);
@@ -1405,9 +1390,9 @@ static void ripng_clear_changed_flag(struct ripng *ripng)
 
 /* Regular update of RIPng route.  Send all routing formation to RIPng
    enabled interface. */
-static void ripng_update(struct thread *t)
+static void ripng_update(struct event *t)
 {
-       struct ripng *ripng = THREAD_ARG(t);
+       struct ripng *ripng = EVENT_ARG(t);
        struct interface *ifp;
        struct ripng_interface *ri;
 
@@ -1445,7 +1430,7 @@ static void ripng_update(struct thread *t)
 
        /* Triggered updates may be suppressed if a regular update is due by
           the time the triggered update would be sent. */
-       thread_cancel(&ripng->t_triggered_interval);
+       EVENT_OFF(ripng->t_triggered_interval);
        ripng->trigger = 0;
 
        /* Reset flush event. */
@@ -1453,9 +1438,9 @@ static void ripng_update(struct thread *t)
 }
 
 /* Triggered update interval timer. */
-static void ripng_triggered_interval(struct thread *t)
+static void ripng_triggered_interval(struct event *t)
 {
-       struct ripng *ripng = THREAD_ARG(t);
+       struct ripng *ripng = EVENT_ARG(t);
 
        if (ripng->trigger) {
                ripng->trigger = 0;
@@ -1464,15 +1449,15 @@ static void ripng_triggered_interval(struct thread *t)
 }
 
 /* Execute triggered update. */
-void ripng_triggered_update(struct thread *t)
+void ripng_triggered_update(struct event *t)
 {
-       struct ripng *ripng = THREAD_ARG(t);
+       struct ripng *ripng = EVENT_ARG(t);
        struct interface *ifp;
        struct ripng_interface *ri;
        int interval;
 
        /* Cancel interval timer. */
-       thread_cancel(&ripng->t_triggered_interval);
+       EVENT_OFF(ripng->t_triggered_interval);
        ripng->trigger = 0;
 
        /* Logging triggered update. */
@@ -1508,8 +1493,8 @@ void ripng_triggered_update(struct thread *t)
           update is triggered when the timer expires. */
        interval = (frr_weak_random() % 5) + 1;
 
-       thread_add_timer(master, ripng_triggered_interval, ripng, interval,
-                        &ripng->t_triggered_interval);
+       event_add_timer(master, ripng_triggered_interval, ripng, interval,
+                       &ripng->t_triggered_interval);
 }
 
 /* Write routing table entry to the stream and return next index of
@@ -1913,27 +1898,27 @@ void ripng_event(struct ripng *ripng, enum ripng_event event, int sock)
 
        switch (event) {
        case RIPNG_READ:
-               thread_add_read(master, ripng_read, ripng, sock,
-                               &ripng->t_read);
+               event_add_read(master, ripng_read, ripng, sock, &ripng->t_read);
                break;
        case RIPNG_UPDATE_EVENT:
-               thread_cancel(&ripng->t_update);
+               EVENT_OFF(ripng->t_update);
 
                /* Update timer jitter. */
                jitter = ripng_update_jitter(ripng->update_time);
 
-               thread_add_timer(master, ripng_update, ripng,
-                                sock ? 2 : ripng->update_time + jitter,
-                                &ripng->t_update);
+               event_add_timer(master, ripng_update, ripng,
+                               sock ? 2 : ripng->update_time + jitter,
+                               &ripng->t_update);
                break;
        case RIPNG_TRIGGERED_UPDATE:
                if (ripng->t_triggered_interval)
                        ripng->trigger = 1;
                else
-                       thread_add_event(master, ripng_triggered_update, ripng,
-                                        0, &ripng->t_triggered_update);
+                       event_add_event(master, ripng_triggered_update, ripng,
+                                       0, &ripng->t_triggered_update);
                break;
-       default:
+       case RIPNG_ZEBRA:
+       case RIPNG_REQUEST_EVENT:
                break;
        }
 }
@@ -1946,15 +1931,15 @@ static void ripng_vty_out_uptime(struct vty *vty, struct ripng_info *rinfo)
        struct tm tm;
 #define TIME_BUF 25
        char timebuf[TIME_BUF];
-       struct thread *thread;
+       struct event *thread;
 
        if ((thread = rinfo->t_timeout) != NULL) {
-               clock = thread_timer_remain_second(thread);
+               clock = event_timer_remain_second(thread);
                gmtime_r(&clock, &tm);
                strftime(timebuf, TIME_BUF, "%M:%S", &tm);
                vty_out(vty, "%5s", timebuf);
        } else if ((thread = rinfo->t_garbage_collect) != NULL) {
-               clock = thread_timer_remain_second(thread);
+               clock = event_timer_remain_second(thread);
                gmtime_r(&clock, &tm);
                strftime(timebuf, TIME_BUF, "%M:%S", &tm);
                vty_out(vty, "%5s", timebuf);
@@ -2143,7 +2128,7 @@ DEFUN (show_ipv6_ripng_status,
        vty_out(vty, "  Sending updates every %u seconds with +/-50%%,",
                ripng->update_time);
        vty_out(vty, " next due in %lu seconds\n",
-               thread_timer_remain_second(ripng->t_update));
+               event_timer_remain_second(ripng->t_update));
        vty_out(vty, "  Timeout after %u seconds,", ripng->timeout_time);
        vty_out(vty, " garbage collect after %u seconds\n",
                ripng->garbage_time);
@@ -2209,9 +2194,8 @@ void ripng_ecmp_disable(struct ripng *ripng)
                        /* Drop all other entries, except the first one. */
                        for (ALL_LIST_ELEMENTS(list, node, nextnode, tmp_rinfo))
                                if (tmp_rinfo != rinfo) {
-                                       RIPNG_TIMER_OFF(tmp_rinfo->t_timeout);
-                                       RIPNG_TIMER_OFF(
-                                               tmp_rinfo->t_garbage_collect);
+                                       EVENT_OFF(tmp_rinfo->t_timeout);
+                                       EVENT_OFF(tmp_rinfo->t_garbage_collect);
                                        list_delete_node(list, node);
                                        ripng_info_free(tmp_rinfo);
                                }
@@ -2247,7 +2231,6 @@ static int ripng_config_write(struct vty *vty)
                nb_cli_show_dnode_cmds(vty, dnode, false);
 
                config_write_distribute(vty, ripng->distribute_ctx);
-               config_write_if_rmap(vty, ripng->if_rmap_ctx);
 
                vty_out(vty, "exit\n");
 
@@ -2528,8 +2511,8 @@ static void ripng_instance_disable(struct ripng *ripng)
                                ripng_zebra_ipv6_delete(ripng, rp);
 
                        for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) {
-                               RIPNG_TIMER_OFF(rinfo->t_timeout);
-                               RIPNG_TIMER_OFF(rinfo->t_garbage_collect);
+                               EVENT_OFF(rinfo->t_timeout);
+                               EVENT_OFF(rinfo->t_garbage_collect);
                                ripng_info_free(rinfo);
                        }
                        list_delete(&list);
@@ -2548,12 +2531,12 @@ static void ripng_instance_disable(struct ripng *ripng)
        ripng_redistribute_disable(ripng);
 
        /* Cancel the RIPng timers */
-       RIPNG_TIMER_OFF(ripng->t_update);
-       RIPNG_TIMER_OFF(ripng->t_triggered_update);
-       RIPNG_TIMER_OFF(ripng->t_triggered_interval);
+       EVENT_OFF(ripng->t_update);
+       EVENT_OFF(ripng->t_triggered_update);
+       EVENT_OFF(ripng->t_triggered_interval);
 
        /* Cancel the read thread */
-       thread_cancel(&ripng->t_read);
+       EVENT_OFF(ripng->t_read);
 
        /* Close the RIPng socket */
        if (ripng->sock >= 0) {
@@ -2581,10 +2564,17 @@ static int ripng_vrf_new(struct vrf *vrf)
 
 static int ripng_vrf_delete(struct vrf *vrf)
 {
+       struct ripng *ripng;
+
        if (IS_RIPNG_DEBUG_EVENT)
                zlog_debug("%s: VRF deleted: %s(%u)", __func__, vrf->name,
                           vrf->vrf_id);
 
+       ripng = ripng_lookup_by_vrf_name(vrf->name);
+       if (!ripng)
+               return 0;
+
+       ripng_clean(ripng);
        return 0;
 }