Replaces comparison against INADDR_ANY, so we can do IPv6 too.
(Renamed from "pim_is_addr_any" for "pim_addr_*" naming pattern, and
type fixed to bool.)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
if (!addr)
return bputs(buf, "(null)");
- if (use_star) {
- pim_addr zero = {};
-
- if (memcmp(addr, &zero, sizeof(zero)) == 0)
- return bputch(buf, '*');
- }
+ if (use_star && pim_addr_is_any(*addr))
+ return bputch(buf, '*');
#if PIM_IPV == 4
return bprintfrr(buf, "%pI4", addr);
#define PIM_ADDRSTRLEN INET6_ADDRSTRLEN
#endif
+static inline bool pim_addr_is_any(pim_addr addr)
+{
+ pim_addr zero = {};
+
+ return memcmp(&addr, &zero, sizeof(zero)) == 0;
+}
+
/* don't use this struct directly, use the pim_sgaddr typedef */
struct _pim_sgaddr {
pim_addr grp;
/* Find the upstream (*, G) whose upstream address is same as
* the RP
*/
- if (up->sg.src.s_addr != INADDR_ANY)
+ if (!pim_addr_is_any(up->sg.src))
continue;
struct prefix grp;
* we are the FHR, else we just put
* the RP as the rpfAddress
*/
- if (up->flags & PIM_UPSTREAM_FLAG_MASK_FHR
- || up->sg.src.s_addr == INADDR_ANY) {
+ if (up->flags & PIM_UPSTREAM_FLAG_MASK_FHR ||
+ pim_addr_is_any(up->sg.src)) {
char rpf[PREFIX_STRLEN];
struct pim_rpf *rpg;
struct pim_ifchannel *child;
// Basic Sanity that we are not being silly
- if ((ch->sg.src.s_addr != INADDR_ANY)
- && (ch->sg.grp.s_addr != INADDR_ANY))
+ if (!pim_addr_is_any(ch->sg.src) && !pim_addr_is_any(ch->sg.grp))
return;
- if ((ch->sg.src.s_addr == INADDR_ANY)
- && (ch->sg.grp.s_addr == INADDR_ANY))
+ if (pim_addr_is_any(ch->sg.src) && pim_addr_is_any(ch->sg.grp))
return;
RB_FOREACH (child, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) {
- if ((ch->sg.grp.s_addr != INADDR_ANY)
- && (child->sg.grp.s_addr == ch->sg.grp.s_addr)
- && (child != ch)) {
+ if (!pim_addr_is_any(ch->sg.grp) &&
+ (child->sg.grp.s_addr == ch->sg.grp.s_addr) &&
+ (child != ch)) {
child->parent = ch;
listnode_add_sort(ch->sources, child);
}
* being inherited. So let's figure out what
* needs to be done here
*/
- if ((ch->sg.src.s_addr != INADDR_ANY) &&
- pim_upstream_evaluate_join_desired_interface(
- ch->upstream, ch, ch->parent))
+ if (!pim_addr_is_any(ch->sg.src) &&
+ pim_upstream_evaluate_join_desired_interface(
+ ch->upstream, ch, ch->parent))
pim_channel_add_oif(ch->upstream->channel_oil,
ch->interface,
PIM_OIF_FLAG_PROTO_STAR,
ch->ifjoin_state = new_state;
- if (ch->sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(ch->sg.src)) {
struct pim_upstream *up = ch->upstream;
struct pim_upstream *child;
struct listnode *up_node;
struct pim_ifchannel *parent = NULL;
// (S,G)
- if ((parent_sg.src.s_addr != INADDR_ANY)
- && (parent_sg.grp.s_addr != INADDR_ANY)) {
+ if (!pim_addr_is_any(parent_sg.src) &&
+ !pim_addr_is_any(parent_sg.grp)) {
parent_sg.src.s_addr = INADDR_ANY;
parent = pim_ifchannel_find(ch->interface, &parent_sg);
ch->sg = *sg;
snprintfrr(ch->sg_str, sizeof(ch->sg_str), "%pSG", sg);
ch->parent = pim_ifchannel_find_parent(ch);
- if (ch->sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(ch->sg.src)) {
ch->sources = list_new();
ch->sources->cmp =
(int (*)(void *, void *))pim_ifchannel_compare;
THREAD_OFF(ch->t_ifjoin_prune_pending_timer);
/* Check if SGRpt join Received */
- if ((source_flags & PIM_ENCODE_RPT_BIT)
- && (sg->src.s_addr != INADDR_ANY)) {
+ if ((source_flags & PIM_ENCODE_RPT_BIT) &&
+ !pim_addr_is_any(sg->src)) {
/*
* Transitions from Prune-Pending State (Rcv SGRpt Join)
* RFC 7761 Sec 4.5.3:
pim = pim_ifp->pim;
/* skip (*,G) ch creation if G is of type SSM */
- if (sg->src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(sg->src)) {
if (pim_is_grp_ssm(pim, sg->grp)) {
if (PIM_DEBUG_PIM_EVENTS)
zlog_debug("%s: local membership (S,G)=%pSG ignored as group is SSM",
ifmembership_set(ch, PIM_IFMEMBERSHIP_INCLUDE);
- if (sg->src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(sg->src)) {
struct pim_upstream *up = pim_upstream_find(pim, sg);
struct pim_upstream *child;
struct listnode *up_node;
return;
ifmembership_set(ch, PIM_IFMEMBERSHIP_NOINFO);
- if (sg->src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(sg->src)) {
struct pim_upstream *up = pim_upstream_find(pim_ifp->pim, sg);
struct pim_upstream *child;
struct listnode *up_node, *up_nnode;
rspp->rtg_proto = MTRACE_RTG_PROTO_PIM;
/* 6.2.2. 4. Fill in ... S, and Src Mask */
- if (sg.src.s_addr != INADDR_ANY) {
+ if (!pim_addr_is_any(sg.src)) {
rspp->s = 1;
rspp->src_mask = MTRACE_SRC_MASK_SOURCE;
} else {
msg_upstream_addr.u.prefix4, &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(
/* If DF role changed on a (*,G) termination mroute update the
* associated DF role on the inherited (S,G) entries
*/
- if ((up->sg.src.s_addr == INADDR_ANY) &&
- PIM_UPSTREAM_FLAG_TEST_MLAG_VXLAN(up->flags))
+ if (pim_addr_is_any(up->sg.src) &&
+ PIM_UPSTREAM_FLAG_TEST_MLAG_VXLAN(up->flags))
pim_vxlan_inherit_mlag_flags(pim, up, true /* inherit */);
return true;
}
/* If this is not really an XG entry just move on */
- if ((xg_up->sg.src.s_addr != INADDR_ANY)
- || (xg_up->sg.grp.s_addr == INADDR_ANY)) {
+ if (!pim_addr_is_any(xg_up->sg.src) || pim_addr_is_any(xg_up->sg.grp)) {
return;
}
}
/* If this is not really an XG entry just move on */
- if ((sg->src.s_addr != INADDR_ANY) || (sg->grp.s_addr == INADDR_ANY)) {
+ if (!pim_addr_is_any(sg->src) || pim_addr_is_any(sg->grp)) {
return;
}
if (PIM_DEBUG_MSDP_INTERNAL) {
zlog_debug("MSDP up %pSG del", sg);
}
- if (sg->src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(sg->src)) {
pim_msdp_up_xg_del(pim, sg);
} else {
pim_msdp_sa_local_del_on_up_del(pim, sg);
size += sizeof(struct pim_encoded_source_ipv4) * sources->count;
js = listgetdata(listhead(sources));
- if (js && js->up->sg.src.s_addr == INADDR_ANY && js->is_join) {
+ if (js && pim_addr_is_any(js->up->sg.src) && js->is_join) {
struct pim_upstream *child, *up;
struct listnode *up_node;
else
grp->prunes++;
- if (source->up->sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(source->up->sg.src)) {
struct pim_instance *pim = source->up->channel_oil->pim;
struct pim_rpf *rpf = pim_rp_g(pim, source->up->sg.grp);
bits = PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_WC_BIT
struct prefix grp;
struct rp_info *trp_info;
- if (upstream->sg.src.s_addr != INADDR_ANY)
+ if (!pim_addr_is_any(upstream->sg.src))
continue;
grp.family = AF_INET;
/* if an inherited OIF is being removed join-desired can change
* if the inherited OIL is now empty and KAT is running
*/
- if (up && up->sg.src.s_addr != INADDR_ANY &&
- pim_upstream_empty_inherited_olist(up))
+ if (up && !pim_addr_is_any(up->sg.src) &&
+ pim_upstream_empty_inherited_olist(up))
pim_upstream_update_join_desired(up->pim, up);
}
}
if (pim_is_grp_ssm(pim_ifp->pim, sg.grp)) {
- if (sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(sg.src)) {
zlog_warn(
"%s: Received Register message for Group(%pI4) is now in SSM, dropping the packet",
__func__, &sg.grp);
/* Find (*, G) upstream whose RP is not
* configured yet
*/
- if ((up->upstream_addr.s_addr == INADDR_ANY)
- && (up->sg.src.s_addr == INADDR_ANY)) {
+ if ((up->upstream_addr.s_addr == INADDR_ANY) &&
+ pim_addr_is_any(up->sg.src)) {
struct prefix grp;
struct rp_info *trp_info;
route_node_get_lock_count(rn));
frr_each (rb_pim_upstream, &pim->upstream_head, up) {
- if (up->sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(up->sg.src)) {
struct prefix grp;
struct rp_info *trp_info;
/* Find the upstream (*, G) whose upstream address is
* same as the deleted RP
*/
- if ((up->upstream_addr.s_addr
- == rp_info->rp.rpf_addr.u.prefix4.s_addr)
- && (up->sg.src.s_addr == INADDR_ANY)) {
+ if ((up->upstream_addr.s_addr ==
+ rp_info->rp.rpf_addr.u.prefix4.s_addr) &&
+ pim_addr_is_any(up->sg.src)) {
struct prefix grp;
grp.family = AF_INET;
grp.prefixlen = IPV4_MAX_BITLEN;
/* Find the upstream (*, G) whose upstream address is same as
* the deleted RP
*/
- if ((up->upstream_addr.s_addr
- == rp_info->rp.rpf_addr.u.prefix4.s_addr)
- && (up->sg.src.s_addr == INADDR_ANY)) {
+ if ((up->upstream_addr.s_addr ==
+ rp_info->rp.rpf_addr.u.prefix4.s_addr) &&
+ pim_addr_is_any(up->sg.src)) {
struct prefix grp;
grp.family = AF_INET;
listnode_add_sort(pim->rp_list, rp_info);
frr_each (rb_pim_upstream, &pim->upstream_head, up) {
- if (up->sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(up->sg.src)) {
struct prefix grp;
struct rp_info *trp_info;
grp.prefixlen = IPV4_MAX_BITLEN;
grp.u.prefix4 = up->sg.grp;
- if ((up->sg.src.s_addr == INADDR_ANY && I_am_RP(pim, up->sg.grp)) ||
+ if ((pim_addr_is_any(up->sg.src) && I_am_RP(pim, up->sg.grp)) ||
PIM_UPSTREAM_FLAG_TEST_FHR(up->flags))
neigh_needed = false;
pim_find_or_track_nexthop(pim, &nht_p, up, NULL, NULL);
dest->s_addr = source->s_addr;
}
-static inline int pim_is_addr_any(pim_addr addr)
-{
- return (addr.s_addr == INADDR_ANY);
-}
-
static inline int pim_addr_cmp(pim_addr addr1, pim_addr addr2)
{
return IPV4_ADDR_CMP(&addr1, &addr2);
{
struct pim_upstream *child;
- if ((up->sg.src.s_addr != INADDR_ANY)
- && (up->sg.grp.s_addr != INADDR_ANY))
+ if (!pim_addr_is_any(up->sg.src) && !pim_addr_is_any(up->sg.grp))
return;
- if ((up->sg.src.s_addr == INADDR_ANY)
- && (up->sg.grp.s_addr == INADDR_ANY))
+ if (pim_addr_is_any(up->sg.src) && pim_addr_is_any(up->sg.grp))
return;
frr_each (rb_pim_upstream, &pim->upstream_head, child) {
- if ((up->sg.grp.s_addr != INADDR_ANY)
- && (child->sg.grp.s_addr == up->sg.grp.s_addr)
- && (child != up)) {
+ if (!pim_addr_is_any(up->sg.grp) &&
+ (child->sg.grp.s_addr == up->sg.grp.s_addr) &&
+ (child != up)) {
child->parent = up;
listnode_add_sort(up->sources, child);
if (PIM_UPSTREAM_FLAG_TEST_USE_RPT(child->flags))
struct pim_upstream *up = NULL;
// (S,G)
- if ((child->sg.src.s_addr != INADDR_ANY)
- && (child->sg.grp.s_addr != INADDR_ANY)) {
+ if (!pim_addr_is_any(child->sg.src) &&
+ !pim_addr_is_any(child->sg.grp)) {
any.src.s_addr = INADDR_ANY;
up = pim_upstream_find(pim, &any);
if (up->join_state == PIM_UPSTREAM_JOINED) {
pim_jp_agg_single_upstream_send(&up->rpf, up, 0);
- if (up->sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(up->sg.src)) {
/* if a (*, G) entry in the joined state is being
* deleted we
* need to notify MSDP */
pim_jp_agg_upstream_verification(up, false);
up->rpf.source_nexthop.interface = NULL;
- if (up->sg.src.s_addr != INADDR_ANY) {
+ if (!pim_addr_is_any(up->sg.src)) {
if (pim->upstream_sg_wheel)
wheel_remove_item(pim->upstream_sg_wheel, up);
notify_msdp = true;
bool old_use_rpt;
bool new_use_rpt;
- if (up->sg.src.s_addr == INADDR_ANY)
+ if (pim_addr_is_any(up->sg.src))
return;
old_use_rpt = !!PIM_UPSTREAM_FLAG_TEST_USE_RPT(up->flags);
struct pim_upstream *up;
frr_each (rb_pim_upstream, &pim->upstream_head, up) {
- if (up->sg.src.s_addr == INADDR_ANY)
+ if (pim_addr_is_any(up->sg.src))
continue;
pim_upstream_update_use_rpt(up, true /*update_mroute*/);
* RFC 4601 Sec 4.5.7:
* JoinDesired(S,G) -> False, set SPTbit to false.
*/
- if (up->sg.src.s_addr != INADDR_ANY)
+ if (!pim_addr_is_any(up->sg.src))
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
if (old_state == PIM_UPSTREAM_JOINED)
}
up->parent = pim_upstream_find_parent(pim, up);
- if (up->sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(up->sg.src)) {
up->sources = list_new();
up->sources->cmp =
(int (*)(void *, void *))pim_upstream_compare;
up->ifchannels = list_new();
up->ifchannels->cmp = (int (*)(void *, void *))pim_ifchannel_compare;
- if (up->sg.src.s_addr != INADDR_ANY) {
+ if (!pim_addr_is_any(up->sg.src)) {
wheel_add_item(pim->upstream_sg_wheel, up);
/* Inherit the DF role from the parent (*, G) entry for
empty_imm_oil = pim_upstream_empty_immediate_olist(pim, up);
/* (*,G) */
- if (up->sg.src.s_addr == INADDR_ANY)
+ if (pim_addr_is_any(up->sg.src))
return !empty_imm_oil;
/* (S,G) */
struct pim_upstream *up;
frr_each (rb_pim_upstream, &pim->upstream_head, up) {
- if (up->sg.src.s_addr != INADDR_ANY)
+ if (!pim_addr_is_any(up->sg.src))
continue;
if (!PIM_UPSTREAM_FLAG_TEST_CAN_BE_LHR(up->flags))
g.prefixlen = IPV4_MAX_BITLEN;
frr_each (rb_pim_upstream, &pim->upstream_head, up) {
- if (up->sg.src.s_addr != INADDR_ANY)
+ if (!pim_addr_is_any(up->sg.src))
continue;
if (!PIM_UPSTREAM_FLAG_TEST_CAN_BE_LHR(up->flags))
*/
static inline bool pim_vxlan_is_orig_mroute(struct pim_vxlan_sg *vxlan_sg)
{
- return (vxlan_sg->sg.src.s_addr != INADDR_ANY);
+ return !pim_addr_is_any(vxlan_sg->sg.src);
}
static inline bool pim_vxlan_is_local_sip(struct pim_upstream *up)
{
- return (up->sg.src.s_addr != INADDR_ANY) &&
- up->rpf.source_nexthop.interface &&
- if_is_loopback(up->rpf.source_nexthop.interface);
+ return !pim_addr_is_any(up->sg.src) &&
+ up->rpf.source_nexthop.interface &&
+ if_is_loopback(up->rpf.source_nexthop.interface);
}
static inline bool pim_vxlan_is_term_dev_cfg(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);
}
}