struct pim_br *pim_br;
for (ALL_LIST_ELEMENTS_RO(pim_br_list, node, pim_br)) {
- if (sg->src.s_addr == pim_br->sg.src.s_addr
- && sg->grp.s_addr == pim_br->sg.grp.s_addr)
+ if (!pim_sgaddr_cmp(*sg, pim_br->sg))
return pim_br->pmbr;
}
struct pim_br *pim_br;
for (ALL_LIST_ELEMENTS(pim_br_list, node, next, pim_br)) {
- if (sg->src.s_addr == pim_br->sg.src.s_addr
- && sg->grp.s_addr == pim_br->sg.grp.s_addr)
+ if (!pim_sgaddr_cmp(*sg, pim_br->sg))
break;
}
struct pim_br *pim_br;
for (ALL_LIST_ELEMENTS(pim_br_list, node, next, pim_br)) {
- if (sg->src.s_addr == pim_br->sg.src.s_addr
- && sg->grp.s_addr == pim_br->sg.grp.s_addr)
+ if (!pim_sgaddr_cmp(*sg, pim_br->sg))
break;
}
.config_write = pim_debug_config_write,
};
+static inline bool pim_sgaddr_match(pim_sgaddr item, pim_sgaddr match)
+{
+ return (pim_addr_is_any(match.grp) ||
+ !pim_addr_cmp(match.grp, item.grp)) &&
+ (pim_addr_is_any(match.src) ||
+ !pim_addr_cmp(match.src, item.src));
+}
+
static struct vrf *pim_cmd_lookup_vrf(struct vty *vty, struct cmd_token *argv[],
const int argc, int *idx)
{
continue;
RB_FOREACH (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) {
- if (sg->grp.s_addr != INADDR_ANY
- && sg->grp.s_addr != ch->sg.grp.s_addr)
- continue;
- if (sg->src.s_addr != INADDR_ANY
- && sg->src.s_addr != ch->sg.src.s_addr)
+ if (!pim_sgaddr_match(ch->sg, *sg))
continue;
pim_show_join_helper(vty, pim_ifp, ch, json, now, uj);
} /* scan interface channels */
char msdp_reg_timer[10];
char state_str[PIM_REG_STATE_STR_LEN];
- if (sg->grp.s_addr != INADDR_ANY
- && sg->grp.s_addr != up->sg.grp.s_addr)
- continue;
- if (sg->src.s_addr != INADDR_ANY
- && sg->src.s_addr != up->sg.src.s_addr)
+ if (!pim_sgaddr_match(up->sg, *sg))
continue;
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
if (pim_ifp1->mroute_vif_index > pim_ifp2->mroute_vif_index)
return 1;
- if (ntohl(ch1->sg.grp.s_addr) < ntohl(ch2->sg.grp.s_addr))
- return -1;
-
- if (ntohl(ch1->sg.grp.s_addr) > ntohl(ch2->sg.grp.s_addr))
- return 1;
-
- if (ntohl(ch1->sg.src.s_addr) < ntohl(ch2->sg.src.s_addr))
- return -1;
-
- if (ntohl(ch1->sg.src.s_addr) > ntohl(ch2->sg.src.s_addr))
- return 1;
-
- return 0;
+ return pim_sgaddr_cmp(ch1->sg, ch2->sg);
}
/*
{
const struct pim_msdp_sa *sa = p;
- return (jhash_2words(sa->sg.src.s_addr, sa->sg.grp.s_addr, 0));
+ return pim_sgaddr_hash(sa->sg, 0);
}
static bool pim_msdp_sa_hash_eq(const void *p1, const void *p2)
const struct pim_msdp_sa *sa1 = p1;
const struct pim_msdp_sa *sa2 = p2;
- return ((sa1->sg.src.s_addr == sa2->sg.src.s_addr)
- && (sa1->sg.grp.s_addr == sa2->sg.grp.s_addr));
+ return !pim_sgaddr_cmp(sa1->sg, sa2->sg);
}
static int pim_msdp_sa_comp(const void *p1, const void *p2)
const struct pim_msdp_sa *sa1 = p1;
const struct pim_msdp_sa *sa2 = p2;
- if (ntohl(sa1->sg.grp.s_addr) < ntohl(sa2->sg.grp.s_addr))
- return -1;
-
- if (ntohl(sa1->sg.grp.s_addr) > ntohl(sa2->sg.grp.s_addr))
- return 1;
-
- if (ntohl(sa1->sg.src.s_addr) < ntohl(sa2->sg.src.s_addr))
- return -1;
-
- if (ntohl(sa1->sg.src.s_addr) > ntohl(sa2->sg.src.s_addr))
- return 1;
-
- return 0;
+ return pim_sgaddr_cmp(sa1->sg, sa2->sg);
}
/* RFC-3618:Sec-10.1.3 - Peer-RPF forwarding */
int pim_upstream_compare(const struct pim_upstream *up1,
const struct pim_upstream *up2)
{
- if (ntohl(up1->sg.grp.s_addr) < ntohl(up2->sg.grp.s_addr))
- return -1;
-
- if (ntohl(up1->sg.grp.s_addr) > ntohl(up2->sg.grp.s_addr))
- return 1;
-
- if (ntohl(up1->sg.src.s_addr) < ntohl(up2->sg.src.s_addr))
- return -1;
-
- if (ntohl(up1->sg.src.s_addr) > ntohl(up2->sg.src.s_addr))
- return 1;
-
- return 0;
+ return pim_sgaddr_cmp(up1->sg, up2->sg);
}
void pim_upstream_fill_static_iif(struct pim_upstream *up,
{
const struct pim_upstream *up = arg;
- return jhash_2words(up->sg.src.s_addr, up->sg.grp.s_addr, 0);
+ return pim_sgaddr_hash(up->sg, 0);
}
void pim_upstream_terminate(struct pim_instance *pim)
const struct pim_upstream *up1 = (const struct pim_upstream *)arg1;
const struct pim_upstream *up2 = (const struct pim_upstream *)arg2;
- if ((up1->sg.grp.s_addr == up2->sg.grp.s_addr)
- && (up1->sg.src.s_addr == up2->sg.src.s_addr))
- return true;
-
- return false;
+ return !pim_sgaddr_cmp(up1->sg, up2->sg);
}
/* rfc4601:section-4.2:"Data Packet Forwarding Rules" defines
{
const struct pim_vxlan_sg *vxlan_sg = p;
- return (jhash_2words(vxlan_sg->sg.src.s_addr,
- vxlan_sg->sg.grp.s_addr, 0));
+ return pim_sgaddr_hash(vxlan_sg->sg, 0);
}
static bool pim_vxlan_sg_hash_eq(const void *p1, const void *p2)
const struct pim_vxlan_sg *sg1 = p1;
const struct pim_vxlan_sg *sg2 = p2;
- return ((sg1->sg.src.s_addr == sg2->sg.src.s_addr)
- && (sg1->sg.grp.s_addr == sg2->sg.grp.s_addr));
+ return !pim_sgaddr_cmp(sg1->sg, sg2->sg);
}
static struct pim_vxlan_sg *pim_vxlan_sg_new(struct pim_instance *pim,