]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_zebra.c
Merge pull request #10400 from opensourcerouting/pim6-compilefix
[mirror_frr.git] / pimd / pim_zebra.c
index 2efafd4b9b0914ea829cac13775d84e8c870efb8..0acd3c06940e2cf4a44c2c0113a49aac3aef6b24 100644 (file)
@@ -55,6 +55,7 @@ struct zclient *zclient;
 
 
 /* Router-id update message from zebra. */
+__attribute__((unused))
 static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
 {
        struct prefix router_id;
@@ -64,6 +65,7 @@ static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
        return 0;
 }
 
+__attribute__((unused))
 static int pim_zebra_interface_vrf_update(ZAPI_CALLBACK_ARGS)
 {
        struct interface *ifp;
@@ -112,7 +114,6 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
        struct connected *c;
        struct prefix *p;
        struct pim_interface *pim_ifp;
-       struct pim_instance *pim;
 
        /*
          zebra api notifies address adds/dels events by using the same call
@@ -141,12 +142,15 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
 #endif
        }
 
-       if (!CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)) {
-               /* trying to add primary address */
+#if PIM_IPV == 4
+       if (p->family != PIM_AF)
+               SET_FLAG(c->flags, ZEBRA_IFA_SECONDARY);
+       else if (!CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)) {
+               /* trying to add primary address? */
+               pim_addr primary_addr = pim_find_primary_addr(c->ifp);
+               pim_addr addr = pim_addr_from_prefix(p);
 
-               struct in_addr primary_addr = pim_find_primary_addr(c->ifp);
-               if (p->family != AF_INET
-                   || primary_addr.s_addr != p->u.prefix4.s_addr) {
+               if (pim_addr_cmp(primary_addr, addr)) {
                        if (PIM_DEBUG_ZEBRA)
                                zlog_warn(
                                        "%s: %s : forcing secondary flag on %pFX",
@@ -157,6 +161,8 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
 
        pim_if_addr_add(c);
        if (pim_ifp) {
+               struct pim_instance *pim;
+
                pim = pim_get_pim_instance(vrf_id);
                pim_ifp->pim = pim;
 
@@ -172,7 +178,10 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
                                pim_if_addr_add_all(ifp);
                }
        }
-
+#else /* PIM_IPV != 4 */
+       /* unused - for now */
+       (void)pim_ifp;
+#endif
        return 0;
 }
 
@@ -181,11 +190,9 @@ static int pim_zebra_if_address_del(ZAPI_CALLBACK_ARGS)
        struct connected *c;
        struct prefix *p;
        struct vrf *vrf = vrf_lookup_by_id(vrf_id);
-       struct pim_instance *pim;
 
        if (!vrf)
                return 0;
-       pim = vrf->info;
 
        /*
          zebra api notifies address adds/dels events by using the same call
@@ -200,24 +207,29 @@ static int pim_zebra_if_address_del(ZAPI_CALLBACK_ARGS)
                return 0;
 
        p = c->address;
-       if (p->family == AF_INET) {
-               if (PIM_DEBUG_ZEBRA) {
-                       zlog_debug(
-                               "%s: %s(%u) disconnected IP address %pFX flags %u %s",
-                               __func__, c->ifp->name, vrf_id, p, c->flags,
-                               CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)
-                                       ? "secondary"
-                                       : "primary");
 
+       if (PIM_DEBUG_ZEBRA) {
+               zlog_debug(
+                       "%s: %s(%u) disconnected IP address %pFX flags %u %s",
+                       __func__, c->ifp->name, vrf_id, p, c->flags,
+                       CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)
+                               ? "secondary"
+                               : "primary");
 #ifdef PIM_DEBUG_IFADDR_DUMP
-                       dump_if_address(c->ifp);
+               dump_if_address(c->ifp);
 #endif
-               }
+       }
 
+#if PIM_IPV == 4
+       if (p->family == AF_INET) {
+               struct pim_instance *pim;
+
+               pim = vrf->info;
                pim_if_addr_del(c, 0);
                pim_rp_setup(pim);
                pim_i_am_rp_re_evaluate(pim);
        }
+#endif
 
        connected_free(&c);
        return 0;
@@ -240,7 +252,7 @@ void pim_zebra_update_all_interfaces(struct pim_instance *pim)
                        struct pim_rpf rpf;
 
                        rpf.source_nexthop.interface = ifp;
-                       rpf.rpf_addr.u.prefix4 = us->address;
+                       pim_addr_to_prefix(&rpf.rpf_addr, us->address);
                        pim_joinprune_send(&rpf, us->us);
                        pim_jp_agg_clear_group(us->us);
                }
@@ -254,8 +266,8 @@ void pim_zebra_upstream_rpf_changed(struct pim_instance *pim,
        if (old->source_nexthop.interface) {
                struct pim_neighbor *nbr;
 
-               nbr = pim_neighbor_find(old->source_nexthop.interface,
-                                       old->rpf_addr.u.prefix4);
+               nbr = pim_neighbor_find_prefix(old->source_nexthop.interface,
+                                              &old->rpf_addr);
                if (nbr)
                        pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr);
 
@@ -323,6 +335,7 @@ void pim_zebra_upstream_rpf_changed(struct pim_instance *pim,
        pim_upstream_update_join_desired(pim, up);
 }
 
+__attribute__((unused))
 static int pim_zebra_vxlan_sg_proc(ZAPI_CALLBACK_ARGS)
 {
        struct stream *s;
@@ -337,8 +350,8 @@ static int pim_zebra_vxlan_sg_proc(ZAPI_CALLBACK_ARGS)
        s = zclient->ibuf;
 
        prefixlen = stream_getl(s);
-       stream_get(&sg.src.s_addr, s, prefixlen);
-       stream_get(&sg.grp.s_addr, s, prefixlen);
+       stream_get(&sg.src, s, prefixlen);
+       stream_get(&sg.grp, s, prefixlen);
 
        if (PIM_DEBUG_ZEBRA)
                zlog_debug("%u:recv SG %s %pSG", vrf_id,
@@ -352,6 +365,7 @@ static int pim_zebra_vxlan_sg_proc(ZAPI_CALLBACK_ARGS)
        return 0;
 }
 
+__attribute__((unused))
 static void pim_zebra_vxlan_replay(void)
 {
        struct stream *s = NULL;
@@ -380,7 +394,7 @@ void pim_scan_oil(struct pim_instance *pim)
                pim_upstream_mroute_iif_update(c_oil, __func__);
 }
 
-static int on_rpf_cache_refresh(struct thread *t)
+static void on_rpf_cache_refresh(struct thread *t)
 {
        struct pim_instance *pim = THREAD_ARG(t);
 
@@ -392,7 +406,6 @@ static int on_rpf_cache_refresh(struct thread *t)
 
        // It is called as part of pim_neighbor_add
        // pim_rp_setup ();
-       return 0;
 }
 
 void sched_rpf_cache_refresh(struct pim_instance *pim)
@@ -420,13 +433,17 @@ void sched_rpf_cache_refresh(struct pim_instance *pim)
 
 static void pim_zebra_connected(struct zclient *zclient)
 {
+#if PIM_IPV == 4
        /* Send the client registration */
        bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, router->vrf_id);
+#endif
 
        zclient_send_reg_requests(zclient, router->vrf_id);
 
+#if PIM_IPV == 4
        /* request for VxLAN BUM group addresses */
        pim_zebra_vxlan_replay();
+#endif
 }
 
 static void pim_zebra_capabilities(struct zclient_capabilities *cap)
@@ -435,9 +452,10 @@ static void pim_zebra_capabilities(struct zclient_capabilities *cap)
 }
 
 static zclient_handler *const pim_handlers[] = {
-       [ZEBRA_ROUTER_ID_UPDATE] = pim_router_id_update_zebra,
        [ZEBRA_INTERFACE_ADDRESS_ADD] = pim_zebra_if_address_add,
        [ZEBRA_INTERFACE_ADDRESS_DELETE] = pim_zebra_if_address_del,
+#if PIM_IPV == 4
+       [ZEBRA_ROUTER_ID_UPDATE] = pim_router_id_update_zebra,
        [ZEBRA_INTERFACE_VRF_UPDATE] = pim_zebra_interface_vrf_update,
        [ZEBRA_NEXTHOP_UPDATE] = pim_parse_nexthop_update,
 
@@ -447,6 +465,7 @@ static zclient_handler *const pim_handlers[] = {
        [ZEBRA_MLAG_PROCESS_UP] = pim_zebra_mlag_process_up,
        [ZEBRA_MLAG_PROCESS_DOWN] = pim_zebra_mlag_process_down,
        [ZEBRA_MLAG_FORWARD_MSG] = pim_zebra_mlag_handle_msg,
+#endif
 };
 
 void pim_zebra_init(void)
@@ -466,6 +485,7 @@ void pim_zebra_init(void)
        zclient_lookup_new();
 }
 
+#if PIM_IPV == 4
 void igmp_anysource_forward_start(struct pim_instance *pim,
                                  struct gm_group *group)
 {
@@ -606,7 +626,7 @@ void igmp_source_forward_start(struct pim_instance *pim,
        }
 
        if (!source->source_channel_oil) {
-               struct in_addr vif_source;
+               pim_addr vif_source;
                struct prefix src, grp;
                struct pim_nexthop nexthop;
                struct pim_upstream *up = NULL;
@@ -619,12 +639,8 @@ void igmp_source_forward_start(struct pim_instance *pim,
                }
 
                else {
-                       src.family = AF_INET;
-                       src.prefixlen = IPV4_MAX_BITLEN;
-                       src.u.prefix4 = vif_source; // RP or Src address
-                       grp.family = AF_INET;
-                       grp.prefixlen = IPV4_MAX_BITLEN;
-                       grp.u.prefix4 = sg.grp;
+                       pim_addr_to_prefix(&src, vif_source); // RP or Src addr
+                       pim_addr_to_prefix(&grp, sg.grp);
 
                        up = pim_upstream_find(pim, &sg);
                        if (up) {
@@ -642,15 +658,11 @@ void igmp_source_forward_start(struct pim_instance *pim,
                                        pim_ecmp_fib_lookup_if_vif_index(
                                                pim, &src, &grp);
 
-                       if (PIM_DEBUG_ZEBRA) {
-                               char buf2[INET_ADDRSTRLEN];
-
-                               pim_inet4_dump("<source?>", vif_source, buf2,
-                                              sizeof(buf2));
-                               zlog_debug("%s: NHT %pSG vif_source %s vif_index:%d ",
-                                          __func__, &sg, buf2,
-                                          input_iface_vif_index);
-                       }
+                       if (PIM_DEBUG_ZEBRA)
+                               zlog_debug(
+                                       "%s: NHT %pSG vif_source %pPAs vif_index:%d ",
+                                       __func__, &sg, &vif_source,
+                                       input_iface_vif_index);
 
                        if (input_iface_vif_index < 1) {
                                if (PIM_DEBUG_IGMP_TRACE) {
@@ -800,6 +812,7 @@ void igmp_source_forward_stop(struct gm_source *source)
 
        IGMP_SOURCE_DONT_FORWARDING(source->source_flags);
 }
+#endif /* PIM_IPV == 4 */
 
 void pim_forward_start(struct pim_ifchannel *ch)
 {