forked from Mirror/frr
pimd: Convert pim_rp.c to use 'struct pim_instance *'
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
9b29ea95fc
commit
d9c9a9ee06
|
@ -3506,7 +3506,7 @@ DEFUN (show_ip_pim_rp,
|
|||
"JavaScript Object Notation\n")
|
||||
{
|
||||
u_char uj = use_json(argc, argv);
|
||||
pim_rp_show_information(vty, uj);
|
||||
pim_rp_show_information(pimg, vty, uj);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
@ -3588,7 +3588,7 @@ DEFUN (show_ip_pim_nexthop_lookup,
|
|||
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;
|
||||
|
||||
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
|
||||
|
@ -4210,7 +4210,7 @@ DEFUN (show_ip_rib,
|
|||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
if (pim_nexthop_lookup(&nexthop, addr, 0)) {
|
||||
if (pim_nexthop_lookup(pimg, &nexthop, addr, 0)) {
|
||||
vty_out(vty,
|
||||
"Failure querying RIB nexthop for unicast address %s\n",
|
||||
addr_str);
|
||||
|
|
|
@ -48,6 +48,8 @@ static void pim_instance_terminate(struct pim_instance *pim)
|
|||
if (pim->static_routes)
|
||||
list_free(pim->static_routes);
|
||||
|
||||
pim_rp_free(pim);
|
||||
|
||||
pim_upstream_terminate(pim);
|
||||
|
||||
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_rp_init(pim);
|
||||
|
||||
pim_upstream_init(pim);
|
||||
|
||||
return pim;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,6 +61,8 @@ struct pim_instance {
|
|||
struct list *upstream_list;
|
||||
struct hash *upstream_hash;
|
||||
struct timer_wheel *upstream_sg_wheel;
|
||||
|
||||
struct list *rp_list;
|
||||
};
|
||||
|
||||
void pim_vrf_init(void);
|
||||
|
|
|
@ -462,8 +462,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
|
|||
*/
|
||||
if (!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)) {
|
||||
// No if channel, but upstream we are at the RP.
|
||||
if (pim_nexthop_lookup(&source, up->upstream_register,
|
||||
0)
|
||||
if (pim_nexthop_lookup(pim_ifp->pim, &source,
|
||||
up->upstream_register, 0)
|
||||
== 0)
|
||||
pim_register_stop_send(source.interface, &sg,
|
||||
pim_ifp->primary_address,
|
||||
|
@ -477,8 +477,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
|
|||
__PRETTY_FUNCTION__);
|
||||
pim_upstream_set_sptbit(up, ifp);
|
||||
} else {
|
||||
if (I_am_RP(up->sg.grp)) {
|
||||
if (pim_nexthop_lookup(&source,
|
||||
if (I_am_RP(pim_ifp->pim, up->sg.grp)) {
|
||||
if (pim_nexthop_lookup(pim_ifp->pim, &source,
|
||||
up->upstream_register, 0)
|
||||
== 0)
|
||||
pim_register_stop_send(
|
||||
|
|
|
@ -138,7 +138,7 @@ static bool pim_msdp_sa_upstream_add_ok(struct pim_msdp_sa *sa,
|
|||
return false;
|
||||
}
|
||||
/* check if we are RP */
|
||||
if (!I_am_RP(sa->sg.grp)) {
|
||||
if (!I_am_RP(pimg, sa->sg.grp)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -447,7 +447,7 @@ static bool pim_msdp_sa_local_add_ok(struct pim_upstream *up)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!I_am_RP(up->sg.grp)) {
|
||||
if (!I_am_RP(pimg, up->sg.grp)) {
|
||||
/* we are not RP for the group */
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -320,7 +320,7 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
|
|||
sg.src = ip_hdr->ip_src;
|
||||
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) {
|
||||
char src_str[INET_ADDRSTRLEN];
|
||||
|
|
121
pimd/pim_rp.c
121
pimd/pim_rp.c
|
@ -45,9 +45,6 @@
|
|||
#include "pim_nht.h"
|
||||
|
||||
|
||||
static struct list *qpim_rp_list = NULL;
|
||||
static struct rp_info *tail = NULL;
|
||||
|
||||
/* Cleanup pim->rpf_hash each node data */
|
||||
void pim_rp_list_hash_clean(void *data)
|
||||
{
|
||||
|
@ -93,13 +90,13 @@ int pim_rp_list_cmp(void *v1, void *v2)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void pim_rp_init(void)
|
||||
void pim_rp_init(struct pim_instance *pim)
|
||||
{
|
||||
struct rp_info *rp_info;
|
||||
|
||||
qpim_rp_list = list_new();
|
||||
qpim_rp_list->del = (void (*)(void *))pim_rp_info_free;
|
||||
qpim_rp_list->cmp = pim_rp_list_cmp;
|
||||
pim->rp_list = list_new();
|
||||
pim->rp_list->del = (void (*)(void *))pim_rp_info_free;
|
||||
pim->rp_list->cmp = pim_rp_list_cmp;
|
||||
|
||||
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.prefixlen = IPV4_MAX_PREFIXLEN;
|
||||
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)
|
||||
list_delete(qpim_rp_list);
|
||||
qpim_rp_list = NULL;
|
||||
if (pim->rp_list)
|
||||
list_delete(pim->rp_list);
|
||||
pim->rp_list = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
struct listnode *node;
|
||||
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
|
||||
&& rp_info->plist && strcmp(rp_info->plist, plist) == 0) {
|
||||
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
|
||||
*/
|
||||
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 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) {
|
||||
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
|
||||
* '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 listnode *node;
|
||||
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
|
||||
&& prefix_same(&rp_info->group, group))
|
||||
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
|
||||
*/
|
||||
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 rp_info *rp_info;
|
||||
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) {
|
||||
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();
|
||||
}
|
||||
|
||||
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 rp_info *rp_info;
|
||||
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
|
||||
&& strcmp(rp_info->plist, prefix_list_name(plist)) == 0) {
|
||||
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
|
||||
*/
|
||||
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)) {
|
||||
XFREE(MTYPE_PIM_RP, rp_info);
|
||||
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
|
||||
*/
|
||||
if (pim_rp_prefix_list_used(plist)) {
|
||||
if (pim_rp_prefix_list_used(pim, plist)) {
|
||||
XFREE(MTYPE_PIM_RP, rp_info);
|
||||
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
|
||||
*/
|
||||
for (ALL_LIST_ELEMENTS(qpim_rp_list, node, nnode,
|
||||
for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode,
|
||||
tmp_rp_info)) {
|
||||
if (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);
|
||||
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
|
||||
|
@ -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
|
||||
*/
|
||||
for (ALL_LIST_ELEMENTS(qpim_rp_list, node, nnode,
|
||||
for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode,
|
||||
tmp_rp_info)) {
|
||||
if (tmp_rp_info->plist
|
||||
&& 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;
|
||||
} else {
|
||||
if (pim_nexthop_lookup(
|
||||
&rp_all->rp.source_nexthop,
|
||||
pim, &rp_all->rp.source_nexthop,
|
||||
rp_all->rp.rpf_addr.u.prefix4, 1)
|
||||
!= 0)
|
||||
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
|
||||
*/
|
||||
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)) {
|
||||
XFREE(MTYPE_PIM_RP, rp_info);
|
||||
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
|
||||
*/
|
||||
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->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 */
|
||||
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))
|
||||
return PIM_RP_NO_PATH;
|
||||
} 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)
|
||||
!= 0)
|
||||
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;
|
||||
|
||||
if (plist)
|
||||
rp_info = pim_rp_find_prefix_list(rp_addr, plist);
|
||||
rp_info = pim_rp_find_prefix_list(pim, rp_addr, plist);
|
||||
else
|
||||
rp_info = pim_rp_find_exact(rp_addr, &group);
|
||||
rp_info = pim_rp_find_exact(pim, rp_addr, &group);
|
||||
|
||||
if (!rp_info)
|
||||
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);
|
||||
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
listnode_delete(qpim_rp_list, rp_info);
|
||||
listnode_delete(pim->rp_list, rp_info);
|
||||
pim_rp_refresh_group_to_rp_mapping();
|
||||
return PIM_SUCCESS;
|
||||
}
|
||||
|
@ -561,7 +561,7 @@ void pim_rp_setup(struct pim_instance *pim)
|
|||
struct prefix nht_p;
|
||||
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)
|
||||
continue;
|
||||
|
||||
|
@ -581,10 +581,9 @@ void pim_rp_setup(struct pim_instance *pim)
|
|||
"%s: NHT Local Nexthop not found for RP %s ",
|
||||
__PRETTY_FUNCTION__, buf);
|
||||
}
|
||||
if (pim_nexthop_lookup(&rp_info->rp.source_nexthop,
|
||||
rp_info->rp.rpf_addr.u.prefix4,
|
||||
1)
|
||||
!= 0)
|
||||
if (!pim_nexthop_lookup(
|
||||
pim, &rp_info->rp.source_nexthop,
|
||||
rp_info->rp.rpf_addr.u.prefix4, 1))
|
||||
if (PIM_DEBUG_PIM_TRACE)
|
||||
zlog_debug(
|
||||
"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 rp_info *rp_info;
|
||||
bool i_am_rp_changed = false;
|
||||
struct pim_instance *pim = pim_ifp->pim;
|
||||
|
||||
if (qpim_rp_list == NULL)
|
||||
if (pim->rp_list == NULL)
|
||||
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))
|
||||
continue;
|
||||
|
||||
|
@ -643,10 +643,10 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
|
|||
bool i_am_rp_changed = false;
|
||||
int old_i_am_rp;
|
||||
|
||||
if (qpim_rp_list == NULL)
|
||||
if (pim->rp_list == NULL)
|
||||
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))
|
||||
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
|
||||
*/
|
||||
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 rp_info *rp_info;
|
||||
|
@ -691,7 +691,7 @@ int pim_rp_i_am_rp(struct in_addr group)
|
|||
g.prefixlen = 32;
|
||||
g.u.prefix4 = group;
|
||||
|
||||
rp_info = pim_rp_find_match_group(&g);
|
||||
rp_info = pim_rp_find_match_group(pim, &g);
|
||||
|
||||
if (rp_info)
|
||||
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.u.prefix4 = group;
|
||||
|
||||
rp_info = pim_rp_find_match_group(&g);
|
||||
rp_info = pim_rp_find_match_group(pim, &g);
|
||||
|
||||
if (rp_info) {
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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.
|
||||
*
|
||||
*/
|
||||
int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
|
||||
struct in_addr group)
|
||||
int pim_rp_set_upstream_addr(struct pim_instance *pim, struct in_addr *up,
|
||||
struct in_addr source, struct in_addr group)
|
||||
{
|
||||
struct rp_info *rp_info;
|
||||
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.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))
|
||||
&& (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;
|
||||
}
|
||||
|
||||
int pim_rp_config_write(struct vty *vty)
|
||||
int pim_rp_config_write(struct pim_instance *pim, struct vty *vty)
|
||||
{
|
||||
struct listnode *node;
|
||||
struct rp_info *rp_info;
|
||||
|
@ -801,7 +801,7 @@ int pim_rp_config_write(struct vty *vty)
|
|||
char group_buffer[32];
|
||||
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))
|
||||
continue;
|
||||
|
||||
|
@ -835,14 +835,14 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
|
|||
g.prefixlen = 32;
|
||||
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?
|
||||
* This might not make sense if we ever leave a static RP
|
||||
* type of configuration.
|
||||
* 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)
|
||||
return 1;
|
||||
}
|
||||
|
@ -853,7 +853,8 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
|
|||
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 *prev_rp_info = NULL;
|
||||
|
@ -869,7 +870,7 @@ void pim_rp_show_information(struct vty *vty, u_char uj)
|
|||
vty_out(vty,
|
||||
"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)) {
|
||||
char buf[48];
|
||||
|
||||
|
@ -968,7 +969,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim)
|
|||
struct pim_nexthop_cache pnc;
|
||||
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)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -34,21 +34,23 @@ struct rp_info {
|
|||
char *plist;
|
||||
};
|
||||
|
||||
void pim_rp_init(void);
|
||||
void pim_rp_free(void);
|
||||
void pim_rp_init(struct pim_instance *pim);
|
||||
void pim_rp_free(struct pim_instance *pim);
|
||||
|
||||
void pim_rp_list_hash_clean(void *data);
|
||||
|
||||
int pim_rp_new(struct pim_instance *pim, const char *rp, const char *group,
|
||||
const char *plist);
|
||||
int pim_rp_del(struct pim_instance *pim, const char *rp, const char *group,
|
||||
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);
|
||||
|
||||
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_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 dest_addr);
|
||||
|
||||
int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
|
||||
struct in_addr group);
|
||||
int pim_rp_set_upstream_addr(struct pim_instance *pim, struct in_addr *up,
|
||||
struct in_addr source, 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))
|
||||
|
||||
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);
|
||||
int pim_rp_list_cmp(void *v1, void *v2);
|
||||
#endif
|
||||
|
|
|
@ -49,8 +49,8 @@ void pim_rpf_set_refresh_time(void)
|
|||
__PRETTY_FUNCTION__, last_route_change_time);
|
||||
}
|
||||
|
||||
int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
|
||||
int neighbor_needed)
|
||||
int pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
|
||||
struct in_addr addr, int neighbor_needed)
|
||||
{
|
||||
struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM];
|
||||
struct pim_neighbor *nbr = NULL;
|
||||
|
|
|
@ -61,8 +61,8 @@ extern long long nexthop_lookups_avoided;
|
|||
unsigned int pim_rpf_hash_key(void *arg);
|
||||
int pim_rpf_equal(const void *arg1, const void *arg2);
|
||||
|
||||
int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
|
||||
int neighbor_needed);
|
||||
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,
|
||||
uint8_t is_new);
|
||||
|
||||
|
|
|
@ -561,7 +561,7 @@ void pim_upstream_switch(struct pim_upstream *up,
|
|||
RP.
|
||||
If I am RP for G then send S,G prune to its IIF. */
|
||||
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)
|
||||
zlog_debug(
|
||||
"%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;
|
||||
pim_str_sg_set(sg, up->sg_str);
|
||||
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)
|
||||
zlog_debug("%s: Received a (*,G) with no RP configured",
|
||||
__PRETTY_FUNCTION__);
|
||||
|
@ -1083,7 +1084,7 @@ static int pim_upstream_keep_alive_timer(struct thread *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);
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
if (I_am_RP(sg->grp))
|
||||
if (I_am_RP(pimg, sg->grp))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
@ -1345,14 +1346,14 @@ static int pim_upstream_register_stop_timer(struct thread *t)
|
|||
|
||||
if (((up->channel_oil->cc.lastused / 100)
|
||||
> PIM_KEEPALIVE_PERIOD)
|
||||
&& (I_am_RP(up->sg.grp))) {
|
||||
&& (I_am_RP(pim_ifp->pim, up->sg.grp))) {
|
||||
if (PIM_DEBUG_TRACE)
|
||||
zlog_debug(
|
||||
"%s: Stop sending the register, because I am the RP and we haven't seen a packet in a while",
|
||||
__PRETTY_FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
rpg = RP(pimg, up->sg.grp);
|
||||
rpg = RP(pim_ifp->pim, up->sg.grp);
|
||||
memset(&ip_hdr, 0, sizeof(struct ip));
|
||||
ip_hdr.ip_p = PIM_IP_PROTO_PIM;
|
||||
ip_hdr.ip_hl = 5;
|
||||
|
@ -1576,7 +1577,7 @@ static bool pim_upstream_kat_start_ok(struct pim_upstream *up)
|
|||
* MUST be
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -154,7 +154,7 @@ int pim_global_config_write(struct vty *vty)
|
|||
++writes;
|
||||
}
|
||||
|
||||
writes += pim_rp_config_write(vty);
|
||||
writes += pim_rp_config_write(pimg, vty);
|
||||
|
||||
if (qpim_register_suppress_time
|
||||
!= PIM_REGISTER_SUPPRESSION_TIME_DEFAULT) {
|
||||
|
|
|
@ -487,7 +487,8 @@ void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index)
|
|||
int input_iface_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))
|
||||
return;
|
||||
|
||||
|
@ -884,8 +885,8 @@ void igmp_source_forward_start(struct igmp_source *source)
|
|||
struct pim_nexthop nexthop;
|
||||
struct pim_upstream *up = NULL;
|
||||
|
||||
if (!pim_rp_set_upstream_addr(&vif_source, source->source_addr,
|
||||
sg.grp))
|
||||
if (!pim_rp_set_upstream_addr(pimg, &vif_source,
|
||||
source->source_addr, sg.grp))
|
||||
return;
|
||||
|
||||
/* Register addr with Zebra NHT */
|
||||
|
|
19
pimd/pimd.c
19
pimd/pimd.c
|
@ -73,9 +73,19 @@ int32_t qpim_register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT;
|
|||
|
||||
void pim_prefix_list_update(struct prefix_list *plist)
|
||||
{
|
||||
pim_rp_prefix_list_update(plist);
|
||||
pim_ssm_prefix_list_update(plist);
|
||||
pim_upstream_spt_prefix_list_update(pimg, 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_upstream_spt_prefix_list_update(pim, plist);
|
||||
}
|
||||
}
|
||||
|
||||
static void pim_free()
|
||||
|
@ -85,7 +95,6 @@ static void pim_free()
|
|||
pim_oil_terminate();
|
||||
|
||||
pim_if_terminate();
|
||||
pim_rp_free();
|
||||
|
||||
pim_route_map_terminate();
|
||||
|
||||
|
@ -98,8 +107,6 @@ void pim_init()
|
|||
{
|
||||
qpim_rp_keep_alive_time = PIM_RP_KEEPALIVE_PERIOD;
|
||||
|
||||
pim_rp_init();
|
||||
|
||||
if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) {
|
||||
zlog_err(
|
||||
"%s %s: could not solve %s to group address: errno=%d: %s",
|
||||
|
|
Loading…
Reference in a new issue