]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_circuit.c
*: remove THREAD_ON macros, add nullity check
[mirror_frr.git] / isisd / isis_circuit.c
index 4f22a5e55894e9c77dd97ae67b91d37a7b6c1f06..190811bac45ce4676c8c2931308e5d564a6efe36 100644 (file)
@@ -41,9 +41,9 @@
 #include "hash.h"
 #include "prefix.h"
 #include "stream.h"
+#include "qobj.h"
 
 #include "isisd/dict.h"
-#include "isisd/include-netbsd/iso.h"
 #include "isisd/isis_constants.h"
 #include "isisd/isis_common.h"
 #include "isisd/isis_flags.h"
@@ -60,6 +60,9 @@
 #include "isisd/isis_csm.h"
 #include "isisd/isis_events.h"
 #include "isisd/isis_te.h"
+#include "isisd/isis_mt.h"
+
+DEFINE_QOBJ_TYPE(isis_circuit)
 
 /*
  * Prototypes.
@@ -100,6 +103,10 @@ isis_circuit_new ()
 
   circuit->mtc = mpls_te_circuit_new();
 
+  circuit_mt_init(circuit);
+
+  QOBJ_REG (circuit, isis_circuit);
+
   return circuit;
 }
 
@@ -109,8 +116,12 @@ isis_circuit_del (struct isis_circuit *circuit)
   if (!circuit)
     return;
 
+  QOBJ_UNREG (circuit);
+
   isis_circuit_if_unbind (circuit, circuit->interface);
 
+  circuit_mt_finish(circuit);
+
   /* and lastly the circuit itself */
   XFREE (MTYPE_ISIS_CIRCUIT, circuit);
 
@@ -278,10 +289,8 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
   struct prefix_ipv4 *ipv4, *ip = NULL;
   struct listnode *node;
   char buf[PREFIX2STR_BUFFER];
-#ifdef HAVE_IPV6
   struct prefix_ipv6 *ipv6, *ip6 = NULL;
   int found = 0;
-#endif /* HAVE_IPV6 */
 
   if (connected->address->family == AF_INET)
     {
@@ -302,12 +311,12 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
       else
        {
          prefix2str (connected->address, buf, sizeof (buf));
-         zlog_warn ("Nonexitant ip address %s removal attempt from \
+         zlog_warn ("Nonexistant ip address %s removal attempt from \
                       circuit %d", buf, circuit->circuit_id);
          zlog_warn ("Current ip addresses on %s:", circuit->interface->name);
          for (ALL_LIST_ELEMENTS_RO(circuit->ip_addrs, node, ip))
            {
-             prefix2str((struct prefix*)ip, (char *)buf, BUFSIZ);
+             prefix2str(ip, buf, sizeof(buf));
              zlog_warn("  %s", buf);
            }
          zlog_warn("End of addresses");
@@ -315,7 +324,6 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
 
       prefix_ipv4_free (ipv4);
     }
-#ifdef HAVE_IPV6
   if (connected->address->family == AF_INET6)
     {
       ipv6 = prefix_ipv6_new ();
@@ -373,7 +381,6 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
 
       prefix_ipv6_free (ipv6);
     }
-#endif /* HAVE_IPV6 */
   return;
 }
 
@@ -461,10 +468,8 @@ isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp)
     }
 
   circuit->ip_addrs = list_new ();
-#ifdef HAVE_IPV6
   circuit->ipv6_link = list_new ();
   circuit->ipv6_non_link = list_new ();
-#endif /* HAVE_IPV6 */
 
   for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
     isis_circuit_add_addr (circuit, conn);
@@ -491,7 +496,6 @@ isis_circuit_if_del (struct isis_circuit *circuit, struct interface *ifp)
       circuit->ip_addrs = NULL;
     }
 
-#ifdef HAVE_IPV6
   if (circuit->ipv6_link)
     {
       assert (listcount(circuit->ipv6_link) == 0);
@@ -505,7 +509,6 @@ isis_circuit_if_del (struct isis_circuit *circuit, struct interface *ifp)
       list_delete (circuit->ipv6_non_link);
       circuit->ipv6_non_link = NULL;
     }
-#endif /* HAVE_IPV6 */
 
   circuit->circ_type = CIRCUIT_T_UNKNOWN;
   circuit->circuit_id = 0;
@@ -600,6 +603,19 @@ isis_circuit_stream(struct isis_circuit *circuit, struct stream **stream)
     }
 }
 
+void
+isis_circuit_prepare (struct isis_circuit *circuit)
+{
+#ifdef GNU_LINUX
+  thread_add_read(master, isis_receive, circuit, circuit->fd,
+                  &circuit->t_read);
+#else
+  thread_add_timer_msec(master, isis_receive, circuit,
+                        listcount(circuit->area->circuit_list) * 100,
+                        &circuit->t_read);
+#endif
+}
+
 int
 isis_circuit_up (struct isis_circuit *circuit)
 {
@@ -657,13 +673,13 @@ isis_circuit_up (struct isis_circuit *circuit)
 
       if (circuit->is_type & IS_LEVEL_1)
         {
-          thread_add_event (master, send_lan_l1_hello, circuit, 0);
+          thread_add_event(master, send_lan_l1_hello, circuit, 0, NULL);
           circuit->u.bc.lan_neighs[0] = list_new ();
         }
 
       if (circuit->is_type & IS_LEVEL_2)
         {
-          thread_add_event (master, send_lan_l2_hello, circuit, 0);
+          thread_add_event(master, send_lan_l2_hello, circuit, 0, NULL);
           circuit->u.bc.lan_neighs[1] = list_new ();
         }
 
@@ -673,11 +689,13 @@ isis_circuit_up (struct isis_circuit *circuit)
       /* 8.4.1 d) */
       /* dr election will commence in... */
       if (circuit->is_type & IS_LEVEL_1)
-        THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
-            circuit, 2 * circuit->hello_interval[0]);
+        thread_add_timer(master, isis_run_dr_l1, circuit,
+                         2 * circuit->hello_interval[0],
+                         &circuit->u.bc.t_run_dr[0]);
       if (circuit->is_type & IS_LEVEL_2)
-        THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
-            circuit, 2 * circuit->hello_interval[1]);
+        thread_add_timer(master, isis_run_dr_l2, circuit,
+                         2 * circuit->hello_interval[1],
+                         &circuit->u.bc.t_run_dr[1]);
     }
   else
     {
@@ -685,17 +703,19 @@ isis_circuit_up (struct isis_circuit *circuit)
        * for a ptp IF
        */
       circuit->u.p2p.neighbor = NULL;
-      thread_add_event (master, send_p2p_hello, circuit, 0);
+      thread_add_event(master, send_p2p_hello, circuit, 0, NULL);
     }
 
   /* initializing PSNP timers */
   if (circuit->is_type & IS_LEVEL_1)
-    THREAD_TIMER_ON (master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
-                     isis_jitter (circuit->psnp_interval[0], PSNP_JITTER));
+    thread_add_timer(master, send_l1_psnp, circuit,
+                     isis_jitter(circuit->psnp_interval[0], PSNP_JITTER),
+                     &circuit->t_send_psnp[0]);
 
   if (circuit->is_type & IS_LEVEL_2)
-    THREAD_TIMER_ON (master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
-                     isis_jitter (circuit->psnp_interval[1], PSNP_JITTER));
+    thread_add_timer(master, send_l2_psnp, circuit,
+                     isis_jitter(circuit->psnp_interval[1], PSNP_JITTER),
+                     &circuit->t_send_psnp[1]);
 
   /* unified init for circuits; ignore warnings below this level */
   retv = isis_sock_init (circuit);
@@ -709,13 +729,7 @@ isis_circuit_up (struct isis_circuit *circuit)
   isis_circuit_stream(circuit, &circuit->rcv_stream);
   isis_circuit_stream(circuit, &circuit->snd_stream);
 
-#ifdef GNU_LINUX
-  THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit,
-                  circuit->fd);
-#else
-  THREAD_TIMER_ON (master, circuit->t_read, isis_receive, circuit,
-                   circuit->fd);
-#endif
+  isis_circuit_prepare (circuit);
 
   circuit->lsp_queue = list_new ();
   circuit->lsp_queue_last_cleared = time (NULL);
@@ -845,13 +859,11 @@ circuit_update_nlpids (struct isis_circuit *circuit)
       circuit->nlpids.nlpids[0] = NLPID_IP;
       circuit->nlpids.count++;
     }
-#ifdef HAVE_IPV6
   if (circuit->ipv6_router)
     {
       circuit->nlpids.nlpids[circuit->nlpids.count] = NLPID_IPV6;
       circuit->nlpids.count++;
     }
-#endif /* HAVE_IPV6 */
   return;
 }
 
@@ -972,7 +984,7 @@ isis_circuit_print_vty (struct isis_circuit *circuit, struct vty *vty,
               vty_out(vty, "      %s%s", buf, VTY_NEWLINE);
             }
         }
-      if (circuit->ipv6_link && listcount(circuit->ipv6_non_link) > 0)
+      if (circuit->ipv6_non_link && listcount(circuit->ipv6_non_link) > 0)
         {
           vty_out(vty, "    IPv6 Prefixes:%s", VTY_NEWLINE);
           for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_non_link, node, ip_addr))
@@ -1033,14 +1045,12 @@ isis_interface_config_write (struct vty *vty)
               vty_out (vty, " isis network point-to-point%s", VTY_NEWLINE);
               write++;
             }
-#ifdef HAVE_IPV6
           if (circuit->ipv6_router)
             {
               vty_out (vty, " ipv6 router isis %s%s", area->area_tag,
                   VTY_NEWLINE);
               write++;
             }
-#endif /* HAVE_IPV6 */
 
           /* ISIS - circuit type */
           if (circuit->is_type == IS_LEVEL_1)
@@ -1215,6 +1225,7 @@ isis_interface_config_write (struct vty *vty)
                        VTY_NEWLINE);
               write++;
             }
+          write += circuit_write_mt_settings(circuit, vty);
         }
       vty_out (vty, "!%s", VTY_NEWLINE);
     }
@@ -1382,6 +1393,22 @@ isis_circuit_circ_type_set(struct isis_circuit *circuit, int circ_type)
   return 0;
 }
 
+int
+isis_circuit_mt_enabled_set (struct isis_circuit *circuit, uint16_t mtid,
+                             bool enabled)
+{
+  struct isis_circuit_mt_setting *setting;
+
+  setting = circuit_get_mt_setting(circuit, mtid);
+  if (setting->enabled != enabled)
+    {
+      setting->enabled = enabled;
+      lsp_regenerate_schedule (circuit->area, IS_LEVEL_1 | IS_LEVEL_2, 0);
+    }
+
+  return CMD_SUCCESS;
+}
+
 int
 isis_if_new_hook (struct interface *ifp)
 {
@@ -1412,12 +1439,7 @@ isis_circuit_init ()
 
   /* Install interface node */
   install_node (&interface_node, isis_interface_config_write);
-  install_element (CONFIG_NODE, &interface_cmd);
-  install_element (CONFIG_NODE, &no_interface_cmd);
-
-  install_default (INTERFACE_NODE);
-  install_element (INTERFACE_NODE, &interface_desc_cmd);
-  install_element (INTERFACE_NODE, &no_interface_desc_cmd);
+  if_cmd_init ();
 
   isis_vty_init ();
 }