pimd: Convert pim_rp.c to use 'struct pim_instance *'

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2017-05-20 13:43:58 -04:00
parent 9b29ea95fc
commit d9c9a9ee06
14 changed files with 120 additions and 100 deletions

View file

@ -3506,7 +3506,7 @@ DEFUN (show_ip_pim_rp,
"JavaScript Object Notation\n") "JavaScript Object Notation\n")
{ {
u_char uj = use_json(argc, argv); u_char uj = use_json(argc, argv);
pim_rp_show_information(vty, uj); pim_rp_show_information(pimg, vty, uj);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -3588,7 +3588,7 @@ DEFUN (show_ip_pim_nexthop_lookup,
return CMD_WARNING; return CMD_WARNING;
} }
if (!pim_rp_set_upstream_addr(&vif_source, src_addr, grp_addr)) if (!pim_rp_set_upstream_addr(pimg, &vif_source, src_addr, grp_addr))
return CMD_SUCCESS; return CMD_SUCCESS;
memset(&pnc, 0, sizeof(struct pim_nexthop_cache)); memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
@ -4210,7 +4210,7 @@ DEFUN (show_ip_rib,
return CMD_WARNING; return CMD_WARNING;
} }
if (pim_nexthop_lookup(&nexthop, addr, 0)) { if (pim_nexthop_lookup(pimg, &nexthop, addr, 0)) {
vty_out(vty, vty_out(vty,
"Failure querying RIB nexthop for unicast address %s\n", "Failure querying RIB nexthop for unicast address %s\n",
addr_str); addr_str);

View file

@ -48,6 +48,8 @@ static void pim_instance_terminate(struct pim_instance *pim)
if (pim->static_routes) if (pim->static_routes)
list_free(pim->static_routes); list_free(pim->static_routes);
pim_rp_free(pim);
pim_upstream_terminate(pim); pim_upstream_terminate(pim);
XFREE(MTYPE_PIM_PIM_INSTANCE, pimg); XFREE(MTYPE_PIM_PIM_INSTANCE, pimg);
@ -95,7 +97,10 @@ static struct pim_instance *pim_instance_init(struct vrf *vrf)
pim_mroute_socket_enable(pim); pim_mroute_socket_enable(pim);
pim_rp_init(pim);
pim_upstream_init(pim); pim_upstream_init(pim);
return pim; return pim;
} }

View file

@ -61,6 +61,8 @@ struct pim_instance {
struct list *upstream_list; struct list *upstream_list;
struct hash *upstream_hash; struct hash *upstream_hash;
struct timer_wheel *upstream_sg_wheel; struct timer_wheel *upstream_sg_wheel;
struct list *rp_list;
}; };
void pim_vrf_init(void); void pim_vrf_init(void);

View file

@ -462,8 +462,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
*/ */
if (!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)) { if (!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)) {
// No if channel, but upstream we are at the RP. // No if channel, but upstream we are at the RP.
if (pim_nexthop_lookup(&source, up->upstream_register, if (pim_nexthop_lookup(pim_ifp->pim, &source,
0) up->upstream_register, 0)
== 0) == 0)
pim_register_stop_send(source.interface, &sg, pim_register_stop_send(source.interface, &sg,
pim_ifp->primary_address, pim_ifp->primary_address,
@ -477,8 +477,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
__PRETTY_FUNCTION__); __PRETTY_FUNCTION__);
pim_upstream_set_sptbit(up, ifp); pim_upstream_set_sptbit(up, ifp);
} else { } else {
if (I_am_RP(up->sg.grp)) { if (I_am_RP(pim_ifp->pim, up->sg.grp)) {
if (pim_nexthop_lookup(&source, if (pim_nexthop_lookup(pim_ifp->pim, &source,
up->upstream_register, 0) up->upstream_register, 0)
== 0) == 0)
pim_register_stop_send( pim_register_stop_send(

View file

@ -138,7 +138,7 @@ static bool pim_msdp_sa_upstream_add_ok(struct pim_msdp_sa *sa,
return false; return false;
} }
/* check if we are RP */ /* check if we are RP */
if (!I_am_RP(sa->sg.grp)) { if (!I_am_RP(pimg, sa->sg.grp)) {
return false; return false;
} }
@ -447,7 +447,7 @@ static bool pim_msdp_sa_local_add_ok(struct pim_upstream *up)
return false; return false;
} }
if (!I_am_RP(up->sg.grp)) { if (!I_am_RP(pimg, up->sg.grp)) {
/* we are not RP for the group */ /* we are not RP for the group */
return false; return false;
} }

View file

@ -320,7 +320,7 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
sg.src = ip_hdr->ip_src; sg.src = ip_hdr->ip_src;
sg.grp = ip_hdr->ip_dst; sg.grp = ip_hdr->ip_dst;
i_am_rp = I_am_RP(sg.grp); i_am_rp = I_am_RP(pim_ifp->pim, sg.grp);
if (PIM_DEBUG_PIM_REG) { if (PIM_DEBUG_PIM_REG) {
char src_str[INET_ADDRSTRLEN]; char src_str[INET_ADDRSTRLEN];

View file

@ -45,9 +45,6 @@
#include "pim_nht.h" #include "pim_nht.h"
static struct list *qpim_rp_list = NULL;
static struct rp_info *tail = NULL;
/* Cleanup pim->rpf_hash each node data */ /* Cleanup pim->rpf_hash each node data */
void pim_rp_list_hash_clean(void *data) void pim_rp_list_hash_clean(void *data)
{ {
@ -93,13 +90,13 @@ int pim_rp_list_cmp(void *v1, void *v2)
return 0; return 0;
} }
void pim_rp_init(void) void pim_rp_init(struct pim_instance *pim)
{ {
struct rp_info *rp_info; struct rp_info *rp_info;
qpim_rp_list = list_new(); pim->rp_list = list_new();
qpim_rp_list->del = (void (*)(void *))pim_rp_info_free; pim->rp_list->del = (void (*)(void *))pim_rp_info_free;
qpim_rp_list->cmp = pim_rp_list_cmp; pim->rp_list->cmp = pim_rp_list_cmp;
rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info)); rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
@ -114,28 +111,28 @@ void pim_rp_init(void)
rp_info->rp.rpf_addr.family = AF_INET; rp_info->rp.rpf_addr.family = AF_INET;
rp_info->rp.rpf_addr.prefixlen = IPV4_MAX_PREFIXLEN; rp_info->rp.rpf_addr.prefixlen = IPV4_MAX_PREFIXLEN;
rp_info->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE; rp_info->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
tail = rp_info;
listnode_add(qpim_rp_list, rp_info); listnode_add(pim->rp_list, rp_info);
} }
void pim_rp_free(void) void pim_rp_free(struct pim_instance *pim)
{ {
if (qpim_rp_list) if (pim->rp_list)
list_delete(qpim_rp_list); list_delete(pim->rp_list);
qpim_rp_list = NULL; pim->rp_list = NULL;
} }
/* /*
* Given an RP's prefix-list, return the RP's rp_info for that prefix-list * Given an RP's prefix-list, return the RP's rp_info for that prefix-list
*/ */
static struct rp_info *pim_rp_find_prefix_list(struct in_addr rp, static struct rp_info *pim_rp_find_prefix_list(struct pim_instance *pim,
struct in_addr rp,
const char *plist) const char *plist)
{ {
struct listnode *node; struct listnode *node;
struct rp_info *rp_info; struct rp_info *rp_info;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr
&& rp_info->plist && strcmp(rp_info->plist, plist) == 0) { && rp_info->plist && strcmp(rp_info->plist, plist) == 0) {
return rp_info; return rp_info;
@ -148,12 +145,12 @@ static struct rp_info *pim_rp_find_prefix_list(struct in_addr rp,
/* /*
* Return true if plist is used by any rp_info * Return true if plist is used by any rp_info
*/ */
static int pim_rp_prefix_list_used(const char *plist) static int pim_rp_prefix_list_used(struct pim_instance *pim, const char *plist)
{ {
struct listnode *node; struct listnode *node;
struct rp_info *rp_info; struct rp_info *rp_info;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (rp_info->plist && strcmp(rp_info->plist, plist) == 0) { if (rp_info->plist && strcmp(rp_info->plist, plist) == 0) {
return 1; return 1;
} }
@ -166,13 +163,14 @@ static int pim_rp_prefix_list_used(const char *plist)
* Given an RP's address, return the RP's rp_info that is an exact match for * Given an RP's address, return the RP's rp_info that is an exact match for
* 'group' * 'group'
*/ */
static struct rp_info *pim_rp_find_exact(struct in_addr rp, static struct rp_info *pim_rp_find_exact(struct pim_instance *pim,
struct in_addr rp,
struct prefix *group) struct prefix *group)
{ {
struct listnode *node; struct listnode *node;
struct rp_info *rp_info; struct rp_info *rp_info;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr
&& prefix_same(&rp_info->group, group)) && prefix_same(&rp_info->group, group))
return rp_info; return rp_info;
@ -184,13 +182,14 @@ static struct rp_info *pim_rp_find_exact(struct in_addr rp,
/* /*
* Given a group, return the rp_info for that group * Given a group, return the rp_info for that group
*/ */
static struct rp_info *pim_rp_find_match_group(struct prefix *group) static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
struct prefix *group)
{ {
struct listnode *node; struct listnode *node;
struct rp_info *rp_info; struct rp_info *rp_info;
struct prefix_list *plist; struct prefix_list *plist;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (rp_info->plist) { if (rp_info->plist) {
plist = prefix_list_lookup(AFI_IP, rp_info->plist); plist = prefix_list_lookup(AFI_IP, rp_info->plist);
@ -218,13 +217,14 @@ static void pim_rp_refresh_group_to_rp_mapping()
pim_msdp_i_am_rp_changed(); pim_msdp_i_am_rp_changed();
} }
void pim_rp_prefix_list_update(struct prefix_list *plist) void pim_rp_prefix_list_update(struct pim_instance *pim,
struct prefix_list *plist)
{ {
struct listnode *node; struct listnode *node;
struct rp_info *rp_info; struct rp_info *rp_info;
int refresh_needed = 0; int refresh_needed = 0;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (rp_info->plist if (rp_info->plist
&& strcmp(rp_info->plist, prefix_list_name(plist)) == 0) { && strcmp(rp_info->plist, prefix_list_name(plist)) == 0) {
refresh_needed = 1; refresh_needed = 1;
@ -319,7 +319,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
/* /*
* Return if the prefix-list is already configured for this RP * Return if the prefix-list is already configured for this RP
*/ */
if (pim_rp_find_prefix_list(rp_info->rp.rpf_addr.u.prefix4, if (pim_rp_find_prefix_list(pim, rp_info->rp.rpf_addr.u.prefix4,
plist)) { plist)) {
XFREE(MTYPE_PIM_RP, rp_info); XFREE(MTYPE_PIM_RP, rp_info);
return PIM_SUCCESS; return PIM_SUCCESS;
@ -328,7 +328,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
/* /*
* Barf if the prefix-list is already configured for an RP * Barf if the prefix-list is already configured for an RP
*/ */
if (pim_rp_prefix_list_used(plist)) { if (pim_rp_prefix_list_used(pim, plist)) {
XFREE(MTYPE_PIM_RP, rp_info); XFREE(MTYPE_PIM_RP, rp_info);
return PIM_RP_PFXLIST_IN_USE; return PIM_RP_PFXLIST_IN_USE;
} }
@ -336,7 +336,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
/* /*
* Free any existing rp_info entries for this RP * Free any existing rp_info entries for this RP
*/ */
for (ALL_LIST_ELEMENTS(qpim_rp_list, node, nnode, for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode,
tmp_rp_info)) { tmp_rp_info)) {
if (rp_info->rp.rpf_addr.u.prefix4.s_addr if (rp_info->rp.rpf_addr.u.prefix4.s_addr
== tmp_rp_info->rp.rpf_addr.u.prefix4.s_addr) { == tmp_rp_info->rp.rpf_addr.u.prefix4.s_addr) {
@ -358,7 +358,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
XFREE(MTYPE_PIM_RP, rp_info); XFREE(MTYPE_PIM_RP, rp_info);
return PIM_GROUP_BAD_ADDRESS; return PIM_GROUP_BAD_ADDRESS;
} }
rp_all = pim_rp_find_match_group(&group_all); rp_all = pim_rp_find_match_group(pim, &group_all);
/* /*
* Barf if group is a non-multicast subnet * Barf if group is a non-multicast subnet
@ -371,7 +371,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
/* /*
* Remove any prefix-list rp_info entries for this RP * Remove any prefix-list rp_info entries for this RP
*/ */
for (ALL_LIST_ELEMENTS(qpim_rp_list, node, nnode, for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode,
tmp_rp_info)) { tmp_rp_info)) {
if (tmp_rp_info->plist if (tmp_rp_info->plist
&& rp_info->rp.rpf_addr.u.prefix4.s_addr && rp_info->rp.rpf_addr.u.prefix4.s_addr
@ -413,7 +413,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
return PIM_RP_NO_PATH; return PIM_RP_NO_PATH;
} else { } else {
if (pim_nexthop_lookup( if (pim_nexthop_lookup(
&rp_all->rp.source_nexthop, pim, &rp_all->rp.source_nexthop,
rp_all->rp.rpf_addr.u.prefix4, 1) rp_all->rp.rpf_addr.u.prefix4, 1)
!= 0) != 0)
return PIM_RP_NO_PATH; return PIM_RP_NO_PATH;
@ -426,7 +426,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
/* /*
* Return if the group is already configured for this RP * Return if the group is already configured for this RP
*/ */
if (pim_rp_find_exact(rp_info->rp.rpf_addr.u.prefix4, if (pim_rp_find_exact(pim, rp_info->rp.rpf_addr.u.prefix4,
&rp_info->group)) { &rp_info->group)) {
XFREE(MTYPE_PIM_RP, rp_info); XFREE(MTYPE_PIM_RP, rp_info);
return PIM_SUCCESS; return PIM_SUCCESS;
@ -435,7 +435,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
/* /*
* Barf if this group is already covered by some other RP * Barf if this group is already covered by some other RP
*/ */
tmp_rp_info = pim_rp_find_match_group(&rp_info->group); tmp_rp_info = pim_rp_find_match_group(pim, &rp_info->group);
if (tmp_rp_info) { if (tmp_rp_info) {
if (tmp_rp_info->plist) { if (tmp_rp_info->plist) {
@ -458,7 +458,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
} }
} }
listnode_add_sort(qpim_rp_list, rp_info); listnode_add_sort(pim->rp_list, rp_info);
/* Register addr with Zebra NHT */ /* Register addr with Zebra NHT */
nht_p.family = AF_INET; nht_p.family = AF_INET;
@ -480,7 +480,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
&nht_p, &rp_info->group, 1)) &nht_p, &rp_info->group, 1))
return PIM_RP_NO_PATH; return PIM_RP_NO_PATH;
} else { } else {
if (pim_nexthop_lookup(&rp_info->rp.source_nexthop, if (pim_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
rp_info->rp.rpf_addr.u.prefix4, 1) rp_info->rp.rpf_addr.u.prefix4, 1)
!= 0) != 0)
return PIM_RP_NO_PATH; return PIM_RP_NO_PATH;
@ -515,9 +515,9 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
return PIM_RP_BAD_ADDRESS; return PIM_RP_BAD_ADDRESS;
if (plist) if (plist)
rp_info = pim_rp_find_prefix_list(rp_addr, plist); rp_info = pim_rp_find_prefix_list(pim, rp_addr, plist);
else else
rp_info = pim_rp_find_exact(rp_addr, &group); rp_info = pim_rp_find_exact(pim, rp_addr, &group);
if (!rp_info) if (!rp_info)
return PIM_RP_NOT_FOUND; return PIM_RP_NOT_FOUND;
@ -540,7 +540,7 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info);
str2prefix("224.0.0.0/4", &g_all); str2prefix("224.0.0.0/4", &g_all);
rp_all = pim_rp_find_match_group(&g_all); rp_all = pim_rp_find_match_group(pim, &g_all);
if (rp_all == rp_info) { if (rp_all == rp_info) {
rp_all->rp.rpf_addr.family = AF_INET; rp_all->rp.rpf_addr.family = AF_INET;
@ -549,7 +549,7 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
return PIM_SUCCESS; return PIM_SUCCESS;
} }
listnode_delete(qpim_rp_list, rp_info); listnode_delete(pim->rp_list, rp_info);
pim_rp_refresh_group_to_rp_mapping(); pim_rp_refresh_group_to_rp_mapping();
return PIM_SUCCESS; return PIM_SUCCESS;
} }
@ -561,7 +561,7 @@ void pim_rp_setup(struct pim_instance *pim)
struct prefix nht_p; struct prefix nht_p;
struct pim_nexthop_cache pnc; struct pim_nexthop_cache pnc;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE) if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE)
continue; continue;
@ -581,10 +581,9 @@ void pim_rp_setup(struct pim_instance *pim)
"%s: NHT Local Nexthop not found for RP %s ", "%s: NHT Local Nexthop not found for RP %s ",
__PRETTY_FUNCTION__, buf); __PRETTY_FUNCTION__, buf);
} }
if (pim_nexthop_lookup(&rp_info->rp.source_nexthop, if (!pim_nexthop_lookup(
rp_info->rp.rpf_addr.u.prefix4, pim, &rp_info->rp.source_nexthop,
1) rp_info->rp.rpf_addr.u.prefix4, 1))
!= 0)
if (PIM_DEBUG_PIM_TRACE) if (PIM_DEBUG_PIM_TRACE)
zlog_debug( zlog_debug(
"Unable to lookup nexthop for rp specified"); "Unable to lookup nexthop for rp specified");
@ -601,11 +600,12 @@ void pim_rp_check_on_if_add(struct pim_interface *pim_ifp)
struct listnode *node; struct listnode *node;
struct rp_info *rp_info; struct rp_info *rp_info;
bool i_am_rp_changed = false; bool i_am_rp_changed = false;
struct pim_instance *pim = pim_ifp->pim;
if (qpim_rp_list == NULL) if (pim->rp_list == NULL)
return; return;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (pim_rpf_addr_is_inaddr_none(&rp_info->rp)) if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
continue; continue;
@ -643,10 +643,10 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
bool i_am_rp_changed = false; bool i_am_rp_changed = false;
int old_i_am_rp; int old_i_am_rp;
if (qpim_rp_list == NULL) if (pim->rp_list == NULL)
return; return;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (pim_rpf_addr_is_inaddr_none(&rp_info->rp)) if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
continue; continue;
@ -681,7 +681,7 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
* *
* Since we only have static RP, all groups are part of this RP * Since we only have static RP, all groups are part of this RP
*/ */
int pim_rp_i_am_rp(struct in_addr group) int pim_rp_i_am_rp(struct pim_instance *pim, struct in_addr group)
{ {
struct prefix g; struct prefix g;
struct rp_info *rp_info; struct rp_info *rp_info;
@ -691,7 +691,7 @@ int pim_rp_i_am_rp(struct in_addr group)
g.prefixlen = 32; g.prefixlen = 32;
g.u.prefix4 = group; g.u.prefix4 = group;
rp_info = pim_rp_find_match_group(&g); rp_info = pim_rp_find_match_group(pim, &g);
if (rp_info) if (rp_info)
return rp_info->i_am_rp; return rp_info->i_am_rp;
@ -714,7 +714,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
g.prefixlen = 32; g.prefixlen = 32;
g.u.prefix4 = group; g.u.prefix4 = group;
rp_info = pim_rp_find_match_group(&g); rp_info = pim_rp_find_match_group(pim, &g);
if (rp_info) { if (rp_info) {
struct prefix nht_p; struct prefix nht_p;
@ -748,7 +748,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
__PRETTY_FUNCTION__, buf, buf1); __PRETTY_FUNCTION__, buf, buf1);
} }
pim_rpf_set_refresh_time(); pim_rpf_set_refresh_time();
pim_nexthop_lookup(&rp_info->rp.source_nexthop, pim_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
rp_info->rp.rpf_addr.u.prefix4, 1); rp_info->rp.rpf_addr.u.prefix4, 1);
} }
return (&rp_info->rp); return (&rp_info->rp);
@ -766,8 +766,8 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
* then return failure. * then return failure.
* *
*/ */
int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source, int pim_rp_set_upstream_addr(struct pim_instance *pim, struct in_addr *up,
struct in_addr group) struct in_addr source, struct in_addr group)
{ {
struct rp_info *rp_info; struct rp_info *rp_info;
struct prefix g; struct prefix g;
@ -777,7 +777,7 @@ int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
g.prefixlen = 32; g.prefixlen = 32;
g.u.prefix4 = group; g.u.prefix4 = group;
rp_info = pim_rp_find_match_group(&g); rp_info = pim_rp_find_match_group(pim, &g);
if ((pim_rpf_addr_is_inaddr_none(&rp_info->rp)) if ((pim_rpf_addr_is_inaddr_none(&rp_info->rp))
&& (source.s_addr == INADDR_ANY)) { && (source.s_addr == INADDR_ANY)) {
@ -793,7 +793,7 @@ int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
return 1; return 1;
} }
int pim_rp_config_write(struct vty *vty) int pim_rp_config_write(struct pim_instance *pim, struct vty *vty)
{ {
struct listnode *node; struct listnode *node;
struct rp_info *rp_info; struct rp_info *rp_info;
@ -801,7 +801,7 @@ int pim_rp_config_write(struct vty *vty)
char group_buffer[32]; char group_buffer[32];
int count = 0; int count = 0;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (pim_rpf_addr_is_inaddr_none(&rp_info->rp)) if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
continue; continue;
@ -835,14 +835,14 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
g.prefixlen = 32; g.prefixlen = 32;
g.u.prefix4 = group; g.u.prefix4 = group;
rp_info = pim_rp_find_match_group(&g); rp_info = pim_rp_find_match_group(pim, &g);
/* /*
* See if we can short-cut some? * See if we can short-cut some?
* This might not make sense if we ever leave a static RP * This might not make sense if we ever leave a static RP
* type of configuration. * type of configuration.
* Note - Premature optimization might bite our patooeys' here. * Note - Premature optimization might bite our patooeys' here.
*/ */
if (I_am_RP(group)) { if (I_am_RP(pim, group)) {
if (dest_addr.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr) if (dest_addr.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr)
return 1; return 1;
} }
@ -853,7 +853,8 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
return 0; return 0;
} }
void pim_rp_show_information(struct vty *vty, u_char uj) void pim_rp_show_information(struct pim_instance *pim, struct vty *vty,
u_char uj)
{ {
struct rp_info *rp_info; struct rp_info *rp_info;
struct rp_info *prev_rp_info = NULL; struct rp_info *prev_rp_info = NULL;
@ -869,7 +870,7 @@ void pim_rp_show_information(struct vty *vty, u_char uj)
vty_out(vty, vty_out(vty,
"RP address group/prefix-list OIF I am RP\n"); "RP address group/prefix-list OIF I am RP\n");
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (!pim_rpf_addr_is_inaddr_none(&rp_info->rp)) { if (!pim_rpf_addr_is_inaddr_none(&rp_info->rp)) {
char buf[48]; char buf[48];
@ -968,7 +969,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim)
struct pim_nexthop_cache pnc; struct pim_nexthop_cache pnc;
struct pim_neighbor *nbr = NULL; struct pim_neighbor *nbr = NULL;
for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE) if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE)
continue; continue;

View file

@ -34,21 +34,23 @@ struct rp_info {
char *plist; char *plist;
}; };
void pim_rp_init(void); void pim_rp_init(struct pim_instance *pim);
void pim_rp_free(void); void pim_rp_free(struct pim_instance *pim);
void pim_rp_list_hash_clean(void *data); void pim_rp_list_hash_clean(void *data);
int pim_rp_new(struct pim_instance *pim, const char *rp, const char *group, int pim_rp_new(struct pim_instance *pim, const char *rp, const char *group,
const char *plist); const char *plist);
int pim_rp_del(struct pim_instance *pim, const char *rp, const char *group, int pim_rp_del(struct pim_instance *pim, const char *rp, const char *group,
const char *plist); const char *plist);
void pim_rp_prefix_list_update(struct prefix_list *plist); void pim_rp_prefix_list_update(struct pim_instance *pim,
struct prefix_list *plist);
int pim_rp_config_write(struct vty *vty); int pim_rp_config_write(struct pim_instance *pim, struct vty *vty);
void pim_rp_setup(struct pim_instance *pim); void pim_rp_setup(struct pim_instance *pim);
int pim_rp_i_am_rp(struct in_addr group); int pim_rp_i_am_rp(struct pim_instance *pim, struct in_addr group);
void pim_rp_check_on_if_add(struct pim_interface *pim_ifp); void pim_rp_check_on_if_add(struct pim_interface *pim_ifp);
void pim_i_am_rp_re_evaluate(struct pim_instance *pim); void pim_i_am_rp_re_evaluate(struct pim_instance *pim);
@ -56,15 +58,16 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
struct in_addr group, struct in_addr group,
struct in_addr dest_addr); struct in_addr dest_addr);
int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source, int pim_rp_set_upstream_addr(struct pim_instance *pim, struct in_addr *up,
struct in_addr group); struct in_addr source, struct in_addr group);
struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group); struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group);
#define I_am_RP(G) pim_rp_i_am_rp ((G)) #define I_am_RP(P, G) pim_rp_i_am_rp ((P), (G))
#define RP(P, G) pim_rp_g ((P), (G)) #define RP(P, G) pim_rp_g ((P), (G))
void pim_rp_show_information(struct vty *vty, u_char uj); void pim_rp_show_information(struct pim_instance *pim, struct vty *vty,
u_char uj);
void pim_resolve_rp_nh(struct pim_instance *pim); void pim_resolve_rp_nh(struct pim_instance *pim);
int pim_rp_list_cmp(void *v1, void *v2); int pim_rp_list_cmp(void *v1, void *v2);
#endif #endif

View file

@ -49,8 +49,8 @@ void pim_rpf_set_refresh_time(void)
__PRETTY_FUNCTION__, last_route_change_time); __PRETTY_FUNCTION__, last_route_change_time);
} }
int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr, int pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
int neighbor_needed) struct in_addr addr, int neighbor_needed)
{ {
struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM]; struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM];
struct pim_neighbor *nbr = NULL; struct pim_neighbor *nbr = NULL;

View file

@ -61,8 +61,8 @@ extern long long nexthop_lookups_avoided;
unsigned int pim_rpf_hash_key(void *arg); unsigned int pim_rpf_hash_key(void *arg);
int pim_rpf_equal(const void *arg1, const void *arg2); int pim_rpf_equal(const void *arg1, const void *arg2);
int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr, int pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
int neighbor_needed); 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_upstream *up, struct pim_rpf *old,
uint8_t is_new); uint8_t is_new);

View file

@ -561,7 +561,7 @@ void pim_upstream_switch(struct pim_upstream *up,
RP. RP.
If I am RP for G then send S,G prune to its IIF. */ If I am RP for G then send S,G prune to its IIF. */
if (pim_upstream_is_sg_rpt(up) && up->parent if (pim_upstream_is_sg_rpt(up) && up->parent
&& !I_am_RP(up->sg.grp)) { && !I_am_RP(up->channel_oil->pim, up->sg.grp)) {
if (PIM_DEBUG_PIM_TRACE_DETAIL) if (PIM_DEBUG_PIM_TRACE_DETAIL)
zlog_debug( zlog_debug(
"%s: *,G IIF %s S,G IIF %s ", "%s: *,G IIF %s S,G IIF %s ",
@ -619,7 +619,8 @@ pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags)
up->sg = *sg; up->sg = *sg;
pim_str_sg_set(sg, up->sg_str); pim_str_sg_set(sg, up->sg_str);
up = hash_get(pim->upstream_hash, up, hash_alloc_intern); up = hash_get(pim->upstream_hash, up, hash_alloc_intern);
if (!pim_rp_set_upstream_addr(&up->upstream_addr, sg->src, sg->grp)) { if (!pim_rp_set_upstream_addr(pim, &up->upstream_addr, sg->src,
sg->grp)) {
if (PIM_DEBUG_TRACE) if (PIM_DEBUG_TRACE)
zlog_debug("%s: Received a (*,G) with no RP configured", zlog_debug("%s: Received a (*,G) with no RP configured",
__PRETTY_FUNCTION__); __PRETTY_FUNCTION__);
@ -1083,7 +1084,7 @@ static int pim_upstream_keep_alive_timer(struct thread *t)
up = THREAD_ARG(t); up = THREAD_ARG(t);
if (I_am_RP(up->sg.grp)) { if (I_am_RP(pimg, up->sg.grp)) {
pim_br_clear_pmbr(&up->sg); pim_br_clear_pmbr(&up->sg);
/* /*
* We need to do more here :) * We need to do more here :)
@ -1176,7 +1177,7 @@ void pim_upstream_msdp_reg_timer_start(struct pim_upstream *up)
*/ */
int pim_upstream_switch_to_spt_desired(struct prefix_sg *sg) int pim_upstream_switch_to_spt_desired(struct prefix_sg *sg)
{ {
if (I_am_RP(sg->grp)) if (I_am_RP(pimg, sg->grp))
return 1; return 1;
return 0; return 0;
@ -1345,14 +1346,14 @@ static int pim_upstream_register_stop_timer(struct thread *t)
if (((up->channel_oil->cc.lastused / 100) if (((up->channel_oil->cc.lastused / 100)
> PIM_KEEPALIVE_PERIOD) > PIM_KEEPALIVE_PERIOD)
&& (I_am_RP(up->sg.grp))) { && (I_am_RP(pim_ifp->pim, up->sg.grp))) {
if (PIM_DEBUG_TRACE) if (PIM_DEBUG_TRACE)
zlog_debug( zlog_debug(
"%s: Stop sending the register, because I am the RP and we haven't seen a packet in a while", "%s: Stop sending the register, because I am the RP and we haven't seen a packet in a while",
__PRETTY_FUNCTION__); __PRETTY_FUNCTION__);
return 0; return 0;
} }
rpg = RP(pimg, up->sg.grp); rpg = RP(pim_ifp->pim, up->sg.grp);
memset(&ip_hdr, 0, sizeof(struct ip)); memset(&ip_hdr, 0, sizeof(struct ip));
ip_hdr.ip_p = PIM_IP_PROTO_PIM; ip_hdr.ip_p = PIM_IP_PROTO_PIM;
ip_hdr.ip_hl = 5; ip_hdr.ip_hl = 5;
@ -1576,7 +1577,7 @@ static bool pim_upstream_kat_start_ok(struct pim_upstream *up)
* MUST be * MUST be
* removed to handle spt turn-arounds correctly in a 3-tier clos * removed to handle spt turn-arounds correctly in a 3-tier clos
*/ */
if (I_am_RP(up->sg.grp)) if (I_am_RP(pimg, up->sg.grp))
return true; return true;
} }

View file

@ -154,7 +154,7 @@ int pim_global_config_write(struct vty *vty)
++writes; ++writes;
} }
writes += pim_rp_config_write(vty); writes += pim_rp_config_write(pimg, vty);
if (qpim_register_suppress_time if (qpim_register_suppress_time
!= PIM_REGISTER_SUPPRESSION_TIME_DEFAULT) { != PIM_REGISTER_SUPPRESSION_TIME_DEFAULT) {

View file

@ -487,7 +487,8 @@ void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index)
int input_iface_vif_index; int input_iface_vif_index;
int old_vif_index; int old_vif_index;
if (!pim_rp_set_upstream_addr(&vif_source, c_oil->oil.mfcc_origin, if (!pim_rp_set_upstream_addr(c_oil->pim, &vif_source,
c_oil->oil.mfcc_origin,
c_oil->oil.mfcc_mcastgrp)) c_oil->oil.mfcc_mcastgrp))
return; return;
@ -884,8 +885,8 @@ void igmp_source_forward_start(struct igmp_source *source)
struct pim_nexthop nexthop; struct pim_nexthop nexthop;
struct pim_upstream *up = NULL; struct pim_upstream *up = NULL;
if (!pim_rp_set_upstream_addr(&vif_source, source->source_addr, if (!pim_rp_set_upstream_addr(pimg, &vif_source,
sg.grp)) source->source_addr, sg.grp))
return; return;
/* Register addr with Zebra NHT */ /* Register addr with Zebra NHT */

View file

@ -73,9 +73,19 @@ int32_t qpim_register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT;
void pim_prefix_list_update(struct prefix_list *plist) void pim_prefix_list_update(struct prefix_list *plist)
{ {
pim_rp_prefix_list_update(plist); struct pim_instance *pim;
struct vrf *vrf;
RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name)
{
pim = vrf->info;
if (!pim)
continue;
pim_rp_prefix_list_update(pim, plist);
pim_ssm_prefix_list_update(plist); pim_ssm_prefix_list_update(plist);
pim_upstream_spt_prefix_list_update(pimg, plist); pim_upstream_spt_prefix_list_update(pim, plist);
}
} }
static void pim_free() static void pim_free()
@ -85,7 +95,6 @@ static void pim_free()
pim_oil_terminate(); pim_oil_terminate();
pim_if_terminate(); pim_if_terminate();
pim_rp_free();
pim_route_map_terminate(); pim_route_map_terminate();
@ -98,8 +107,6 @@ void pim_init()
{ {
qpim_rp_keep_alive_time = PIM_RP_KEEPALIVE_PERIOD; qpim_rp_keep_alive_time = PIM_RP_KEEPALIVE_PERIOD;
pim_rp_init();
if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) { if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) {
zlog_err( zlog_err(
"%s %s: could not solve %s to group address: errno=%d: %s", "%s %s: could not solve %s to group address: errno=%d: %s",