Comparing `s_addr` isn't cutting it for IPv6 support.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
return memcmp(&addr, &zero, sizeof(zero)) == 0;
}
+static inline int pim_addr_cmp(pim_addr a, pim_addr b)
+{
+ return memcmp(&a, &b, sizeof(a));
+}
+
/* don't use this struct directly, use the pim_sgaddr typedef */
struct _pim_sgaddr {
pim_addr grp;
if (!c_oil->installed)
continue;
- if (sg->grp.s_addr != INADDR_ANY
- && sg->grp.s_addr != c_oil->oil.mfcc_mcastgrp.s_addr)
+ if (!pim_addr_is_any(sg->grp) &&
+ pim_addr_cmp(sg->grp, c_oil->oil.mfcc_mcastgrp))
continue;
- if (sg->src.s_addr != INADDR_ANY
- && sg->src.s_addr != c_oil->oil.mfcc_origin.s_addr)
+ if (!pim_addr_is_any(sg->src) &&
+ pim_addr_cmp(sg->src, c_oil->oil.mfcc_origin))
continue;
pim_inet4_dump("<group?>", c_oil->oil.mfcc_mcastgrp, grp_str,
else
oif_name = vxlan_sg->term_oif?vxlan_sg->term_oif->name:"";
- if (cwd->addr_match && (vxlan_sg->sg.src.s_addr != cwd->addr.s_addr) &&
- (vxlan_sg->sg.grp.s_addr != cwd->addr.s_addr)) {
+ if (cwd->addr_match && pim_addr_cmp(vxlan_sg->sg.src, cwd->addr) &&
+ pim_addr_cmp(vxlan_sg->sg.grp, cwd->addr)) {
return;
}
pim_inet4_dump("<src?>", vxlan_sg->sg.src, src_str, sizeof(src_str));
RB_FOREACH (child, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) {
if (!pim_addr_is_any(ch->sg.grp) &&
- (child->sg.grp.s_addr == ch->sg.grp.s_addr) &&
- (child != ch)) {
+ !pim_addr_cmp(child->sg.grp, ch->sg.grp) && (child != ch)) {
child->parent = ch;
listnode_add_sort(ch->sources, child);
}
if (!js1->is_join && js2->is_join)
return 1;
- if ((uint32_t)js1->up->sg.src.s_addr < (uint32_t)js2->up->sg.src.s_addr)
- return -1;
-
- if ((uint32_t)js1->up->sg.src.s_addr > (uint32_t)js2->up->sg.src.s_addr)
- return 1;
-
- return 0;
+ return pim_addr_cmp(js1->up->sg.src, js2->up->sg.src);
}
/*
struct pim_jp_sources *js = NULL;
for (ALL_LIST_ELEMENTS(group, node, nnode, jag)) {
- if (jag->group.s_addr == up->sg.grp.s_addr)
+ if (!pim_addr_cmp(jag->group, up->sg.grp))
break;
}
struct pim_jp_sources *js = NULL;
for (ALL_LIST_ELEMENTS(group, node, nnode, jag)) {
- if (jag->group.s_addr == up->sg.grp.s_addr)
+ if (!pim_addr_cmp(jag->group, up->sg.grp))
break;
}
struct pim_jp_sources *js = NULL;
for (ALL_LIST_ELEMENTS(group, node, nnode, jag)) {
- if (jag->group.s_addr == up->sg.grp.s_addr)
+ if (!pim_addr_cmp(jag->group, up->sg.grp))
break;
}
/* XXX: Need to maintain SAs per-group to avoid all this unnecessary
* walking */
for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) {
- if (sa->sg.grp.s_addr != xg_up->sg.grp.s_addr) {
+ if (pim_addr_cmp(sa->sg.grp, xg_up->sg.grp)) {
continue;
}
pim_msdp_sa_upstream_update(sa, xg_up, "up-jp-change");
/* XXX: Need to maintain SAs per-group to avoid all this unnecessary
* walking */
for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) {
- if (sa->sg.grp.s_addr != sg->grp.s_addr) {
+ if (pim_addr_cmp(sa->sg.grp, sg->grp)) {
continue;
}
pim_msdp_sa_upstream_update(sa, NULL /* xg */, "up-jp-change");
dest->s_addr = source->s_addr;
}
-static inline int pim_addr_cmp(pim_addr addr1, pim_addr addr2)
-{
- return IPV4_ADDR_CMP(&addr1, &addr2);
-}
-
void pim_addr_dump(const char *onfail, struct prefix *p, char *buf,
int buf_size);
void pim_inet4_dump(const char *onfail, struct in_addr addr, char *buf,
frr_each (rb_pim_upstream, &pim->upstream_head, child) {
if (!pim_addr_is_any(up->sg.grp) &&
- (child->sg.grp.s_addr == up->sg.grp.s_addr) &&
- (child != up)) {
+ !pim_addr_cmp(child->sg.grp, up->sg.grp) && (child != up)) {
child->parent = up;
listnode_add_sort(up->sources, child);
if (PIM_UPSTREAM_FLAG_TEST_USE_RPT(child->flags))