mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-29 15:07:51 +00:00
pimd: deploy pim_sgaddr_* helpers
Use _cmp/_hash/_match helpers for operations on pim_sgaddr to prepare IPv6 support. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
408ed95ed2
commit
62f59b58ba
@ -43,8 +43,7 @@ struct in_addr pim_br_get_pmbr(pim_sgaddr *sg)
|
|||||||
struct pim_br *pim_br;
|
struct pim_br *pim_br;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS_RO(pim_br_list, node, pim_br)) {
|
for (ALL_LIST_ELEMENTS_RO(pim_br_list, node, pim_br)) {
|
||||||
if (sg->src.s_addr == pim_br->sg.src.s_addr
|
if (!pim_sgaddr_cmp(*sg, pim_br->sg))
|
||||||
&& sg->grp.s_addr == pim_br->sg.grp.s_addr)
|
|
||||||
return pim_br->pmbr;
|
return pim_br->pmbr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,8 +56,7 @@ void pim_br_set_pmbr(pim_sgaddr *sg, struct in_addr br)
|
|||||||
struct pim_br *pim_br;
|
struct pim_br *pim_br;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(pim_br_list, node, next, pim_br)) {
|
for (ALL_LIST_ELEMENTS(pim_br_list, node, next, pim_br)) {
|
||||||
if (sg->src.s_addr == pim_br->sg.src.s_addr
|
if (!pim_sgaddr_cmp(*sg, pim_br->sg))
|
||||||
&& sg->grp.s_addr == pim_br->sg.grp.s_addr)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,8 +79,7 @@ void pim_br_clear_pmbr(pim_sgaddr *sg)
|
|||||||
struct pim_br *pim_br;
|
struct pim_br *pim_br;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(pim_br_list, node, next, pim_br)) {
|
for (ALL_LIST_ELEMENTS(pim_br_list, node, next, pim_br)) {
|
||||||
if (sg->src.s_addr == pim_br->sg.src.s_addr
|
if (!pim_sgaddr_cmp(*sg, pim_br->sg))
|
||||||
&& sg->grp.s_addr == pim_br->sg.grp.s_addr)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,6 +79,14 @@ static struct cmd_node debug_node = {
|
|||||||
.config_write = pim_debug_config_write,
|
.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[],
|
static struct vrf *pim_cmd_lookup_vrf(struct vty *vty, struct cmd_token *argv[],
|
||||||
const int argc, int *idx)
|
const int argc, int *idx)
|
||||||
{
|
{
|
||||||
@ -1762,11 +1770,7 @@ static void pim_show_join(struct pim_instance *pim, struct vty *vty,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
RB_FOREACH (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) {
|
RB_FOREACH (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) {
|
||||||
if (sg->grp.s_addr != INADDR_ANY
|
if (!pim_sgaddr_match(ch->sg, *sg))
|
||||||
&& 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)
|
|
||||||
continue;
|
continue;
|
||||||
pim_show_join_helper(vty, pim_ifp, ch, json, now, uj);
|
pim_show_join_helper(vty, pim_ifp, ch, json, now, uj);
|
||||||
} /* scan interface channels */
|
} /* scan interface channels */
|
||||||
@ -2464,11 +2468,7 @@ static void pim_show_upstream(struct pim_instance *pim, struct vty *vty,
|
|||||||
char msdp_reg_timer[10];
|
char msdp_reg_timer[10];
|
||||||
char state_str[PIM_REG_STATE_STR_LEN];
|
char state_str[PIM_REG_STATE_STR_LEN];
|
||||||
|
|
||||||
if (sg->grp.s_addr != INADDR_ANY
|
if (!pim_sgaddr_match(up->sg, *sg))
|
||||||
&& 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)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
|
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
|
||||||
|
@ -62,19 +62,7 @@ int pim_ifchannel_compare(const struct pim_ifchannel *ch1,
|
|||||||
if (pim_ifp1->mroute_vif_index > pim_ifp2->mroute_vif_index)
|
if (pim_ifp1->mroute_vif_index > pim_ifp2->mroute_vif_index)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (ntohl(ch1->sg.grp.s_addr) < ntohl(ch2->sg.grp.s_addr))
|
return pim_sgaddr_cmp(ch1->sg, ch2->sg);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -680,7 +680,7 @@ static unsigned int pim_msdp_sa_hash_key_make(const void *p)
|
|||||||
{
|
{
|
||||||
const struct pim_msdp_sa *sa = p;
|
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)
|
static bool pim_msdp_sa_hash_eq(const void *p1, const void *p2)
|
||||||
@ -688,8 +688,7 @@ 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 *sa1 = p1;
|
||||||
const struct pim_msdp_sa *sa2 = p2;
|
const struct pim_msdp_sa *sa2 = p2;
|
||||||
|
|
||||||
return ((sa1->sg.src.s_addr == sa2->sg.src.s_addr)
|
return !pim_sgaddr_cmp(sa1->sg, sa2->sg);
|
||||||
&& (sa1->sg.grp.s_addr == sa2->sg.grp.s_addr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pim_msdp_sa_comp(const void *p1, const void *p2)
|
static int pim_msdp_sa_comp(const void *p1, const void *p2)
|
||||||
@ -697,19 +696,7 @@ static int pim_msdp_sa_comp(const void *p1, const void *p2)
|
|||||||
const struct pim_msdp_sa *sa1 = p1;
|
const struct pim_msdp_sa *sa1 = p1;
|
||||||
const struct pim_msdp_sa *sa2 = p2;
|
const struct pim_msdp_sa *sa2 = p2;
|
||||||
|
|
||||||
if (ntohl(sa1->sg.grp.s_addr) < ntohl(sa2->sg.grp.s_addr))
|
return pim_sgaddr_cmp(sa1->sg, sa2->sg);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* RFC-3618:Sec-10.1.3 - Peer-RPF forwarding */
|
/* RFC-3618:Sec-10.1.3 - Peer-RPF forwarding */
|
||||||
|
@ -824,19 +824,7 @@ void pim_upstream_switch(struct pim_instance *pim, struct pim_upstream *up,
|
|||||||
int pim_upstream_compare(const struct pim_upstream *up1,
|
int pim_upstream_compare(const struct pim_upstream *up1,
|
||||||
const struct pim_upstream *up2)
|
const struct pim_upstream *up2)
|
||||||
{
|
{
|
||||||
if (ntohl(up1->sg.grp.s_addr) < ntohl(up2->sg.grp.s_addr))
|
return pim_sgaddr_cmp(up1->sg, up2->sg);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pim_upstream_fill_static_iif(struct pim_upstream *up,
|
void pim_upstream_fill_static_iif(struct pim_upstream *up,
|
||||||
@ -1958,7 +1946,7 @@ unsigned int pim_upstream_hash_key(const void *arg)
|
|||||||
{
|
{
|
||||||
const struct pim_upstream *up = arg;
|
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)
|
void pim_upstream_terminate(struct pim_instance *pim)
|
||||||
@ -1981,11 +1969,7 @@ bool pim_upstream_equal(const void *arg1, const void *arg2)
|
|||||||
const struct pim_upstream *up1 = (const struct pim_upstream *)arg1;
|
const struct pim_upstream *up1 = (const struct pim_upstream *)arg1;
|
||||||
const struct pim_upstream *up2 = (const struct pim_upstream *)arg2;
|
const struct pim_upstream *up2 = (const struct pim_upstream *)arg2;
|
||||||
|
|
||||||
if ((up1->sg.grp.s_addr == up2->sg.grp.s_addr)
|
return !pim_sgaddr_cmp(up1->sg, up2->sg);
|
||||||
&& (up1->sg.src.s_addr == up2->sg.src.s_addr))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rfc4601:section-4.2:"Data Packet Forwarding Rules" defines
|
/* rfc4601:section-4.2:"Data Packet Forwarding Rules" defines
|
||||||
|
@ -720,8 +720,7 @@ static unsigned int pim_vxlan_sg_hash_key_make(const void *p)
|
|||||||
{
|
{
|
||||||
const struct pim_vxlan_sg *vxlan_sg = p;
|
const struct pim_vxlan_sg *vxlan_sg = p;
|
||||||
|
|
||||||
return (jhash_2words(vxlan_sg->sg.src.s_addr,
|
return pim_sgaddr_hash(vxlan_sg->sg, 0);
|
||||||
vxlan_sg->sg.grp.s_addr, 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pim_vxlan_sg_hash_eq(const void *p1, const void *p2)
|
static bool pim_vxlan_sg_hash_eq(const void *p1, const void *p2)
|
||||||
@ -729,8 +728,7 @@ 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 *sg1 = p1;
|
||||||
const struct pim_vxlan_sg *sg2 = p2;
|
const struct pim_vxlan_sg *sg2 = p2;
|
||||||
|
|
||||||
return ((sg1->sg.src.s_addr == sg2->sg.src.s_addr)
|
return !pim_sgaddr_cmp(sg1->sg, sg2->sg);
|
||||||
&& (sg1->sg.grp.s_addr == sg2->sg.grp.s_addr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pim_vxlan_sg *pim_vxlan_sg_new(struct pim_instance *pim,
|
static struct pim_vxlan_sg *pim_vxlan_sg_new(struct pim_instance *pim,
|
||||||
|
Loading…
Reference in New Issue
Block a user