return 0;
}
-int pim_joinprune_send(struct interface *ifp,
- struct in_addr upstream_addr,
- struct pim_upstream *up,
- int send_join)
+int pim_joinprune_send(struct pim_rpf *rpf,
+ struct pim_upstream *up,
+ int send_join)
{
struct pim_interface *pim_ifp;
uint8_t pim_msg[9000];
int pim_msg_size;
- on_trace (__PRETTY_FUNCTION__, ifp, upstream_addr);
+ on_trace (__PRETTY_FUNCTION__, rpf->source_nexthop.interface, rpf->rpf_addr.u.prefix4);
- zassert(ifp);
-
- pim_ifp = ifp->info;
+ pim_ifp = rpf->source_nexthop.interface->info;
if (!pim_ifp) {
zlog_warn("%s: multicast not enabled on interface %s",
- __PRETTY_FUNCTION__,
- ifp->name);
+ __PRETTY_FUNCTION__,
+ rpf->source_nexthop.interface->name);
return -1;
}
-
- if (PIM_INADDR_IS_ANY(upstream_addr)) {
+ if (PIM_INADDR_IS_ANY(rpf->rpf_addr.u.prefix4)) {
if (PIM_DEBUG_PIM_J_P) {
char dst_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<dst?>", upstream_addr, dst_str, sizeof(dst_str));
+ pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4, dst_str, sizeof(dst_str));
zlog_debug("%s: %s(S,G)=%s: upstream=%s is myself on interface %s",
__PRETTY_FUNCTION__,
send_join ? "Join" : "Prune",
- up->sg_str, dst_str, ifp->name);
+ up->sg_str, dst_str, rpf->source_nexthop.interface->name);
}
return 0;
}
relevant Hello message without waiting for the Hello Timer to
expire, followed by the Join/Prune or Assert message.
*/
- pim_hello_require(ifp);
+ pim_hello_require(rpf->source_nexthop.interface);
/*
Build PIM message
*/
pim_msg_size = pim_msg_join_prune_encode (pim_msg, 9000, send_join,
- up, upstream_addr, PIM_JP_HOLDTIME);
+ up, rpf->rpf_addr.u.prefix4, PIM_JP_HOLDTIME);
if (pim_msg_size < 0)
return pim_msg_size;
if (PIM_DEBUG_PIM_J_P) {
char dst_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<dst?>", upstream_addr, dst_str, sizeof(dst_str));
+ pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4, dst_str, sizeof(dst_str));
zlog_debug("%s: sending %s(S,G)=%s to upstream=%s on interface %s",
__PRETTY_FUNCTION__,
send_join ? "Join" : "Prune",
- up->sg_str, dst_str, ifp->name);
+ up->sg_str, dst_str, rpf->source_nexthop.interface->name);
}
if (pim_msg_send(pim_ifp->pim_sock_fd,
qpim_all_pim_routers_addr,
pim_msg,
pim_msg_size,
- ifp->name)) {
+ rpf->source_nexthop.interface->name)) {
zlog_warn("%s: could not send PIM message on interface %s",
- __PRETTY_FUNCTION__, ifp->name);
+ __PRETTY_FUNCTION__, rpf->source_nexthop.interface->name);
return -8;
}
THREAD_OFF(up->t_msdp_reg_timer);
if (up->join_state == PIM_UPSTREAM_JOINED) {
- pim_joinprune_send (up->rpf.source_nexthop.interface,
- up->rpf.rpf_addr.u.prefix4,
- up, 0);
+ pim_joinprune_send (&up->rpf, up, 0);
if (up->sg.src.s_addr == INADDR_ANY) {
/* if a (*, G) entry in the joined state is being deleted we
* need to notify MSDP */
}
/* send Join(S,G) to the current upstream neighbor */
- pim_joinprune_send(up->rpf.source_nexthop.interface,
- up->rpf.rpf_addr.u.prefix4,
- up,
- 1 /* join */);
+ pim_joinprune_send(&up->rpf, up, 1 /* join */);
}
static int on_join_timer(struct thread *t)
forward_off(up);
if (old_state == PIM_UPSTREAM_JOINED)
pim_msdp_up_join_state_changed(up);
- pim_joinprune_send(up->rpf.source_nexthop.interface,
- up->rpf.rpf_addr.u.prefix4,
- up,
- 0 /* prune */);
+ pim_joinprune_send(&up->rpf, up, 0 /* prune */);
if (up->t_join_timer)
THREAD_OFF(up->t_join_timer);
}
/* send Prune(S,G) to the old upstream neighbor */
- pim_joinprune_send(old.source_nexthop.interface, old.rpf_addr.u.prefix4,
- up, 0 /* prune */);
+ pim_joinprune_send(&old, up, 0 /* prune */);
/* send Join(S,G) to the current upstream neighbor */
- pim_joinprune_send(up->rpf.source_nexthop.interface,
- up->rpf.rpf_addr.u.prefix4,
- up,
- 1 /* join */);
+ pim_joinprune_send(&up->rpf, up, 1 /* join */);
pim_upstream_join_timer_restart(up);
} /* up->join_state == PIM_UPSTREAM_JOINED */