]> git.proxmox.com Git - mirror_frr.git/blobdiff - nhrpd/nhrp_interface.c
staticd: Do not ready prefix for printing till it's decoded
[mirror_frr.git] / nhrpd / nhrp_interface.c
index 58ad1675498da2c1af91be0fb8d0b584ea17eb3b..ccca100db57940b038501c5a08b44cccd3958e20 100644 (file)
@@ -7,6 +7,10 @@
  * (at your option) any later version.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <net/if_arp.h>
 #include "zebra.h"
 #include "linklist.h"
@@ -25,7 +29,6 @@ static int nhrp_if_new_hook(struct interface *ifp)
        afi_t afi;
 
        nifp = XCALLOC(MTYPE_NHRP_IF, sizeof(struct nhrp_interface));
-       if (!nifp) return 0;
 
        ifp->info = nifp;
        nifp->ifp = ifp;
@@ -48,8 +51,8 @@ static int nhrp_if_delete_hook(struct interface *ifp)
 
 void nhrp_interface_init(void)
 {
-       if_add_hook(IF_NEW_HOOK,    nhrp_if_new_hook);
-       if_add_hook(IF_DELETE_HOOK, nhrp_if_delete_hook);
+       hook_register_prio(if_add, 0, nhrp_if_new_hook);
+       hook_register_prio(if_del, 0, nhrp_if_delete_hook);
 }
 
 void nhrp_interface_update_mtu(struct interface *ifp, afi_t afi)
@@ -66,9 +69,11 @@ void nhrp_interface_update_mtu(struct interface *ifp, afi_t afi)
                new_mtu = 0;
 
        if (new_mtu != if_ad->mtu) {
-               debugf(NHRP_DEBUG_IF, "%s: MTU changed to %d", ifp->name, new_mtu);
+               debugf(NHRP_DEBUG_IF, "%s: MTU changed to %d", ifp->name,
+                      new_mtu);
                if_ad->mtu = new_mtu;
-               notifier_call(&nifp->notifier_list, NOTIFY_INTERFACE_MTU_CHANGED);
+               notifier_call(&nifp->notifier_list,
+                             NOTIFY_INTERFACE_MTU_CHANGED);
        }
 }
 
@@ -76,18 +81,21 @@ static void nhrp_interface_update_source(struct interface *ifp)
 {
        struct nhrp_interface *nifp = ifp->info;
 
-       if (!nifp->source || !nifp->nbmaifp ||
-           (ifindex_t)nifp->linkidx == nifp->nbmaifp->ifindex)
+       if (!nifp->source || !nifp->nbmaifp
+           || (ifindex_t)nifp->linkidx == nifp->nbmaifp->ifindex)
                return;
 
        nifp->linkidx = nifp->nbmaifp->ifindex;
-       debugf(NHRP_DEBUG_IF, "%s: bound device index changed to %d", ifp->name, nifp->linkidx);
+       debugf(NHRP_DEBUG_IF, "%s: bound device index changed to %d", ifp->name,
+              nifp->linkidx);
        netlink_gre_set_link(ifp->ifindex, nifp->linkidx);
 }
 
-static void nhrp_interface_interface_notifier(struct notifier_block *n, unsigned long cmd)
+static void nhrp_interface_interface_notifier(struct notifier_block *n,
+                                             unsigned long cmd)
 {
-       struct nhrp_interface *nifp = container_of(n, struct nhrp_interface, nbmanifp_notifier);
+       struct nhrp_interface *nifp =
+               container_of(n, struct nhrp_interface, nbmanifp_notifier);
        struct interface *nbmaifp = nifp->nbmaifp;
        struct nhrp_interface *nbmanifp = nbmaifp->info;
        char buf[SU_ADDRSTRLEN];
@@ -100,10 +108,11 @@ static void nhrp_interface_interface_notifier(struct notifier_block *n, unsigned
        case NOTIFY_INTERFACE_ADDRESS_CHANGED:
                nifp->nbma = nbmanifp->afi[AFI_IP].addr;
                nhrp_interface_update(nifp->ifp);
-               notifier_call(&nifp->notifier_list, NOTIFY_INTERFACE_NBMA_CHANGED);
+               notifier_call(&nifp->notifier_list,
+                             NOTIFY_INTERFACE_NBMA_CHANGED);
                debugf(NHRP_DEBUG_IF, "%s: NBMA change: address %s",
-                       nifp->ifp->name,
-                       sockunion2str(&nifp->nbma, buf, sizeof buf));
+                      nifp->ifp->name,
+                      sockunion2str(&nifp->nbma, buf, sizeof buf));
                break;
        }
 }
@@ -117,19 +126,22 @@ static void nhrp_interface_update_nbma(struct interface *ifp)
        sockunion_family(&nbma) = AF_UNSPEC;
 
        if (nifp->source)
-          nbmaifp = if_lookup_by_name(nifp->source, VRF_DEFAULT);
+               nbmaifp = if_lookup_by_name(nifp->source, VRF_DEFAULT);
 
        switch (ifp->ll_type) {
        case ZEBRA_LLT_IPGRE: {
-                       struct in_addr saddr = {0};
-                       netlink_gre_get_info(ifp->ifindex, &nifp->grekey, &nifp->linkidx, &saddr);
-                       debugf(NHRP_DEBUG_IF, "%s: GRE: %x %x %x", ifp->name, nifp->grekey, nifp->linkidx, saddr.s_addr);
-                       if (saddr.s_addr)
-                               sockunion_set(&nbma, AF_INET, (u_char *) &saddr.s_addr, sizeof(saddr.s_addr));
-                       else if (!nbmaifp && nifp->linkidx != IFINDEX_INTERNAL)
-                          nbmaifp = if_lookup_by_index(nifp->linkidx, VRF_DEFAULT);
-               }
-               break;
+               struct in_addr saddr = {0};
+               netlink_gre_get_info(ifp->ifindex, &nifp->grekey,
+                                    &nifp->linkidx, &saddr);
+               debugf(NHRP_DEBUG_IF, "%s: GRE: %x %x %x", ifp->name,
+                      nifp->grekey, nifp->linkidx, saddr.s_addr);
+               if (saddr.s_addr)
+                       sockunion_set(&nbma, AF_INET, (uint8_t *)&saddr.s_addr,
+                                     sizeof(saddr.s_addr));
+               else if (!nbmaifp && nifp->linkidx != IFINDEX_INTERNAL)
+                       nbmaifp =
+                               if_lookup_by_index(nifp->linkidx, VRF_DEFAULT);
+       } break;
        default:
                break;
        }
@@ -142,8 +154,11 @@ static void nhrp_interface_update_nbma(struct interface *ifp)
                        notifier_del(&nifp->nbmanifp_notifier);
                nifp->nbmaifp = nbmaifp;
                if (nbmaifp) {
-                       notifier_add(&nifp->nbmanifp_notifier, &nbmanifp->notifier_list, nhrp_interface_interface_notifier);
-                       debugf(NHRP_DEBUG_IF, "%s: bound to %s", ifp->name, nbmaifp->name);
+                       notifier_add(&nifp->nbmanifp_notifier,
+                                    &nbmanifp->notifier_list,
+                                    nhrp_interface_interface_notifier);
+                       debugf(NHRP_DEBUG_IF, "%s: bound to %s", ifp->name,
+                              nbmaifp->name);
                }
        }
 
@@ -158,13 +173,15 @@ static void nhrp_interface_update_nbma(struct interface *ifp)
                nifp->nbma = nbma;
                nhrp_interface_update(nifp->ifp);
                debugf(NHRP_DEBUG_IF, "%s: NBMA address changed", ifp->name);
-               notifier_call(&nifp->notifier_list, NOTIFY_INTERFACE_NBMA_CHANGED);
+               notifier_call(&nifp->notifier_list,
+                             NOTIFY_INTERFACE_NBMA_CHANGED);
        }
 
        nhrp_interface_update(ifp);
 }
 
-static void nhrp_interface_update_address(struct interface *ifp, afi_t afi, int force)
+static void nhrp_interface_update_address(struct interface *ifp, afi_t afi,
+                                         int force)
 {
        const int family = afi2family(afi);
        struct nhrp_interface *nifp = ifp->info;
@@ -184,11 +201,13 @@ static void nhrp_interface_update_address(struct interface *ifp, afi_t afi, int
                        best = c;
                        continue;
                }
-               if ((best->flags & ZEBRA_IFA_SECONDARY) && !(c->flags & ZEBRA_IFA_SECONDARY)) {
+               if ((best->flags & ZEBRA_IFA_SECONDARY)
+                   && !(c->flags & ZEBRA_IFA_SECONDARY)) {
                        best = c;
                        continue;
                }
-               if (!(best->flags & ZEBRA_IFA_SECONDARY) && (c->flags & ZEBRA_IFA_SECONDARY))
+               if (!(best->flags & ZEBRA_IFA_SECONDARY)
+                   && (c->flags & ZEBRA_IFA_SECONDARY))
                        continue;
                if (best->address->prefixlen > c->address->prefixlen) {
                        best = c;
@@ -199,9 +218,10 @@ static void nhrp_interface_update_address(struct interface *ifp, afi_t afi, int
        }
 
        /* On NHRP interfaces a host prefix is required */
-       if (best && if_ad->configured && best->address->prefixlen != 8 * prefix_blen(best->address)) {
+       if (best && if_ad->configured
+           && best->address->prefixlen != 8 * prefix_blen(best->address)) {
                zlog_notice("%s: %s is not a host prefix", ifp->name,
-                       prefix2str(best->address, buf, sizeof buf));
+                           prefix2str(best->address, buf, sizeof buf));
                best = NULL;
        }
 
@@ -216,17 +236,21 @@ static void nhrp_interface_update_address(struct interface *ifp, afi_t afi, int
 
        if (sockunion_family(&if_ad->addr) != AF_UNSPEC) {
                nc = nhrp_cache_get(ifp, &if_ad->addr, 0);
-               if (nc) nhrp_cache_update_binding(nc, NHRP_CACHE_LOCAL, -1, NULL, 0, NULL);
+               if (nc)
+                       nhrp_cache_update_binding(nc, NHRP_CACHE_LOCAL, -1,
+                                                 NULL, 0, NULL);
        }
 
-       debugf(NHRP_DEBUG_KERNEL, "%s: IPv%d address changed to %s",
-               ifp->name, afi == AFI_IP ? 4 : 6,
-               best ? prefix2str(best->address, buf, sizeof buf) : "(none)");
+       debugf(NHRP_DEBUG_KERNEL, "%s: IPv%d address changed to %s", ifp->name,
+              afi == AFI_IP ? 4 : 6,
+              best ? prefix2str(best->address, buf, sizeof buf) : "(none)");
        if_ad->addr = addr;
 
        if (if_ad->configured && sockunion_family(&if_ad->addr) != AF_UNSPEC) {
                nc = nhrp_cache_get(ifp, &addr, 1);
-               if (nc) nhrp_cache_update_binding(nc, NHRP_CACHE_LOCAL, 0, NULL, 0, NULL);
+               if (nc)
+                       nhrp_cache_update_binding(nc, NHRP_CACHE_LOCAL, 0, NULL,
+                                                 0, NULL);
        }
 
        notifier_call(&nifp->notifier_list, NOTIFY_INTERFACE_ADDRESS_CHANGED);
@@ -244,9 +268,9 @@ void nhrp_interface_update(struct interface *ifp)
        for (afi = 0; afi < AFI_MAX; afi++) {
                if_ad = &nifp->afi[afi];
 
-               if (sockunion_family(&nifp->nbma) == AF_UNSPEC ||
-                   ifp->ifindex == IFINDEX_INTERNAL || !if_is_up(ifp) ||
-                   !if_ad->network_id) {
+               if (sockunion_family(&nifp->nbma) == AF_UNSPEC
+                   || ifp->ifindex == IFINDEX_INTERNAL || !if_is_up(ifp)
+                   || !if_ad->network_id) {
                        if (if_ad->configured) {
                                if_ad->configured = 0;
                                nhrp_interface_update_address(ifp, afi, 1);
@@ -255,7 +279,8 @@ void nhrp_interface_update(struct interface *ifp)
                }
 
                if (!if_ad->configured) {
-                       os_configure_dmvpn(ifp->ifindex, ifp->name, afi2family(afi));
+                       os_configure_dmvpn(ifp->ifindex, ifp->name,
+                                          afi2family(afi));
                        if_ad->configured = 1;
                        nhrp_interface_update_address(ifp, afi, 1);
                }
@@ -265,11 +290,14 @@ void nhrp_interface_update(struct interface *ifp)
 
        if (enabled != nifp->enabled) {
                nifp->enabled = enabled;
-               notifier_call(&nifp->notifier_list, enabled ? NOTIFY_INTERFACE_UP : NOTIFY_INTERFACE_DOWN);
+               notifier_call(&nifp->notifier_list,
+                             enabled ? NOTIFY_INTERFACE_UP
+                                     : NOTIFY_INTERFACE_DOWN);
        }
 }
 
-int nhrp_interface_add(int cmd, struct zclient *client, zebra_size_t length, vrf_id_t vrf_id)
+int nhrp_interface_add(int cmd, struct zclient *client, zebra_size_t length,
+                      vrf_id_t vrf_id)
 {
        struct interface *ifp;
 
@@ -279,16 +307,16 @@ int nhrp_interface_add(int cmd, struct zclient *client, zebra_size_t length, vrf
                return 0;
 
        debugf(NHRP_DEBUG_IF, "if-add: %s, ifindex: %u, hw_type: %d %s",
-               ifp->name, ifp->ifindex,
-               ifp->ll_type, if_link_type_str(ifp->ll_type));
+              ifp->name, ifp->ifindex, ifp->ll_type,
+              if_link_type_str(ifp->ll_type));
 
        nhrp_interface_update_nbma(ifp);
 
        return 0;
 }
 
-int nhrp_interface_delete(int cmd, struct zclient *client,
-                         zebra_size_t length, vrf_id_t vrf_id)
+int nhrp_interface_delete(int cmd, struct zclient *client, zebra_size_t length,
+                         vrf_id_t vrf_id)
 {
        struct interface *ifp;
        struct stream *s;
@@ -299,14 +327,14 @@ int nhrp_interface_delete(int cmd, struct zclient *client,
                return 0;
 
        debugf(NHRP_DEBUG_IF, "if-delete: %s", ifp->name);
-       ifp->ifindex = IFINDEX_INTERNAL;
+       if_set_index(ifp, ifp->ifindex);
        nhrp_interface_update(ifp);
        /* if_delete(ifp); */
        return 0;
 }
 
-int nhrp_interface_up(int cmd, struct zclient *client,
-                     zebra_size_t length, vrf_id_t vrf_id)
+int nhrp_interface_up(int cmd, struct zclient *client, zebra_size_t length,
+                     vrf_id_t vrf_id)
 {
        struct interface *ifp;
 
@@ -320,8 +348,8 @@ int nhrp_interface_up(int cmd, struct zclient *client,
        return 0;
 }
 
-int nhrp_interface_down(int cmd, struct zclient *client,
-                       zebra_size_t length, vrf_id_t vrf_id)
+int nhrp_interface_down(int cmd, struct zclient *client, zebra_size_t length,
+                       vrf_id_t vrf_id)
 {
        struct interface *ifp;
 
@@ -344,11 +372,11 @@ int nhrp_interface_address_add(int cmd, struct zclient *client,
        if (ifc == NULL)
                return 0;
 
-       debugf(NHRP_DEBUG_IF, "if-addr-add: %s: %s",
-               ifc->ifp->name,
-               prefix2str(ifc->address, buf, sizeof buf));
+       debugf(NHRP_DEBUG_IF, "if-addr-add: %s: %s", ifc->ifp->name,
+              prefix2str(ifc->address, buf, sizeof buf));
 
-       nhrp_interface_update_address(ifc->ifp, family2afi(PREFIX_FAMILY(ifc->address)), 0);
+       nhrp_interface_update_address(
+               ifc->ifp, family2afi(PREFIX_FAMILY(ifc->address)), 0);
 
        return 0;
 }
@@ -363,17 +391,18 @@ int nhrp_interface_address_delete(int cmd, struct zclient *client,
        if (ifc == NULL)
                return 0;
 
-       debugf(NHRP_DEBUG_IF, "if-addr-del: %s: %s",
-               ifc->ifp->name,
-               prefix2str(ifc->address, buf, sizeof buf));
+       debugf(NHRP_DEBUG_IF, "if-addr-del: %s: %s", ifc->ifp->name,
+              prefix2str(ifc->address, buf, sizeof buf));
 
-       nhrp_interface_update_address(ifc->ifp, family2afi(PREFIX_FAMILY(ifc->address)), 0);
+       nhrp_interface_update_address(
+               ifc->ifp, family2afi(PREFIX_FAMILY(ifc->address)), 0);
        connected_free(ifc);
 
        return 0;
 }
 
-void nhrp_interface_notify_add(struct interface *ifp, struct notifier_block *n, notifier_fn_t fn)
+void nhrp_interface_notify_add(struct interface *ifp, struct notifier_block *n,
+                              notifier_fn_t fn)
 {
        struct nhrp_interface *nifp = ifp->info;
        notifier_add(n, &nifp->notifier_list, fn);
@@ -384,15 +413,19 @@ void nhrp_interface_notify_del(struct interface *ifp, struct notifier_block *n)
        notifier_del(n);
 }
 
-void nhrp_interface_set_protection(struct interface *ifp, const char *profile, const char *fallback_profile)
+void nhrp_interface_set_protection(struct interface *ifp, const char *profile,
+                                  const char *fallback_profile)
 {
        struct nhrp_interface *nifp = ifp->info;
 
-       if (nifp->ipsec_profile) free(nifp->ipsec_profile);
+       if (nifp->ipsec_profile)
+               free(nifp->ipsec_profile);
        nifp->ipsec_profile = profile ? strdup(profile) : NULL;
 
-       if (nifp->ipsec_fallback_profile) free(nifp->ipsec_fallback_profile);
-       nifp->ipsec_fallback_profile = fallback_profile ? strdup(fallback_profile) : NULL;
+       if (nifp->ipsec_fallback_profile)
+               free(nifp->ipsec_fallback_profile);
+       nifp->ipsec_fallback_profile =
+               fallback_profile ? strdup(fallback_profile) : NULL;
 
        notifier_call(&nifp->notifier_list, NOTIFY_INTERFACE_ADDRESS_CHANGED);
 }
@@ -401,7 +434,8 @@ void nhrp_interface_set_source(struct interface *ifp, const char *ifname)
 {
        struct nhrp_interface *nifp = ifp->info;
 
-       if (nifp->source) free(nifp->source);
+       if (nifp->source)
+               free(nifp->source);
        nifp->source = ifname ? strdup(ifname) : NULL;
 
        nhrp_interface_update_nbma(ifp);