const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ bool old_metric, new_metric;
+ enum isis_metric_style metric_style = yang_dnode_get_enum(dnode, NULL);
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ old_metric = (metric_style == ISIS_WIDE_METRIC) ? false : true;
+ new_metric = (metric_style == ISIS_NARROW_METRIC) ? false : true;
+ isis_area_metricstyle_set(area, old_metric, new_metric);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ area->purge_originator = true;
+
return NB_OK;
}
static int isis_instance_purge_originator_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ area->purge_originator = false;
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct listnode *node;
+ struct isis_circuit *circuit;
+ uint16_t lsp_mtu = yang_dnode_get_uint16(dnode, NULL);
+ struct isis_area *area;
+
+ switch (event) {
+ case NB_EV_VALIDATE:
+ area = yang_dnode_get_entry(dnode, false);
+ if (!area)
+ break;
+ for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
+ if (circuit->state != C_STATE_INIT
+ && circuit->state != C_STATE_UP)
+ continue;
+ if (lsp_mtu > isis_circuit_pdu_size(circuit)) {
+ flog_warn(
+ EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "ISIS area contains circuit %s, which has a maximum PDU size of %zu",
+ circuit->interface->name,
+ isis_circuit_pdu_size(circuit));
+ return NB_ERR_VALIDATION;
+ }
+ }
+ break;
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ break;
+ case NB_EV_APPLY:
+ area = yang_dnode_get_entry(dnode, true);
+ isis_area_lsp_mtu_set(area, lsp_mtu);
+ break;
+ }
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ uint16_t refr_int;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ refr_int = yang_dnode_get_uint16(dnode, NULL);
+ area = yang_dnode_get_entry(dnode, true);
+ isis_area_lsp_refresh_set(area, IS_LEVEL_1, refr_int);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ uint16_t refr_int;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ refr_int = yang_dnode_get_uint16(dnode, NULL);
+ area = yang_dnode_get_entry(dnode, true);
+ isis_area_lsp_refresh_set(area, IS_LEVEL_2, refr_int);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ uint16_t max_lt;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ max_lt = yang_dnode_get_uint16(dnode, NULL);
+ area = yang_dnode_get_entry(dnode, true);
+ isis_area_max_lsp_lifetime_set(area, IS_LEVEL_1, max_lt);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ uint16_t max_lt;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ max_lt = yang_dnode_get_uint16(dnode, NULL);
+ area = yang_dnode_get_entry(dnode, true);
+ isis_area_max_lsp_lifetime_set(area, IS_LEVEL_2, max_lt);
+
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ uint16_t gen_int;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ gen_int = yang_dnode_get_uint16(dnode, NULL);
+ area = yang_dnode_get_entry(dnode, true);
+ area->lsp_gen_interval[0] = gen_int;
+
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ uint16_t gen_int;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ gen_int = yang_dnode_get_uint16(dnode, NULL);
+ area = yang_dnode_get_entry(dnode, true);
+ area->lsp_gen_interval[1] = gen_int;
+
return NB_OK;
}
/*
* XPath: /frr-isisd:isis/instance/spf/ietf-backoff-delay
*/
+static void ietf_backoff_delay_apply_finish(const struct lyd_node *dnode)
+{
+ long init_delay = yang_dnode_get_uint16(dnode, "./init-delay");
+ long short_delay = yang_dnode_get_uint16(dnode, "./short-delay");
+ long long_delay = yang_dnode_get_uint16(dnode, "./long-delay");
+ long holddown = yang_dnode_get_uint16(dnode, "./hold-down");
+ long timetolearn = yang_dnode_get_uint16(dnode, "./time-to-learn");
+ struct isis_area *area = yang_dnode_get_entry(dnode, true);
+ size_t bufsiz = strlen(area->area_tag) + sizeof("IS-IS Lx");
+ char *buf = XCALLOC(MTYPE_TMP, bufsiz);
+
+ snprintf(buf, bufsiz, "IS-IS %s L1", area->area_tag);
+ spf_backoff_free(area->spf_delay_ietf[0]);
+ area->spf_delay_ietf[0] =
+ spf_backoff_new(master, buf, init_delay, short_delay,
+ long_delay, holddown, timetolearn);
+
+ snprintf(buf, bufsiz, "IS-IS %s L2", area->area_tag);
+ spf_backoff_free(area->spf_delay_ietf[1]);
+ area->spf_delay_ietf[1] =
+ spf_backoff_new(master, buf, init_delay, short_delay,
+ long_delay, holddown, timetolearn);
+
+ XFREE(MTYPE_TMP, buf);
+}
+
static int
isis_instance_spf_ietf_backoff_delay_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* All the work is done in the apply_finish */
return NB_OK;
}
isis_instance_spf_ietf_backoff_delay_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ spf_backoff_free(area->spf_delay_ietf[0]);
+ spf_backoff_free(area->spf_delay_ietf[1]);
+ area->spf_delay_ietf[0] = NULL;
+ area->spf_delay_ietf[1] = NULL;
+
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* All the work is done in the apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* All the work is done in the apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* All the work is done in the apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* All the work is done in the apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* All the work is done in the apply_finish */
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ area->min_spf_interval[0] = yang_dnode_get_uint16(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ area->min_spf_interval[1] = yang_dnode_get_uint16(dnode, NULL);
+
return NB_OK;
}
/*
* XPath: /frr-isisd:isis/instance/area-password
*/
+static void area_password_apply_finish(const struct lyd_node *dnode)
+{
+ const char *password = yang_dnode_get_string(dnode, "./password");
+ struct isis_area *area = yang_dnode_get_entry(dnode, true);
+ int pass_type = yang_dnode_get_enum(dnode, "./password-type");
+ uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
+
+ switch (pass_type) {
+ case ISIS_PASSWD_TYPE_CLEARTXT:
+ isis_area_passwd_cleartext_set(area, IS_LEVEL_1, password,
+ snp_auth);
+ break;
+ case ISIS_PASSWD_TYPE_HMAC_MD5:
+ isis_area_passwd_hmac_md5_set(area, IS_LEVEL_1, password,
+ snp_auth);
+ break;
+ }
+}
+
static int isis_instance_area_password_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
static int isis_instance_area_password_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ isis_area_passwd_unset(area, IS_LEVEL_1);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
/*
* XPath: /frr-isisd:isis/instance/domain-password
*/
+static void domain_password_apply_finish(const struct lyd_node *dnode)
+{
+ const char *password = yang_dnode_get_string(dnode, "./password");
+ struct isis_area *area = yang_dnode_get_entry(dnode, true);
+ int pass_type = yang_dnode_get_enum(dnode, "./password-type");
+ uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
+
+ switch (pass_type) {
+ case ISIS_PASSWD_TYPE_CLEARTXT:
+ isis_area_passwd_cleartext_set(area, IS_LEVEL_2, password,
+ snp_auth);
+ break;
+ case ISIS_PASSWD_TYPE_HMAC_MD5:
+ isis_area_passwd_hmac_md5_set(area, IS_LEVEL_2, password,
+ snp_auth);
+ break;
+ }
+}
+
static int isis_instance_domain_password_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
static int isis_instance_domain_password_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ isis_area_passwd_unset(area, IS_LEVEL_2);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* actual setting is done in apply_finish */
return NB_OK;
}
/*
* XPath: /frr-isisd:isis/instance/default-information-originate/ipv4
*/
+static void default_info_origin_apply_finish(const struct lyd_node *dnode,
+ int family)
+{
+ int originate_type = DEFAULT_ORIGINATE;
+ unsigned long metric = 0;
+ const char *routemap = NULL;
+ struct isis_area *area = yang_dnode_get_entry(dnode, true);
+ int level = yang_dnode_get_enum(dnode, "./level");
+
+ if (yang_dnode_exists(dnode, "./always")) {
+ originate_type = DEFAULT_ORIGINATE_ALWAYS;
+ } else if (family == AF_INET6) {
+ zlog_warn(
+ "%s: Zebra doesn't implement default-originate for IPv6 yet, so use with care or use default-originate always.",
+ __func__);
+ }
+
+ if (yang_dnode_exists(dnode, "./metric"))
+ metric = yang_dnode_get_uint32(dnode, "./metric");
+ else if (yang_dnode_exists(dnode, "./route-map"))
+ routemap = yang_dnode_get_string(dnode, "./route-map");
+
+ isis_redist_set(area, level, family, DEFAULT_ROUTE, metric, routemap,
+ originate_type);
+}
+
+static void default_info_origin_ipv4_apply_finish(const struct lyd_node *dnode)
+{
+ default_info_origin_apply_finish(dnode, AF_INET);
+}
+
+static void default_info_origin_ipv6_apply_finish(const struct lyd_node *dnode)
+{
+ default_info_origin_apply_finish(dnode, AF_INET6);
+}
+
static int isis_instance_default_information_originate_ipv4_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv4_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ int level;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ level = yang_dnode_get_enum(dnode, "./level");
+ isis_redist_unset(area, level, AF_INET, DEFAULT_ROUTE);
+
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv4_always_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv4_route_map_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv4_metric_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv6_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ int level;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ level = yang_dnode_get_enum(dnode, "./level");
+ isis_redist_unset(area, level, AF_INET6, DEFAULT_ROUTE);
+
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv6_always_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv6_route_map_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
static int isis_instance_default_information_originate_ipv6_metric_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by default_info_origin_apply_finish */
return NB_OK;
}
/*
* XPath: /frr-isisd:isis/instance/redistribute/ipv4
*/
+static void redistribute_apply_finish(const struct lyd_node *dnode, int family)
+{
+ assert(family == AF_INET || family == AF_INET6);
+ int type, level;
+ unsigned long metric = 0;
+ const char *routemap = NULL;
+ struct isis_area *area;
+
+ type = yang_dnode_get_enum(dnode, "./protocol");
+ level = yang_dnode_get_enum(dnode, "./level");
+ area = yang_dnode_get_entry(dnode, true);
+
+ if (yang_dnode_exists(dnode, "./metric"))
+ metric = yang_dnode_get_uint32(dnode, "./metric");
+ else if (yang_dnode_exists(dnode, "./route-map"))
+ routemap = yang_dnode_get_string(dnode, "./route-map");
+
+ isis_redist_set(area, level, family, type, metric, routemap, 0);
+}
+
+static void redistribute_ipv4_apply_finish(const struct lyd_node *dnode)
+{
+ redistribute_apply_finish(dnode, AF_INET);
+}
+
+static void redistribute_ipv6_apply_finish(const struct lyd_node *dnode)
+{
+ redistribute_apply_finish(dnode, AF_INET6);
+}
+
static int isis_instance_redistribute_ipv4_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
static int isis_instance_redistribute_ipv4_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ int level, type;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ level = yang_dnode_get_enum(dnode, "./level");
+ type = yang_dnode_get_enum(dnode, "./protocol");
+ isis_redist_unset(area, level, AF_INET, type);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
isis_instance_redistribute_ipv4_route_map_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
isis_instance_redistribute_ipv4_metric_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
static int isis_instance_redistribute_ipv6_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+ int level, type;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ level = yang_dnode_get_enum(dnode, "./level");
+ type = yang_dnode_get_enum(dnode, "./protocol");
+ isis_redist_unset(area, level, AF_INET6, type);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
isis_instance_redistribute_ipv6_route_map_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
isis_instance_redistribute_ipv6_metric_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* It's all done by redistribute_apply_finish */
return NB_OK;
}
/*
* XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
*/
+static int isis_multi_topology_common(enum nb_event event,
+ const struct lyd_node *dnode,
+ const char *topology, bool create)
+{
+ struct isis_area *area;
+ struct isis_area_mt_setting *setting;
+ uint16_t mtid = isis_str2mtid(topology);
+
+ switch (event) {
+ case NB_EV_VALIDATE:
+ if (mtid == (uint16_t)-1) {
+ flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "Unknown topology %s", topology);
+ return NB_ERR_VALIDATION;
+ }
+ break;
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ break;
+ case NB_EV_APPLY:
+ area = yang_dnode_get_entry(dnode, true);
+ setting = area_get_mt_setting(area, mtid);
+ setting->enabled = create;
+ lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
+ break;
+ }
+
+ return NB_OK;
+}
+
+static int isis_multi_topology_overload_common(enum nb_event event,
+ const struct lyd_node *dnode,
+ const char *topology,
+ bool create)
+{
+ struct isis_area *area;
+ struct isis_area_mt_setting *setting;
+ uint16_t mtid = isis_str2mtid(topology);
+
+ /* validation is done in isis_multi_topology_common */
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ setting = area_get_mt_setting(area, mtid);
+ setting->overload = create;
+ if (setting->enabled)
+ lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
+
+ return NB_OK;
+}
+
static int
isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv4-multicast", true);
}
static int
isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv4-multicast",
+ false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode,
+ "ipv4-multicast", true);
}
static int isis_instance_multi_topology_ipv4_multicast_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode,
+ "ipv4-multicast", false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv4-mgmt", true);
}
static int isis_instance_multi_topology_ipv4_management_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv4-mgmt", false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
+ true);
}
static int isis_instance_multi_topology_ipv4_management_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
+ false);
}
/*
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-unicast", true);
}
static int
isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-unicast", false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
+ true);
}
static int isis_instance_multi_topology_ipv6_unicast_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
+ false);
}
/*
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-multicast", true);
}
static int
isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-multicast",
+ false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode,
+ "ipv6-multicast", true);
}
static int isis_instance_multi_topology_ipv6_multicast_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode,
+ "ipv6-multicast", false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-mgmt", true);
}
static int isis_instance_multi_topology_ipv6_management_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-mgmt", false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
+ true);
}
static int isis_instance_multi_topology_ipv6_management_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
+ false);
}
/*
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", true);
}
static int
isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", false);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
+ true);
}
static int isis_instance_multi_topology_ipv6_dstsrc_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
+ false);
}
/*
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ area->log_adj_changes = 1;
+
return NB_OK;
}
isis_instance_log_adjacency_changes_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
-}
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ area = yang_dnode_get_entry(dnode, true);
+ area->log_adj_changes = 0;
+
+ return NB_OK;
+}
/*
* XPath: /frr-isisd:isis/mpls-te
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct listnode *node;
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ isisMplsTE.status = enable;
+
+ /*
+ * Following code is intended to handle two cases;
+ *
+ * 1) MPLS-TE was disabled at startup time, but now become enabled.
+ * In this case, we must enable MPLS-TE Circuit regarding interface
+ * MPLS_TE flag
+ * 2) MPLS-TE was once enabled then disabled, and now enabled again.
+ */
+ for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
+ if (circuit->mtc == NULL || IS_FLOOD_AS(circuit->mtc->type))
+ continue;
+
+ if ((circuit->mtc->status == disable)
+ && HAS_LINK_PARAMS(circuit->interface))
+ circuit->mtc->status = enable;
+ else
+ continue;
+
+ /* Reoriginate STD_TE & GMPLS circuits */
+ if (circuit->area)
+ lsp_regenerate_schedule(circuit->area, circuit->is_type,
+ 0);
+ }
+
return NB_OK;
}
static int isis_mpls_te_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct listnode *node;
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ isisMplsTE.status = disable;
+
+ /* Flush LSP if circuit engage */
+ for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
+ if (circuit->mtc == NULL || (circuit->mtc->status == disable))
+ continue;
+
+ /* disable MPLS_TE Circuit */
+ circuit->mtc->status = disable;
+
+ /* Re-originate circuit without STD_TE & GMPLS parameters */
+ if (circuit->area)
+ lsp_regenerate_schedule(circuit->area, circuit->is_type,
+ 0);
+ }
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct in_addr value;
+ struct listnode *node;
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ yang_dnode_get_ipv4(&value, dnode, NULL);
+ isisMplsTE.router_id.s_addr = value.s_addr;
+ /* only proceed if MPLS-TE is enabled */
+ if (isisMplsTE.status == disable)
+ return NB_OK;
+
+ /* Update main Router ID in isis global structure */
+ isis->router_id = value.s_addr;
+ /* And re-schedule LSP update */
+ for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
+ if (listcount(area->area_addrs) > 0)
+ lsp_regenerate_schedule(area, area->is_type, 0);
+
return NB_OK;
}
static int isis_mpls_te_router_address_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct listnode *node;
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ isisMplsTE.router_id.s_addr = INADDR_ANY;
+ /* only proceed if MPLS-TE is enabled */
+ if (isisMplsTE.status == disable)
+ return NB_OK;
+
+ /* Update main Router ID in isis global structure */
+ isis->router_id = 0;
+ /* And re-schedule LSP update */
+ for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
+ if (listcount(area->area_addrs) > 0)
+ lsp_regenerate_schedule(area, area->is_type, 0);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->csnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->csnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->psnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->psnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->pad_hellos = yang_dnode_get_bool(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ uint32_t interval;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ interval = yang_dnode_get_uint32(dnode, NULL);
+ circuit->hello_interval[0] = interval;
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ uint32_t interval;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ interval = yang_dnode_get_uint32(dnode, NULL);
+ circuit->hello_interval[1] = interval;
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ uint16_t multi;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ multi = yang_dnode_get_uint16(dnode, NULL);
+ circuit->hello_multiplier[0] = multi;
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ uint16_t multi;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ multi = yang_dnode_get_uint16(dnode, NULL);
+ circuit->hello_multiplier[1] = multi;
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ unsigned int met;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ met = yang_dnode_get_uint32(dnode, NULL);
+ isis_circuit_metric_set(circuit, IS_LEVEL_1, met);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ unsigned int met;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ met = yang_dnode_get_uint32(dnode, NULL);
+ isis_circuit_metric_set(circuit, IS_LEVEL_2, met);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->priority[0] = yang_dnode_get_uint8(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->priority[1] = yang_dnode_get_uint8(dnode, NULL);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ int net_type = yang_dnode_get_enum(dnode, NULL);
+
+ switch (event) {
+ case NB_EV_VALIDATE:
+ circuit = yang_dnode_get_entry(dnode, false);
+ if (!circuit)
+ break;
+ if (circuit->circ_type == CIRCUIT_T_LOOPBACK
+ || circuit->circ_type == CIRCUIT_T_UNKNOWN) {
+ flog_warn(
+ EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "Cannot change network type on unknown or loopback interface");
+ return NB_ERR_VALIDATION;
+ }
+ if (net_type == CIRCUIT_T_BROADCAST
+ && circuit->state == C_STATE_UP
+ && !if_is_broadcast(circuit->interface)) {
+ flog_warn(
+ EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "Cannot configure non-broadcast interface for broadcast operation");
+ return NB_ERR_VALIDATION;
+ }
+ break;
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ break;
+ case NB_EV_APPLY:
+ circuit = yang_dnode_get_entry(dnode, true);
+ isis_circuit_circ_type_set(circuit, net_type);
+ break;
+ }
+
return NB_OK;
}
static int lib_interface_isis_network_type_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* FIXME: This cannot be done in FRR. Not sure what the intended
+ * behavior is.
+ */
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ struct isis_area *area;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ if (circuit->state != C_STATE_UP) {
+ circuit->is_passive = true;
+ } else {
+ area = circuit->area;
+ isis_csm_state_change(ISIS_DISABLE, circuit, area);
+ circuit->is_passive = true;
+ isis_csm_state_change(ISIS_ENABLE, circuit, area);
+ }
+
return NB_OK;
}
static int lib_interface_isis_passive_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ struct isis_area *area;
+ struct interface *ifp;
+
+ switch (event) {
+ case NB_EV_VALIDATE:
+ circuit = yang_dnode_get_entry(dnode, false);
+ if (!circuit)
+ break;
+ ifp = circuit->interface;
+ if (!ifp)
+ break;
+ if (if_is_loopback(ifp)) {
+ flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "Loopback is always passive");
+ return NB_ERR_VALIDATION;
+ }
+ break;
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ break;
+ case NB_EV_APPLY:
+ circuit = yang_dnode_get_entry(dnode, true);
+ if (circuit->state != C_STATE_UP) {
+ circuit->is_passive = false;
+ } else {
+ area = circuit->area;
+ isis_csm_state_change(ISIS_DISABLE, circuit, area);
+ circuit->is_passive = false;
+ isis_csm_state_change(ISIS_ENABLE, circuit, area);
+ }
+ break;
+ }
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
return NB_OK;
}
static int lib_interface_isis_password_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ isis_circuit_passwd_unset(circuit);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ const char *password;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ password = yang_dnode_get_string(dnode, NULL);
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->passwd.len = strlen(password);
+ strncpy((char *)circuit->passwd.passwd, password, 255);
+
return NB_OK;
}
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ uint8_t pass_type;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ pass_type = yang_dnode_get_enum(dnode, NULL);
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->passwd.type = pass_type;
+
return NB_OK;
}
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->disable_threeway_adj = true;
+
return NB_OK;
}
static int lib_interface_isis_disable_three_way_handshake_delete(
enum nb_event event, const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ circuit = yang_dnode_get_entry(dnode, true);
+ circuit->disable_threeway_adj = false;
+
return NB_OK;
}
* XPath:
* /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast
*/
+static int lib_interface_isis_multi_topology_common(
+ enum nb_event event, const struct lyd_node *dnode, uint16_t mtid)
+{
+ struct isis_circuit *circuit;
+ bool value;
+
+ switch (event) {
+ case NB_EV_VALIDATE:
+ circuit = yang_dnode_get_entry(dnode, false);
+ if (circuit && circuit->area && circuit->area->oldmetric) {
+ flog_warn(
+ EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "Multi topology IS-IS can only be used with wide metrics");
+ return NB_ERR_VALIDATION;
+ }
+ break;
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ break;
+ case NB_EV_APPLY:
+ circuit = yang_dnode_get_entry(dnode, true);
+ value = yang_dnode_get_bool(dnode, NULL);
+ isis_circuit_mt_enabled_set(circuit, mtid, value);
+ break;
+ }
+
+ return NB_OK;
+}
+
static int lib_interface_isis_multi_topology_ipv4_unicast_modify(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return lib_interface_isis_multi_topology_common(event, dnode,
+ ISIS_MT_IPV4_UNICAST);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return lib_interface_isis_multi_topology_common(event, dnode,
+ ISIS_MT_IPV4_MULTICAST);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return lib_interface_isis_multi_topology_common(event, dnode,
+ ISIS_MT_IPV4_MGMT);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return lib_interface_isis_multi_topology_common(event, dnode,
+ ISIS_MT_IPV6_UNICAST);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return lib_interface_isis_multi_topology_common(event, dnode,
+ ISIS_MT_IPV6_MULTICAST);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return lib_interface_isis_multi_topology_common(event, dnode,
+ ISIS_MT_IPV6_MGMT);
}
/*
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ return lib_interface_isis_multi_topology_common(event, dnode,
+ ISIS_MT_IPV6_DSTSRC);
+}
+
+/*
+ * NOTIFICATIONS
+ */
+static void notif_prep_instance_hdr(const char *xpath,
+ const struct isis_area *area,
+ const char *routing_instance,
+ struct list *args)
+{
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-instance", xpath);
+ data = yang_data_new_string(xpath_arg, routing_instance);
+ listnode_add(args, data);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-protocol-name",
+ xpath);
+ data = yang_data_new_string(xpath_arg, area->area_tag);
+ listnode_add(args, data);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/isis-level", xpath);
+ data = yang_data_new_enum(xpath_arg, area->is_type);
+ listnode_add(args, data);
+}
+
+static void notif_prepr_iface_hdr(const char *xpath,
+ const struct isis_circuit *circuit,
+ struct list *args)
+{
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-name", xpath);
+ data = yang_data_new_string(xpath_arg, circuit->interface->name);
+ listnode_add(args, data);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-level", xpath);
+ data = yang_data_new_enum(xpath_arg, circuit->is_type);
+ listnode_add(args, data);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/extended-circuit-id", xpath);
+ /* we do not seem to have the extended version of the circuit_id */
+ data = yang_data_new_uint32(xpath_arg, (uint32_t)circuit->circuit_id);
+ listnode_add(args, data);
+}
+
+/*
+ * XPath:
+ * /frr-isisd:database-overload
+ */
+void isis_notif_db_overload(const struct isis_area *area, bool overload)
+{
+ const char *xpath = "/frr-isisd:database-overload";
+ struct list *arguments = yang_data_list_new();
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+
+ notif_prep_instance_hdr(xpath, area, "default", arguments);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/overload", xpath);
+ data = yang_data_new_enum(xpath_arg, !!overload);
+ listnode_add(arguments, data);
+
+ nb_notification_send(xpath, arguments);
+}
+
+/*
+ * XPath:
+ * /frr-isisd:lsp-too-large
+ */
+void isis_notif_lsp_too_large(const struct isis_circuit *circuit,
+ uint32_t pdu_size, const char *lsp_id)
+{
+ const char *xpath = "/frr-isisd:lsp-too-large";
+ struct list *arguments = yang_data_list_new();
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+ struct isis_area *area = circuit->area;
+
+ notif_prep_instance_hdr(xpath, area, "default", arguments);
+ notif_prepr_iface_hdr(xpath, circuit, arguments);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/pdu-size", xpath);
+ data = yang_data_new_uint32(xpath_arg, pdu_size);
+ listnode_add(arguments, data);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
+ data = yang_data_new_string(xpath_arg, lsp_id);
+ listnode_add(arguments, data);
+
+ nb_notification_send(xpath, arguments);
+}
+
+/*
+ * XPath:
+ * /frr-isisd:if-state-change
+ */
+void isis_notif_if_state_change(const struct isis_circuit *circuit, bool down)
+{
+ const char *xpath = "/frr-isisd:if-state-change";
+ struct list *arguments = yang_data_list_new();
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+ struct isis_area *area = circuit->area;
+
+ notif_prep_instance_hdr(xpath, area, "default", arguments);
+ notif_prepr_iface_hdr(xpath, circuit, arguments);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
+ data = yang_data_new_enum(xpath_arg, !!down);
+ listnode_add(arguments, data);
+
+ nb_notification_send(xpath, arguments);
+}
+
+/*
+ * XPath:
+ * /frr-isisd:corrupted-lsp-detected
+ */
+void isis_notif_corrupted_lsp(const struct isis_area *area, const char *lsp_id)
+{
+ const char *xpath = "/frr-isisd:corrupted-lsp-detected";
+ struct list *arguments = yang_data_list_new();
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+
+ notif_prep_instance_hdr(xpath, area, "default", arguments);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
+ data = yang_data_new_string(xpath_arg, lsp_id);
+ listnode_add(arguments, data);
+
+ nb_notification_send(xpath, arguments);
+}
+
+/*
+ * XPath:
+ * /frr-isisd:attempt-to-exceed-max-sequence
+ */
+void isis_notif_lsp_exceed_max(const struct isis_area *area, const char *lsp_id)
+{
+ const char *xpath = "/frr-isisd:attempt-to-exceed-max-sequence";
+ struct list *arguments = yang_data_list_new();
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+
+ notif_prep_instance_hdr(xpath, area, "default", arguments);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
+ data = yang_data_new_string(xpath_arg, lsp_id);
+ listnode_add(arguments, data);
+
+ nb_notification_send(xpath, arguments);
+}
+
+/*
+ * XPath:
+ * /frr-isisd:max-area-addresses-mismatch
+ */
+void isis_notif_max_area_addr_mismatch(const struct isis_circuit *circuit,
+ uint8_t max_area_addrs,
+ const char *raw_pdu)
+{
+ const char *xpath = "/frr-isisd:max-area-addresses-mismatch";
+ struct list *arguments = yang_data_list_new();
+ char xpath_arg[XPATH_MAXLEN];
+ struct yang_data *data;
+ struct isis_area *area = circuit->area;
+
+ notif_prep_instance_hdr(xpath, area, "default", arguments);
+ notif_prepr_iface_hdr(xpath, circuit, arguments);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/max-area-addresses", xpath);
+ data = yang_data_new_uint8(xpath_arg, max_area_addrs);
+ listnode_add(arguments, data);
+ snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
+ data = yang_data_new(xpath_arg, raw_pdu);
+ listnode_add(arguments, data);
+
+ nb_notification_send(xpath, arguments);
}
/* clang-format off */
{
.xpath = "/frr-isisd:isis/instance/metric-style",
.cbs.modify = isis_instance_metric_style_modify,
+ .cbs.cli_show = cli_show_isis_metric_style,
},
{
.xpath = "/frr-isisd:isis/instance/purge-originator",
.cbs.create = isis_instance_purge_originator_create,
.cbs.delete = isis_instance_purge_originator_delete,
+ .cbs.cli_show = cli_show_isis_purge_origin,
},
{
.xpath = "/frr-isisd:isis/instance/lsp/mtu",
.cbs.modify = isis_instance_lsp_mtu_modify,
+ .cbs.cli_show = cli_show_isis_lsp_mtu,
+ },
+ {
+ .xpath = "/frr-isisd:isis/instance/lsp/refresh-interval",
+ .cbs.cli_show = cli_show_isis_lsp_ref_interval,
},
{
.xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-1",
.xpath = "/frr-isisd:isis/instance/lsp/refresh-interval/level-2",
.cbs.modify = isis_instance_lsp_refresh_interval_level_2_modify,
},
+ {
+ .xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime",
+ .cbs.cli_show = cli_show_isis_lsp_max_lifetime,
+ },
{
.xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-1",
.cbs.modify = isis_instance_lsp_maximum_lifetime_level_1_modify,
.xpath = "/frr-isisd:isis/instance/lsp/maximum-lifetime/level-2",
.cbs.modify = isis_instance_lsp_maximum_lifetime_level_2_modify,
},
+ {
+ .xpath = "/frr-isisd:isis/instance/lsp/generation-interval",
+ .cbs.cli_show = cli_show_isis_lsp_gen_interval,
+ },
{
.xpath = "/frr-isisd:isis/instance/lsp/generation-interval/level-1",
.cbs.modify = isis_instance_lsp_generation_interval_level_1_modify,
.xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
.cbs.create = isis_instance_spf_ietf_backoff_delay_create,
.cbs.delete = isis_instance_spf_ietf_backoff_delay_delete,
+ .cbs.apply_finish = ietf_backoff_delay_apply_finish,
+ .cbs.cli_show = cli_show_isis_spf_ietf_backoff,
},
{
.xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/init-delay",
.xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay/time-to-learn",
.cbs.modify = isis_instance_spf_ietf_backoff_delay_time_to_learn_modify,
},
+ {
+ .xpath = "/frr-isisd:isis/instance/spf/minimum-interval",
+ .cbs.cli_show = cli_show_isis_spf_min_interval,
+ },
{
.xpath = "/frr-isisd:isis/instance/spf/minimum-interval/level-1",
.cbs.modify = isis_instance_spf_minimum_interval_level_1_modify,
.xpath = "/frr-isisd:isis/instance/area-password",
.cbs.create = isis_instance_area_password_create,
.cbs.delete = isis_instance_area_password_delete,
+ .cbs.apply_finish = area_password_apply_finish,
+ .cbs.cli_show = cli_show_isis_area_pwd,
},
{
.xpath = "/frr-isisd:isis/instance/area-password/password",
.xpath = "/frr-isisd:isis/instance/domain-password",
.cbs.create = isis_instance_domain_password_create,
.cbs.delete = isis_instance_domain_password_delete,
+ .cbs.apply_finish = domain_password_apply_finish,
+ .cbs.cli_show = cli_show_isis_domain_pwd,
},
{
.xpath = "/frr-isisd:isis/instance/domain-password/password",
.xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4",
.cbs.create = isis_instance_default_information_originate_ipv4_create,
.cbs.delete = isis_instance_default_information_originate_ipv4_delete,
+ .cbs.apply_finish = default_info_origin_ipv4_apply_finish,
+ .cbs.cli_show = cli_show_isis_def_origin_ipv4,
},
{
.xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
.xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6",
.cbs.create = isis_instance_default_information_originate_ipv6_create,
.cbs.delete = isis_instance_default_information_originate_ipv6_delete,
+ .cbs.apply_finish = default_info_origin_ipv6_apply_finish,
+ .cbs.cli_show = cli_show_isis_def_origin_ipv6,
},
{
.xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
.xpath = "/frr-isisd:isis/instance/redistribute/ipv4",
.cbs.create = isis_instance_redistribute_ipv4_create,
.cbs.delete = isis_instance_redistribute_ipv4_delete,
+ .cbs.apply_finish = redistribute_ipv4_apply_finish,
+ .cbs.cli_show = cli_show_isis_redistribute_ipv4,
},
{
.xpath = "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
.xpath = "/frr-isisd:isis/instance/redistribute/ipv6",
.cbs.create = isis_instance_redistribute_ipv6_create,
.cbs.delete = isis_instance_redistribute_ipv6_delete,
+ .cbs.apply_finish = redistribute_ipv6_apply_finish,
+ .cbs.cli_show = cli_show_isis_redistribute_ipv6,
},
{
.xpath = "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
.cbs.create = isis_instance_multi_topology_ipv4_multicast_create,
.cbs.delete = isis_instance_multi_topology_ipv4_multicast_delete,
+ .cbs.cli_show = cli_show_isis_mt_ipv4_multicast,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management",
.cbs.create = isis_instance_multi_topology_ipv4_management_create,
.cbs.delete = isis_instance_multi_topology_ipv4_management_delete,
+ .cbs.cli_show = cli_show_isis_mt_ipv4_mgmt,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
.cbs.create = isis_instance_multi_topology_ipv6_unicast_create,
.cbs.delete = isis_instance_multi_topology_ipv6_unicast_delete,
+ .cbs.cli_show = cli_show_isis_mt_ipv6_unicast,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
.cbs.create = isis_instance_multi_topology_ipv6_multicast_create,
.cbs.delete = isis_instance_multi_topology_ipv6_multicast_delete,
+ .cbs.cli_show = cli_show_isis_mt_ipv6_multicast,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management",
.cbs.create = isis_instance_multi_topology_ipv6_management_create,
.cbs.delete = isis_instance_multi_topology_ipv6_management_delete,
+ .cbs.cli_show = cli_show_isis_mt_ipv6_mgmt,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
.cbs.create = isis_instance_multi_topology_ipv6_dstsrc_create,
.cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_delete,
+ .cbs.cli_show = cli_show_isis_mt_ipv6_dstsrc,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
.xpath = "/frr-isisd:isis/instance/log-adjacency-changes",
.cbs.create = isis_instance_log_adjacency_changes_create,
.cbs.delete = isis_instance_log_adjacency_changes_delete,
+ .cbs.cli_show = cli_show_isis_log_adjacency,
},
{
.xpath = "/frr-isisd:isis/mpls-te",
.cbs.create = isis_mpls_te_create,
.cbs.delete = isis_mpls_te_delete,
+ .cbs.cli_show = cli_show_isis_mpls_te,
},
{
.xpath = "/frr-isisd:isis/mpls-te/router-address",
.cbs.modify = isis_mpls_te_router_address_modify,
.cbs.delete = isis_mpls_te_router_address_delete,
+ .cbs.cli_show = cli_show_isis_mpls_te_router_addr,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis",
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/circuit-type",
.cbs.modify = lib_interface_isis_circuit_type_modify,
+ .cbs.cli_show = cli_show_ip_isis_circ_type,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
.cbs.delete = lib_interface_isis_ipv6_routing_delete,
.cbs.cli_show = cli_show_ip_isis_ipv6,
},
+ {
+ .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
+ .cbs.cli_show = cli_show_ip_isis_csnp_interval,
+ },
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1",
.cbs.modify = lib_interface_isis_csnp_interval_level_1_modify,
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-2",
.cbs.modify = lib_interface_isis_csnp_interval_level_2_modify,
},
+ {
+ .xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval",
+ .cbs.cli_show = cli_show_ip_isis_psnp_interval,
+ },
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/psnp-interval/level-1",
.cbs.modify = lib_interface_isis_psnp_interval_level_1_modify,
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/padding",
.cbs.modify = lib_interface_isis_hello_padding_modify,
+ .cbs.cli_show = cli_show_ip_isis_hello_padding,
+ },
+ {
+ .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval",
+ .cbs.cli_show = cli_show_ip_isis_hello_interval,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-1",
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2",
.cbs.modify = lib_interface_isis_hello_interval_level_2_modify,
},
+ {
+ .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier",
+ .cbs.cli_show = cli_show_ip_isis_hello_multi,
+ },
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1",
.cbs.modify = lib_interface_isis_hello_multiplier_level_1_modify,
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
.cbs.modify = lib_interface_isis_hello_multiplier_level_2_modify,
},
+ {
+ .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric",
+ .cbs.cli_show = cli_show_ip_isis_metric,
+ },
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
.cbs.modify = lib_interface_isis_metric_level_1_modify,
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-2",
.cbs.modify = lib_interface_isis_metric_level_2_modify,
},
+ {
+ .xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority",
+ .cbs.cli_show = cli_show_ip_isis_priority,
+ },
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/priority/level-1",
.cbs.modify = lib_interface_isis_priority_level_1_modify,
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/network-type",
.cbs.modify = lib_interface_isis_network_type_modify,
.cbs.delete = lib_interface_isis_network_type_delete,
+ .cbs.cli_show = cli_show_ip_isis_network_type,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/passive",
.cbs.create = lib_interface_isis_passive_create,
.cbs.delete = lib_interface_isis_passive_delete,
+ .cbs.cli_show = cli_show_ip_isis_passive,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/password",
.cbs.create = lib_interface_isis_password_create,
.cbs.delete = lib_interface_isis_password_delete,
+ .cbs.cli_show = cli_show_ip_isis_password,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/password/password",
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
.cbs.create = lib_interface_isis_disable_three_way_handshake_create,
.cbs.delete = lib_interface_isis_disable_three_way_handshake_delete,
+ .cbs.cli_show = cli_show_ip_isis_threeway_shake,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast",
.cbs.modify = lib_interface_isis_multi_topology_ipv4_unicast_modify,
+ .cbs.cli_show = cli_show_ip_isis_mt_ipv4_unicast,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast",
.cbs.modify = lib_interface_isis_multi_topology_ipv4_multicast_modify,
+ .cbs.cli_show = cli_show_ip_isis_mt_ipv4_multicast,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management",
.cbs.modify = lib_interface_isis_multi_topology_ipv4_management_modify,
+ .cbs.cli_show = cli_show_ip_isis_mt_ipv4_mgmt,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast",
.cbs.modify = lib_interface_isis_multi_topology_ipv6_unicast_modify,
+ .cbs.cli_show = cli_show_ip_isis_mt_ipv6_unicast,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast",
.cbs.modify = lib_interface_isis_multi_topology_ipv6_multicast_modify,
+ .cbs.cli_show = cli_show_ip_isis_mt_ipv6_multicast,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management",
.cbs.modify = lib_interface_isis_multi_topology_ipv6_management_modify,
+ .cbs.cli_show = cli_show_ip_isis_mt_ipv6_mgmt,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc",
.cbs.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify,
+ .cbs.cli_show = cli_show_ip_isis_mt_ipv6_dstsrc,
},
{
.xpath = NULL,