summaryrefslogtreecommitdiff
path: root/isisd/isis_circuit.c
diff options
context:
space:
mode:
Diffstat (limited to 'isisd/isis_circuit.c')
-rw-r--r--isisd/isis_circuit.c56
1 files changed, 36 insertions, 20 deletions
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index 985e07820f..d6988095e5 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -59,6 +59,7 @@
#include "isisd/isis_errors.h"
#include "isisd/isis_tx_queue.h"
#include "isisd/isis_nb.h"
+#include "isisd/isis_ldp_sync.h"
DEFINE_QOBJ_TYPE(isis_circuit)
@@ -1244,21 +1245,24 @@ static int isis_interface_config_write(struct vty *vty)
#else
static int isis_interface_config_write(struct vty *vty)
{
- struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
+ struct vrf *vrf = NULL;
int write = 0;
- struct interface *ifp;
- struct lyd_node *dnode;
- FOR_ALL_INTERFACES (vrf, ifp) {
- dnode = yang_dnode_get(
- running_config->dnode,
- "/frr-interface:lib/interface[name='%s'][vrf='%s']",
- ifp->name, vrf->name);
- if (dnode == NULL)
- continue;
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ struct interface *ifp;
- write++;
- nb_cli_show_dnode_cmds(vty, dnode, false);
+ FOR_ALL_INTERFACES (vrf, ifp) {
+ struct lyd_node *dnode;
+ dnode = yang_dnode_get(
+ running_config->dnode,
+ "/frr-interface:lib/interface[name='%s'][vrf='%s']",
+ ifp->name, vrf->name);
+ if (dnode == NULL)
+ continue;
+
+ write++;
+ nb_cli_show_dnode_cmds(vty, dnode, false);
+ }
}
return write;
}
@@ -1268,6 +1272,7 @@ struct isis_circuit *isis_circuit_create(struct isis_area *area,
struct interface *ifp)
{
struct isis_circuit *circuit = circuit_scan_by_ifp(ifp);
+
if (circuit && circuit->area)
return NULL;
circuit = isis_csm_state_change(ISIS_ENABLE, circuit, area);
@@ -1276,6 +1281,7 @@ struct isis_circuit *isis_circuit_create(struct isis_area *area,
isis_circuit_if_bind(circuit, ifp);
if (circuit->area->mta && circuit->area->mta->status)
isis_link_params_update(circuit, ifp);
+
return circuit;
}
@@ -1346,11 +1352,16 @@ ferr_r isis_circuit_metric_set(struct isis_circuit *circuit, int level,
return ferr_cfg_invalid("metric %d too large for narrow metric",
metric);
- circuit->te_metric[level - 1] = metric;
- circuit->metric[level - 1] = metric;
-
- if (circuit->area)
- lsp_regenerate_schedule(circuit->area, level, 0);
+ /* inform ldp-sync of metric change
+ * if ldp-sync is running need to save metric
+ * and restore new values after ldp-sync completion.
+ */
+ if (isis_ldp_sync_if_metric_config(circuit, level, metric)) {
+ circuit->te_metric[level - 1] = metric;
+ circuit->metric[level - 1] = metric;
+ if (circuit->area)
+ lsp_regenerate_schedule(circuit->area, level, 0);
+ }
return ferr_ok();
}
@@ -1446,7 +1457,7 @@ int isis_if_delete_hook(struct interface *ifp)
/* Clean up the circuit data */
if (ifp && ifp->info) {
circuit = ifp->info;
- isis_csm_state_change(IF_DOWN_FROM_Z, circuit, circuit->area);
+ isis_csm_state_change(IF_DOWN_FROM_Z, circuit, ifp);
}
return 0;
@@ -1454,10 +1465,15 @@ int isis_if_delete_hook(struct interface *ifp)
static int isis_ifp_create(struct interface *ifp)
{
- if (if_is_operative(ifp))
+ struct vrf *vrf = NULL;
+
+ if (if_is_operative(ifp)) {
+ vrf = vrf_lookup_by_id(ifp->vrf_id);
+ if (vrf)
+ isis_global_instance_create(vrf->name);
isis_csm_state_change(IF_UP_FROM_Z, circuit_scan_by_ifp(ifp),
ifp);
-
+ }
hook_call(isis_if_new_hook, ifp);
return 0;