]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_join.c
Merge pull request #10447 from ton31337/fix/json_with_whitespaces
[mirror_frr.git] / pimd / pim_join.c
index b2e1b1a28af8591679eef31a38b4cb65a3e35aa7..929beea26bef81abf521ba038d637c5963148ac1 100644 (file)
@@ -54,24 +54,17 @@ static void on_trace(const char *label, struct interface *ifp,
 }
 
 static void recv_join(struct interface *ifp, struct pim_neighbor *neigh,
-                     uint16_t holdtime, struct in_addr upstream,
-                     struct prefix_sg *sg, uint8_t source_flags)
+                     uint16_t holdtime, pim_addr upstream, pim_sgaddr *sg,
+                     uint8_t source_flags)
 {
        struct pim_interface *pim_ifp = NULL;
 
-       if (PIM_DEBUG_PIM_TRACE) {
-               char up_str[INET_ADDRSTRLEN];
-               char neigh_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<upstream?>", upstream, up_str, sizeof(up_str));
-               pim_inet4_dump("<neigh?>", neigh->source_addr, neigh_str,
-                              sizeof(neigh_str));
+       if (PIM_DEBUG_PIM_TRACE)
                zlog_debug(
-                       "%s: join (S,G)=%s rpt=%d wc=%d upstream=%s holdtime=%d from %s on %s",
-                       __func__, pim_str_sg_dump(sg),
-                       !!(source_flags & PIM_RPT_BIT_MASK),
-                       !!(source_flags & PIM_WILDCARD_BIT_MASK), up_str,
-                       holdtime, neigh_str, ifp->name);
-       }
+                       "%s: join (S,G)=%pSG rpt=%d wc=%d upstream=%pPAs holdtime=%d from %pPA on %s",
+                       __func__, sg, !!(source_flags & PIM_RPT_BIT_MASK),
+                       !!(source_flags & PIM_WILDCARD_BIT_MASK), &upstream,
+                       holdtime, &neigh->source_addr, ifp->name);
 
        pim_ifp = ifp->info;
        assert(pim_ifp);
@@ -85,37 +78,33 @@ static void recv_join(struct interface *ifp, struct pim_neighbor *neigh,
        if ((source_flags & PIM_RPT_BIT_MASK)
            && (source_flags & PIM_WILDCARD_BIT_MASK)) {
                struct pim_rpf *rp = RP(pim_ifp->pim, sg->grp);
+               pim_addr rpf_addr;
 
                if (!rp) {
-                       zlog_warn("%s: Lookup of RP failed for %pPSG4",
-                                 __func__, sg);
+                       zlog_warn("%s: Lookup of RP failed for %pSG", __func__,
+                                 sg);
                        return;
                }
                /*
                 * If the RP sent in the message is not
                 * our RP for the group, drop the message
                 */
-               if (sg->src.s_addr != rp->rpf_addr.u.prefix4.s_addr) {
-                       char received_rp[INET_ADDRSTRLEN];
-                       char local_rp[INET_ADDRSTRLEN];
-                       pim_inet4_dump("<received?>", sg->src, received_rp,
-                                      sizeof(received_rp));
-                       pim_inet4_dump("<local?>", rp->rpf_addr.u.prefix4,
-                                      local_rp, sizeof(local_rp));
+               rpf_addr = pim_addr_from_prefix(&rp->rpf_addr);
+               if (pim_addr_cmp(sg->src, rpf_addr)) {
                        zlog_warn(
-                               "%s: Specified RP(%s) in join is different than our configured RP(%s)",
-                               __func__, received_rp, local_rp);
+                               "%s: Specified RP(%pPAs) in join is different than our configured RP(%pPAs)",
+                               __func__, &sg->src, &rpf_addr);
                        return;
                }
 
                if (pim_is_grp_ssm(pim_ifp->pim, sg->grp)) {
                        zlog_warn(
-                               "%s: Specified Group(%pI4) in join is now in SSM, not allowed to create PIM state",
+                               "%s: Specified Group(%pPA) in join is now in SSM, not allowed to create PIM state",
                                __func__, &sg->grp);
                        return;
                }
 
-               sg->src.s_addr = INADDR_ANY;
+               sg->src = PIMADDR_ANY;
        }
 
        /* Restart join expiry timer */
@@ -124,24 +113,17 @@ static void recv_join(struct interface *ifp, struct pim_neighbor *neigh,
 }
 
 static void recv_prune(struct interface *ifp, struct pim_neighbor *neigh,
-                      uint16_t holdtime, struct in_addr upstream,
-                      struct prefix_sg *sg, uint8_t source_flags)
+                      uint16_t holdtime, pim_addr upstream, pim_sgaddr *sg,
+                      uint8_t source_flags)
 {
        struct pim_interface *pim_ifp = NULL;
 
-       if (PIM_DEBUG_PIM_TRACE) {
-               char up_str[INET_ADDRSTRLEN];
-               char neigh_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<upstream?>", upstream, up_str, sizeof(up_str));
-               pim_inet4_dump("<neigh?>", neigh->source_addr, neigh_str,
-                              sizeof(neigh_str));
+       if (PIM_DEBUG_PIM_TRACE)
                zlog_debug(
-                       "%s: prune (S,G)=%s rpt=%d wc=%d upstream=%s holdtime=%d from %s on %s",
-                       __func__, pim_str_sg_dump(sg),
-                       source_flags & PIM_RPT_BIT_MASK,
-                       source_flags & PIM_WILDCARD_BIT_MASK, up_str, holdtime,
-                       neigh_str, ifp->name);
-       }
+                       "%s: prune (S,G)=%pSG rpt=%d wc=%d upstream=%pPAs holdtime=%d from %pPA on %s",
+                       __func__, sg, source_flags & PIM_RPT_BIT_MASK,
+                       source_flags & PIM_WILDCARD_BIT_MASK, &upstream,
+                       holdtime, &neigh->source_addr, ifp->name);
 
        pim_ifp = ifp->info;
        assert(pim_ifp);
@@ -155,26 +137,21 @@ static void recv_prune(struct interface *ifp, struct pim_neighbor *neigh,
                 * Received Prune(*,G) messages are processed even if the
                 * RP in the message does not match RP(G).
                 */
-               if (PIM_DEBUG_PIM_TRACE) {
-                       char received_rp[INET_ADDRSTRLEN];
-
-                       pim_inet4_dump("<received?>", sg->src, received_rp,
-                                      sizeof(received_rp));
-                       zlog_debug("%s: Prune received with RP(%s) for %pPSG4",
-                                  __func__, received_rp, sg);
-               }
+               if (PIM_DEBUG_PIM_TRACE)
+                       zlog_debug("%s: Prune received with RP(%pPAs) for %pSG",
+                                  __func__, &sg->src, sg);
 
-               sg->src.s_addr = INADDR_ANY;
+               sg->src = PIMADDR_ANY;
        }
 
        pim_ifchannel_prune(ifp, upstream, sg, source_flags, holdtime);
 }
 
 int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
-                      struct in_addr src_addr, uint8_t *tlv_buf,
-                      int tlv_buf_size)
+                      pim_addr src_addr, uint8_t *tlv_buf, int tlv_buf_size)
 {
-       struct prefix msg_upstream_addr;
+       pim_addr msg_upstream_addr;
+       bool wrong_af = false;
        struct pim_interface *pim_ifp;
        uint8_t msg_num_groups;
        uint16_t msg_holdtime;
@@ -193,13 +170,11 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
        /*
          Parse ucast addr
        */
-       addr_offset =
-               pim_parse_addr_ucast(&msg_upstream_addr, buf, pastend - buf);
+       addr_offset = pim_parse_addr_ucast(&msg_upstream_addr, buf,
+                                          pastend - buf, &wrong_af);
        if (addr_offset < 1) {
-               char src_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
-               zlog_warn("%s: pim_parse_addr_ucast() failure: from %s on %s",
-                         __func__, src_str, ifp->name);
+               zlog_warn("%s: pim_parse_addr_ucast() failure: from %pPA on %s",
+                         __func__, &src_addr, ifp->name);
                return -1;
        }
        buf += addr_offset;
@@ -207,22 +182,18 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
        /*
          Check upstream address family
         */
-       if (msg_upstream_addr.family != AF_INET) {
-               char src_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
+       if (wrong_af) {
                zlog_warn(
-                       "%s: ignoring join/prune directed to unexpected addr family=%d from %s on %s",
-                       __func__, msg_upstream_addr.family, src_str, ifp->name);
+                       "%s: ignoring join/prune directed to unexpected addr family from %pPA on %s",
+                       __func__, &src_addr, ifp->name);
                return -2;
        }
 
        remain = pastend - buf;
        if (remain < 4) {
-               char src_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
                zlog_warn(
-                       "%s: short join/prune message buffer for group list: size=%d minimum=%d from %s on %s",
-                       __func__, remain, 4, src_str, ifp->name);
+                       "%s: short join/prune message buffer for group list: size=%d minimum=%d from %pPA on %s",
+                       __func__, remain, 4, &src_addr, ifp->name);
                return -4;
        }
 
@@ -233,21 +204,15 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
        ++buf;
        ++buf;
 
-       if (PIM_DEBUG_PIM_J_P) {
-               char src_str[INET_ADDRSTRLEN];
-               char upstream_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
-               pim_inet4_dump("<addr?>", msg_upstream_addr.u.prefix4,
-                              upstream_str, sizeof(upstream_str));
+       if (PIM_DEBUG_PIM_J_P)
                zlog_debug(
-                       "%s: join/prune upstream=%s groups=%d holdtime=%d from %s on %s",
-                       __func__, upstream_str, msg_num_groups, msg_holdtime,
-                       src_str, ifp->name);
-       }
+                       "%s: join/prune upstream=%pPAs groups=%d holdtime=%d from %pPA on %s",
+                       __func__, &msg_upstream_addr, msg_num_groups,
+                       msg_holdtime, &src_addr, ifp->name);
 
        /* Scan groups */
        for (group = 0; group < msg_num_groups; ++group) {
-               struct prefix_sg sg;
+               pim_sgaddr sg;
                uint8_t msg_source_flags;
                uint16_t msg_num_joined_sources;
                uint16_t msg_num_pruned_sources;
@@ -255,7 +220,7 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                struct pim_ifchannel *starg_ch = NULL, *sg_ch = NULL;
                bool filtered = false;
 
-               memset(&sg, 0, sizeof(struct prefix_sg));
+               memset(&sg, 0, sizeof(sg));
                addr_offset = pim_parse_addr_group(&sg, buf, pastend - buf);
                if (addr_offset < 1) {
                        return -5;
@@ -264,12 +229,9 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
 
                remain = pastend - buf;
                if (remain < 4) {
-                       char src_str[INET_ADDRSTRLEN];
-                       pim_inet4_dump("<src?>", src_addr, src_str,
-                                      sizeof(src_str));
                        zlog_warn(
-                               "%s: short join/prune buffer for source list: size=%d minimum=%d from %s on %s",
-                               __func__, remain, 4, src_str, ifp->name);
+                               "%s: short join/prune buffer for source list: size=%d minimum=%d from %pPA on %s",
+                               __func__, remain, 4, &src_addr, ifp->name);
                        return -6;
                }
 
@@ -278,22 +240,12 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                msg_num_pruned_sources = ntohs(*(const uint16_t *)buf);
                buf += 2;
 
-               if (PIM_DEBUG_PIM_J_P) {
-                       char src_str[INET_ADDRSTRLEN];
-                       char upstream_str[INET_ADDRSTRLEN];
-                       char group_str[INET_ADDRSTRLEN];
-                       pim_inet4_dump("<src?>", src_addr, src_str,
-                                      sizeof(src_str));
-                       pim_inet4_dump("<addr?>", msg_upstream_addr.u.prefix4,
-                                      upstream_str, sizeof(upstream_str));
-                       pim_inet4_dump("<grp?>", sg.grp, group_str,
-                                      sizeof(group_str));
+               if (PIM_DEBUG_PIM_J_P)
                        zlog_debug(
-                               "%s: join/prune upstream=%s group=%s/32 join_src=%d prune_src=%d from %s on %s",
-                               __func__, upstream_str, group_str,
+                               "%s: join/prune upstream=%pPAs group=%pPA/32 join_src=%d prune_src=%d from %pPA on %s",
+                               __func__, &msg_upstream_addr, &sg.grp,
                                msg_num_joined_sources, msg_num_pruned_sources,
-                               src_str, ifp->name);
-               }
+                               &src_addr, ifp->name);
 
                /* boundary check */
                filtered = pim_is_group_filtered(pim_ifp, &sg.grp);
@@ -312,11 +264,10 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                        if (filtered)
                                continue;
 
-                       recv_join(ifp, neigh, msg_holdtime,
-                                 msg_upstream_addr.u.prefix4, &sg,
-                                 msg_source_flags);
+                       recv_join(ifp, neigh, msg_holdtime, msg_upstream_addr,
+                                 &sg, msg_source_flags);
 
-                       if (sg.src.s_addr == INADDR_ANY) {
+                       if (pim_addr_is_any(sg.src)) {
                                starg_ch = pim_ifchannel_find(ifp, &sg);
                                if (starg_ch)
                                        pim_ifchannel_set_star_g_join_state(
@@ -338,9 +289,8 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                        if (filtered)
                                continue;
 
-                       recv_prune(ifp, neigh, msg_holdtime,
-                                  msg_upstream_addr.u.prefix4, &sg,
-                                  msg_source_flags);
+                       recv_prune(ifp, neigh, msg_holdtime, msg_upstream_addr,
+                                  &sg, msg_source_flags);
                        /*
                         * So if we are receiving a S,G,RPT prune
                         * before we have any data for that S,G
@@ -489,7 +439,7 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
                return -1;
        }
 
-       if (PIM_INADDR_IS_ANY(rpf->rpf_addr.u.prefix4)) {
+       if (rpf->rpf_addr.u.prefix4.s_addr == INADDR_ANY) {
                if (PIM_DEBUG_PIM_J_P) {
                        char dst_str[INET_ADDRSTRLEN];
                        pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4,
@@ -528,7 +478,7 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
                        grp = &msg->groups[0];
                        curr_ptr = (uint8_t *)grp;
                        packet_size = sizeof(struct pim_msg_header);
-                       packet_size += sizeof(struct pim_encoded_ipv4_unicast);
+                       packet_size += sizeof(pim_encoded_unicast);
                        packet_size +=
                                4; // reserved (1) + groups (1) + holdtime (2)
 
@@ -537,14 +487,11 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
                }
                if (PIM_DEBUG_PIM_J_P) {
                        char dst_str[INET_ADDRSTRLEN];
-                       char grp_str[INET_ADDRSTRLEN];
                        pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4,
                                       dst_str, sizeof(dst_str));
-                       pim_inet4_dump("<grp?>", group->group, grp_str,
-                                      sizeof(grp_str));
                        zlog_debug(
-                               "%s: sending (G)=%s to upstream=%s on interface %s",
-                               __func__, grp_str, dst_str,
+                               "%s: sending (G)=%pPAs to upstream=%s on interface %s",
+                               __func__, &group->group, dst_str,
                                rpf->source_nexthop.interface->name);
                }
 
@@ -576,7 +523,7 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
                        grp = &msg->groups[0];
                        curr_ptr = (uint8_t *)grp;
                        packet_size = sizeof(struct pim_msg_header);
-                       packet_size += sizeof(struct pim_encoded_ipv4_unicast);
+                       packet_size += sizeof(pim_encoded_unicast);
                        packet_size +=
                                4; // reserved (1) + groups (1) + holdtime (2)