pimd: extern pim_null_register_send

pim_vxlan will use this for registering the local-VTEP-IP wth the RP
independent of the presence of BUM traffic.

Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
This commit is contained in:
Anuradha Karuppiah 2019-03-22 10:01:40 -07:00
parent b1891fa084
commit aea1f84551
3 changed files with 41 additions and 20 deletions

View File

@ -219,6 +219,45 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src,
}
}
void pim_null_register_send(struct pim_upstream *up)
{
struct ip ip_hdr;
struct pim_interface *pim_ifp;
struct pim_rpf *rpg;
struct in_addr src;
pim_ifp = up->rpf.source_nexthop.interface->info;
if (!pim_ifp) {
if (PIM_DEBUG_TRACE)
zlog_debug(
"%s: Cannot send null-register for %s no valid iif",
__PRETTY_FUNCTION__, up->sg_str);
return;
}
rpg = RP(pim_ifp->pim, up->sg.grp);
if (!rpg) {
if (PIM_DEBUG_TRACE)
zlog_debug(
"%s: Cannot send null-register for %s no RPF to the RP",
__PRETTY_FUNCTION__, up->sg_str);
return;
}
memset(&ip_hdr, 0, sizeof(struct ip));
ip_hdr.ip_p = PIM_IP_PROTO_PIM;
ip_hdr.ip_hl = 5;
ip_hdr.ip_v = 4;
ip_hdr.ip_src = up->sg.src;
ip_hdr.ip_dst = up->sg.grp;
ip_hdr.ip_len = htons(20);
/* checksum is broken */
src = pim_ifp->primary_address;
pim_register_send((uint8_t *)&ip_hdr, sizeof(struct ip),
src, rpg, 1, up);
}
/*
* 4.4.2 Receiving Register Messages at the RP
*

View File

@ -42,5 +42,6 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src,
void pim_register_stop_send(struct interface *ifp, struct prefix_sg *sg,
struct in_addr src, struct in_addr originator);
void pim_register_join(struct pim_upstream *up);
void pim_null_register_send(struct pim_upstream *up);
#endif

View File

@ -1417,8 +1417,6 @@ static int pim_upstream_register_stop_timer(struct thread *t)
struct pim_interface *pim_ifp;
struct pim_instance *pim;
struct pim_upstream *up;
struct pim_rpf *rpg;
struct ip ip_hdr;
up = THREAD_ARG(t);
pim = up->channel_oil->pim;
@ -1466,24 +1464,7 @@ static int pim_upstream_register_stop_timer(struct thread *t)
__PRETTY_FUNCTION__);
return 0;
}
rpg = RP(pim_ifp->pim, up->sg.grp);
if (!rpg) {
if (PIM_DEBUG_TRACE)
zlog_debug(
"%s: Cannot send register for %s no RPF to the RP",
__PRETTY_FUNCTION__, up->sg_str);
return 0;
}
memset(&ip_hdr, 0, sizeof(struct ip));
ip_hdr.ip_p = PIM_IP_PROTO_PIM;
ip_hdr.ip_hl = 5;
ip_hdr.ip_v = 4;
ip_hdr.ip_src = up->sg.src;
ip_hdr.ip_dst = up->sg.grp;
ip_hdr.ip_len = htons(20);
// checksum is broken
pim_register_send((uint8_t *)&ip_hdr, sizeof(struct ip),
pim_ifp->primary_address, rpg, 1, up);
pim_null_register_send(up);
break;
default:
break;