Skip to content

Commit

Permalink
pimd: Modifying members of pim_interface to accommodate IPv6 changes
Browse files Browse the repository at this point in the history
Modifying the members of pim_interface which are to be used
for both IPv4 and IPv6 to common names(for both MLD and IGMP).

Issue: FRRouting#10023

Co-authored-by: Mobashshera Rasool <[email protected]>
Signed-off-by: Sai Gomathi <[email protected]>
  • Loading branch information
2 people authored and nguggarigoud committed Jun 7, 2022
1 parent 78ab622 commit afa1e8d
Show file tree
Hide file tree
Showing 9 changed files with 163 additions and 176 deletions.
61 changes: 27 additions & 34 deletions pimd/pim_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,7 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty,
if (!pim_ifp)
continue;

for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node,
igmp)) {
char uptime[10];
char query_hhmmss[10];
Expand All @@ -525,7 +525,7 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty,
json_object_string_add(json_row, "upTime",
uptime);
json_object_int_add(json_row, "version",
pim_ifp->igmp_version);
pim_ifp->version);

if (igmp->t_igmp_query_timer) {
json_object_boolean_true_add(json_row,
Expand Down Expand Up @@ -555,7 +555,7 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty,
: "down",
inet_ntop(AF_INET, &igmp->ifaddr, buf,
sizeof(buf)),
pim_ifp->igmp_version,
pim_ifp->version,
igmp->t_igmp_query_timer ? "local"
: "other",
&igmp->querier_addr, query_hhmmss,
Expand Down Expand Up @@ -610,7 +610,7 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
if (strcmp(ifname, "detail") && strcmp(ifname, ifp->name))
continue;

for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node,
igmp)) {
found_ifname = 1;
pim_time_uptime(uptime, sizeof(uptime),
Expand All @@ -625,35 +625,33 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
gmi_msec = PIM_IGMP_GMI_MSEC(
igmp->querier_robustness_variable,
igmp->querier_query_interval,
pim_ifp->igmp_query_max_response_time_dsec);
pim_ifp->query_max_response_time_dsec);

sqi = PIM_IGMP_SQI(
pim_ifp->igmp_default_query_interval);
sqi = PIM_IGMP_SQI(pim_ifp->default_query_interval);

oqpi_msec = PIM_IGMP_OQPI_MSEC(
igmp->querier_robustness_variable,
igmp->querier_query_interval,
pim_ifp->igmp_query_max_response_time_dsec);
pim_ifp->query_max_response_time_dsec);

lmqt_msec = PIM_IGMP_LMQT_MSEC(
pim_ifp->igmp_specific_query_max_response_time_dsec,
pim_ifp->igmp_last_member_query_count);
pim_ifp->specific_query_max_response_time_dsec,
pim_ifp->last_member_query_count);

ohpi_msec =
PIM_IGMP_OHPI_DSEC(
igmp->querier_robustness_variable,
igmp->querier_query_interval,
pim_ifp->igmp_query_max_response_time_dsec)
pim_ifp->query_max_response_time_dsec)
* 100;

qri_msec = pim_ifp->igmp_query_max_response_time_dsec
* 100;
qri_msec = pim_ifp->query_max_response_time_dsec * 100;
if (pim_ifp->pim_sock_fd >= 0)
mloop = pim_socket_mcastloop_get(
pim_ifp->pim_sock_fd);
else
mloop = 0;
lmqc = pim_ifp->igmp_last_member_query_count;
lmqc = pim_ifp->last_member_query_count;

if (uj) {
json_row = json_object_new_object();
Expand All @@ -676,7 +674,7 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
"queryOtherTimer",
other_hhmmss);
json_object_int_add(json_row, "version",
pim_ifp->igmp_version);
pim_ifp->version);
json_object_int_add(
json_row,
"timerGroupMembershipIntervalMsec",
Expand Down Expand Up @@ -727,7 +725,7 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
&pim_ifp->primary_address);
vty_out(vty, "Uptime : %s\n", uptime);
vty_out(vty, "Version : %d\n",
pim_ifp->igmp_version);
pim_ifp->version);
vty_out(vty, "\n");
vty_out(vty, "\n");

Expand Down Expand Up @@ -833,15 +831,14 @@ static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty,
if (!pim_ifp)
continue;

if (!pim_ifp->igmp_join_list)
if (!pim_ifp->join_list)
continue;

pri_addr = pim_find_primary_addr(ifp);
pim_inet4_dump("<pri?>", pri_addr, pri_addr_str,
sizeof(pri_addr_str));

for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_join_list, join_node,
ij)) {
for (ALL_LIST_ELEMENTS_RO(pim_ifp->join_list, join_node, ij)) {
char group_str[INET_ADDRSTRLEN];
char source_str[INET_ADDRSTRLEN];
char uptime[10];
Expand Down Expand Up @@ -887,7 +884,7 @@ static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty,
ifp->name, pri_addr_str, source_str,
group_str, ij->sock_fd, uptime);
}
} /* for (pim_ifp->igmp_join_list) */
} /* for (pim_ifp->join_list) */

} /* for (iflist) */

Expand Down Expand Up @@ -1340,7 +1337,7 @@ static void igmp_show_statistics(struct pim_instance *pim, struct vty *vty,
if (ifname && strcmp(ifname, ifp->name))
continue;

for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node,
igmp)) {
igmp_stats_add(&rx_stats, &igmp->rx_stats);
}
Expand Down Expand Up @@ -3429,8 +3426,7 @@ static void igmp_show_groups(struct pim_instance *pim, struct vty *vty, bool uj)
continue;

/* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) {
char group_str[INET_ADDRSTRLEN];
char hhmmss[10];
char uptime[10];
Expand Down Expand Up @@ -3523,8 +3519,7 @@ static void igmp_show_group_retransmission(struct pim_instance *pim,
continue;

/* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) {
char group_str[INET_ADDRSTRLEN];
char grp_retr_mmss[10];
struct listnode *src_node;
Expand Down Expand Up @@ -3576,8 +3571,7 @@ static void igmp_show_sources(struct pim_instance *pim, struct vty *vty)
continue;

/* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) {
char group_str[INET_ADDRSTRLEN];
struct listnode *srcnode;
struct igmp_source *src;
Expand Down Expand Up @@ -3610,7 +3604,7 @@ static void igmp_show_sources(struct pim_instance *pim, struct vty *vty)
uptime);

} /* scan group sources */
} /* scan igmp groups */
} /* scan igmp groups */
} /* scan interfaces */
}

Expand All @@ -3632,8 +3626,7 @@ static void igmp_show_source_retransmission(struct pim_instance *pim,
continue;

/* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) {
char group_str[INET_ADDRSTRLEN];
struct listnode *srcnode;
struct igmp_source *src;
Expand All @@ -3654,7 +3647,7 @@ static void igmp_show_source_retransmission(struct pim_instance *pim,
src->source_query_retransmit_count);

} /* scan group sources */
} /* scan igmp groups */
} /* scan igmp groups */
} /* scan interfaces */
}

Expand Down Expand Up @@ -3923,9 +3916,9 @@ static void clear_mroute(struct pim_instance *pim)

/* clean up all igmp groups */

if (pim_ifp->igmp_group_list) {
while (pim_ifp->igmp_group_list->count) {
grp = listnode_head(pim_ifp->igmp_group_list);
if (pim_ifp->group_list) {
while (pim_ifp->group_list->count) {
grp = listnode_head(pim_ifp->group_list);
igmp_group_delete(grp);
}
}
Expand Down
70 changes: 34 additions & 36 deletions pimd/pim_iface.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,16 +124,14 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
pim_ifp->pim = ifp->vrf->info;
pim_ifp->mroute_vif_index = -1;

pim_ifp->igmp_version = IGMP_DEFAULT_VERSION;
pim_ifp->igmp_default_robustness_variable =
IGMP_DEFAULT_ROBUSTNESS_VARIABLE;
pim_ifp->igmp_default_query_interval = IGMP_GENERAL_QUERY_INTERVAL;
pim_ifp->igmp_query_max_response_time_dsec =
pim_ifp->version = IGMP_DEFAULT_VERSION;
pim_ifp->default_robustness_variable = IGMP_DEFAULT_ROBUSTNESS_VARIABLE;
pim_ifp->default_query_interval = IGMP_GENERAL_QUERY_INTERVAL;
pim_ifp->query_max_response_time_dsec =
IGMP_QUERY_MAX_RESPONSE_TIME_DSEC;
pim_ifp->igmp_specific_query_max_response_time_dsec =
pim_ifp->specific_query_max_response_time_dsec =
IGMP_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC;
pim_ifp->igmp_last_member_query_count =
IGMP_DEFAULT_ROBUSTNESS_VARIABLE;
pim_ifp->last_member_query_count = IGMP_DEFAULT_ROBUSTNESS_VARIABLE;

/* BSM config on interface: true by default */
pim_ifp->bsm_enable = true;
Expand All @@ -145,8 +143,8 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
The number of seconds represented by the [Query Response Interval]
must be less than the [Query Interval].
*/
assert(pim_ifp->igmp_query_max_response_time_dsec
< pim_ifp->igmp_default_query_interval);
assert(pim_ifp->query_max_response_time_dsec
< pim_ifp->default_query_interval);

if (pim)
PIM_IF_DO_PIM(pim_ifp->options);
Expand All @@ -155,7 +153,7 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,

PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(pim_ifp->options);

pim_ifp->igmp_join_list = NULL;
pim_ifp->join_list = NULL;
pim_ifp->pim_neighbor_list = NULL;
pim_ifp->upstream_switch_list = NULL;
pim_ifp->pim_generation_id = 0;
Expand Down Expand Up @@ -200,7 +198,7 @@ void pim_if_delete(struct interface *ifp)
pim_ifp = ifp->info;
assert(pim_ifp);

if (pim_ifp->igmp_join_list) {
if (pim_ifp->join_list) {
pim_if_igmp_join_del_all(ifp);
}

Expand Down Expand Up @@ -535,27 +533,27 @@ void pim_if_addr_add(struct connected *ifc)
struct igmp_sock *igmp;

/* lookup IGMP socket */
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list,
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->socket_list,
ifaddr);
if (!igmp) {
/* if addr new, add IGMP socket */
if (ifc->address->family == AF_INET)
pim_igmp_sock_add(pim_ifp->igmp_socket_list,
ifaddr, ifp, false);
pim_igmp_sock_add(pim_ifp->socket_list, ifaddr,
ifp, false);
} else if (igmp->mtrace_only) {
igmp_sock_delete(igmp);
pim_igmp_sock_add(pim_ifp->igmp_socket_list, ifaddr,
ifp, false);
pim_igmp_sock_add(pim_ifp->socket_list, ifaddr, ifp,
false);
}

/* Replay Static IGMP groups */
if (pim_ifp->igmp_join_list) {
if (pim_ifp->join_list) {
struct listnode *node;
struct listnode *nextnode;
struct igmp_join *ij;
int join_fd;

for (ALL_LIST_ELEMENTS(pim_ifp->igmp_join_list, node,
for (ALL_LIST_ELEMENTS(pim_ifp->join_list, node,
nextnode, ij)) {
/* Close socket and reopen with Source and Group
*/
Expand Down Expand Up @@ -586,14 +584,14 @@ void pim_if_addr_add(struct connected *ifc)
struct igmp_sock *igmp;

/* lookup IGMP socket */
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list,
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->socket_list,
ifaddr);
if (ifc->address->family == AF_INET) {
if (igmp)
igmp_sock_delete(igmp);
/* if addr new, add IGMP socket */
pim_igmp_sock_add(pim_ifp->igmp_socket_list, ifaddr,
ifp, true);
pim_igmp_sock_add(pim_ifp->socket_list, ifaddr, ifp,
true);
}
} /* igmp mtrace only */

Expand Down Expand Up @@ -664,7 +662,7 @@ static void pim_if_addr_del_igmp(struct connected *ifc)
ifaddr = ifc->address->u.prefix4;

/* lookup IGMP socket */
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list, ifaddr);
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->socket_list, ifaddr);
if (igmp) {
/* if addr found, del IGMP socket */
igmp_sock_delete(igmp);
Expand Down Expand Up @@ -1245,7 +1243,7 @@ static struct igmp_join *igmp_join_new(struct interface *ifp,
ij->source_addr = source_addr;
ij->sock_creation = pim_time_monotonic_sec();

listnode_add(pim_ifp->igmp_join_list, ij);
listnode_add(pim_ifp->join_list, ij);

return ij;
}
Expand All @@ -1262,12 +1260,12 @@ ferr_r pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr,
ifp->name);
}

if (!pim_ifp->igmp_join_list) {
pim_ifp->igmp_join_list = list_new();
pim_ifp->igmp_join_list->del = (void (*)(void *))igmp_join_free;
if (!pim_ifp->join_list) {
pim_ifp->join_list = list_new();
pim_ifp->join_list->del = (void (*)(void *))igmp_join_free;
}

ij = igmp_join_find(pim_ifp->igmp_join_list, group_addr, source_addr);
ij = igmp_join_find(pim_ifp->join_list, group_addr, source_addr);

/* This interface has already been configured to join this IGMP group
*/
Expand Down Expand Up @@ -1306,13 +1304,13 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,
return -1;
}

if (!pim_ifp->igmp_join_list) {
if (!pim_ifp->join_list) {
zlog_warn("%s: no IGMP join on interface %s", __func__,
ifp->name);
return -2;
}

ij = igmp_join_find(pim_ifp->igmp_join_list, group_addr, source_addr);
ij = igmp_join_find(pim_ifp->join_list, group_addr, source_addr);
if (!ij) {
char group_str[INET_ADDRSTRLEN];
char source_str[INET_ADDRSTRLEN];
Expand All @@ -1339,11 +1337,11 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,
errno, safe_strerror(errno));
/* warning only */
}
listnode_delete(pim_ifp->igmp_join_list, ij);
listnode_delete(pim_ifp->join_list, ij);
igmp_join_free(ij);
if (listcount(pim_ifp->igmp_join_list) < 1) {
list_delete(&pim_ifp->igmp_join_list);
pim_ifp->igmp_join_list = 0;
if (listcount(pim_ifp->join_list) < 1) {
list_delete(&pim_ifp->join_list);
pim_ifp->join_list = 0;
}

return 0;
Expand All @@ -1363,10 +1361,10 @@ static void pim_if_igmp_join_del_all(struct interface *ifp)
return;
}

if (!pim_ifp->igmp_join_list)
if (!pim_ifp->join_list)
return;

for (ALL_LIST_ELEMENTS(pim_ifp->igmp_join_list, node, nextnode, ij))
for (ALL_LIST_ELEMENTS(pim_ifp->join_list, node, nextnode, ij))
pim_if_igmp_join_del(ifp, ij->group_addr, ij->source_addr);
}

Expand Down
Loading

0 comments on commit afa1e8d

Please sign in to comment.