]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_cli.c
Merge pull request #4539 from opensourcerouting/7.1/watchfrr-sd-timeout
[mirror_frr.git] / isisd / isis_cli.c
index f39a83e0efa88b08716915c404c73568970f0984..0334b98a122fb71c54a0704b8d97cf068a266457 100644 (file)
@@ -82,14 +82,16 @@ DEFPY(no_router_isis, no_router_isis_cmd, "no router isis WORD$tag",
        struct isis_circuit *circuit = NULL;
        struct isis_area *area = NULL;
 
-       area = isis_area_lookup(tag);
-       if (!area) {
+       if (!yang_dnode_exists(vty->candidate_config->dnode,
+                              "/frr-isisd:isis/instance[area-tag='%s']",
+                              tag)) {
                vty_out(vty, "ISIS area %s not found.\n", tag);
                return CMD_ERR_NOTHING_TODO;
        }
 
-       nb_cli_enqueue_change(vty, ".", NB_OP_DELETE, NULL);
-       if (area->circuit_list && listcount(area->circuit_list)) {
+       nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
+       area = isis_area_lookup(tag);
+       if (area && area->circuit_list && listcount(area->circuit_list)) {
                for (ALL_LIST_ELEMENTS(area->circuit_list, node, nnode,
                                       circuit)) {
                        /* add callbacks to delete each of the circuits listed
@@ -101,7 +103,7 @@ DEFPY(no_router_isis, no_router_isis_cmd, "no router isis WORD$tag",
                                temp_xpath, XPATH_MAXLEN,
                                "/frr-interface:lib/interface[name='%s'][vrf='%s']/frr-isisd:isis",
                                circuit->interface->name, vrf_name);
-                       nb_cli_enqueue_change(vty, temp_xpath, NB_OP_DELETE,
+                       nb_cli_enqueue_change(vty, temp_xpath, NB_OP_DESTROY,
                                              NULL);
                }
        }
@@ -133,6 +135,7 @@ DEFPY(ip_router_isis, ip_router_isis_cmd, "ip router isis WORD$tag",
        char temp_xpath[XPATH_MAXLEN];
        const char *circ_type;
        struct isis_area *area;
+       struct interface *ifp;
 
        /* area will be created if it is not present. make sure the yang model
         * is synced with FRR and call the appropriate NB cb.
@@ -153,7 +156,7 @@ DEFPY(ip_router_isis, ip_router_isis_cmd, "ip router isis WORD$tag",
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/area-tag",
                                      NB_OP_MODIFY, tag);
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/ipv4-routing",
-                                     NB_OP_CREATE, NULL);
+                                     NB_OP_MODIFY, "true");
                nb_cli_enqueue_change(
                        vty, "./frr-isisd:isis/circuit-type", NB_OP_MODIFY,
                        listcount(isis->area_list) == 0 ? "level-1-2"
@@ -170,17 +173,30 @@ DEFPY(ip_router_isis, ip_router_isis_cmd, "ip router isis WORD$tag",
                case IS_LEVEL_1_AND_2:
                        circ_type = "level-1-2";
                        break;
+               default:
+                       /* just to silence compiler warnings */
+                       return CMD_WARNING_CONFIG_FAILED;
                }
                nb_cli_enqueue_change(vty, "./frr-isisd:isis", NB_OP_CREATE,
                                      NULL);
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/area-tag",
                                      NB_OP_MODIFY, tag);
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/ipv4-routing",
-                                     NB_OP_CREATE, NULL);
+                                     NB_OP_MODIFY, "true");
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/circuit-type",
                                      NB_OP_MODIFY, circ_type);
        }
 
+       /* check if the interface is a loopback and if so set it as passive */
+       pthread_rwlock_rdlock(&running_config->lock);
+       {
+               ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false);
+               if (ifp && if_is_loopback(ifp))
+                       nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive",
+                                             NB_OP_MODIFY, "true");
+       }
+       pthread_rwlock_unlock(&running_config->lock);
+
        return nb_cli_apply_changes(vty, NULL);
 }
 
@@ -193,6 +209,7 @@ DEFPY(ip6_router_isis, ip6_router_isis_cmd, "ipv6 router isis WORD$tag",
        char temp_xpath[XPATH_MAXLEN];
        const char *circ_type;
        struct isis_area *area;
+       struct interface *ifp;
 
        /* area will be created if it is not present. make sure the yang model
         * is synced with FRR and call the appropriate NB cb.
@@ -213,7 +230,7 @@ DEFPY(ip6_router_isis, ip6_router_isis_cmd, "ipv6 router isis WORD$tag",
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/area-tag",
                                      NB_OP_MODIFY, tag);
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/ipv6-routing",
-                                     NB_OP_CREATE, NULL);
+                                     NB_OP_MODIFY, "true");
                nb_cli_enqueue_change(
                        vty, "./frr-isisd:isis/circuit-type", NB_OP_MODIFY,
                        listcount(isis->area_list) == 0 ? "level-1-2"
@@ -230,17 +247,30 @@ DEFPY(ip6_router_isis, ip6_router_isis_cmd, "ipv6 router isis WORD$tag",
                case IS_LEVEL_1_AND_2:
                        circ_type = "level-1-2";
                        break;
+               default:
+                       /* just to silence compiler warnings */
+                       return CMD_WARNING_CONFIG_FAILED;
                }
                nb_cli_enqueue_change(vty, "./frr-isisd:isis", NB_OP_CREATE,
                                      NULL);
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/area-tag",
                                      NB_OP_MODIFY, tag);
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/ipv6-routing",
-                                     NB_OP_CREATE, NULL);
+                                     NB_OP_MODIFY, "true");
                nb_cli_enqueue_change(vty, "./frr-isisd:isis/circuit-type",
                                      NB_OP_MODIFY, circ_type);
        }
 
+       /* check if the interface is a loopback and if so set it as passive */
+       pthread_rwlock_rdlock(&running_config->lock);
+       {
+               ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false);
+               if (ifp && if_is_loopback(ifp))
+                       nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive",
+                                             NB_OP_MODIFY, "true");
+       }
+       pthread_rwlock_unlock(&running_config->lock);
+
        return nb_cli_apply_changes(vty, NULL);
 }
 
@@ -253,36 +283,32 @@ DEFPY(no_ip_router_isis, no_ip_router_isis_cmd,
       "IS-IS routing protocol\n"
       "Routing process tag\n")
 {
-       const struct lyd_node *dnode =
-               yang_dnode_get(running_config->dnode, VTY_CURR_XPATH);
-       struct interface *ifp;
-       struct isis_circuit *circuit = NULL;
+       const struct lyd_node *dnode;
 
-       /* check for the existance of a circuit */
-       if (dnode) {
-               ifp = yang_dnode_get_entry(dnode, false);
-               if (ifp)
-                       circuit = circuit_scan_by_ifp(ifp);
-       }
+       dnode = yang_dnode_get(vty->candidate_config->dnode,
+                              "%s/frr-isisd:isis", VTY_CURR_XPATH);
+       if (!dnode)
+               return CMD_SUCCESS;
 
-       /* if both ipv4 and ipv6 are off delete the interface isis container too
+       /*
+        * If both ipv4 and ipv6 are off delete the interface isis container.
         */
-       if (!strncmp(ip, "ipv6", strlen("ipv6"))) {
-               if (circuit && !circuit->ip_router)
+       if (strmatch(ip, "ipv6")) {
+               if (!yang_dnode_get_bool(dnode, "./ipv4-routing"))
                        nb_cli_enqueue_change(vty, "./frr-isisd:isis",
-                                             NB_OP_DELETE, NULL);
+                                             NB_OP_DESTROY, NULL);
                else
                        nb_cli_enqueue_change(vty,
                                              "./frr-isisd:isis/ipv6-routing",
-                                             NB_OP_DELETE, NULL);
-       } else { /* no ipv4  */
-               if (circuit && !circuit->ipv6_router)
+                                             NB_OP_MODIFY, "false");
+       } else {
+               if (!yang_dnode_get_bool(dnode, "./ipv6-routing"))
                        nb_cli_enqueue_change(vty, "./frr-isisd:isis",
-                                             NB_OP_DELETE, NULL);
+                                             NB_OP_DESTROY, NULL);
                else
                        nb_cli_enqueue_change(vty,
                                              "./frr-isisd:isis/ipv4-routing",
-                                             NB_OP_DELETE, NULL);
+                                             NB_OP_MODIFY, "false");
        }
 
        return nb_cli_apply_changes(vty, NULL);
@@ -291,6 +317,8 @@ DEFPY(no_ip_router_isis, no_ip_router_isis_cmd,
 void cli_show_ip_isis_ipv4(struct vty *vty, struct lyd_node *dnode,
                           bool show_defaults)
 {
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
        vty_out(vty, " ip router isis %s\n",
                yang_dnode_get_string(dnode, "../area-tag"));
 }
@@ -298,6 +326,8 @@ void cli_show_ip_isis_ipv4(struct vty *vty, struct lyd_node *dnode,
 void cli_show_ip_isis_ipv6(struct vty *vty, struct lyd_node *dnode,
                           bool show_defaults)
 {
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
        vty_out(vty, " ipv6 router isis %s\n",
                yang_dnode_get_string(dnode, "../area-tag"));
 }
@@ -311,7 +341,7 @@ DEFPY(net, net_cmd, "[no] net WORD",
       "XX.XXXX. ... .XXX.XX  Network entity title (NET)\n")
 {
        nb_cli_enqueue_change(vty, "./area-address",
-                             no ? NB_OP_DELETE : NB_OP_CREATE, net);
+                             no ? NB_OP_DESTROY : NB_OP_CREATE, net);
 
        return nb_cli_apply_changes(vty, NULL);
 }
@@ -346,20 +376,26 @@ DEFPY(no_is_type, no_is_type_cmd,
       "Act as both a station router and an area router\n"
       "Act as an area router only\n")
 {
-       const char *value = NULL;
-       const struct lyd_node *dnode =
-               yang_dnode_get(running_config->dnode, VTY_CURR_XPATH);
-       struct isis_area *area = yang_dnode_get_entry(dnode, false);
+       const char *value;
+
+       pthread_rwlock_rdlock(&running_config->lock);
+       {
+               struct isis_area *area;
+
+               area = nb_running_get_entry(NULL, VTY_CURR_XPATH, false);
+
+               /*
+                * Put the is-type back to defaults:
+                * - level-1-2 on first area
+                * - level-1 for the rest
+                */
+               if (area && listgetdata(listhead(isis->area_list)) == area)
+                       value = "level-1-2";
+               else
+                       value = NULL;
+       }
+       pthread_rwlock_unlock(&running_config->lock);
 
-       /*
-        * Put the is-type back to defaults:
-        * - level-1-2 on first area
-        * - level-1 for the rest
-        */
-       if (area && listgetdata(listhead(isis->area_list)) == area)
-               value = "level-1-2";
-       else
-               value = NULL;
        nb_cli_enqueue_change(vty, "./is-type", NB_OP_MODIFY, value);
 
        return nb_cli_apply_changes(vty, NULL);
@@ -413,8 +449,8 @@ DEFPY(set_overload_bit, set_overload_bit_cmd, "[no] set-overload-bit",
       "Reset overload bit to accept transit traffic\n"
       "Set overload bit to avoid any transit traffic\n")
 {
-       nb_cli_enqueue_change(vty, "./overload",
-                             no ? NB_OP_DELETE : NB_OP_CREATE, NULL);
+       nb_cli_enqueue_change(vty, "./overload", NB_OP_MODIFY,
+                             no ? "false" : "true");
 
        return nb_cli_apply_changes(vty, NULL);
 }
@@ -422,6 +458,8 @@ DEFPY(set_overload_bit, set_overload_bit_cmd, "[no] set-overload-bit",
 void cli_show_isis_overload(struct vty *vty, struct lyd_node *dnode,
                            bool show_defaults)
 {
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
        vty_out(vty, " set-overload-bit\n");
 }
 
@@ -432,8 +470,8 @@ DEFPY(set_attached_bit, set_attached_bit_cmd, "[no] set-attached-bit",
       "Reset attached bit\n"
       "Set attached bit to identify as L1/L2 router for inter-area traffic\n")
 {
-       nb_cli_enqueue_change(vty, "./attached",
-                             no ? NB_OP_DELETE : NB_OP_CREATE, NULL);
+       nb_cli_enqueue_change(vty, "./attached", NB_OP_MODIFY,
+                             no ? "false" : "true");
 
        return nb_cli_apply_changes(vty, NULL);
 }
@@ -441,6 +479,8 @@ DEFPY(set_attached_bit, set_attached_bit_cmd, "[no] set-attached-bit",
 void cli_show_isis_attached(struct vty *vty, struct lyd_node *dnode,
                            bool show_defaults)
 {
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
        vty_out(vty, " set-attached-bit\n");
 }
 
@@ -448,7 +488,7 @@ void cli_show_isis_attached(struct vty *vty, struct lyd_node *dnode,
  * XPath: /frr-isisd:isis/instance/metric-style
  */
 DEFPY(metric_style, metric_style_cmd,
-         "metric-style <narrow|transition|wide>$style",
+      "metric-style <narrow|transition|wide>$style",
       "Use old-style (ISO 10589) or new-style packet formats\n"
       "Use old style of TLVs with narrow metric\n"
       "Send and accept both styles of TLVs during transition\n"
@@ -460,9 +500,9 @@ DEFPY(metric_style, metric_style_cmd,
 }
 
 DEFPY(no_metric_style, no_metric_style_cmd,
-         "no metric-style [narrow|transition|wide]",
-         NO_STR
-         "Use old-style (ISO 10589) or new-style packet formats\n"
+      "no metric-style [narrow|transition|wide]",
+      NO_STR
+      "Use old-style (ISO 10589) or new-style packet formats\n"
       "Use old style of TLVs with narrow metric\n"
       "Send and accept both styles of TLVs during transition\n"
       "Use new style of TLVs to carry wider metric\n")
@@ -560,7 +600,7 @@ DEFPY(no_area_passwd, no_area_passwd_cmd,
       "Configure the authentication password for an area\n"
       "Set the authentication password for a routing domain\n")
 {
-       nb_cli_enqueue_change(vty, ".", NB_OP_DELETE, NULL);
+       nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, "./%s", cmd);
 }
@@ -851,7 +891,7 @@ DEFPY(spf_delay_ietf, spf_delay_ietf_cmd,
 DEFPY(no_spf_delay_ietf, no_spf_delay_ietf_cmd,
       "no spf-delay-ietf [init-delay (0-60000) short-delay (0-60000) long-delay (0-60000) holddown (0-60000) time-to-learn (0-60000)]",
       NO_STR
-         "IETF SPF delay algorithm\n"
+      "IETF SPF delay algorithm\n"
       "Delay used while in QUIET state\n"
       "Delay used while in QUIET state in milliseconds\n"
       "Delay used while in SHORT_WAIT state\n"
@@ -863,7 +903,7 @@ DEFPY(no_spf_delay_ietf, no_spf_delay_ietf_cmd,
       "Maximum duration needed to learn all the events related to a single failure\n"
       "Maximum duration needed to learn all the events related to a single failure (in milliseconds)\n")
 {
-       nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay", NB_OP_DELETE,
+       nb_cli_enqueue_change(vty, "./spf/ietf-backoff-delay", NB_OP_DESTROY,
                              NULL);
 
        return nb_cli_apply_changes(vty, NULL);
@@ -887,8 +927,8 @@ void cli_show_isis_spf_ietf_backoff(struct vty *vty, struct lyd_node *dnode,
 DEFPY(area_purge_originator, area_purge_originator_cmd, "[no] purge-originator",
       NO_STR "Use the RFC 6232 purge-originator\n")
 {
-       nb_cli_enqueue_change(vty, "./purge-originator",
-                             no ? NB_OP_DELETE : NB_OP_CREATE, NULL);
+       nb_cli_enqueue_change(vty, "./purge-originator", NB_OP_MODIFY,
+                             no ? "false" : "true");
 
        return nb_cli_apply_changes(vty, NULL);
 }
@@ -896,16 +936,18 @@ DEFPY(area_purge_originator, area_purge_originator_cmd, "[no] purge-originator",
 void cli_show_isis_purge_origin(struct vty *vty, struct lyd_node *dnode,
                                bool show_defaults)
 {
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
        vty_out(vty, " purge-originator\n");
 }
 
 /*
- * XPath: /frr-isisd:isis/mpls-te
+ * XPath: /frr-isisd:isis/instance/mpls-te
  */
 DEFPY(isis_mpls_te_on, isis_mpls_te_on_cmd, "mpls-te on",
       MPLS_TE_STR "Enable the MPLS-TE functionality\n")
 {
-       nb_cli_enqueue_change(vty, "/frr-isisd:isis/mpls-te", NB_OP_CREATE,
+       nb_cli_enqueue_change(vty, "./mpls-te", NB_OP_CREATE,
                              NULL);
 
        return nb_cli_apply_changes(vty, NULL);
@@ -914,9 +956,9 @@ DEFPY(isis_mpls_te_on, isis_mpls_te_on_cmd, "mpls-te on",
 DEFPY(no_isis_mpls_te_on, no_isis_mpls_te_on_cmd, "no mpls-te [on]",
       NO_STR
       "Disable the MPLS-TE functionality\n"
-      "Enable the MPLS-TE functionality\n")
+      "Disable the MPLS-TE functionality\n")
 {
-       nb_cli_enqueue_change(vty, "/frr-isisd:isis/mpls-te", NB_OP_DELETE,
+       nb_cli_enqueue_change(vty, "./mpls-te", NB_OP_DESTROY,
                              NULL);
 
        return nb_cli_apply_changes(vty, NULL);
@@ -929,7 +971,7 @@ void cli_show_isis_mpls_te(struct vty *vty, struct lyd_node *dnode,
 }
 
 /*
- * XPath: /frr-isisd:isis/mpls-te/router-address
+ * XPath: /frr-isisd:isis/instance/mpls-te/router-address
  */
 DEFPY(isis_mpls_te_router_addr, isis_mpls_te_router_addr_cmd,
       "mpls-te router-address A.B.C.D",
@@ -937,12 +979,24 @@ DEFPY(isis_mpls_te_router_addr, isis_mpls_te_router_addr_cmd,
       "Stable IP address of the advertising router\n"
       "MPLS-TE router address in IPv4 address format\n")
 {
-       nb_cli_enqueue_change(vty, "/frr-isisd:isis/mpls-te/router-address",
+       nb_cli_enqueue_change(vty, "./mpls-te/router-address",
                              NB_OP_MODIFY, router_address_str);
 
        return nb_cli_apply_changes(vty, NULL);
 }
 
+DEFPY(no_isis_mpls_te_router_addr, no_isis_mpls_te_router_addr_cmd,
+      "no mpls-te router-address [A.B.C.D]",
+      NO_STR MPLS_TE_STR
+      "Delete IP address of the advertising router\n"
+      "MPLS-TE router address in IPv4 address format\n")
+{
+       nb_cli_enqueue_change(vty, "./mpls-te/router-address",
+                             NB_OP_DESTROY, NULL);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
 void cli_show_isis_mpls_te_router_addr(struct vty *vty, struct lyd_node *dnode,
                                       bool show_defaults)
 {
@@ -958,7 +1012,7 @@ DEFPY(isis_mpls_te_inter_as, isis_mpls_te_inter_as_cmd,
       "AREA native mode self originate INTER-AS LSP with L1 and L2 flooding scope\n"
       "AS native mode self originate INTER-AS LSP with L2 only flooding scope\n")
 {
-       vty_out(vty, "MPLS-TE Inter-AS is not yet supported.");
+       vty_out(vty, "MPLS-TE Inter-AS is not yet supported\n");
        return CMD_SUCCESS;
 }
 
@@ -968,7 +1022,7 @@ DEFPY(isis_mpls_te_inter_as, isis_mpls_te_inter_as_cmd,
 DEFPY(isis_default_originate, isis_default_originate_cmd,
       "[no] default-information originate <ipv4|ipv6>$ip"
       " <level-1|level-2>$level [always]$always"
-      " [<metric (0-16777215)$metric|route-map WORD$rmap>]",
+      " [{metric (0-16777215)$metric|route-map WORD$rmap}]",
       NO_STR
       "Control distribution of default information\n"
       "Distribute a default route\n"
@@ -983,18 +1037,16 @@ DEFPY(isis_default_originate, isis_default_originate_cmd,
       "Pointer to route-map entries\n")
 {
        if (no)
-               nb_cli_enqueue_change(vty, ".", NB_OP_DELETE, NULL);
+               nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
        else {
                nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
-               nb_cli_enqueue_change(vty, "./always",
-                                     always ? NB_OP_CREATE : NB_OP_DELETE,
-                                     NULL);
+               nb_cli_enqueue_change(vty, "./always", NB_OP_MODIFY,
+                                     always ? "true" : "false");
                nb_cli_enqueue_change(vty, "./route-map",
-                                     rmap ? NB_OP_MODIFY : NB_OP_DELETE,
+                                     rmap ? NB_OP_MODIFY : NB_OP_DESTROY,
                                      rmap ? rmap : NULL);
-               nb_cli_enqueue_change(vty, "./metric",
-                                     metric ? NB_OP_MODIFY : NB_OP_DELETE,
-                                     metric ? metric_str : NULL);
+               nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY,
+                                     metric_str ? metric_str : NULL);
                if (strmatch(ip, "ipv6") && !always) {
                        vty_out(vty,
                                "Zebra doesn't implement default-originate for IPv6 yet\n");
@@ -1009,22 +1061,20 @@ DEFPY(isis_default_originate, isis_default_originate_cmd,
 }
 
 static void vty_print_def_origin(struct vty *vty, struct lyd_node *dnode,
-                                const char *family, const char *level, bool show_defaults)
+                                const char *family, const char *level,
+                                bool show_defaults)
 {
-       const char *metric;
-
        vty_out(vty, " default-information originate %s %s", family, level);
-       if (yang_dnode_exists(dnode, "./always"))
+       if (yang_dnode_get_bool(dnode, "./always"))
                vty_out(vty, " always");
 
        if (yang_dnode_exists(dnode, "./route-map"))
                vty_out(vty, " route-map %s",
                        yang_dnode_get_string(dnode, "./route-map"));
-       else if (yang_dnode_exists(dnode, "./metric")) {
-               metric = yang_dnode_get_string(dnode, "./metric");
-               if (show_defaults || !yang_dnode_is_default(dnode, "./metric"))
-                       vty_out(vty, " metric %s", metric);
-       }
+       if (show_defaults || !yang_dnode_is_default(dnode, "./metric"))
+               vty_out(vty, " metric %s",
+                       yang_dnode_get_string(dnode, "./metric"));
+
        vty_out(vty, "\n");
 }
 
@@ -1051,7 +1101,7 @@ DEFPY(isis_redistribute, isis_redistribute_cmd,
       "[no] redistribute <ipv4|ipv6>$ip " PROTO_REDIST_STR
       "$proto"
       " <level-1|level-2>$level"
-      " [<metric (0-16777215)|route-map WORD>]",
+      " [{metric (0-16777215)|route-map WORD}]",
       NO_STR REDIST_STR
       "Redistribute IPv4 routes\n"
       "Redistribute IPv6 routes\n" PROTO_REDIST_HELP
@@ -1063,15 +1113,14 @@ DEFPY(isis_redistribute, isis_redistribute_cmd,
       "Pointer to route-map entries\n")
 {
        if (no)
-               nb_cli_enqueue_change(vty, ".", NB_OP_DELETE, NULL);
+               nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
        else {
                nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
                nb_cli_enqueue_change(vty, "./route-map",
-                                     route_map ? NB_OP_MODIFY : NB_OP_DELETE,
+                                     route_map ? NB_OP_MODIFY : NB_OP_DESTROY,
                                      route_map ? route_map : NULL);
-               nb_cli_enqueue_change(vty, "./metric",
-                                     metric ? NB_OP_MODIFY : NB_OP_DELETE,
-                                     metric ? metric_str : NULL);
+               nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY,
+                                     metric_str ? metric_str : NULL);
        }
 
        return nb_cli_apply_changes(
@@ -1080,16 +1129,16 @@ DEFPY(isis_redistribute, isis_redistribute_cmd,
 }
 
 static void vty_print_redistribute(struct vty *vty, struct lyd_node *dnode,
-                                  const char *family)
+                                  bool show_defaults, const char *family)
 {
        const char *level = yang_dnode_get_string(dnode, "./level");
        const char *protocol = yang_dnode_get_string(dnode, "./protocol");
 
        vty_out(vty, " redistribute %s %s %s", family, protocol, level);
-       if (yang_dnode_exists(dnode, "./metric"))
+       if (show_defaults || !yang_dnode_is_default(dnode, "./metric"))
                vty_out(vty, " metric %s",
                        yang_dnode_get_string(dnode, "./metric"));
-       else if (yang_dnode_exists(dnode, "./route-map"))
+       if (yang_dnode_exists(dnode, "./route-map"))
                vty_out(vty, " route-map %s",
                        yang_dnode_get_string(dnode, "./route-map"));
        vty_out(vty, "\n");
@@ -1098,12 +1147,12 @@ static void vty_print_redistribute(struct vty *vty, struct lyd_node *dnode,
 void cli_show_isis_redistribute_ipv4(struct vty *vty, struct lyd_node *dnode,
                                     bool show_defaults)
 {
-       vty_print_redistribute(vty, dnode, "ipv4");
+       vty_print_redistribute(vty, dnode, show_defaults, "ipv4");
 }
 void cli_show_isis_redistribute_ipv6(struct vty *vty, struct lyd_node *dnode,
                                     bool show_defaults)
 {
-       vty_print_redistribute(vty, dnode, "ipv6");
+       vty_print_redistribute(vty, dnode, show_defaults, "ipv6");
 }
 
 /*
@@ -1151,12 +1200,11 @@ DEFPY(isis_topology, isis_topology_cmd,
                         topology);
 
        if (no)
-               nb_cli_enqueue_change(vty, ".", NB_OP_DELETE, NULL);
+               nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
        else {
                nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
-               nb_cli_enqueue_change(vty, "./overload",
-                                     overload ? NB_OP_CREATE : NB_OP_DELETE,
-                                     NULL);
+               nb_cli_enqueue_change(vty, "./overload", NB_OP_MODIFY,
+                                     overload ? "true" : "false");
        }
 
        return nb_cli_apply_changes(vty, base_xpath);
@@ -1166,7 +1214,7 @@ void cli_show_isis_mt_ipv4_multicast(struct vty *vty, struct lyd_node *dnode,
                                     bool show_defaults)
 {
        vty_out(vty, " topology ipv4-multicast");
-       if (yang_dnode_exists(dnode, "./overload"))
+       if (yang_dnode_get_bool(dnode, "./overload"))
                vty_out(vty, " overload");
        vty_out(vty, "\n");
 }
@@ -1175,7 +1223,7 @@ void cli_show_isis_mt_ipv4_mgmt(struct vty *vty, struct lyd_node *dnode,
                                bool show_defaults)
 {
        vty_out(vty, " topology ipv4-mgmt");
-       if (yang_dnode_exists(dnode, "./overload"))
+       if (yang_dnode_get_bool(dnode, "./overload"))
                vty_out(vty, " overload");
        vty_out(vty, "\n");
 }
@@ -1184,7 +1232,7 @@ void cli_show_isis_mt_ipv6_unicast(struct vty *vty, struct lyd_node *dnode,
                                   bool show_defaults)
 {
        vty_out(vty, " topology ipv6-unicast");
-       if (yang_dnode_exists(dnode, "./overload"))
+       if (yang_dnode_get_bool(dnode, "./overload"))
                vty_out(vty, " overload");
        vty_out(vty, "\n");
 }
@@ -1193,7 +1241,7 @@ void cli_show_isis_mt_ipv6_multicast(struct vty *vty, struct lyd_node *dnode,
                                     bool show_defaults)
 {
        vty_out(vty, " topology ipv6-multicast");
-       if (yang_dnode_exists(dnode, "./overload"))
+       if (yang_dnode_get_bool(dnode, "./overload"))
                vty_out(vty, " overload");
        vty_out(vty, "\n");
 }
@@ -1202,7 +1250,7 @@ void cli_show_isis_mt_ipv6_mgmt(struct vty *vty, struct lyd_node *dnode,
                                bool show_defaults)
 {
        vty_out(vty, " topology ipv6-mgmt");
-       if (yang_dnode_exists(dnode, "./overload"))
+       if (yang_dnode_get_bool(dnode, "./overload"))
                vty_out(vty, " overload");
        vty_out(vty, "\n");
 }
@@ -1211,7 +1259,7 @@ void cli_show_isis_mt_ipv6_dstsrc(struct vty *vty, struct lyd_node *dnode,
                                  bool show_defaults)
 {
        vty_out(vty, " topology ipv6-dstsrc");
-       if (yang_dnode_exists(dnode, "./overload"))
+       if (yang_dnode_get_bool(dnode, "./overload"))
                vty_out(vty, " overload");
        vty_out(vty, "\n");
 }
@@ -1224,8 +1272,8 @@ DEFPY(isis_passive, isis_passive_cmd, "[no] isis passive",
       "IS-IS routing protocol\n"
       "Configure the passive mode for interface\n")
 {
-       nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive",
-                             no ? NB_OP_DELETE : NB_OP_CREATE, NULL);
+       nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive", NB_OP_MODIFY,
+                             no ? "false" : "true");
 
        return nb_cli_apply_changes(vty, NULL);
 }
@@ -1233,6 +1281,8 @@ DEFPY(isis_passive, isis_passive_cmd, "[no] isis passive",
 void cli_show_ip_isis_passive(struct vty *vty, struct lyd_node *dnode,
                              bool show_defaults)
 {
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
        vty_out(vty, " isis passive\n");
 }
 
@@ -1265,7 +1315,7 @@ DEFPY(no_isis_passwd, no_isis_passwd_cmd, "no isis password [<md5|clear> WORD]",
       "Cleartext password\n"
       "Circuit password\n")
 {
-       nb_cli_enqueue_change(vty, "./frr-isisd:isis/password", NB_OP_DELETE,
+       nb_cli_enqueue_change(vty, "./frr-isisd:isis/password", NB_OP_DESTROY,
                              NULL);
 
        return nb_cli_apply_changes(vty, NULL);
@@ -1449,6 +1499,448 @@ void cli_show_ip_isis_hello_multi(struct vty *vty, struct lyd_node *dnode,
        }
 }
 
+/*
+ * XPath:
+ * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
+ */
+DEFPY(isis_threeway_adj, isis_threeway_adj_cmd, "[no] isis three-way-handshake",
+      NO_STR
+      "IS-IS commands\n"
+      "Enable/Disable three-way handshake\n")
+{
+       nb_cli_enqueue_change(vty,
+                             "./frr-isisd:isis/disable-three-way-handshake",
+                             NB_OP_MODIFY, no ? "true" : "false");
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_threeway_shake(struct vty *vty, struct lyd_node *dnode,
+                                    bool show_defaults)
+{
+       if (yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis three-way-handshake\n");
+}
+
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/padding
+ */
+DEFPY(isis_hello_padding, isis_hello_padding_cmd, "[no] isis hello padding",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Add padding to IS-IS hello packets\n"
+      "Pad hello packets\n")
+{
+       nb_cli_enqueue_change(vty, "./frr-isisd:isis/hello/padding",
+                             NB_OP_MODIFY, no ? "false" : "true");
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_hello_padding(struct vty *vty, struct lyd_node *dnode,
+                                   bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+
+       vty_out(vty, " isis hello padding\n");
+}
+
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval
+ */
+DEFPY(csnp_interval, csnp_interval_cmd,
+      "isis csnp-interval (1-600)$intv [level-1|level-2]$level",
+      "IS-IS routing protocol\n"
+      "Set CSNP interval in seconds\n"
+      "CSNP interval value\n"
+      "Specify interval for level-1 CSNPs\n"
+      "Specify interval for level-2 CSNPs\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/csnp-interval/level-1",
+                                     NB_OP_MODIFY, intv_str);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/csnp-interval/level-2",
+                                     NB_OP_MODIFY, intv_str);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY(no_csnp_interval, no_csnp_interval_cmd,
+      "no isis csnp-interval [(1-600)] [level-1|level-2]$level",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Set CSNP interval in seconds\n"
+      "CSNP interval value\n"
+      "Specify interval for level-1 CSNPs\n"
+      "Specify interval for level-2 CSNPs\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/csnp-interval/level-1",
+                                     NB_OP_MODIFY, NULL);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/csnp-interval/level-2",
+                                     NB_OP_MODIFY, NULL);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_csnp_interval(struct vty *vty, struct lyd_node *dnode,
+                                   bool show_defaults)
+{
+       const char *l1 = yang_dnode_get_string(dnode, "./level-1");
+       const char *l2 = yang_dnode_get_string(dnode, "./level-2");
+
+       if (strmatch(l1, l2))
+               vty_out(vty, " isis csnp-interval %s\n", l1);
+       else {
+               vty_out(vty, " isis csnp-interval %s level-1\n", l1);
+               vty_out(vty, " isis csnp-interval %s level-2\n", l2);
+       }
+}
+
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/psnp-interval
+ */
+DEFPY(psnp_interval, psnp_interval_cmd,
+      "isis psnp-interval (1-120)$intv [level-1|level-2]$level",
+      "IS-IS routing protocol\n"
+      "Set PSNP interval in seconds\n"
+      "PSNP interval value\n"
+      "Specify interval for level-1 PSNPs\n"
+      "Specify interval for level-2 PSNPs\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/psnp-interval/level-1",
+                                     NB_OP_MODIFY, intv_str);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/psnp-interval/level-2",
+                                     NB_OP_MODIFY, intv_str);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY(no_psnp_interval, no_psnp_interval_cmd,
+      "no isis psnp-interval [(1-120)] [level-1|level-2]$level",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Set PSNP interval in seconds\n"
+      "PSNP interval value\n"
+      "Specify interval for level-1 PSNPs\n"
+      "Specify interval for level-2 PSNPs\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/psnp-interval/level-1",
+                                     NB_OP_MODIFY, NULL);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty,
+                                     "./frr-isisd:isis/psnp-interval/level-2",
+                                     NB_OP_MODIFY, NULL);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_psnp_interval(struct vty *vty, struct lyd_node *dnode,
+                                   bool show_defaults)
+{
+       const char *l1 = yang_dnode_get_string(dnode, "./level-1");
+       const char *l2 = yang_dnode_get_string(dnode, "./level-2");
+
+       if (strmatch(l1, l2))
+               vty_out(vty, " isis psnp-interval %s\n", l1);
+       else {
+               vty_out(vty, " isis psnp-interval %s level-1\n", l1);
+               vty_out(vty, " isis psnp-interval %s level-2\n", l2);
+       }
+}
+
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology
+ */
+DEFPY(circuit_topology, circuit_topology_cmd,
+      "[no] isis topology"
+      "<ipv4-unicast"
+      "|ipv4-mgmt"
+      "|ipv6-unicast"
+      "|ipv4-multicast"
+      "|ipv6-multicast"
+      "|ipv6-mgmt"
+      "|ipv6-dstsrc"
+      ">$topology",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Configure interface IS-IS topologies\n"
+      "IPv4 unicast topology\n"
+      "IPv4 management topology\n"
+      "IPv6 unicast topology\n"
+      "IPv4 multicast topology\n"
+      "IPv6 multicast topology\n"
+      "IPv6 management topology\n"
+      "IPv6 dst-src topology\n")
+{
+       nb_cli_enqueue_change(vty, ".", NB_OP_MODIFY, no ? "false" : "true");
+
+       if (strmatch(topology, "ipv4-mgmt"))
+               return nb_cli_apply_changes(
+                       vty, "./frr-isisd:isis/multi-topology/ipv4-management");
+       else if (strmatch(topology, "ipv6-mgmt"))
+               return nb_cli_apply_changes(
+                       vty, "./frr-isisd:isis/multi-topology/ipv6-management");
+       else
+               return nb_cli_apply_changes(
+                       vty, "./frr-isisd:isis/multi-topology/%s", topology);
+}
+
+void cli_show_ip_isis_mt_ipv4_unicast(struct vty *vty, struct lyd_node *dnode,
+                                     bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis topology ipv4-unicast\n");
+}
+
+void cli_show_ip_isis_mt_ipv4_multicast(struct vty *vty, struct lyd_node *dnode,
+                                       bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis topology ipv4-multicast\n");
+}
+
+void cli_show_ip_isis_mt_ipv4_mgmt(struct vty *vty, struct lyd_node *dnode,
+                                  bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis topology ipv4-mgmt\n");
+}
+
+void cli_show_ip_isis_mt_ipv6_unicast(struct vty *vty, struct lyd_node *dnode,
+                                     bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis topology ipv6-unicast\n");
+}
+
+void cli_show_ip_isis_mt_ipv6_multicast(struct vty *vty, struct lyd_node *dnode,
+                                       bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis topology ipv6-multicast\n");
+}
+
+void cli_show_ip_isis_mt_ipv6_mgmt(struct vty *vty, struct lyd_node *dnode,
+                                  bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis topology ipv6-mgmt\n");
+}
+
+void cli_show_ip_isis_mt_ipv6_dstsrc(struct vty *vty, struct lyd_node *dnode,
+                                    bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " isis topology ipv6-dstsrc\n");
+}
+
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/circuit-type
+ */
+DEFPY(isis_circuit_type, isis_circuit_type_cmd,
+      "isis circuit-type <level-1|level-1-2|level-2-only>$type",
+      "IS-IS routing protocol\n"
+      "Configure circuit type for interface\n"
+      "Level-1 only adjacencies are formed\n"
+      "Level-1-2 adjacencies are formed\n"
+      "Level-2 only adjacencies are formed\n")
+{
+       nb_cli_enqueue_change(
+               vty, "./frr-isisd:isis/circuit-type", NB_OP_MODIFY,
+               strmatch(type, "level-2-only") ? "level-2" : type);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY(no_isis_circuit_type, no_isis_circuit_type_cmd,
+      "no isis circuit-type [level-1|level-1-2|level-2-only]",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Configure circuit type for interface\n"
+      "Level-1 only adjacencies are formed\n"
+      "Level-1-2 adjacencies are formed\n"
+      "Level-2 only adjacencies are formed\n")
+{
+       const char *circ_type = NULL;
+
+       /*
+        * Default value depends on whether the circuit is part of an area,
+        * and the is-type of the area if there is one. So we need to do this
+        * here.
+        */
+       pthread_rwlock_rdlock(&running_config->lock);
+       {
+               struct interface *ifp;
+               struct isis_circuit *circuit;
+
+               ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false);
+               if (!ifp)
+                       goto unlock;
+
+               circuit = circuit_scan_by_ifp(ifp);
+               if (!circuit || circuit->state != C_STATE_UP)
+                       goto unlock;
+
+               switch (circuit->area->is_type) {
+               case IS_LEVEL_1:
+                       circ_type = "level-1";
+                       break;
+               case IS_LEVEL_2:
+                       circ_type = "level-2";
+                       break;
+               case IS_LEVEL_1_AND_2:
+                       circ_type = "level-1-2";
+                       break;
+               }
+       }
+unlock:
+       pthread_rwlock_unlock(&running_config->lock);
+
+       nb_cli_enqueue_change(vty, "./frr-isisd:isis/circuit-type",
+                             NB_OP_MODIFY, circ_type);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_circ_type(struct vty *vty, struct lyd_node *dnode,
+                               bool show_defaults)
+{
+       int level = yang_dnode_get_enum(dnode, NULL);
+
+       switch (level) {
+       case IS_LEVEL_1:
+               vty_out(vty, " isis circuit-type level-1\n");
+               break;
+       case IS_LEVEL_2:
+               vty_out(vty, " isis circuit-type level-2-only\n");
+               break;
+       case IS_LEVEL_1_AND_2:
+               vty_out(vty, " isis circuit-type level-1-2\n");
+               break;
+       }
+}
+
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
+ */
+DEFPY(isis_network, isis_network_cmd, "[no] isis network point-to-point",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Set network type\n"
+      "point-to-point network type\n")
+{
+       nb_cli_enqueue_change(vty, "./frr-isisd:isis/network-type",
+                             NB_OP_MODIFY,
+                             no ? "broadcast" : "point-to-point");
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_network_type(struct vty *vty, struct lyd_node *dnode,
+                                  bool show_defaults)
+{
+       if (yang_dnode_get_enum(dnode, NULL) != CIRCUIT_T_P2P)
+               vty_out(vty, " no");
+
+       vty_out(vty, " isis network point-to-point\n");
+}
+
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/priority
+ */
+DEFPY(isis_priority, isis_priority_cmd,
+      "isis priority (0-127)$prio [level-1|level-2]$level",
+      "IS-IS routing protocol\n"
+      "Set priority for Designated Router election\n"
+      "Priority value\n"
+      "Specify priority for level-1 routing\n"
+      "Specify priority for level-2 routing\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-1",
+                                     NB_OP_MODIFY, prio_str);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-2",
+                                     NB_OP_MODIFY, prio_str);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY(no_isis_priority, no_isis_priority_cmd,
+      "no isis priority [(0-127)] [level-1|level-2]$level",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Set priority for Designated Router election\n"
+      "Priority value\n"
+      "Specify priority for level-1 routing\n"
+      "Specify priority for level-2 routing\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-1",
+                                     NB_OP_MODIFY, NULL);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/priority/level-2",
+                                     NB_OP_MODIFY, NULL);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_priority(struct vty *vty, struct lyd_node *dnode,
+                              bool show_defaults)
+{
+       const char *l1 = yang_dnode_get_string(dnode, "./level-1");
+       const char *l2 = yang_dnode_get_string(dnode, "./level-2");
+
+       if (strmatch(l1, l2))
+               vty_out(vty, " isis priority %s\n", l1);
+       else {
+               vty_out(vty, " isis priority %s level-1\n", l1);
+               vty_out(vty, " isis priority %s level-2\n", l2);
+       }
+}
+
+/*
+ * XPath: /frr-isisd:isis/instance/log-adjacency-changes
+ */
+DEFPY(log_adj_changes, log_adj_changes_cmd, "[no] log-adjacency-changes",
+      NO_STR "Log changes in adjacency state\n")
+{
+       nb_cli_enqueue_change(vty, "./log-adjacency-changes", NB_OP_MODIFY,
+                             no ? "false" : "true");
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_isis_log_adjacency(struct vty *vty, struct lyd_node *dnode,
+                                bool show_defaults)
+{
+       if (!yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " no");
+       vty_out(vty, " log-adjacency-changes\n");
+}
+
 void isis_cli_init(void)
 {
        install_element(CONFIG_NODE, &router_isis_cmd);
@@ -1494,6 +1986,7 @@ void isis_cli_init(void)
        install_element(ISIS_NODE, &isis_mpls_te_on_cmd);
        install_element(ISIS_NODE, &no_isis_mpls_te_on_cmd);
        install_element(ISIS_NODE, &isis_mpls_te_router_addr_cmd);
+       install_element(ISIS_NODE, &no_isis_mpls_te_router_addr_cmd);
        install_element(ISIS_NODE, &isis_mpls_te_inter_as_cmd);
 
        install_element(ISIS_NODE, &isis_default_originate_cmd);
@@ -1514,6 +2007,28 @@ void isis_cli_init(void)
 
        install_element(INTERFACE_NODE, &isis_hello_multiplier_cmd);
        install_element(INTERFACE_NODE, &no_isis_hello_multiplier_cmd);
+
+       install_element(INTERFACE_NODE, &isis_threeway_adj_cmd);
+
+       install_element(INTERFACE_NODE, &isis_hello_padding_cmd);
+
+       install_element(INTERFACE_NODE, &csnp_interval_cmd);
+       install_element(INTERFACE_NODE, &no_csnp_interval_cmd);
+
+       install_element(INTERFACE_NODE, &psnp_interval_cmd);
+       install_element(INTERFACE_NODE, &no_psnp_interval_cmd);
+
+       install_element(INTERFACE_NODE, &circuit_topology_cmd);
+
+       install_element(INTERFACE_NODE, &isis_circuit_type_cmd);
+       install_element(INTERFACE_NODE, &no_isis_circuit_type_cmd);
+
+       install_element(INTERFACE_NODE, &isis_network_cmd);
+
+       install_element(INTERFACE_NODE, &isis_priority_cmd);
+       install_element(INTERFACE_NODE, &no_isis_priority_cmd);
+
+       install_element(ISIS_NODE, &log_adj_changes_cmd);
 }
 
 #endif /* ifndef FABRICD */