Skip to content

Commit

Permalink
Merge pull request #15149 from donaldsharp/pim_vxlan_issues_2
Browse files Browse the repository at this point in the history
Some code realignment in pim
  • Loading branch information
ton31337 authored Jan 13, 2024
2 parents fd690b9 + 22427b5 commit 4eafe41
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 77 deletions.
138 changes: 66 additions & 72 deletions pimd/pim_msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,84 +185,78 @@ size_t pim_msg_get_jp_group_size(struct list *sources)
size += sizeof(pim_encoded_source) * sources->count;

js = listgetdata(listhead(sources));
if (js && pim_addr_is_any(js->up->sg.src) && js->is_join) {
struct pim_upstream *child, *up;
struct listnode *up_node;

up = js->up;
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug(
"%s: Considering (%s) children for (S,G,rpt) prune",
__func__, up->sg_str);

for (ALL_LIST_ELEMENTS_RO(up->sources, up_node, child)) {
/*
* PIM VXLAN is weird
* It auto creates the S,G and populates a bunch
* of flags that make it look like a SPT prune should
* be sent. But this regularly scheduled join
* for the *,G in the VXLAN setup can happen at
* scheduled times *before* the null register
* is received by the RP to cause it to initiate
* the S,G joins toward the source. Let's just
* assume that if this is a SRC VXLAN ORIG route
* and no actual ifchannels( joins ) have been
* created then do not send the embedded prune
* Why you may ask? Well if the prune is S,G
* RPT Prune is received *before* the join
* from the RP( if it flows to this routers
* upstream interface ) then we'll just wisely
* create a mroute with an empty oil on
* the upstream intermediate router preventing
* packets from flowing to the RP
if (!js || !pim_addr_is_any(js->up->sg.src) || !js->is_join)
return size;

struct pim_upstream *child, *up;
struct listnode *up_node;

up = js->up;
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: Considering (%s) children for (S,G,rpt) prune",
__func__, up->sg_str);

for (ALL_LIST_ELEMENTS_RO(up->sources, up_node, child)) {
/*
* PIM VXLAN is weird
* It auto creates the S,G and populates a bunch
* of flags that make it look like a SPT prune should
* be sent. But this regularly scheduled join
* for the *,G in the VXLAN setup can happen at
* scheduled times *before* the null register
* is received by the RP to cause it to initiate
* the S,G joins toward the source. Let's just
* assume that if this is a SRC VXLAN ORIG route
* and no actual ifchannels( joins ) have been
* created then do not send the embedded prune
* Why you may ask? Well if the prune is S,G
* RPT Prune is received *before* the join
* from the RP( if it flows to this routers
* upstream interface ) then we'll just wisely
* create a mroute with an empty oil on
* the upstream intermediate router preventing
* packets from flowing to the RP
*/
if (PIM_UPSTREAM_FLAG_TEST_SRC_VXLAN_ORIG(child->flags) &&
listcount(child->ifchannels) == 0) {
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: %s Vxlan originated S,G route with no ifchannels, not adding prune to compound message",
__func__, child->sg_str);
} else if (!PIM_UPSTREAM_FLAG_TEST_USE_RPT(child->flags)) {
/* If we are using SPT and the SPT and RPT IIFs
* are different we can prune the source off
* of the RPT.
* If RPF_interface(S) is not resolved hold
* decision to prune as SPT may end up on the
* same IIF as RPF_interface(RP).
*/
if (PIM_UPSTREAM_FLAG_TEST_SRC_VXLAN_ORIG(child->flags) &&
listcount(child->ifchannels) == 0) {
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: %s Vxlan originated S,G route with no ifchannels, not adding prune to compound message",
__func__, child->sg_str);
} else if (!PIM_UPSTREAM_FLAG_TEST_USE_RPT(child->flags)) {
/* If we are using SPT and the SPT and RPT IIFs
* are different we can prune the source off
* of the RPT.
* If RPF_interface(S) is not resolved hold
* decision to prune as SPT may end up on the
* same IIF as RPF_interface(RP).
*/
if (child->rpf.source_nexthop.interface &&
!pim_rpf_is_same(&up->rpf,
&child->rpf)) {
size += sizeof(pim_encoded_source);
PIM_UPSTREAM_FLAG_SET_SEND_SG_RPT_PRUNE(
child->flags);
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug(
"%s: SPT Bit and RPF'(%s) != RPF'(S,G): Add Prune (%s,rpt) to compound message",
__func__, up->sg_str,
child->sg_str);
} else if (PIM_DEBUG_PIM_PACKETS)
zlog_debug(
"%s: SPT Bit and RPF'(%s) == RPF'(S,G): Not adding Prune for (%s,rpt)",
__func__, up->sg_str,
child->sg_str);
} else if (pim_upstream_empty_inherited_olist(child)) {
/* S is supposed to be forwarded along the RPT
* but it's inherited OIL is empty. So just
* prune it off.
*/
if (child->rpf.source_nexthop.interface &&
!pim_rpf_is_same(&up->rpf, &child->rpf)) {
size += sizeof(pim_encoded_source);
PIM_UPSTREAM_FLAG_SET_SEND_SG_RPT_PRUNE(
child->flags);
child->flags);
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug(
"%s: inherited_olist(%s,rpt) is NULL, Add Prune to compound message",
__func__, child->sg_str);
zlog_debug("%s: SPT Bit and RPF'(%s) != RPF'(S,G): Add Prune (%s,rpt) to compound message",
__func__, up->sg_str,
child->sg_str);
} else if (PIM_DEBUG_PIM_PACKETS)
zlog_debug(
"%s: Do not add Prune %s to compound message %s",
__func__, child->sg_str, up->sg_str);
}
zlog_debug("%s: SPT Bit and RPF'(%s) == RPF'(S,G): Not adding Prune for (%s,rpt)",
__func__, up->sg_str, child->sg_str);
} else if (pim_upstream_empty_inherited_olist(child)) {
/* S is supposed to be forwarded along the RPT
* but it's inherited OIL is empty. So just
* prune it off.
*/
size += sizeof(pim_encoded_source);
PIM_UPSTREAM_FLAG_SET_SEND_SG_RPT_PRUNE(child->flags);
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: inherited_olist(%s,rpt) is NULL, Add Prune to compound message",
__func__, child->sg_str);
} else if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: Do not add Prune %s to compound message %s",
__func__, child->sg_str, up->sg_str);
}

return size;
}

Expand Down
10 changes: 5 additions & 5 deletions pimd/pim_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
p = c->address;

if (PIM_DEBUG_ZEBRA) {
zlog_debug("%s: %s(%u) connected IP address %pFX flags %u %s",
__func__, c->ifp->name, vrf_id, p, c->flags,
zlog_debug("%s: %s(%s) connected IP address %pFX flags %u %s",
__func__, c->ifp->name, VRF_LOGNAME(pim_ifp->pim->vrf), p, c->flags,
CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)
? "secondary"
: "primary");
Expand Down Expand Up @@ -182,8 +182,8 @@ static int pim_zebra_if_address_del(ZAPI_CALLBACK_ARGS)

if (PIM_DEBUG_ZEBRA) {
zlog_debug(
"%s: %s(%u) disconnected IP address %pFX flags %u %s",
__func__, c->ifp->name, vrf_id, p, c->flags,
"%s: %s(%s) disconnected IP address %pFX flags %u %s",
__func__, c->ifp->name, VRF_LOGNAME(vrf), p, c->flags,
CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)
? "secondary"
: "primary");
Expand Down Expand Up @@ -325,7 +325,7 @@ static int pim_zebra_vxlan_sg_proc(ZAPI_CALLBACK_ARGS)
stream_get(&sg.grp, s, prefixlen);

if (PIM_DEBUG_ZEBRA)
zlog_debug("%u:recv SG %s %pSG", vrf_id,
zlog_debug("%s:recv SG %s %pSG", VRF_LOGNAME(pim->vrf),
(cmd == ZEBRA_VXLAN_SG_ADD) ? "add" : "del", &sg);

if (cmd == ZEBRA_VXLAN_SG_ADD)
Expand Down

0 comments on commit 4eafe41

Please sign in to comment.