diff --git a/isisd/isis_adjacency.h b/isisd/isis_adjacency.h index 8f3d63c297..834eba7925 100644 --- a/isisd/isis_adjacency.h +++ b/isisd/isis_adjacency.h @@ -118,6 +118,10 @@ void isis_adj_process_threeway(struct isis_adjacency *adj, struct isis_threeway_adj *tw_adj, enum isis_adj_usage adj_usage); DECLARE_HOOK(isis_adj_state_change_hook, (struct isis_adjacency *adj), (adj)) +DECLARE_HOOK(isis_adj_ip_enabled_hook, + (struct isis_adjacency *adj, int family), (adj, family)) +DECLARE_HOOK(isis_adj_ip_disabled_hook, + (struct isis_adjacency *adj, int family), (adj, family)) void isis_adj_state_change(struct isis_adjacency **adj, enum isis_adj_state state, const char *reason); void isis_adj_print(struct isis_adjacency *adj); diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c index 5b0b709206..761005d0cd 100644 --- a/isisd/isis_tlvs.c +++ b/isisd/isis_tlvs.c @@ -4413,10 +4413,22 @@ static void tlvs_protocols_supported_to_adj(struct isis_tlvs *tlvs, memcpy(adj->nlpids.nlpids, reduced.nlpids, reduced.count); } +DEFINE_HOOK(isis_adj_ip_enabled_hook, (struct isis_adjacency *adj, int family), + (adj, family)) +DEFINE_HOOK(isis_adj_ip_disabled_hook, + (struct isis_adjacency *adj, int family), (adj, family)) + static void tlvs_ipv4_addresses_to_adj(struct isis_tlvs *tlvs, struct isis_adjacency *adj, bool *changed) { + bool ipv4_enabled = false; + + if (adj->ipv4_address_count == 0 && tlvs->ipv4_address.count > 0) + ipv4_enabled = true; + else if (adj->ipv4_address_count > 0 && tlvs->ipv4_address.count == 0) + hook_call(isis_adj_ip_disabled_hook, adj, AF_INET); + if (adj->ipv4_address_count != tlvs->ipv4_address.count) { *changed = true; adj->ipv4_address_count = tlvs->ipv4_address.count; @@ -4440,12 +4452,22 @@ static void tlvs_ipv4_addresses_to_adj(struct isis_tlvs *tlvs, *changed = true; adj->ipv4_addresses[i] = addr->addr; } + + if (ipv4_enabled) + hook_call(isis_adj_ip_enabled_hook, adj, AF_INET); } static void tlvs_ipv6_addresses_to_adj(struct isis_tlvs *tlvs, struct isis_adjacency *adj, bool *changed) { + bool ipv6_enabled = false; + + if (adj->ipv6_address_count == 0 && tlvs->ipv6_address.count > 0) + ipv6_enabled = true; + else if (adj->ipv6_address_count > 0 && tlvs->ipv6_address.count == 0) + hook_call(isis_adj_ip_disabled_hook, adj, AF_INET6); + if (adj->ipv6_address_count != tlvs->ipv6_address.count) { *changed = true; adj->ipv6_address_count = tlvs->ipv6_address.count; @@ -4469,6 +4491,9 @@ static void tlvs_ipv6_addresses_to_adj(struct isis_tlvs *tlvs, *changed = true; adj->ipv6_addresses[i] = addr->addr; } + + if (ipv6_enabled) + hook_call(isis_adj_ip_enabled_hook, adj, AF_INET6); } void isis_tlvs_to_adj(struct isis_tlvs *tlvs, struct isis_adjacency *adj,