]> 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 3a08c6aee5b2e3945a442aead6c7d91172ceee53..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,11 +335,13 @@ 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;
        struct pim_instance *pim;
-       struct prefix_sg sg;
+       pim_sgaddr sg;
+       size_t prefixlen;
 
        pim = pim_get_pim_instance(vrf_id);
        if (!pim)
@@ -335,19 +349,13 @@ static int pim_zebra_vxlan_sg_proc(ZAPI_CALLBACK_ARGS)
 
        s = zclient->ibuf;
 
-       sg.family = AF_INET;
-       sg.prefixlen = stream_getl(s);
-       stream_get(&sg.src.s_addr, s, sg.prefixlen);
-       stream_get(&sg.grp.s_addr, s, sg.prefixlen);
-
-       if (PIM_DEBUG_ZEBRA) {
-               char sg_str[PIM_SG_LEN];
+       prefixlen = stream_getl(s);
+       stream_get(&sg.src, s, prefixlen);
+       stream_get(&sg.grp, s, prefixlen);
 
-               pim_str_sg_set(&sg, sg_str);
-               zlog_debug("%u:recv SG %s %s", vrf_id,
-                       (cmd == ZEBRA_VXLAN_SG_ADD)?"add":"del",
-                       sg_str);
-       }
+       if (PIM_DEBUG_ZEBRA)
+               zlog_debug("%u:recv SG %s %pSG", vrf_id,
+                          (cmd == ZEBRA_VXLAN_SG_ADD) ? "add" : "del", &sg);
 
        if (cmd == ZEBRA_VXLAN_SG_ADD)
                pim_vxlan_sg_add(pim, &sg);
@@ -357,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;
@@ -385,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);
 
@@ -397,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)
@@ -425,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)
@@ -440,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,
 
@@ -452,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)
@@ -471,10 +485,11 @@ void pim_zebra_init(void)
        zclient_lookup_new();
 }
 
+#if PIM_IPV == 4
 void igmp_anysource_forward_start(struct pim_instance *pim,
-                                 struct igmp_group *group)
+                                 struct gm_group *group)
 {
-       struct igmp_source *source;
+       struct gm_source *source;
        struct in_addr src_addr = {.s_addr = 0};
        /* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */
        assert(group->group_filtermode_isexcl);
@@ -489,9 +504,9 @@ void igmp_anysource_forward_start(struct pim_instance *pim,
        igmp_source_forward_start(pim, source);
 }
 
-void igmp_anysource_forward_stop(struct igmp_group *group)
+void igmp_anysource_forward_stop(struct gm_group *group)
 {
-       struct igmp_source *source;
+       struct gm_source *source;
        struct in_addr star = {.s_addr = 0};
 
        source = igmp_find_source_by_addr(group, star);
@@ -500,17 +515,17 @@ void igmp_anysource_forward_stop(struct igmp_group *group)
 }
 
 static void igmp_source_forward_reevaluate_one(struct pim_instance *pim,
-                                              struct igmp_source *source)
+                                              struct gm_source *source)
 {
-       struct prefix_sg sg;
-       struct igmp_group *group = source->source_group;
+       pim_sgaddr sg;
+       struct gm_group *group = source->source_group;
        struct pim_ifchannel *ch;
 
        if ((source->source_addr.s_addr != INADDR_ANY)
            || !IGMP_SOURCE_TEST_FORWARDING(source->source_flags))
                return;
 
-       memset(&sg, 0, sizeof(struct prefix_sg));
+       memset(&sg, 0, sizeof(sg));
        sg.src = source->source_addr;
        sg.grp = group->group_addr;
 
@@ -520,9 +535,8 @@ static void igmp_source_forward_reevaluate_one(struct pim_instance *pim,
                if (ch
                    && (ch->local_ifmembership == PIM_IFMEMBERSHIP_INCLUDE)) {
                        if (PIM_DEBUG_PIM_EVENTS)
-                               zlog_debug(
-                                       "local membership del for %s as G is now SSM",
-                                       pim_str_sg_dump(&sg));
+                               zlog_debug("local membership del for %pSG as G is now SSM",
+                                          &sg);
                        pim_ifchannel_local_membership_del(group->interface,
                                                           &sg);
                }
@@ -531,9 +545,8 @@ static void igmp_source_forward_reevaluate_one(struct pim_instance *pim,
                if (!ch
                    || (ch->local_ifmembership == PIM_IFMEMBERSHIP_NOINFO)) {
                        if (PIM_DEBUG_PIM_EVENTS)
-                               zlog_debug(
-                                       "local membership add for %s as G is now ASM",
-                                       pim_str_sg_dump(&sg));
+                               zlog_debug("local membership add for %pSG as G is now ASM",
+                                          &sg);
                        pim_ifchannel_local_membership_add(
                                group->interface, &sg, false /*is_vxlan*/);
                }
@@ -547,17 +560,17 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
        FOR_ALL_INTERFACES (pim->vrf, ifp) {
                struct pim_interface *pim_ifp = ifp->info;
                struct listnode *grpnode;
-               struct igmp_group *grp;
+               struct gm_group *grp;
                struct pim_ifchannel *ch, *ch_temp;
 
                if (!pim_ifp)
                        continue;
 
                /* scan igmp groups */
-               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
+               for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_group_list, grpnode,
                                          grp)) {
                        struct listnode *srcnode;
-                       struct igmp_source *src;
+                       struct gm_source *src;
 
                        /* scan group sources */
                        for (ALL_LIST_ELEMENTS_RO(grp->group_source_list,
@@ -569,7 +582,7 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
                RB_FOREACH_SAFE (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb,
                                 ch_temp) {
                        if (pim_is_grp_ssm(pim, ch->sg.grp)) {
-                               if (ch->sg.src.s_addr == INADDR_ANY)
+                               if (pim_addr_is_any(ch->sg.src))
                                        pim_ifchannel_delete(ch);
                        }
                }
@@ -577,21 +590,20 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
 }
 
 void igmp_source_forward_start(struct pim_instance *pim,
-                              struct igmp_source *source)
+                              struct gm_source *source)
 {
        struct pim_interface *pim_oif;
-       struct igmp_group *group;
-       struct prefix_sg sg;
+       struct gm_group *group;
+       pim_sgaddr sg;
        int result;
        int input_iface_vif_index = 0;
 
-       memset(&sg, 0, sizeof(struct prefix_sg));
+       memset(&sg, 0, sizeof(sg));
        sg.src = source->source_addr;
        sg.grp = source->source_group->group_addr;
 
        if (PIM_DEBUG_IGMP_TRACE) {
-               zlog_debug("%s: (S,G)=%s oif=%s fwd=%d", __func__,
-                          pim_str_sg_dump(&sg),
+               zlog_debug("%s: (S,G)=%pSG oif=%s fwd=%d", __func__, &sg,
                           source->source_group->interface->name,
                           IGMP_SOURCE_TEST_FORWARDING(source->source_flags));
        }
@@ -614,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;
@@ -627,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) {
@@ -650,16 +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));
+                       if (PIM_DEBUG_ZEBRA)
                                zlog_debug(
-                                       "%s: NHT %s vif_source %s vif_index:%d ",
-                                       __func__, pim_str_sg_dump(&sg), buf2,
+                                       "%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) {
@@ -689,13 +692,12 @@ void igmp_source_forward_start(struct pim_instance *pim,
                                        /* ignore request for looped MFC entry
                                         */
                                        if (PIM_DEBUG_IGMP_TRACE) {
-                                               zlog_debug(
-                                                       "%s: ignoring request for looped MFC entry (S,G)=%s: oif=%s vif_index=%d",
-                                                       __func__,
-                                                       pim_str_sg_dump(&sg),
-                                                       source->source_group
-                                                               ->interface->name,
-                                                       input_iface_vif_index);
+                                               zlog_debug("%s: ignoring request for looped MFC entry (S,G)=%pSG: oif=%s vif_index=%d",
+                                                          __func__,
+                                                          &sg,
+                                                          source->source_group
+                                                          ->interface->name,
+                                                          input_iface_vif_index);
                                        }
                                        return;
                                }
@@ -704,10 +706,9 @@ void igmp_source_forward_start(struct pim_instance *pim,
                                        pim_channel_oil_add(pim, &sg, __func__);
                                if (!source->source_channel_oil) {
                                        if (PIM_DEBUG_IGMP_TRACE) {
-                                               zlog_debug(
-                                                       "%s %s: could not create OIL for channel (S,G)=%s",
-                                                       __FILE__, __func__,
-                                                       pim_str_sg_dump(&sg));
+                                               zlog_debug("%s %s: could not create OIL for channel (S,G)=%pSG",
+                                                          __FILE__, __func__,
+                                                          &sg);
                                        }
                                        return;
                                }
@@ -728,10 +729,9 @@ void igmp_source_forward_start(struct pim_instance *pim,
                }
        } else {
                if (PIM_DEBUG_IGMP_TRACE)
-                       zlog_debug(
-                               "%s: %s was received on %s interface but we are not DR for that interface",
-                               __func__, pim_str_sg_dump(&sg),
-                               group->interface->name);
+                       zlog_debug("%s: %pSG was received on %s interface but we are not DR for that interface",
+                                  __func__, &sg,
+                                  group->interface->name);
 
                return;
        }
@@ -742,8 +742,8 @@ void igmp_source_forward_start(struct pim_instance *pim,
        if (!pim_ifchannel_local_membership_add(group->interface, &sg,
                                                false /*is_vxlan*/)) {
                if (PIM_DEBUG_MROUTE)
-                       zlog_warn("%s: Failure to add local membership for %s",
-                                 __func__, pim_str_sg_dump(&sg));
+                       zlog_warn("%s: Failure to add local membership for %pSG",
+                                 __func__, &sg);
 
                pim_channel_del_oif(source->source_channel_oil,
                                    group->interface, PIM_OIF_FLAG_PROTO_IGMP,
@@ -758,19 +758,18 @@ void igmp_source_forward_start(struct pim_instance *pim,
   igmp_source_forward_stop: stop fowarding, but keep the source
   igmp_source_delete:       stop fowarding, and delete the source
  */
-void igmp_source_forward_stop(struct igmp_source *source)
+void igmp_source_forward_stop(struct gm_source *source)
 {
-       struct igmp_group *group;
-       struct prefix_sg sg;
+       struct gm_group *group;
+       pim_sgaddr sg;
        int result;
 
-       memset(&sg, 0, sizeof(struct prefix_sg));
+       memset(&sg, 0, sizeof(sg));
        sg.src = source->source_addr;
        sg.grp = source->source_group->group_addr;
 
        if (PIM_DEBUG_IGMP_TRACE) {
-               zlog_debug("%s: (S,G)=%s oif=%s fwd=%d", __func__,
-                          pim_str_sg_dump(&sg),
+               zlog_debug("%s: (S,G)=%pSG oif=%s fwd=%d", __func__, &sg,
                           source->source_group->interface->name,
                           IGMP_SOURCE_TEST_FORWARDING(source->source_flags));
        }
@@ -813,27 +812,16 @@ void igmp_source_forward_stop(struct igmp_source *source)
 
        IGMP_SOURCE_DONT_FORWARDING(source->source_flags);
 }
+#endif /* PIM_IPV == 4 */
 
 void pim_forward_start(struct pim_ifchannel *ch)
 {
        struct pim_upstream *up = ch->upstream;
        uint32_t mask = 0;
 
-       if (PIM_DEBUG_PIM_TRACE) {
-               char source_str[INET_ADDRSTRLEN];
-               char group_str[INET_ADDRSTRLEN];
-               char upstream_str[INET_ADDRSTRLEN];
-
-               pim_inet4_dump("<source?>", ch->sg.src, source_str,
-                              sizeof(source_str));
-               pim_inet4_dump("<group?>", ch->sg.grp, group_str,
-                              sizeof(group_str));
-               pim_inet4_dump("<upstream?>", up->upstream_addr, upstream_str,
-                              sizeof(upstream_str));
-               zlog_debug("%s: (S,G)=(%s,%s) oif=%s (%pI4)", __func__,
-                          source_str, group_str, ch->interface->name,
-                          &up->upstream_addr);
-       }
+       if (PIM_DEBUG_PIM_TRACE)
+               zlog_debug("%s: (S,G)=%pSG oif=%s (%pI4)", __func__, &ch->sg,
+                          ch->interface->name, &up->upstream_addr);
 
        if (PIM_IF_FLAG_TEST_PROTO_IGMP(ch->flags))
                mask = PIM_OIF_FLAG_PROTO_IGMP;