]> git.proxmox.com Git - mirror_frr.git/blobdiff - ripngd/ripngd.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / ripngd / ripngd.c
index 4d67aa2f680e9603eea23c23ec2aa29828a7d8c3..4ec9209da7670ed3f19efce2b50076da901f0673 100644 (file)
@@ -66,7 +66,7 @@ struct ripng_nexthop {
        struct in6_addr address;
 };
 
-static int ripng_route_rte(struct ripng_info *rinfo)
+int ripng_route_rte(struct ripng_info *rinfo)
 {
        return (rinfo->type == ZEBRA_ROUTE_RIPNG
                && rinfo->sub_type == RIPNG_ROUTE_RTE);
@@ -1805,8 +1805,6 @@ int ripng_create(int socket)
 
        /* Initialize RIPng routig table. */
        ripng->table = agg_table_init();
-       ripng->route = agg_table_init();
-       ripng->aggregate = agg_table_init();
 
        /* Make socket. */
        ripng->sock = socket;
@@ -2064,12 +2062,12 @@ DEFUN (show_ipv6_ripng_status,
                return CMD_SUCCESS;
 
        vty_out(vty, "Routing Protocol is \"RIPng\"\n");
-       vty_out(vty, "  Sending updates every %ld seconds with +/-50%%,",
+       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));
-       vty_out(vty, "  Timeout after %ld seconds,", ripng->timeout_time);
-       vty_out(vty, " garbage collect after %ld seconds\n",
+       vty_out(vty, "  Timeout after %u seconds,", ripng->timeout_time);
+       vty_out(vty, " garbage collect after %u seconds\n",
                ripng->garbage_time);
 
        /* Filtering status show. */
@@ -2081,7 +2079,7 @@ DEFUN (show_ipv6_ripng_status,
 
        /* Redistribute information. */
        vty_out(vty, "  Redistributing:");
-       ripng_redistribute_write(vty, 0);
+       ripng_redistribute_write(vty);
        vty_out(vty, "\n");
 
        vty_out(vty, "  Default version control: send version %d,",
@@ -2103,7 +2101,7 @@ DEFUN (show_ipv6_ripng_status,
        }
 
        vty_out(vty, "  Routing for Networks:\n");
-       ripng_network_write(vty, 0);
+       ripng_network_write(vty);
 
        vty_out(vty, "  Routing Information Sources:\n");
        vty_out(vty,
@@ -2113,183 +2111,6 @@ DEFUN (show_ipv6_ripng_status,
        return CMD_SUCCESS;
 }
 
-DEFUN (clear_ipv6_rip,
-       clear_ipv6_rip_cmd,
-       "clear ipv6 ripng",
-       CLEAR_STR
-       IPV6_STR
-       "Clear IPv6 RIP database\n")
-{
-       struct agg_node *rp;
-       struct ripng_info *rinfo;
-       struct list *list;
-       struct listnode *listnode;
-
-       /* Clear received RIPng routes */
-       for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp)) {
-               list = rp->info;
-               if (list == NULL)
-                       continue;
-
-               for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) {
-                       if (!ripng_route_rte(rinfo))
-                               continue;
-
-                       if (CHECK_FLAG(rinfo->flags, RIPNG_RTF_FIB))
-                               ripng_zebra_ipv6_delete(rp);
-                       break;
-               }
-
-               if (rinfo) {
-                       RIPNG_TIMER_OFF(rinfo->t_timeout);
-                       RIPNG_TIMER_OFF(rinfo->t_garbage_collect);
-                       listnode_delete(list, rinfo);
-                       ripng_info_free(rinfo);
-               }
-
-               if (list_isempty(list)) {
-                       list_delete(&list);
-                       rp->info = NULL;
-                       agg_unlock_node(rp);
-               }
-       }
-
-       return CMD_SUCCESS;
-}
-
-DEFUN (ripng_route,
-       ripng_route_cmd,
-       "route IPV6ADDR",
-       "Static route setup\n"
-       "Set static RIPng route announcement\n")
-{
-       int idx_ipv6addr = 1;
-       int ret;
-       struct prefix_ipv6 p;
-       struct agg_node *rp;
-
-       ret = str2prefix_ipv6(argv[idx_ipv6addr]->arg,
-                             (struct prefix_ipv6 *)&p);
-       if (ret <= 0) {
-               vty_out(vty, "Malformed address\n");
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-       apply_mask_ipv6(&p);
-
-       rp = agg_node_get(ripng->route, (struct prefix *)&p);
-       if (rp->info) {
-               vty_out(vty, "There is already same static route.\n");
-               agg_unlock_node(rp);
-               return CMD_WARNING;
-       }
-       rp->info = (void *)1;
-
-       ripng_redistribute_add(ZEBRA_ROUTE_RIPNG, RIPNG_ROUTE_STATIC, &p, 0,
-                              NULL, 0);
-
-       return CMD_SUCCESS;
-}
-
-DEFUN (no_ripng_route,
-       no_ripng_route_cmd,
-       "no route IPV6ADDR",
-       NO_STR
-       "Static route setup\n"
-       "Delete static RIPng route announcement\n")
-{
-       int idx_ipv6addr = 2;
-       int ret;
-       struct prefix_ipv6 p;
-       struct agg_node *rp;
-
-       ret = str2prefix_ipv6(argv[idx_ipv6addr]->arg,
-                             (struct prefix_ipv6 *)&p);
-       if (ret <= 0) {
-               vty_out(vty, "Malformed address\n");
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-       apply_mask_ipv6(&p);
-
-       rp = agg_node_lookup(ripng->route, (struct prefix *)&p);
-       if (!rp) {
-               vty_out(vty, "Can't find static route.\n");
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-
-       ripng_redistribute_delete(ZEBRA_ROUTE_RIPNG, RIPNG_ROUTE_STATIC, &p, 0);
-       agg_unlock_node(rp);
-
-       rp->info = NULL;
-       agg_unlock_node(rp);
-
-       return CMD_SUCCESS;
-}
-
-DEFUN (ripng_aggregate_address,
-       ripng_aggregate_address_cmd,
-       "aggregate-address X:X::X:X/M",
-       "Set aggregate RIPng route announcement\n"
-       "Aggregate network\n")
-{
-       int idx_ipv6_prefixlen = 1;
-       int ret;
-       struct prefix p;
-       struct agg_node *node;
-
-       ret = str2prefix_ipv6(argv[idx_ipv6_prefixlen]->arg,
-                             (struct prefix_ipv6 *)&p);
-       if (ret <= 0) {
-               vty_out(vty, "Malformed address\n");
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-
-       /* Check aggregate alredy exist or not. */
-       node = agg_node_get(ripng->aggregate, &p);
-       if (node->info) {
-               vty_out(vty, "There is already same aggregate route.\n");
-               agg_unlock_node(node);
-               return CMD_WARNING;
-       }
-       node->info = (void *)1;
-
-       ripng_aggregate_add(&p);
-
-       return CMD_SUCCESS;
-}
-
-DEFUN (no_ripng_aggregate_address,
-       no_ripng_aggregate_address_cmd,
-       "no aggregate-address X:X::X:X/M",
-       NO_STR
-       "Delete aggregate RIPng route announcement\n"
-       "Aggregate network\n")
-{
-       int idx_ipv6_prefixlen = 2;
-       int ret;
-       struct prefix p;
-       struct agg_node *rn;
-
-       ret = str2prefix_ipv6(argv[idx_ipv6_prefixlen]->arg,
-                             (struct prefix_ipv6 *)&p);
-       if (ret <= 0) {
-               vty_out(vty, "Malformed address\n");
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-
-       rn = agg_node_lookup(ripng->aggregate, &p);
-       if (!rn) {
-               vty_out(vty, "Can't find aggregate route.\n");
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-       agg_unlock_node(rn);
-       rn->info = NULL;
-       agg_unlock_node(rn);
-
-       ripng_aggregate_delete(&p);
-
-       return CMD_SUCCESS;
-}
-
 #if 0
 /* RIPng update timer setup. */
 DEFUN (ripng_update_timer,
@@ -2393,58 +2214,6 @@ DEFUN (no_ripng_garbage_timer,
 }
 #endif /* 0 */
 
-DEFUN (ripng_timers,
-       ripng_timers_cmd,
-       "timers basic (0-65535) (0-65535) (0-65535)",
-       "RIPng timers setup\n"
-       "Basic timer\n"
-       "Routing table update timer value in second. Default is 30.\n"
-       "Routing information timeout timer. Default is 180.\n"
-       "Garbage collection timer. Default is 120.\n")
-{
-       int idx_number = 2;
-       int idx_number_2 = 3;
-       int idx_number_3 = 4;
-       unsigned long update;
-       unsigned long timeout;
-       unsigned long garbage;
-
-       update = strtoul(argv[idx_number]->arg, NULL, 10);
-       timeout = strtoul(argv[idx_number_2]->arg, NULL, 10);
-       garbage = strtoul(argv[idx_number_3]->arg, NULL, 10);
-
-       /* Set each timer value. */
-       ripng->update_time = update;
-       ripng->timeout_time = timeout;
-       ripng->garbage_time = garbage;
-
-       /* Reset update timer thread. */
-       ripng_event(RIPNG_UPDATE_EVENT, 0);
-
-       return CMD_SUCCESS;
-}
-
-DEFUN (no_ripng_timers,
-       no_ripng_timers_cmd,
-       "no timers basic [(0-65535) (0-65535) (0-65535)]",
-       NO_STR
-       "RIPng timers setup\n"
-       "Basic timer\n"
-       "Routing table update timer value in second. Default is 30.\n"
-       "Routing information timeout timer. Default is 180.\n"
-       "Garbage collection timer. Default is 120.\n")
-{
-       /* Set each timer value to the default. */
-       ripng->update_time = RIPNG_UPDATE_TIMER_DEFAULT;
-       ripng->timeout_time = RIPNG_TIMEOUT_TIMER_DEFAULT;
-       ripng->garbage_time = RIPNG_GARBAGE_TIMER_DEFAULT;
-
-       /* Reset update timer thread. */
-       ripng_event(RIPNG_UPDATE_EVENT, 0);
-
-       return CMD_SUCCESS;
-}
-
 #if 0
 DEFUN (show_ipv6_protocols,
        show_ipv6_protocols_cmd,
@@ -2515,53 +2284,12 @@ static int ripng_config_write(struct vty *vty)
 {
        struct lyd_node *dnode;
        int write = 0;
-       struct agg_node *rp;
 
        dnode = yang_dnode_get(running_config->dnode,
                               "/frr-ripngd:ripngd/instance");
        if (dnode) {
                nb_cli_show_dnode_cmds(vty, dnode, false);
 
-               ripng_network_write(vty, 1);
-
-               ripng_redistribute_write(vty, 1);
-
-               /* RIP offset-list configuration. */
-               config_write_ripng_offset_list(vty);
-
-               /* RIPng aggregate routes. */
-               for (rp = agg_route_top(ripng->aggregate); rp;
-                    rp = agg_route_next(rp))
-                       if (rp->info != NULL)
-                               vty_out(vty, " aggregate-address %s/%d\n",
-                                       inet6_ntoa(rp->p.u.prefix6),
-                                       rp->p.prefixlen);
-
-               /* RIPng static routes. */
-               for (rp = agg_route_top(ripng->route); rp;
-                    rp = agg_route_next(rp))
-                       if (rp->info != NULL)
-                               vty_out(vty, " route %s/%d\n",
-                                       inet6_ntoa(rp->p.u.prefix6),
-                                       rp->p.prefixlen);
-
-               /* RIPng timers configuration. */
-               if (ripng->update_time != RIPNG_UPDATE_TIMER_DEFAULT
-                   || ripng->timeout_time != RIPNG_TIMEOUT_TIMER_DEFAULT
-                   || ripng->garbage_time != RIPNG_GARBAGE_TIMER_DEFAULT) {
-                       vty_out(vty, " timers basic %ld %ld %ld\n",
-                               ripng->update_time, ripng->timeout_time,
-                               ripng->garbage_time);
-               }
-#if 0
-      if (ripng->update_time != RIPNG_UPDATE_TIMER_DEFAULT)
-       vty_out (vty, " update-timer %d\n", ripng->update_time);
-      if (ripng->timeout_time != RIPNG_TIMEOUT_TIMER_DEFAULT)
-       vty_out (vty, " timeout-timer %d\n", ripng->timeout_time);
-      if (ripng->garbage_time != RIPNG_GARBAGE_TIMER_DEFAULT)
-       vty_out (vty, " garbage-timer %d\n", ripng->garbage_time);
-#endif /* 0 */
-
                config_write_distribute(vty);
 
                config_write_if_rmap(vty);
@@ -2713,29 +2441,11 @@ void ripng_clean()
                        ripng->sock = -1;
                }
 
-               /* Static RIPng route configuration. */
-               for (rp = agg_route_top(ripng->route); rp;
-                    rp = agg_route_next(rp))
-                       if (rp->info) {
-                               rp->info = NULL;
-                               agg_unlock_node(rp);
-                       }
-
-               /* RIPng aggregated prefixes */
-               for (rp = agg_route_top(ripng->aggregate); rp;
-                    rp = agg_route_next(rp))
-                       if (rp->info) {
-                               rp->info = NULL;
-                               agg_unlock_node(rp);
-                       }
-
                for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
                        if (ripng->route_map[i].name)
                                free(ripng->route_map[i].name);
 
-               XFREE(MTYPE_ROUTE_TABLE, ripng->table);
-               XFREE(MTYPE_ROUTE_TABLE, ripng->route);
-               XFREE(MTYPE_ROUTE_TABLE, ripng->aggregate);
+               agg_table_finish(ripng->table);
 
                stream_free(ripng->ibuf);
                stream_free(ripng->obuf);
@@ -2751,25 +2461,6 @@ void ripng_clean()
        ripng_redistribute_clean();
 }
 
-/* Reset all values to the default settings. */
-void ripng_reset()
-{
-       /* Call ripd related reset functions. */
-       ripng_debug_reset();
-       ripng_route_map_reset();
-
-       /* Call library reset functions. */
-       vty_reset();
-       access_list_reset();
-       prefix_list_reset();
-
-       distribute_list_reset();
-
-       ripng_interface_reset();
-
-       ripng_zclient_reset();
-}
-
 static void ripng_if_rmap_update(struct if_rmap *if_rmap)
 {
        struct interface *ifp;
@@ -2845,16 +2536,8 @@ void ripng_init()
        install_element(VIEW_NODE, &show_ipv6_ripng_cmd);
        install_element(VIEW_NODE, &show_ipv6_ripng_status_cmd);
 
-       install_element(ENABLE_NODE, &clear_ipv6_rip_cmd);
-
        install_default(RIPNG_NODE);
-       install_element(RIPNG_NODE, &ripng_route_cmd);
-       install_element(RIPNG_NODE, &no_ripng_route_cmd);
-       install_element(RIPNG_NODE, &ripng_aggregate_address_cmd);
-       install_element(RIPNG_NODE, &no_ripng_aggregate_address_cmd);
 
-       install_element(RIPNG_NODE, &ripng_timers_cmd);
-       install_element(RIPNG_NODE, &no_ripng_timers_cmd);
 #if 0
   install_element (VIEW_NODE, &show_ipv6_protocols_cmd);
   install_element (RIPNG_NODE, &ripng_update_timer_cmd);