#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)
circuit->mtc = mpls_te_circuit_new();
+ circuit_mt_init(circuit);
+
QOBJ_REG (circuit, isis_circuit);
return circuit;
isis_circuit_if_unbind (circuit, circuit->interface);
+ circuit_mt_finish(circuit);
+
/* and lastly the circuit itself */
XFREE (MTYPE_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)
{
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");
prefix_ipv4_free (ipv4);
}
-#ifdef HAVE_IPV6
if (connected->address->family == AF_INET6)
{
ipv6 = prefix_ipv6_new ();
prefix_ipv6_free (ipv6);
}
-#endif /* HAVE_IPV6 */
return;
}
}
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);
circuit->ip_addrs = NULL;
}
-#ifdef HAVE_IPV6
if (circuit->ipv6_link)
{
assert (listcount(circuit->ipv6_link) == 0);
list_delete (circuit->ipv6_non_link);
circuit->ipv6_non_link = NULL;
}
-#endif /* HAVE_IPV6 */
circuit->circ_type = CIRCUIT_T_UNKNOWN;
circuit->circuit_id = 0;
}
}
+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)
{
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 ();
}
/* 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
{
* 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);
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_MSEC_ON (master, circuit->t_read, isis_receive, circuit,
- listcount (circuit->area->circuit_list) * 100);
-#endif
+ isis_circuit_prepare (circuit);
circuit->lsp_queue = list_new ();
circuit->lsp_queue_last_cleared = time (NULL);
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;
}
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)
VTY_NEWLINE);
write++;
}
+ write += circuit_write_mt_settings(circuit, vty);
}
vty_out (vty, "!%s", VTY_NEWLINE);
}
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)
{
/* 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 ();
}