]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: introduce new adjacency hooks
authorRenato Westphal <renato@opensourcerouting.org>
Wed, 7 Aug 2019 22:54:00 +0000 (19:54 -0300)
committerOlivier Dugeon <olivier.dugeon@orange.com>
Thu, 30 Apr 2020 09:28:51 +0000 (11:28 +0200)
The 'isis_adj_ip_enabled_hook' hook will be called whenever
an adjacency goes from zero to one or more IPv4 or IPv6
addresses. Conversely, the 'isis_adj_ip_disabled_hook' hook will
be called whenever an adjacency goes from one or more IPv4/IPv6
addresses to no addresses at all.

These hooks will be used by the upcoming SR code to add/delete
Adj-SIDs depending on the IP addresses present in the remote
adjacencies.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
isisd/isis_adjacency.h
isisd/isis_tlvs.c

index 8f3d63c297b663f8abdacd40ab829dcd67e7f7f8..834eba7925eb9490ea1ac17389aea4ecf6bb8380 100644 (file)
@@ -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);
index 5b0b709206f39973f5123e5652ba0d085397ac0d..761005d0cdc8dd26c9f558334b7e7480dff7ae96 100644 (file)
@@ -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,