detect_address_change(ifp, 0, __PRETTY_FUNCTION__);
- if (ifc->address->family != AF_INET)
- return;
+ // if (ifc->address->family != AF_INET)
+ // return;
if (PIM_IF_TEST_IGMP(pim_ifp->options)) {
struct igmp_sock *igmp;
pim_ifp = ifp->info;
- up = pim_upstream_add(sg, NULL, flags, __PRETTY_FUNCTION__);
+ up = pim_upstream_add(pim_ifp->pim, sg, NULL, flags,
+ __PRETTY_FUNCTION__);
if (!up) {
zlog_err(
"%s: could not attach upstream (S,G)=%s on interface %s",
#include "pim_ifchannel.h"
#include "pim_zlookup.h"
#include "pim_ssm.h"
+#include "pim_sock.h"
static void mroute_read_on(struct pim_instance *pim);
up = pim_upstream_find(pim_ifp->pim, &star);
if (up && PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(up->flags)) {
- up = pim_upstream_add(&sg, ifp,
+ up = pim_upstream_add(pim_ifp->pim, &sg, ifp,
PIM_UPSTREAM_FLAG_MASK_SRC_LHR,
__PRETTY_FUNCTION__);
if (!up) {
if (!oil->installed)
pim_mroute_add(oil, __PRETTY_FUNCTION__);
if (pim_if_connected_to_source(ifp, sg.src)) {
- up = pim_upstream_add(&sg, ifp, PIM_UPSTREAM_FLAG_MASK_FHR,
+ up = pim_upstream_add(pim_ifp->pim, &sg, ifp,
+ PIM_UPSTREAM_FLAG_MASK_FHR,
__PRETTY_FUNCTION__);
if (!up) {
if (PIM_DEBUG_MROUTE)
/* RFC3618: "RP triggers a (S, G) join event towards the data source
* as if a JP message was rxed addressed to the RP itself." */
- up = pim_upstream_add(&sa->sg, NULL /* iif */,
+ up = pim_upstream_add(sa->pim, &sa->sg, NULL /* iif */,
PIM_UPSTREAM_FLAG_MASK_SRC_MSDP,
__PRETTY_FUNCTION__);
struct pim_rpf old;
old.source_nexthop.interface = up->rpf.source_nexthop.interface;
- rpf_result = pim_rpf_update(up, &old, 0);
+ rpf_result = pim_rpf_update(pim, up, &old, 0);
if (rpf_result == PIM_RPF_FAILURE)
continue;
*/
if (!upstream) {
upstream = pim_upstream_add(
- &sg, ifp, PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
+ pim_ifp->pim, &sg, ifp,
+ PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
__PRETTY_FUNCTION__);
if (!upstream) {
zlog_warn("Failure to create upstream state");
|| (nh1->mrib_route_metric != nh2->mrib_route_metric);
}
-enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
+enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
+ struct pim_upstream *up, struct pim_rpf *old,
uint8_t is_new)
{
struct pim_rpf *rpf = &up->rpf;
struct prefix nht_p;
struct pim_nexthop_cache pnc;
struct prefix src, grp;
- struct pim_instance *pim = up->channel_oil->pim;
saved.source_nexthop = rpf->source_nexthop;
saved.rpf_addr = rpf->rpf_addr;
int pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
struct in_addr addr, int neighbor_needed);
-enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
+enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
+ struct pim_upstream *up, struct pim_rpf *old,
uint8_t is_new);
int pim_rpf_addr_is_inaddr_none(struct pim_rpf *rpf);
return 0;
}
-static struct pim_upstream *
-pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags)
+static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
+ struct prefix_sg *sg,
+ struct interface *incoming,
+ int flags)
{
enum pim_rpf_result rpf_result;
struct pim_interface *pim_ifp;
- struct pim_instance *pim;
struct pim_upstream *up;
up = XCALLOC(MTYPE_PIM_UPSTREAM, sizeof(*up));
return NULL;
}
- pim_ifp = incoming->info;
- pim = pim_ifp->pim;
up->sg = *sg;
pim_str_sg_set(sg, up->sg_str);
up = hash_get(pim->upstream_hash, up, hash_alloc_intern);
if (up->sg.src.s_addr != INADDR_ANY)
wheel_add_item(pim->upstream_sg_wheel, up);
- rpf_result = pim_rpf_update(up, NULL, 1);
+ rpf_result = pim_rpf_update(pim, up, NULL, 1);
if (rpf_result == PIM_RPF_FAILURE) {
struct prefix nht_p;
nht_p.family = AF_INET;
nht_p.prefixlen = IPV4_MAX_BITLEN;
nht_p.u.prefix4 = up->upstream_addr;
- pim_delete_tracked_nexthop(pim_ifp->pim, &nht_p, up, NULL);
+ pim_delete_tracked_nexthop(pim, &nht_p, up, NULL);
if (up->parent) {
listnode_delete(up->parent->sources, up);
up->ref_count);
}
} else
- up = pim_upstream_add(sg, incoming, flags, name);
+ up = pim_upstream_add(pim_ifp->pim, sg, incoming, flags, name);
return up;
}
up->ref_count);
}
-struct pim_upstream *pim_upstream_add(struct prefix_sg *sg,
+struct pim_upstream *pim_upstream_add(struct pim_instance *pim,
+ struct prefix_sg *sg,
struct interface *incoming, int flags,
const char *name)
{
struct pim_upstream *up = NULL;
- struct pim_interface *pim_ifp;
int found = 0;
- pim_ifp = incoming->info;
- up = pim_upstream_find(pim_ifp->pim, sg);
+ up = pim_upstream_find(pim, sg);
if (up) {
pim_upstream_ref(up, flags, name);
found = 1;
} else {
- up = pim_upstream_new(sg, incoming, flags);
+ up = pim_upstream_new(pim, sg, incoming, flags);
}
if (PIM_DEBUG_TRACE) {
zlog_debug(
"Upstream %s without a path to send join, checking",
up->sg_str);
- pim_rpf_update(up, NULL, 1);
+ pim_rpf_update(pim, up, NULL, 1);
}
}
}
struct pim_upstream *pim_upstream_find_or_add(struct prefix_sg *sg,
struct interface *ifp, int flags,
const char *name);
-struct pim_upstream *pim_upstream_add(struct prefix_sg *sg,
+struct pim_upstream *pim_upstream_add(struct pim_instance *pim,
+ struct prefix_sg *sg,
struct interface *ifp, int flags,
const char *name);
void pim_upstream_ref(struct pim_upstream *up, int flags, const char *name);
old.source_nexthop.interface =
up->rpf.source_nexthop.interface;
old.source_nexthop.nbr = up->rpf.source_nexthop.nbr;
- rpf_result = pim_rpf_update(up, &old, 0);
+ rpf_result = pim_rpf_update(pim, up, &old, 0);
if (rpf_result == PIM_RPF_FAILURE)
continue;